mirror of
https://github.com/git/git.git
synced 2024-11-29 13:06:07 +08:00
builtin/push.c: use strbuf instead of manual allocation
The command line arguments given to "git push" are massaged into a list of refspecs in set_refspecs() function. This was implemented using xmalloc, strcpy and friends, but it is much easier to read if done using strbuf. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
daad3aa255
commit
50d829c11a
@ -41,29 +41,22 @@ static void set_refspecs(const char **refs, int nr)
|
||||
for (i = 0; i < nr; i++) {
|
||||
const char *ref = refs[i];
|
||||
if (!strcmp("tag", ref)) {
|
||||
char *tag;
|
||||
int len;
|
||||
struct strbuf tagref = STRBUF_INIT;
|
||||
if (nr <= ++i)
|
||||
die(_("tag shorthand without <tag>"));
|
||||
len = strlen(refs[i]) + 11;
|
||||
if (deleterefs) {
|
||||
tag = xmalloc(len+1);
|
||||
strcpy(tag, ":refs/tags/");
|
||||
} else {
|
||||
tag = xmalloc(len);
|
||||
strcpy(tag, "refs/tags/");
|
||||
}
|
||||
strcat(tag, refs[i]);
|
||||
ref = tag;
|
||||
} else if (deleterefs && !strchr(ref, ':')) {
|
||||
char *delref;
|
||||
int len = strlen(ref)+1;
|
||||
delref = xmalloc(len+1);
|
||||
strcpy(delref, ":");
|
||||
strcat(delref, ref);
|
||||
ref = delref;
|
||||
} else if (deleterefs)
|
||||
ref = refs[i];
|
||||
if (deleterefs)
|
||||
strbuf_addf(&tagref, ":refs/tags/%s", ref);
|
||||
else
|
||||
strbuf_addf(&tagref, "refs/tags/%s", ref);
|
||||
ref = strbuf_detach(&tagref, NULL);
|
||||
} else if (deleterefs) {
|
||||
struct strbuf delref = STRBUF_INIT;
|
||||
if (strchr(ref, ':'))
|
||||
die(_("--delete only accepts plain target ref names"));
|
||||
strbuf_addf(&delref, ":%s", ref);
|
||||
ref = strbuf_detach(&delref, NULL);
|
||||
}
|
||||
add_refspec(ref);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user