89 lines
2.4 KiB
Go
89 lines
2.4 KiB
Go
|
package git
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"gitea-page/internal/config"
|
||
|
"github.com/go-git/go-git/v5"
|
||
|
"github.com/go-git/go-git/v5/plumbing"
|
||
|
"github.com/go-git/go-git/v5/plumbing/transport/ssh"
|
||
|
"github.com/pkg/errors"
|
||
|
"github.com/rs/zerolog/log"
|
||
|
cssh "golang.org/x/crypto/ssh"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
type GitHandler struct {
|
||
|
Config config.GiteaPagesConfig
|
||
|
}
|
||
|
|
||
|
func (g GitHandler) GetRepository(name, owner, url string) {
|
||
|
log.Debug().Msg("Try to Get Repository")
|
||
|
path := fmt.Sprintf("%s/%s/%s", g.Config.RootPath, owner, name)
|
||
|
log.Debug().Str("path", path).Msg("Get Path")
|
||
|
_, err := os.Stat(path)
|
||
|
if os.IsNotExist(err) {
|
||
|
g.clone(name, owner, url, path)
|
||
|
} else {
|
||
|
g.pull(name, owner, url, path)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func (g GitHandler) pull(name, owner, url, path string) {
|
||
|
log.Debug().Msg("Dont pull, delete and clone again")
|
||
|
e := os.RemoveAll(path)
|
||
|
if e != nil {
|
||
|
log.Fatal().Err(e).Msg("Cant remove folder")
|
||
|
}
|
||
|
|
||
|
g.clone(name, owner, url, path)
|
||
|
return
|
||
|
log.Debug().Msg("Try to Pull")
|
||
|
publicKeyAuth, err := ssh.NewPublicKeysFromFile("git", g.Config.PublicKey.Filename, "")
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Str("filename", g.Config.PublicKey.Filename).Msg("Cant parse Public key")
|
||
|
return
|
||
|
}
|
||
|
publicKeyAuth.HostKeyCallbackHelper = ssh.HostKeyCallbackHelper{
|
||
|
HostKeyCallback: cssh.InsecureIgnoreHostKey(),
|
||
|
}
|
||
|
|
||
|
r,_ := git.PlainOpen(path)
|
||
|
w,_ := r.Worktree()
|
||
|
err = w.Pull(&git.PullOptions{RemoteName: "origin", Auth: publicKeyAuth, Depth: 1})
|
||
|
if err != nil {
|
||
|
if errors.Is(err, git.NoErrAlreadyUpToDate) {
|
||
|
log.Debug().Msg("Already up to date")
|
||
|
} else {
|
||
|
log.Error().Err(err).Msg("Error doing pull")
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
func (g GitHandler) clone(name, owner, url, path string) {
|
||
|
log.Debug().Msg("Try to Clone")
|
||
|
|
||
|
publicKeyAuth, err := ssh.NewPublicKeysFromFile("git", g.Config.PublicKey.Filename, "")
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Str("filename", g.Config.PublicKey.Filename).Msg("Cant parse Public key")
|
||
|
return
|
||
|
}
|
||
|
publicKeyAuth.HostKeyCallbackHelper = ssh.HostKeyCallbackHelper{
|
||
|
HostKeyCallback: cssh.InsecureIgnoreHostKey(),
|
||
|
}
|
||
|
|
||
|
var remoteBranch plumbing.ReferenceName
|
||
|
remoteBranch = plumbing.ReferenceName(g.Config.Branch)
|
||
|
|
||
|
_, err = git.PlainClone(path, false, &git.CloneOptions{
|
||
|
URL: url,
|
||
|
Progress: os.Stdout,
|
||
|
Auth: publicKeyAuth,
|
||
|
Depth: 1,
|
||
|
ReferenceName: remoteBranch,
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
log.Err(err).Str("url", url).Str("publickey", publicKeyAuth.String()).Msg("Cant clone repository")
|
||
|
}
|
||
|
}
|