mirror of
https://github.com/git/git.git
synced 2024-11-18 22:14:34 +01:00
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:
parent
dadacf10dc
commit
61e2a70ff2
10
cache.h
10
cache.h
@ -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
22
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;
|
||||
}
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user