gitea-page/internal/git/git.go
2022-10-14 14:30:40 +02:00

89 lines
No EOL
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")
}
}