diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-03-26 17:11:20 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-03-26 17:11:20 -0700 |
commit | f8cb64e3d4d512a86c1b7b3aa584f11740b3d038 (patch) | |
tree | a679837356ebc7f598a0073a33ee0aea43edcd1e /hex.c | |
parent | Merge branch 'pb/recurse-submodules-fix' (diff) | |
parent | fast-import: add options for rewriting submodules (diff) | |
download | tgif-f8cb64e3d4d512a86c1b7b3aa584f11740b3d038.tar.xz |
Merge branch 'bc/sha-256-part-1-of-4'
SHA-256 transition continues.
* bc/sha-256-part-1-of-4: (22 commits)
fast-import: add options for rewriting submodules
fast-import: add a generic function to iterate over marks
fast-import: make find_marks work on any mark set
fast-import: add helper function for inserting mark object entries
fast-import: permit reading multiple marks files
commit: use expected signature header for SHA-256
worktree: allow repository version 1
init-db: move writing repo version into a function
builtin/init-db: add environment variable for new repo hash
builtin/init-db: allow specifying hash algorithm on command line
setup: allow check_repository_format to read repository format
t/helper: make repository tests hash independent
t/helper: initialize repository if necessary
t/helper/test-dump-split-index: initialize git repository
t6300: make hash algorithm independent
t6300: abstract away SHA-1-specific constants
t: use hash-specific lookup tables to define test constants
repository: require a build flag to use SHA-256
hex: add functions to parse hex object IDs in any algorithm
hex: introduce parsing variants taking hash algorithms
...
Diffstat (limited to 'hex.c')
-rw-r--r-- | hex.c | 55 |
1 files changed, 48 insertions, 7 deletions
@@ -47,32 +47,73 @@ int hex_to_bytes(unsigned char *binary, const char *hex, size_t len) return 0; } -int get_sha1_hex(const char *hex, unsigned char *sha1) +static int get_hash_hex_algop(const char *hex, unsigned char *hash, + const struct git_hash_algo *algop) { int i; - for (i = 0; i < the_hash_algo->rawsz; i++) { + for (i = 0; i < algop->rawsz; i++) { int val = hex2chr(hex); if (val < 0) return -1; - *sha1++ = val; + *hash++ = val; hex += 2; } return 0; } +int get_sha1_hex(const char *hex, unsigned char *sha1) +{ + return get_hash_hex_algop(hex, sha1, the_hash_algo); +} + +int get_oid_hex_algop(const char *hex, struct object_id *oid, + const struct git_hash_algo *algop) +{ + 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_sha1_hex(hex, oid->hash); + return get_oid_hex_algop(hex, oid, the_hash_algo); } -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 *algop) { - int ret = get_oid_hex(hex, oid); + int ret = get_hash_hex_algop(hex, oid->hash, algop); if (!ret) - *end = hex + the_hash_algo->hexsz; + *end = hex + algop->hexsz; 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); +} + char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash, const struct git_hash_algo *algop) { |