@@ -168,7 +168,17 @@ func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) {
168
168
}
169
169
}
170
170
171
- rs , err := pushHashes (ctx , s , r .s , req , hashesToPush , r .useRefDeltas (ar ))
171
+ if len (hashesToPush ) == 0 {
172
+ allDelete = true
173
+ for _ , command := range req .Commands {
174
+ if command .Action () != packp .Delete {
175
+ allDelete = false
176
+ break
177
+ }
178
+ }
179
+ }
180
+
181
+ rs , err := pushHashes (ctx , s , r .s , req , hashesToPush , r .useRefDeltas (ar ), allDelete )
172
182
if err != nil {
173
183
return err
174
184
}
@@ -1033,10 +1043,11 @@ func pushHashes(
1033
1043
req * packp.ReferenceUpdateRequest ,
1034
1044
hs []plumbing.Hash ,
1035
1045
useRefDeltas bool ,
1046
+ allDelete bool ,
1036
1047
) (* packp.ReportStatus , error ) {
1037
1048
1038
1049
rd , wr := io .Pipe ()
1039
- req . Packfile = rd
1050
+
1040
1051
config , err := s .Config ()
1041
1052
if err != nil {
1042
1053
return nil , err
@@ -1047,15 +1058,20 @@ func pushHashes(
1047
1058
// to the channel.
1048
1059
done := make (chan error , 1 )
1049
1060
1050
- go func () {
1051
- e := packfile .NewEncoder (wr , s , useRefDeltas )
1052
- if _ , err := e .Encode (hs , config .Pack .Window ); err != nil {
1053
- done <- wr .CloseWithError (err )
1054
- return
1055
- }
1061
+ if ! allDelete {
1062
+ req .Packfile = rd
1063
+ go func () {
1064
+ e := packfile .NewEncoder (wr , s , useRefDeltas )
1065
+ if _ , err := e .Encode (hs , config .Pack .Window ); err != nil {
1066
+ done <- wr .CloseWithError (err )
1067
+ return
1068
+ }
1056
1069
1057
- done <- wr .Close ()
1058
- }()
1070
+ done <- wr .Close ()
1071
+ }()
1072
+ } else {
1073
+ close (done )
1074
+ }
1059
1075
1060
1076
rs , err := sess .ReceivePack (ctx , req )
1061
1077
if err != nil {
0 commit comments