All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jan Krüger" <jk@jk.gs>
To: Git ML <git@vger.kernel.org>
Subject: [PATCH RFC] builtin-push: add --delete as syntactic sugar for :foo
Date: Mon, 9 Nov 2009 13:09:35 +0100	[thread overview]
Message-ID: <20091109130935.2bea7771@perceptron> (raw)

Refspecs without a source side have been reported as confusing by many.
As an alternative, this adds support for commands like:

    git push origin --delete somebranch

Specifically, --delete will prepend a colon to all colon-less refspecs
given on the command line.

Signed-off-by: Jan Krüger <jk@jk.gs>
---
Since I consider this extension pure syntactic sugar, it doesn't change
the underlying transport code. As such it's a relatively non-invasive
change.

One might imagine a different implementation that supports combining
--delete with --all and/or --tags, but perhaps it's better if people
are forced to do that kind of thing manually.

 builtin-push.c        |   15 +++++++++++++++
 t/t5516-fetch-push.sh |    6 ++++++
 2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/builtin-push.c b/builtin-push.c
index 8631c06..4ae9166 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -15,6 +15,7 @@ static const char * const push_usage[] = {
 };
 
 static int thin;
+static int deleterefs;
 static const char *receivepack;
 
 static const char **refspec;
@@ -44,6 +45,14 @@ static void set_refspecs(const char **refs, int nr)
 			strcat(tag, refs[i]);
 			ref = tag;
 		}
+		if (deleterefs && !strchr(ref, ':')) {
+			char *delref;
+			int len = strlen(refs[i] + 1);
+			delref = xmalloc(len);
+			strcpy(delref, ":");
+			strcat(delref, refs[i]);
+			ref = delref;
+		}
 		add_refspec(ref);
 	}
 }
@@ -181,6 +190,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)
 		OPT_BIT( 0 , "all", &flags, "push all refs", TRANSPORT_PUSH_ALL),
 		OPT_BIT( 0 , "mirror", &flags, "mirror all refs",
 			    (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
+		OPT_BOOLEAN( 0, "delete", &deleterefs, "delete refs"),
 		OPT_BOOLEAN( 0 , "tags", &tags, "push tags (can't be used with --all or --mirror)"),
 		OPT_BIT('n' , "dry-run", &flags, "dry run", TRANSPORT_PUSH_DRY_RUN),
 		OPT_BIT( 0,  "porcelain", &flags, "machine-readable output", TRANSPORT_PUSH_PORCELAIN),
@@ -193,6 +203,11 @@ int cmd_push(int argc, const char **argv, const char *prefix)
 
 	argc = parse_options(argc, argv, prefix, options, push_usage, 0);
 
+	if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
+		die("--delete is incompatible with --all, --mirror and --tags");
+	if (deleterefs && argc < 2)
+		die("--delete doesn't make sense without any refs");
+
 	if (tags)
 		add_refspec("refs/tags/*");
 
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 6889a53..aa1450a 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -546,6 +546,12 @@ test_expect_success 'allow deleting an invalid remote ref' '
 
 '
 
+test_expect_success 'allow deleting a ref using --delete' '
+	mk_test heads/master &&
+	git push testrepo --delete master &&
+	(cd testrepo && test_must_fail git rev-parse --verify refs/heads/master)
+'
+
 test_expect_success 'warn on push to HEAD of non-bare repository' '
 	mk_test heads/master
 	(cd testrepo &&
-- 
1.6.5.2.155.gbb47.dirty

             reply	other threads:[~2009-11-09 12:09 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-09 12:09 Jan Krüger [this message]
2009-11-09 16:59 ` [PATCH RFC] builtin-push: add --delete as syntactic sugar for :foo Junio C Hamano
2009-11-09 17:08   ` Junio C Hamano
2009-11-09 17:20   ` Sverre Rabbelier
2009-11-09 18:20   ` [PATCH RFC v2] " Jan Krüger
2009-12-29 11:05     ` Nanako Shiraishi
2009-12-29 16:58       ` Junio C Hamano
2009-12-30  9:52         ` [PATCH v3] " Jan Krüger
2009-12-30 12:14           ` Sverre Rabbelier
2009-12-30 19:49           ` Junio C Hamano
2009-12-30 19:57             ` [PATCH v4] " Jan Krüger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091109130935.2bea7771@perceptron \
    --to=jk@jk.gs \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.