diff options
Diffstat (limited to 'internal/vcs/repository.go')
-rw-r--r-- | internal/vcs/repository.go | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/internal/vcs/repository.go b/internal/vcs/repository.go index 625fbd2..5950e53 100644 --- a/internal/vcs/repository.go +++ b/internal/vcs/repository.go @@ -2,11 +2,13 @@ package vcs import ( "os" - "website/internal/config" - "website/internal/log" + + "go.alanpearce.eu/website/internal/config" + "go.alanpearce.eu/x/log" "github.com/go-git/go-git/v5" - "github.com/pkg/errors" + "github.com/go-git/go-git/v5/plumbing" + "gitlab.com/tozd/go/errors" ) type Config struct { @@ -17,9 +19,10 @@ type Config struct { type Repository struct { repo *git.Repository + log *log.Logger } -func CloneOrUpdate(cfg *Config) (*Repository, error) { +func CloneOrUpdate(cfg *Config, log *log.Logger) (*Repository, error) { gr, err := git.PlainClone(cfg.LocalPath, false, &git.CloneOptions{ URL: cfg.RemoteURL.String(), Progress: os.Stdout, @@ -34,8 +37,9 @@ func CloneOrUpdate(cfg *Config) (*Repository, error) { } repo := &Repository{ repo: gr, + log: log, } - _, err := repo.Update(cfg) + _, err := repo.Update() if err != nil { return nil, err } @@ -45,29 +49,25 @@ func CloneOrUpdate(cfg *Config) (*Repository, error) { return &Repository{ repo: gr, + log: log, }, nil } -func (r *Repository) Update(cfg *Config) (bool, error) { - log.Info("updating repository") +func (r *Repository) Update() (bool, error) { + r.log.Info("updating repository") head, err := r.repo.Head() if err != nil { return false, err } - log.Info("updating from", "rev", head.Hash().String()) - wt, err := r.repo.Worktree() - if err != nil { - return false, err - } - err = wt.Pull(&git.PullOptions{ - SingleBranch: true, - Force: true, + r.log.Info("updating from", "rev", head.Hash().String()) + err = r.repo.Fetch(&git.FetchOptions{ + Prune: true, }) if err != nil { if errors.Is(err, git.NoErrAlreadyUpToDate) { - log.Info("already up-to-date") + r.log.Info("already up-to-date") return true, nil } @@ -75,11 +75,31 @@ func (r *Repository) Update(cfg *Config) (bool, error) { return false, err } - head, err = r.repo.Head() + rem, err := r.repo.Remote("origin") + if err != nil { + return false, err + } + refs, err := rem.List(&git.ListOptions{ + Timeout: 5, + }) + + var hash plumbing.Hash + for _, ref := range refs { + if ref.Name() == plumbing.Main { + hash = ref.Hash() + } + } + + wt, err := r.repo.Worktree() if err != nil { return false, err } - log.Info("updated to", "rev", head.Hash().String()) + wt.Checkout(&git.CheckoutOptions{ + Hash: hash, + Force: true, + }) + + r.log.Info("updated to", "rev", hash) return true, r.Clean(wt) } |