From: Junio C Hamano Date: Wed, 13 Dec 2006 18:03:39 +0000 (-0800) Subject: git-push: accept tag as advertised. X-Git-Tag: v1.5.0-rc0~129 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=411fb8baa6862b76f7bdd9fc0d5844855a4db589;p=git.git git-push: accept tag as advertised. The documentation talked about "git push $URL tag " as a short-hand for refs/tags/:refs/tags/ 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 --- diff --git a/builtin-push.c b/builtin-push.c index d23974e70..b7412e829 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 shorthand without "); + 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(); }