path: root/hex.c
diff options
authorbrian m. carlson <>2020-02-22 20:17:29 (GMT)
committerJunio C Hamano <>2020-02-24 17:33:21 (GMT)
commit61e2a70ff26f83f761fa36e0cc16996878d8dd59 (patch)
treeb1b73887d34402bb39b536c42b3332b413d01c03 /hex.c
parentdadacf10dc9e11046e2c8c49347174e71cef3fa3 (diff)
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 <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'hex.c')
1 files changed, 22 insertions, 0 deletions
diff --git a/hex.c b/hex.c
index 10e24dc..da51e64 100644
--- a/hex.c
+++ b/hex.c
@@ -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;
+ }
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);