mirror of
https://github.com/git/git.git
synced 2024-11-20 04:33:56 +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
|
||||
dereferenced anymore (in which case, barf). '<rev>{caret}0'
|
||||
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}\{\}'::
|
||||
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) {
|
||||
if (!o || (!o->parsed && !parse_object(o->sha1)))
|
||||
return NULL;
|
||||
if (o->type == expected_type)
|
||||
if (expected_type == OBJ_ANY || o->type == expected_type)
|
||||
return o;
|
||||
if (o->type == OBJ_TAG)
|
||||
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;
|
||||
else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
|
||||
expected_type = OBJ_BLOB;
|
||||
else if (!prefixcmp(sp, "object}"))
|
||||
expected_type = OBJ_ANY;
|
||||
else if (sp[0] == '}')
|
||||
expected_type = OBJ_NONE;
|
||||
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)
|
||||
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))
|
||||
return -1;
|
||||
|
Loading…
Reference in New Issue
Block a user