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

Commit 57570e8

Browse files
authored
Merge pull request #833 from jfontan/slow-reference-update
git: remote, Do not iterate all references on update.
2 parents e63b032 + 939793b commit 57570e8

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

remote.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,14 +371,22 @@ func (r *Remote) addReferencesToUpdate(
371371
refspecs []config.RefSpec,
372372
localRefs []*plumbing.Reference,
373373
remoteRefs storer.ReferenceStorer,
374-
req *packp.ReferenceUpdateRequest) error {
374+
req *packp.ReferenceUpdateRequest,
375+
) error {
376+
// This references dictionary will be used to search references by name.
377+
refsDict := make(map[string]*plumbing.Reference)
378+
for _, ref := range localRefs {
379+
refsDict[ref.Name().String()] = ref
380+
}
381+
375382
for _, rs := range refspecs {
376383
if rs.IsDelete() {
377384
if err := r.deleteReferences(rs, remoteRefs, req); err != nil {
378385
return err
379386
}
380387
} else {
381-
if err := r.addOrUpdateReferences(rs, localRefs, remoteRefs, req); err != nil {
388+
err := r.addOrUpdateReferences(rs, localRefs, refsDict, remoteRefs, req)
389+
if err != nil {
382390
return err
383391
}
384392
}
@@ -390,9 +398,21 @@ func (r *Remote) addReferencesToUpdate(
390398
func (r *Remote) addOrUpdateReferences(
391399
rs config.RefSpec,
392400
localRefs []*plumbing.Reference,
401+
refsDict map[string]*plumbing.Reference,
393402
remoteRefs storer.ReferenceStorer,
394403
req *packp.ReferenceUpdateRequest,
395404
) error {
405+
// If it is not a wilcard refspec we can directly search for the reference
406+
// in the references dictionary.
407+
if !rs.IsWildcard() {
408+
ref, ok := refsDict[rs.Src()]
409+
if !ok {
410+
return nil
411+
}
412+
413+
return r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req)
414+
}
415+
396416
for _, ref := range localRefs {
397417
err := r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req)
398418
if err != nil {

0 commit comments

Comments
 (0)