spiegel/internal/git/git.go

147 lines
2.5 KiB
Go
Raw Normal View History

package git
import (
"errors"
"io"
"os"
2024-05-22 02:59:08 +02:00
"strings"
2024-05-22 03:07:33 +02:00
"git.gnous.eu/ada/spiegel/internal/utils"
goGit "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing/serverinfo"
2024-05-22 03:07:33 +02:00
"github.com/go-git/go-git/v5/plumbing/transport/ssh"
"github.com/go-git/go-git/v5/storage/filesystem"
"github.com/sirupsen/logrus"
)
func StartClone(repoList []Config) {
logrus.Debug("Start first repository clone")
for _, content := range repoList {
_, err := os.Stat(content.FullPath)
if os.IsNotExist(err) {
content.fullClone()
}
}
}
func (c Config) fullClone() {
2024-05-22 01:45:19 +02:00
logrus.Debug("Clone ", c.Name, "...")
logger := logrus.New()
w := logger.Writer()
defer func(w *io.PipeWriter) {
err := w.Close()
if err != nil {
logrus.Error(err)
2024-05-22 02:59:08 +02:00
return
}
}(w)
2024-05-22 01:45:19 +02:00
repoConfig := &goGit.CloneOptions{
URL: c.URL,
Progress: w,
Mirror: true,
2024-05-22 01:45:19 +02:00
}
2024-05-22 03:07:33 +02:00
if !utils.IsHTTPRepo(c.URL) {
2024-05-22 02:59:08 +02:00
key, err := os.ReadFile(c.SSHKey)
if err != nil {
logrus.Error(err)
return
}
user := strings.Split(c.URL, "@")[0]
url := strings.Split(c.URL, "@")[1]
sshAuth, err := ssh.NewPublicKeys(user, key, "")
if err != nil {
logrus.Error(err)
return
}
repoConfig.Auth = sshAuth
repoConfig.URL = url
}
2024-05-22 01:45:19 +02:00
_, err := goGit.PlainClone(c.FullPath, true, repoConfig)
if err != nil {
2024-05-22 01:45:19 +02:00
logrus.Error(err)
}
err = c.UpdateInfo()
if err != nil {
logrus.Error(err)
}
}
func (c Config) Update() {
2024-05-22 01:45:19 +02:00
repo, err := goGit.PlainOpen(c.FullPath)
if err != nil {
logrus.Error(err)
return
}
2024-05-22 01:45:19 +02:00
logrus.Debug("Clone ", c.Name, "...")
logger := logrus.New()
w := logger.Writer()
defer func(w *io.PipeWriter) {
err := w.Close()
if err != nil {
logrus.Error(err)
}
}(w)
2024-05-22 02:59:08 +02:00
fetchConfig := &goGit.FetchOptions{
Progress: w,
2024-05-22 02:59:08 +02:00
}
2024-05-22 03:07:33 +02:00
if !utils.IsHTTPRepo(c.URL) {
2024-05-22 02:59:08 +02:00
key, err := os.ReadFile(c.SSHKey)
if err != nil {
logrus.Error(err)
return
}
user := strings.Split(c.URL, "@")[0]
sshAuth, err := ssh.NewPublicKeys(user, key, "")
if err != nil {
logrus.Error(err)
return
}
fetchConfig.Auth = sshAuth
}
err = repo.Fetch(fetchConfig)
if err != nil {
if errors.Is(err, goGit.NoErrAlreadyUpToDate) {
2024-05-22 01:45:19 +02:00
logrus.Info(c.Name, " is already up-to-date")
} else {
logrus.Error(err)
}
}
err = c.UpdateInfo()
if err != nil {
logrus.Error(err)
}
}
func (c Config) UpdateInfo() error {
r, err := goGit.PlainOpen(c.FullPath)
if err != nil {
return err
}
err = serverinfo.UpdateServerInfo(r.Storer, r.Storer.(*filesystem.Storage).Filesystem()) //nolint: forcetypeassert
if err != nil {
return err
}
return nil
}