зеркало из https://github.com/microsoft/git.git
[PATCH] Add a new extended SHA1 syntax <name>~<num>
The new notation is a short-hand for <name> followed by <num> caret ('^') characters. E.g. "master~4" is the fourth generation ancestor of the current "master" branch head, following the first parents; same as "master^^^^" but a bit more readable. This will be used in the updated "git show-branch" command. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
792fe559d0
Коммит
4f7599ac25
41
sha1_name.c
41
sha1_name.c
|
@ -191,9 +191,29 @@ static int get_parent(const char *name, int len,
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int get_nth_ancestor(const char *name, int len,
|
||||
unsigned char *result, int generation)
|
||||
{
|
||||
unsigned char sha1[20];
|
||||
int ret = get_sha1_1(name, len, sha1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
while (generation--) {
|
||||
struct commit *commit = lookup_commit_reference(sha1);
|
||||
|
||||
if (!commit || parse_commit(commit) || !commit->parents)
|
||||
return -1;
|
||||
memcpy(sha1, commit->parents->item->object.sha1, 20);
|
||||
}
|
||||
memcpy(result, sha1, 20);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_sha1_1(const char *name, int len, unsigned char *sha1)
|
||||
{
|
||||
int parent, ret;
|
||||
const char *cp;
|
||||
|
||||
/* foo^[0-9] or foo^ (== foo^1); we do not do more than 9 parents. */
|
||||
if (len > 2 && name[len-2] == '^' &&
|
||||
|
@ -210,6 +230,27 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1)
|
|||
if (parent >= 0)
|
||||
return get_parent(name, len, sha1, parent);
|
||||
|
||||
/* "name~3" is "name^^^",
|
||||
* "name~12" is "name^^^^^^^^^^^^", and
|
||||
* "name~" and "name~0" are name -- not "name^0"!
|
||||
*/
|
||||
parent = 0;
|
||||
for (cp = name + len - 1; name <= cp; cp--) {
|
||||
int ch = *cp;
|
||||
if ('0' <= ch && ch <= '9')
|
||||
continue;
|
||||
if (ch != '~')
|
||||
parent = -1;
|
||||
break;
|
||||
}
|
||||
if (!parent && *cp == '~') {
|
||||
int len1 = cp - name;
|
||||
cp++;
|
||||
while (cp < name + len)
|
||||
parent = parent * 10 + *cp++ - '0';
|
||||
return get_nth_ancestor(name, len1, sha1, parent);
|
||||
}
|
||||
|
||||
ret = get_sha1_basic(name, len, sha1);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
|
Загрузка…
Ссылка в новой задаче