summaryrefslogtreecommitdiff
path: root/builtin-push.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-12-13 10:03:39 -0800
committerJunio C Hamano <junkio@cox.net>2006-12-13 10:04:01 -0800
commit411fb8baa6862b76f7bdd9fc0d5844855a4db589 (patch)
tree72d27e82c689aa1a100cd8b89a578c327a0f34b9 /builtin-push.c
parent7ef0435088f41165ece95b6f226d3c15438505a5 (diff)
downloadgit-411fb8baa6862b76f7bdd9fc0d5844855a4db589.tar.gz
git-push: accept tag <tag> as advertised.
The documentation talked about "git push $URL tag <tag>" as a short-hand for refs/tags/<tag>:refs/tags/<tag> for a long time but that was never the case (the short-hand was for "git fetch"). Instead of fixing the documentation, just add a bit of code to match it since it is easy to do and would make it more consistent. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'builtin-push.c')
-rw-r--r--builtin-push.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/builtin-push.c b/builtin-push.c
index d23974e708..b7412e8293 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -57,11 +57,36 @@ static void expand_refspecs(void)
static void set_refspecs(const char **refs, int nr)
{
if (nr) {
- size_t bytes = nr * sizeof(char *);
-
- refspec = xrealloc(refspec, bytes);
- memcpy(refspec, refs, bytes);
- refspec_nr = nr;
+ int pass;
+ for (pass = 0; pass < 2; pass++) {
+ /* pass 0 counts and allocates, pass 1 fills */
+ int i, cnt;
+ for (i = cnt = 0; i < nr; i++) {
+ if (!strcmp("tag", refs[i])) {
+ int len;
+ char *tag;
+ if (nr <= ++i)
+ die("tag <tag> shorthand without <tag>");
+ if (pass) {
+ len = strlen(refs[i]) + 11;
+ tag = xmalloc(len);
+ strcpy(tag, "refs/tags/");
+ strcat(tag, refs[i]);
+ refspec[cnt] = tag;
+ }
+ cnt++;
+ continue;
+ }
+ if (pass)
+ refspec[cnt] = refs[i];
+ cnt++;
+ }
+ if (!pass) {
+ size_t bytes = cnt * sizeof(char *);
+ refspec_nr = cnt;
+ refspec = xrealloc(refspec, bytes);
+ }
+ }
}
expand_refspecs();
}