Subject: [PATCH] http-push: push <remote> :<branch> deletes remote branch

From: Clemens Buchacher <[email-masked]>
Date: Mon, 18 Feb 2008 16:55:46 +0100

This mirrors current ssh/git push syntax.
---
On Mon, Feb 18, 2008 at 01:45:08PM +0000, Johannes Schindelin wrote:
> Besides, why don't you just try to imitate the code for "-d"?

I was hesitant to implement something that will only partially mirror the
behavior of git/ssh push. For example, git/ssh push will also update the
corresponding remote-tracking branches and give a status report
(new/deleted/updated/rejected etc.) at the end.

After playing with the code a little I feel more confident that the other
issues with http-push are unrelated to this patch and the differences between
git/ssh push and http-push are acceptable for now.

> So I think something like this should work, at the same place you added 
> your code:
> 
> 		if (is_zero_sha1(ref->peer_ref->new_sha1)) {
> 			if (delete_remote_branch(ref->peer_ref->name,
> 					force_delete || ref->force) == -1) {
> 				error("Could not remove %s",
> 					ref->peer_ref->name);
> 				rc = -4;
> 			}
> 			continue;
> 		}

Indeed. According to the rules listed in builtin-send-pack.c:442, I changed
(force_delete || ref->force) to 1.

Clemens

 http-push.c |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/http-push.c b/http-push.c
index f9b77d6..e98c52f 100644
--- a/http-push.c
+++ b/http-push.c
@@ -2138,6 +2138,8 @@ static int delete_remote_branch(char *pattern, int force)
 
 	/* Send delete request */
 	fprintf(stderr, "Removing remote branch '%s'\n", remote_ref->name);
+	if (dry_run)
+		return 0;
 	url = xmalloc(strlen(remote->url) + strlen(remote_ref->name) + 1);
 	sprintf(url, "%s%s", remote->url, remote_ref->name);
 	slot = get_active_slot();
@@ -2311,6 +2313,17 @@ int main(int argc, char **argv)
 
 		if (!ref->peer_ref)
 			continue;
+
+		if (is_zero_sha1(ref->peer_ref->new_sha1)) {
+			if (delete_remote_branch(ref->name, 1) == -1) {
+				error("Could not remove %s",
+					ref->peer_ref->name);
+				rc = -4;
+			}
+			new_refs++;
+			continue;
+		}
+
 		if (!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
 			if (push_verbosely || 1)
 				fprintf(stderr, "'%s': up-to-date\n", ref->name);
@@ -2342,11 +2355,6 @@ int main(int argc, char **argv)
 			}
 		}
 		hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
-		if (is_zero_sha1(ref->new_sha1)) {
-			error("cannot happen anymore");
-			rc = -3;
-			continue;
-		}
 		new_refs++;
 		strcpy(old_hex, sha1_to_hex(ref->old_sha1));
 		new_hex = sha1_to_hex(ref->new_sha1);
-- 
1.5.4.2.183.g69d3