diff options
author | Junio C Hamano <junkio@cox.net> | 2006-12-13 10:03:39 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-13 10:04:01 -0800 |
commit | 411fb8baa6862b76f7bdd9fc0d5844855a4db589 (patch) | |
tree | 72d27e82c689aa1a100cd8b89a578c327a0f34b9 | |
parent | 7ef0435088f41165ece95b6f226d3c15438505a5 (diff) | |
download | git-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>
-rw-r--r-- | builtin-push.c | 35 |
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(); } |