mirror of
https://github.com/git/git.git
synced 2024-11-20 06:14:01 +01:00
Merge branch 'jc/sha1-name-object-peeler'
There was no good way to ask "I have a random string that came from outside world. I want to turn it into a 40-hex object name while making sure such an object exists". A new peeling suffix ^{object} can be used for that purpose, together with "rev-parse --verify". * jc/sha1-name-object-peeler: peel_onion(): teach $foo^{object} peeler peel_onion: disambiguate to favor tree-ish when we know we want a tree-ish
This commit is contained in:
commit
1b7b22bfd0
@ -116,6 +116,11 @@ some output processing may assume ref names in UTF-8.
|
|||||||
object of that type is found or the object cannot be
|
object of that type is found or the object cannot be
|
||||||
dereferenced anymore (in which case, barf). '<rev>{caret}0'
|
dereferenced anymore (in which case, barf). '<rev>{caret}0'
|
||||||
is a short-hand for '<rev>{caret}\{commit\}'.
|
is a short-hand for '<rev>{caret}\{commit\}'.
|
||||||
|
+
|
||||||
|
'rev{caret}\{object\}' can be used to make sure 'rev' names an
|
||||||
|
object that exists, without requiring 'rev' to be a tag, and
|
||||||
|
without dereferencing 'rev'; because a tag is already an object,
|
||||||
|
it does not have to be dereferenced even once to get to an object.
|
||||||
|
|
||||||
'<rev>{caret}\{\}', e.g. 'v0.99.8{caret}\{\}'::
|
'<rev>{caret}\{\}', e.g. 'v0.99.8{caret}\{\}'::
|
||||||
A suffix '{caret}' followed by an empty brace pair
|
A suffix '{caret}' followed by an empty brace pair
|
||||||
|
@ -594,7 +594,7 @@ struct object *peel_to_type(const char *name, int namelen,
|
|||||||
while (1) {
|
while (1) {
|
||||||
if (!o || (!o->parsed && !parse_object(o->sha1)))
|
if (!o || (!o->parsed && !parse_object(o->sha1)))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (o->type == expected_type)
|
if (expected_type == OBJ_ANY || o->type == expected_type)
|
||||||
return o;
|
return o;
|
||||||
if (o->type == OBJ_TAG)
|
if (o->type == OBJ_TAG)
|
||||||
o = ((struct tag*) o)->tagged;
|
o = ((struct tag*) o)->tagged;
|
||||||
@ -645,6 +645,8 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
|
|||||||
expected_type = OBJ_TREE;
|
expected_type = OBJ_TREE;
|
||||||
else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
|
else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
|
||||||
expected_type = OBJ_BLOB;
|
expected_type = OBJ_BLOB;
|
||||||
|
else if (!prefixcmp(sp, "object}"))
|
||||||
|
expected_type = OBJ_ANY;
|
||||||
else if (sp[0] == '}')
|
else if (sp[0] == '}')
|
||||||
expected_type = OBJ_NONE;
|
expected_type = OBJ_NONE;
|
||||||
else if (sp[0] == '/')
|
else if (sp[0] == '/')
|
||||||
@ -654,6 +656,8 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
|
|||||||
|
|
||||||
if (expected_type == OBJ_COMMIT)
|
if (expected_type == OBJ_COMMIT)
|
||||||
lookup_flags = GET_SHA1_COMMITTISH;
|
lookup_flags = GET_SHA1_COMMITTISH;
|
||||||
|
else if (expected_type == OBJ_TREE)
|
||||||
|
lookup_flags = GET_SHA1_TREEISH;
|
||||||
|
|
||||||
if (get_sha1_1(name, sp - name - 2, outer, lookup_flags))
|
if (get_sha1_1(name, sp - name - 2, outer, lookup_flags))
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user