Skip to content
This repository has been archived by the owner on Sep 11, 2020. It is now read-only.

Commit

Permalink
Merge pull request #833 from jfontan/slow-reference-update
Browse files Browse the repository at this point in the history
git: remote, Do not iterate all references on update.
  • Loading branch information
mcuadros authored May 16, 2018
2 parents e63b032 + 939793b commit 57570e8
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,14 +371,22 @@ func (r *Remote) addReferencesToUpdate(
refspecs []config.RefSpec,
localRefs []*plumbing.Reference,
remoteRefs storer.ReferenceStorer,
req *packp.ReferenceUpdateRequest) error {
req *packp.ReferenceUpdateRequest,
) error {
// This references dictionary will be used to search references by name.
refsDict := make(map[string]*plumbing.Reference)
for _, ref := range localRefs {
refsDict[ref.Name().String()] = ref
}

for _, rs := range refspecs {
if rs.IsDelete() {
if err := r.deleteReferences(rs, remoteRefs, req); err != nil {
return err
}
} else {
if err := r.addOrUpdateReferences(rs, localRefs, remoteRefs, req); err != nil {
err := r.addOrUpdateReferences(rs, localRefs, refsDict, remoteRefs, req)
if err != nil {
return err
}
}
Expand All @@ -390,9 +398,21 @@ func (r *Remote) addReferencesToUpdate(
func (r *Remote) addOrUpdateReferences(
rs config.RefSpec,
localRefs []*plumbing.Reference,
refsDict map[string]*plumbing.Reference,
remoteRefs storer.ReferenceStorer,
req *packp.ReferenceUpdateRequest,
) error {
// If it is not a wilcard refspec we can directly search for the reference
// in the references dictionary.
if !rs.IsWildcard() {
ref, ok := refsDict[rs.Src()]
if !ok {
return nil
}

return r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req)
}

for _, ref := range localRefs {
err := r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req)
if err != nil {
Expand Down

0 comments on commit 57570e8

Please sign in to comment.