diff options
author | Paulo Gomes <pjbgf@linux.com> | 2024-02-22 11:01:31 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-22 11:01:31 +0000 |
commit | 74a89ee9543b3019ac6046828c0b860bbd9a54f4 (patch) | |
tree | 5a1676030ef2fc64eb164243a6de361d3429e3f0 /remote.go | |
parent | 686a0f7a492894fc3efd67e8be99a4240b9b65ec (diff) | |
parent | 577ec1f3aee1c02ac611cdfe02f89bfaa3840e4f (diff) | |
download | go-git-74a89ee9543b3019ac6046828c0b860bbd9a54f4.tar.gz |
Merge pull request #366 from juliens/prune
remote: fetch, adds the prune option.
Diffstat (limited to 'remote.go')
-rw-r--r-- | remote.go | 31 |
1 files changed, 30 insertions, 1 deletions
@@ -470,6 +470,14 @@ func (r *Remote) fetch(ctx context.Context, o *FetchOptions) (sto storer.Referen } } + var updatedPrune bool + if o.Prune { + updatedPrune, err = r.pruneRemotes(o.RefSpecs, localRefs, remoteRefs) + if err != nil { + return nil, err + } + } + updated, err := r.updateLocalReferenceStorage(o.RefSpecs, refs, remoteRefs, specToRefs, o.Tags, o.Force) if err != nil { return nil, err @@ -482,7 +490,7 @@ func (r *Remote) fetch(ctx context.Context, o *FetchOptions) (sto storer.Referen } } - if !updated { + if !updated && !updatedPrune { return remoteRefs, NoErrAlreadyUpToDate } @@ -574,6 +582,27 @@ func (r *Remote) fetchPack(ctx context.Context, o *FetchOptions, s transport.Upl return err } +func (r *Remote) pruneRemotes(specs []config.RefSpec, localRefs []*plumbing.Reference, remoteRefs memory.ReferenceStorage) (bool, error) { + var updatedPrune bool + for _, spec := range specs { + rev := spec.Reverse() + for _, ref := range localRefs { + if !rev.Match(ref.Name()) { + continue + } + _, err := remoteRefs.Reference(rev.Dst(ref.Name())) + if errors.Is(err, plumbing.ErrReferenceNotFound) { + updatedPrune = true + err := r.s.RemoveReference(ref.Name()) + if err != nil { + return false, err + } + } + } + } + return updatedPrune, nil +} + func (r *Remote) addReferencesToUpdate( refspecs []config.RefSpec, localRefs []*plumbing.Reference, |