@@ -201,7 +201,7 @@ func (r *Remote) newReferenceUpdateRequest(
201201 }
202202 }
203203
204- if err := r .addReferencesToUpdate (o .RefSpecs , localRefs , remoteRefs , req ); err != nil {
204+ if err := r .addReferencesToUpdate (o .RefSpecs , localRefs , remoteRefs , req , o . Prune ); err != nil {
205205 return nil , err
206206 }
207207
@@ -389,6 +389,7 @@ func (r *Remote) addReferencesToUpdate(
389389 localRefs []* plumbing.Reference ,
390390 remoteRefs storer.ReferenceStorer ,
391391 req * packp.ReferenceUpdateRequest ,
392+ prune bool ,
392393) error {
393394 // This references dictionary will be used to search references by name.
394395 refsDict := make (map [string ]* plumbing.Reference )
@@ -398,14 +399,20 @@ func (r *Remote) addReferencesToUpdate(
398399
399400 for _ , rs := range refspecs {
400401 if rs .IsDelete () {
401- if err := r .deleteReferences (rs , remoteRefs , req ); err != nil {
402+ if err := r .deleteReferences (rs , remoteRefs , refsDict , req , false ); err != nil {
402403 return err
403404 }
404405 } else {
405406 err := r .addOrUpdateReferences (rs , localRefs , refsDict , remoteRefs , req )
406407 if err != nil {
407408 return err
408409 }
410+
411+ if prune {
412+ if err := r .deleteReferences (rs , remoteRefs , refsDict , req , true ); err != nil {
413+ return err
414+ }
415+ }
409416 }
410417 }
411418
@@ -441,7 +448,10 @@ func (r *Remote) addOrUpdateReferences(
441448}
442449
443450func (r * Remote ) deleteReferences (rs config.RefSpec ,
444- remoteRefs storer.ReferenceStorer , req * packp.ReferenceUpdateRequest ) error {
451+ remoteRefs storer.ReferenceStorer ,
452+ refsDict map [string ]* plumbing.Reference ,
453+ req * packp.ReferenceUpdateRequest ,
454+ prune bool ) error {
445455 iter , err := remoteRefs .IterReferences ()
446456 if err != nil {
447457 return err
@@ -452,8 +462,19 @@ func (r *Remote) deleteReferences(rs config.RefSpec,
452462 return nil
453463 }
454464
455- if rs .Dst ("" ) != ref .Name () {
456- return nil
465+ if prune {
466+ rs := rs .Reverse ()
467+ if ! rs .Match (ref .Name ()) {
468+ return nil
469+ }
470+
471+ if _ , ok := refsDict [rs .Dst (ref .Name ()).String ()]; ok {
472+ return nil
473+ }
474+ } else {
475+ if rs .Dst ("" ) != ref .Name () {
476+ return nil
477+ }
457478 }
458479
459480 cmd := & packp.Command {
0 commit comments