hex: add functions to parse hex object IDs in any algorithm

There are some places where we need to parse a hex object ID in any
algorithm without knowing beforehand which algorithm is in use. An
example is when parsing fast-import marks.

Add a get_oid_hex_any to parse an object ID and return the algorithm it
belongs to, and additionally add parse_oid_hex_any which is the
equivalent change for parse_oid_hex. If the object is not parseable, we
return GIT_HASH_UNKNOWN.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
brian m. carlson 2020-02-22 20:17:29 +00:00 committed by Junio C Hamano
parent dadacf10dc
commit 61e2a70ff2
2 changed files with 32 additions and 0 deletions

10
cache.h
View File

@ -1523,6 +1523,16 @@ int parse_oid_hex(const char *hex, struct object_id *oid, const char **end);
int parse_oid_hex_algop(const char *hex, struct object_id *oid, const char **end,
const struct git_hash_algo *algo);
/*
* These functions work like get_oid_hex and parse_oid_hex, but they will parse
* a hex value for any algorithm. The algorithm is detected based on the length
* and the algorithm in use is returned. If this is not a hex object ID in any
* algorithm, returns GIT_HASH_UNKNOWN.
*/
int get_oid_hex_any(const char *hex, struct object_id *oid);
int parse_oid_hex_any(const char *hex, struct object_id *oid, const char **end);
/*
* This reads short-hand syntax that not only evaluates to a commit
* object name, but also can act as if the end user spelled the name

22
hex.c
View File

@ -72,6 +72,20 @@ int get_oid_hex_algop(const char *hex, struct object_id *oid,
return get_hash_hex_algop(hex, oid->hash, algop);
}
/*
* NOTE: This function relies on hash algorithms being in order from shortest
* length to longest length.
*/
int get_oid_hex_any(const char *hex, struct object_id *oid)
{
int i;
for (i = GIT_HASH_NALGOS - 1; i > 0; i--) {
if (!get_hash_hex_algop(hex, oid->hash, &hash_algos[i]))
return i;
}
return GIT_HASH_UNKNOWN;
}
int get_oid_hex(const char *hex, struct object_id *oid)
{
return get_oid_hex_algop(hex, oid, the_hash_algo);
@ -87,6 +101,14 @@ int parse_oid_hex_algop(const char *hex, struct object_id *oid,
return ret;
}
int parse_oid_hex_any(const char *hex, struct object_id *oid, const char **end)
{
int ret = get_oid_hex_any(hex, oid);
if (ret)
*end = hex + hash_algos[ret].hexsz;
return ret;
}
int parse_oid_hex(const char *hex, struct object_id *oid, const char **end)
{
return parse_oid_hex_algop(hex, oid, end, the_hash_algo);