Git fork

hash-ll: merge with "hash.h"

The "hash-ll.h" header was introduced via d1cbe1e6d8 (hash-ll.h: split
out of hash.h to remove dependency on repository.h, 2023-04-22) to make
explicit the split between hash-related functions that rely on the
global `the_repository`, and those that don't. This split is no longer
necessary now that we we have removed the reliance on `the_repository`.

Merge "hash-ll.h" back into "hash.h". This causes some code units to not
include "repository.h" anymore, which requires us to add some forward
declarations.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Patrick Steinhardt and committed by
Junio C Hamano
8a676bdc 36026a0f

+400 -398
+1 -1
apply.h
··· 1 1 #ifndef APPLY_H 2 2 #define APPLY_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "lockfile.h" 6 6 #include "string-list.h" 7 7 #include "strmap.h"
+1
bloom.c
··· 6 6 #include "commit-graph.h" 7 7 #include "commit.h" 8 8 #include "commit-slab.h" 9 + #include "repository.h" 9 10 10 11 define_commit_slab(bloom_filter_slab, struct bloom_filter); 11 12
+1 -1
checkout.h
··· 1 1 #ifndef CHECKOUT_H 2 2 #define CHECKOUT_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 /* 7 7 * Check if the branch name uniquely matches a branch name on a remote
+1 -1
chunk-format.h
··· 1 1 #ifndef CHUNK_FORMAT_H 2 2 #define CHUNK_FORMAT_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 struct hashfile; 7 7 struct chunkfile;
+2
commit-graph.h
··· 122 122 struct commit_graph *read_commit_graph_one(struct repository *r, 123 123 struct object_directory *odb); 124 124 125 + struct repo_settings; 126 + 125 127 /* 126 128 * Callers should initialize the repo_settings with prepare_repo_settings() 127 129 * prior to calling parse_commit_graph().
+1 -1
compat/sha1-chunked.c
··· 1 1 #include "git-compat-util.h" 2 - #include "hash-ll.h" 2 + #include "hash.h" 3 3 4 4 int git_SHA1_Update_Chunked(platform_SHA_CTX *c, const void *data, size_t len) 5 5 {
+1 -1
convert.h
··· 4 4 #ifndef CONVERT_H 5 5 #define CONVERT_H 6 6 7 - #include "hash-ll.h" 7 + #include "hash.h" 8 8 #include "string-list.h" 9 9 10 10 struct index_state;
+1 -1
csum-file.h
··· 1 1 #ifndef CSUM_FILE_H 2 2 #define CSUM_FILE_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "write-or-die.h" 6 6 7 7 struct progress;
+1 -1
diff.h
··· 4 4 #ifndef DIFF_H 5 5 #define DIFF_H 6 6 7 - #include "hash-ll.h" 7 + #include "hash.h" 8 8 #include "pathspec.h" 9 9 #include "strbuf.h" 10 10
+1 -1
diffcore.h
··· 4 4 #ifndef DIFFCORE_H 5 5 #define DIFFCORE_H 6 6 7 - #include "hash-ll.h" 7 + #include "hash.h" 8 8 9 9 struct diff_options; 10 10 struct mem_pool;
+1 -1
dir.h
··· 1 1 #ifndef DIR_H 2 2 #define DIR_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "hashmap.h" 6 6 #include "pathspec.h" 7 7 #include "statinfo.h"
-364
hash-ll.h
··· 1 - #ifndef HASH_LL_H 2 - #define HASH_LL_H 3 - 4 - #if defined(SHA1_APPLE) 5 - #include <CommonCrypto/CommonDigest.h> 6 - #elif defined(SHA1_OPENSSL) 7 - # include <openssl/sha.h> 8 - # if defined(OPENSSL_API_LEVEL) && OPENSSL_API_LEVEL >= 3 9 - # define SHA1_NEEDS_CLONE_HELPER 10 - # include "sha1/openssl.h" 11 - # endif 12 - #elif defined(SHA1_DC) 13 - #include "sha1dc_git.h" 14 - #else /* SHA1_BLK */ 15 - #include "block-sha1/sha1.h" 16 - #endif 17 - 18 - #if defined(SHA256_NETTLE) 19 - #include "sha256/nettle.h" 20 - #elif defined(SHA256_GCRYPT) 21 - #define SHA256_NEEDS_CLONE_HELPER 22 - #include "sha256/gcrypt.h" 23 - #elif defined(SHA256_OPENSSL) 24 - # include <openssl/sha.h> 25 - # if defined(OPENSSL_API_LEVEL) && OPENSSL_API_LEVEL >= 3 26 - # define SHA256_NEEDS_CLONE_HELPER 27 - # include "sha256/openssl.h" 28 - # endif 29 - #else 30 - #include "sha256/block/sha256.h" 31 - #endif 32 - 33 - #ifndef platform_SHA_CTX 34 - /* 35 - * platform's underlying implementation of SHA-1; could be OpenSSL, 36 - * blk_SHA, Apple CommonCrypto, etc... Note that the relevant 37 - * SHA-1 header may have already defined platform_SHA_CTX for our 38 - * own implementations like block-sha1, so we list 39 - * the default for OpenSSL compatible SHA-1 implementations here. 40 - */ 41 - #define platform_SHA_CTX SHA_CTX 42 - #define platform_SHA1_Init SHA1_Init 43 - #define platform_SHA1_Update SHA1_Update 44 - #define platform_SHA1_Final SHA1_Final 45 - #endif 46 - 47 - #define git_SHA_CTX platform_SHA_CTX 48 - #define git_SHA1_Init platform_SHA1_Init 49 - #define git_SHA1_Update platform_SHA1_Update 50 - #define git_SHA1_Final platform_SHA1_Final 51 - 52 - #ifdef platform_SHA1_Clone 53 - #define git_SHA1_Clone platform_SHA1_Clone 54 - #endif 55 - 56 - #ifndef platform_SHA256_CTX 57 - #define platform_SHA256_CTX SHA256_CTX 58 - #define platform_SHA256_Init SHA256_Init 59 - #define platform_SHA256_Update SHA256_Update 60 - #define platform_SHA256_Final SHA256_Final 61 - #endif 62 - 63 - #define git_SHA256_CTX platform_SHA256_CTX 64 - #define git_SHA256_Init platform_SHA256_Init 65 - #define git_SHA256_Update platform_SHA256_Update 66 - #define git_SHA256_Final platform_SHA256_Final 67 - 68 - #ifdef platform_SHA256_Clone 69 - #define git_SHA256_Clone platform_SHA256_Clone 70 - #endif 71 - 72 - #ifdef SHA1_MAX_BLOCK_SIZE 73 - #include "compat/sha1-chunked.h" 74 - #undef git_SHA1_Update 75 - #define git_SHA1_Update git_SHA1_Update_Chunked 76 - #endif 77 - 78 - #ifndef SHA1_NEEDS_CLONE_HELPER 79 - static inline void git_SHA1_Clone(git_SHA_CTX *dst, const git_SHA_CTX *src) 80 - { 81 - memcpy(dst, src, sizeof(*dst)); 82 - } 83 - #endif 84 - 85 - #ifndef SHA256_NEEDS_CLONE_HELPER 86 - static inline void git_SHA256_Clone(git_SHA256_CTX *dst, const git_SHA256_CTX *src) 87 - { 88 - memcpy(dst, src, sizeof(*dst)); 89 - } 90 - #endif 91 - 92 - /* 93 - * Note that these constants are suitable for indexing the hash_algos array and 94 - * comparing against each other, but are otherwise arbitrary, so they should not 95 - * be exposed to the user or serialized to disk. To know whether a 96 - * git_hash_algo struct points to some usable hash function, test the format_id 97 - * field for being non-zero. Use the name field for user-visible situations and 98 - * the format_id field for fixed-length fields on disk. 99 - */ 100 - /* An unknown hash function. */ 101 - #define GIT_HASH_UNKNOWN 0 102 - /* SHA-1 */ 103 - #define GIT_HASH_SHA1 1 104 - /* SHA-256 */ 105 - #define GIT_HASH_SHA256 2 106 - /* Number of algorithms supported (including unknown). */ 107 - #define GIT_HASH_NALGOS (GIT_HASH_SHA256 + 1) 108 - 109 - /* "sha1", big-endian */ 110 - #define GIT_SHA1_FORMAT_ID 0x73686131 111 - 112 - /* The length in bytes and in hex digits of an object name (SHA-1 value). */ 113 - #define GIT_SHA1_RAWSZ 20 114 - #define GIT_SHA1_HEXSZ (2 * GIT_SHA1_RAWSZ) 115 - /* The block size of SHA-1. */ 116 - #define GIT_SHA1_BLKSZ 64 117 - 118 - /* "s256", big-endian */ 119 - #define GIT_SHA256_FORMAT_ID 0x73323536 120 - 121 - /* The length in bytes and in hex digits of an object name (SHA-256 value). */ 122 - #define GIT_SHA256_RAWSZ 32 123 - #define GIT_SHA256_HEXSZ (2 * GIT_SHA256_RAWSZ) 124 - /* The block size of SHA-256. */ 125 - #define GIT_SHA256_BLKSZ 64 126 - 127 - /* The length in byte and in hex digits of the largest possible hash value. */ 128 - #define GIT_MAX_RAWSZ GIT_SHA256_RAWSZ 129 - #define GIT_MAX_HEXSZ GIT_SHA256_HEXSZ 130 - /* The largest possible block size for any supported hash. */ 131 - #define GIT_MAX_BLKSZ GIT_SHA256_BLKSZ 132 - 133 - struct object_id { 134 - unsigned char hash[GIT_MAX_RAWSZ]; 135 - int algo; /* XXX requires 4-byte alignment */ 136 - }; 137 - 138 - #define GET_OID_QUIETLY 01 139 - #define GET_OID_COMMIT 02 140 - #define GET_OID_COMMITTISH 04 141 - #define GET_OID_TREE 010 142 - #define GET_OID_TREEISH 020 143 - #define GET_OID_BLOB 040 144 - #define GET_OID_FOLLOW_SYMLINKS 0100 145 - #define GET_OID_RECORD_PATH 0200 146 - #define GET_OID_ONLY_TO_DIE 04000 147 - #define GET_OID_REQUIRE_PATH 010000 148 - #define GET_OID_HASH_ANY 020000 149 - 150 - #define GET_OID_DISAMBIGUATORS \ 151 - (GET_OID_COMMIT | GET_OID_COMMITTISH | \ 152 - GET_OID_TREE | GET_OID_TREEISH | \ 153 - GET_OID_BLOB) 154 - 155 - enum get_oid_result { 156 - FOUND = 0, 157 - MISSING_OBJECT = -1, /* The requested object is missing */ 158 - SHORT_NAME_AMBIGUOUS = -2, 159 - /* The following only apply when symlinks are followed */ 160 - DANGLING_SYMLINK = -4, /* 161 - * The initial symlink is there, but 162 - * (transitively) points to a missing 163 - * in-tree file 164 - */ 165 - SYMLINK_LOOP = -5, 166 - NOT_DIR = -6, /* 167 - * Somewhere along the symlink chain, a path is 168 - * requested which contains a file as a 169 - * non-final element. 170 - */ 171 - }; 172 - 173 - /* A suitably aligned type for stack allocations of hash contexts. */ 174 - union git_hash_ctx { 175 - git_SHA_CTX sha1; 176 - git_SHA256_CTX sha256; 177 - }; 178 - typedef union git_hash_ctx git_hash_ctx; 179 - 180 - typedef void (*git_hash_init_fn)(git_hash_ctx *ctx); 181 - typedef void (*git_hash_clone_fn)(git_hash_ctx *dst, const git_hash_ctx *src); 182 - typedef void (*git_hash_update_fn)(git_hash_ctx *ctx, const void *in, size_t len); 183 - typedef void (*git_hash_final_fn)(unsigned char *hash, git_hash_ctx *ctx); 184 - typedef void (*git_hash_final_oid_fn)(struct object_id *oid, git_hash_ctx *ctx); 185 - 186 - struct git_hash_algo { 187 - /* 188 - * The name of the algorithm, as appears in the config file and in 189 - * messages. 190 - */ 191 - const char *name; 192 - 193 - /* A four-byte version identifier, used in pack indices. */ 194 - uint32_t format_id; 195 - 196 - /* The length of the hash in binary. */ 197 - size_t rawsz; 198 - 199 - /* The length of the hash in hex characters. */ 200 - size_t hexsz; 201 - 202 - /* The block size of the hash. */ 203 - size_t blksz; 204 - 205 - /* The hash initialization function. */ 206 - git_hash_init_fn init_fn; 207 - 208 - /* The hash context cloning function. */ 209 - git_hash_clone_fn clone_fn; 210 - 211 - /* The hash update function. */ 212 - git_hash_update_fn update_fn; 213 - 214 - /* The hash finalization function. */ 215 - git_hash_final_fn final_fn; 216 - 217 - /* The hash finalization function for object IDs. */ 218 - git_hash_final_oid_fn final_oid_fn; 219 - 220 - /* The OID of the empty tree. */ 221 - const struct object_id *empty_tree; 222 - 223 - /* The OID of the empty blob. */ 224 - const struct object_id *empty_blob; 225 - 226 - /* The all-zeros OID. */ 227 - const struct object_id *null_oid; 228 - }; 229 - extern const struct git_hash_algo hash_algos[GIT_HASH_NALGOS]; 230 - 231 - /* 232 - * Return a GIT_HASH_* constant based on the name. Returns GIT_HASH_UNKNOWN if 233 - * the name doesn't match a known algorithm. 234 - */ 235 - int hash_algo_by_name(const char *name); 236 - /* Identical, except based on the format ID. */ 237 - int hash_algo_by_id(uint32_t format_id); 238 - /* Identical, except based on the length. */ 239 - int hash_algo_by_length(int len); 240 - /* Identical, except for a pointer to struct git_hash_algo. */ 241 - static inline int hash_algo_by_ptr(const struct git_hash_algo *p) 242 - { 243 - return p - hash_algos; 244 - } 245 - 246 - const struct object_id *null_oid(void); 247 - 248 - static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop) 249 - { 250 - /* 251 - * Teach the compiler that there are only two possibilities of hash size 252 - * here, so that it can optimize for this case as much as possible. 253 - */ 254 - if (algop->rawsz == GIT_MAX_RAWSZ) 255 - return memcmp(sha1, sha2, GIT_MAX_RAWSZ); 256 - return memcmp(sha1, sha2, GIT_SHA1_RAWSZ); 257 - } 258 - 259 - static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop) 260 - { 261 - /* 262 - * We write this here instead of deferring to hashcmp so that the 263 - * compiler can properly inline it and avoid calling memcmp. 264 - */ 265 - if (algop->rawsz == GIT_MAX_RAWSZ) 266 - return !memcmp(sha1, sha2, GIT_MAX_RAWSZ); 267 - return !memcmp(sha1, sha2, GIT_SHA1_RAWSZ); 268 - } 269 - 270 - static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src, 271 - const struct git_hash_algo *algop) 272 - { 273 - memcpy(sha_dst, sha_src, algop->rawsz); 274 - } 275 - 276 - static inline void hashclr(unsigned char *hash, const struct git_hash_algo *algop) 277 - { 278 - memset(hash, 0, algop->rawsz); 279 - } 280 - 281 - static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2) 282 - { 283 - return memcmp(oid1->hash, oid2->hash, GIT_MAX_RAWSZ); 284 - } 285 - 286 - static inline int oideq(const struct object_id *oid1, const struct object_id *oid2) 287 - { 288 - return !memcmp(oid1->hash, oid2->hash, GIT_MAX_RAWSZ); 289 - } 290 - 291 - static inline void oidcpy(struct object_id *dst, const struct object_id *src) 292 - { 293 - memcpy(dst->hash, src->hash, GIT_MAX_RAWSZ); 294 - dst->algo = src->algo; 295 - } 296 - 297 - static inline void oidread(struct object_id *oid, const unsigned char *hash, 298 - const struct git_hash_algo *algop) 299 - { 300 - memcpy(oid->hash, hash, algop->rawsz); 301 - if (algop->rawsz < GIT_MAX_RAWSZ) 302 - memset(oid->hash + algop->rawsz, 0, GIT_MAX_RAWSZ - algop->rawsz); 303 - oid->algo = hash_algo_by_ptr(algop); 304 - } 305 - 306 - static inline void oidclr(struct object_id *oid, 307 - const struct git_hash_algo *algop) 308 - { 309 - memset(oid->hash, 0, GIT_MAX_RAWSZ); 310 - oid->algo = hash_algo_by_ptr(algop); 311 - } 312 - 313 - static inline struct object_id *oiddup(const struct object_id *src) 314 - { 315 - struct object_id *dst = xmalloc(sizeof(struct object_id)); 316 - oidcpy(dst, src); 317 - return dst; 318 - } 319 - 320 - static inline void oid_set_algo(struct object_id *oid, const struct git_hash_algo *algop) 321 - { 322 - oid->algo = hash_algo_by_ptr(algop); 323 - } 324 - 325 - /* 326 - * Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code 327 - * for use in hash tables. Cryptographic hashes are supposed to have 328 - * uniform distribution, so in contrast to `memhash()`, this just copies 329 - * the first `sizeof(int)` bytes without shuffling any bits. Note that 330 - * the results will be different on big-endian and little-endian 331 - * platforms, so they should not be stored or transferred over the net. 332 - */ 333 - static inline unsigned int oidhash(const struct object_id *oid) 334 - { 335 - /* 336 - * Equivalent to 'return *(unsigned int *)oid->hash;', but safe on 337 - * platforms that don't support unaligned reads. 338 - */ 339 - unsigned int hash; 340 - memcpy(&hash, oid->hash, sizeof(hash)); 341 - return hash; 342 - } 343 - 344 - static inline int is_null_oid(const struct object_id *oid) 345 - { 346 - static const unsigned char null_hash[GIT_MAX_RAWSZ]; 347 - return !memcmp(oid->hash, null_hash, GIT_MAX_RAWSZ); 348 - } 349 - 350 - const char *empty_tree_oid_hex(const struct git_hash_algo *algop); 351 - 352 - static inline int is_empty_blob_oid(const struct object_id *oid, 353 - const struct git_hash_algo *algop) 354 - { 355 - return oideq(oid, algop->empty_blob); 356 - } 357 - 358 - static inline int is_empty_tree_oid(const struct object_id *oid, 359 - const struct git_hash_algo *algop) 360 - { 361 - return oideq(oid, algop->empty_tree); 362 - } 363 - 364 - #endif
+360 -2
hash.h
··· 1 1 #ifndef HASH_H 2 2 #define HASH_H 3 3 4 - #include "hash-ll.h" 5 - #include "repository.h" 4 + #if defined(SHA1_APPLE) 5 + #include <CommonCrypto/CommonDigest.h> 6 + #elif defined(SHA1_OPENSSL) 7 + # include <openssl/sha.h> 8 + # if defined(OPENSSL_API_LEVEL) && OPENSSL_API_LEVEL >= 3 9 + # define SHA1_NEEDS_CLONE_HELPER 10 + # include "sha1/openssl.h" 11 + # endif 12 + #elif defined(SHA1_DC) 13 + #include "sha1dc_git.h" 14 + #else /* SHA1_BLK */ 15 + #include "block-sha1/sha1.h" 16 + #endif 17 + 18 + #if defined(SHA256_NETTLE) 19 + #include "sha256/nettle.h" 20 + #elif defined(SHA256_GCRYPT) 21 + #define SHA256_NEEDS_CLONE_HELPER 22 + #include "sha256/gcrypt.h" 23 + #elif defined(SHA256_OPENSSL) 24 + # include <openssl/sha.h> 25 + # if defined(OPENSSL_API_LEVEL) && OPENSSL_API_LEVEL >= 3 26 + # define SHA256_NEEDS_CLONE_HELPER 27 + # include "sha256/openssl.h" 28 + # endif 29 + #else 30 + #include "sha256/block/sha256.h" 31 + #endif 32 + 33 + #ifndef platform_SHA_CTX 34 + /* 35 + * platform's underlying implementation of SHA-1; could be OpenSSL, 36 + * blk_SHA, Apple CommonCrypto, etc... Note that the relevant 37 + * SHA-1 header may have already defined platform_SHA_CTX for our 38 + * own implementations like block-sha1, so we list 39 + * the default for OpenSSL compatible SHA-1 implementations here. 40 + */ 41 + #define platform_SHA_CTX SHA_CTX 42 + #define platform_SHA1_Init SHA1_Init 43 + #define platform_SHA1_Update SHA1_Update 44 + #define platform_SHA1_Final SHA1_Final 45 + #endif 46 + 47 + #define git_SHA_CTX platform_SHA_CTX 48 + #define git_SHA1_Init platform_SHA1_Init 49 + #define git_SHA1_Update platform_SHA1_Update 50 + #define git_SHA1_Final platform_SHA1_Final 51 + 52 + #ifdef platform_SHA1_Clone 53 + #define git_SHA1_Clone platform_SHA1_Clone 54 + #endif 55 + 56 + #ifndef platform_SHA256_CTX 57 + #define platform_SHA256_CTX SHA256_CTX 58 + #define platform_SHA256_Init SHA256_Init 59 + #define platform_SHA256_Update SHA256_Update 60 + #define platform_SHA256_Final SHA256_Final 61 + #endif 62 + 63 + #define git_SHA256_CTX platform_SHA256_CTX 64 + #define git_SHA256_Init platform_SHA256_Init 65 + #define git_SHA256_Update platform_SHA256_Update 66 + #define git_SHA256_Final platform_SHA256_Final 67 + 68 + #ifdef platform_SHA256_Clone 69 + #define git_SHA256_Clone platform_SHA256_Clone 70 + #endif 71 + 72 + #ifdef SHA1_MAX_BLOCK_SIZE 73 + #include "compat/sha1-chunked.h" 74 + #undef git_SHA1_Update 75 + #define git_SHA1_Update git_SHA1_Update_Chunked 76 + #endif 77 + 78 + #ifndef SHA1_NEEDS_CLONE_HELPER 79 + static inline void git_SHA1_Clone(git_SHA_CTX *dst, const git_SHA_CTX *src) 80 + { 81 + memcpy(dst, src, sizeof(*dst)); 82 + } 83 + #endif 84 + 85 + #ifndef SHA256_NEEDS_CLONE_HELPER 86 + static inline void git_SHA256_Clone(git_SHA256_CTX *dst, const git_SHA256_CTX *src) 87 + { 88 + memcpy(dst, src, sizeof(*dst)); 89 + } 90 + #endif 91 + 92 + /* 93 + * Note that these constants are suitable for indexing the hash_algos array and 94 + * comparing against each other, but are otherwise arbitrary, so they should not 95 + * be exposed to the user or serialized to disk. To know whether a 96 + * git_hash_algo struct points to some usable hash function, test the format_id 97 + * field for being non-zero. Use the name field for user-visible situations and 98 + * the format_id field for fixed-length fields on disk. 99 + */ 100 + /* An unknown hash function. */ 101 + #define GIT_HASH_UNKNOWN 0 102 + /* SHA-1 */ 103 + #define GIT_HASH_SHA1 1 104 + /* SHA-256 */ 105 + #define GIT_HASH_SHA256 2 106 + /* Number of algorithms supported (including unknown). */ 107 + #define GIT_HASH_NALGOS (GIT_HASH_SHA256 + 1) 108 + 109 + /* "sha1", big-endian */ 110 + #define GIT_SHA1_FORMAT_ID 0x73686131 111 + 112 + /* The length in bytes and in hex digits of an object name (SHA-1 value). */ 113 + #define GIT_SHA1_RAWSZ 20 114 + #define GIT_SHA1_HEXSZ (2 * GIT_SHA1_RAWSZ) 115 + /* The block size of SHA-1. */ 116 + #define GIT_SHA1_BLKSZ 64 117 + 118 + /* "s256", big-endian */ 119 + #define GIT_SHA256_FORMAT_ID 0x73323536 120 + 121 + /* The length in bytes and in hex digits of an object name (SHA-256 value). */ 122 + #define GIT_SHA256_RAWSZ 32 123 + #define GIT_SHA256_HEXSZ (2 * GIT_SHA256_RAWSZ) 124 + /* The block size of SHA-256. */ 125 + #define GIT_SHA256_BLKSZ 64 126 + 127 + /* The length in byte and in hex digits of the largest possible hash value. */ 128 + #define GIT_MAX_RAWSZ GIT_SHA256_RAWSZ 129 + #define GIT_MAX_HEXSZ GIT_SHA256_HEXSZ 130 + /* The largest possible block size for any supported hash. */ 131 + #define GIT_MAX_BLKSZ GIT_SHA256_BLKSZ 132 + 133 + struct object_id { 134 + unsigned char hash[GIT_MAX_RAWSZ]; 135 + int algo; /* XXX requires 4-byte alignment */ 136 + }; 137 + 138 + #define GET_OID_QUIETLY 01 139 + #define GET_OID_COMMIT 02 140 + #define GET_OID_COMMITTISH 04 141 + #define GET_OID_TREE 010 142 + #define GET_OID_TREEISH 020 143 + #define GET_OID_BLOB 040 144 + #define GET_OID_FOLLOW_SYMLINKS 0100 145 + #define GET_OID_RECORD_PATH 0200 146 + #define GET_OID_ONLY_TO_DIE 04000 147 + #define GET_OID_REQUIRE_PATH 010000 148 + #define GET_OID_HASH_ANY 020000 149 + 150 + #define GET_OID_DISAMBIGUATORS \ 151 + (GET_OID_COMMIT | GET_OID_COMMITTISH | \ 152 + GET_OID_TREE | GET_OID_TREEISH | \ 153 + GET_OID_BLOB) 154 + 155 + enum get_oid_result { 156 + FOUND = 0, 157 + MISSING_OBJECT = -1, /* The requested object is missing */ 158 + SHORT_NAME_AMBIGUOUS = -2, 159 + /* The following only apply when symlinks are followed */ 160 + DANGLING_SYMLINK = -4, /* 161 + * The initial symlink is there, but 162 + * (transitively) points to a missing 163 + * in-tree file 164 + */ 165 + SYMLINK_LOOP = -5, 166 + NOT_DIR = -6, /* 167 + * Somewhere along the symlink chain, a path is 168 + * requested which contains a file as a 169 + * non-final element. 170 + */ 171 + }; 6 172 7 173 #ifdef USE_THE_REPOSITORY_VARIABLE 174 + # include "repository.h" 8 175 # define the_hash_algo the_repository->hash_algo 9 176 #endif 177 + 178 + /* A suitably aligned type for stack allocations of hash contexts. */ 179 + union git_hash_ctx { 180 + git_SHA_CTX sha1; 181 + git_SHA256_CTX sha256; 182 + }; 183 + typedef union git_hash_ctx git_hash_ctx; 184 + 185 + typedef void (*git_hash_init_fn)(git_hash_ctx *ctx); 186 + typedef void (*git_hash_clone_fn)(git_hash_ctx *dst, const git_hash_ctx *src); 187 + typedef void (*git_hash_update_fn)(git_hash_ctx *ctx, const void *in, size_t len); 188 + typedef void (*git_hash_final_fn)(unsigned char *hash, git_hash_ctx *ctx); 189 + typedef void (*git_hash_final_oid_fn)(struct object_id *oid, git_hash_ctx *ctx); 190 + 191 + struct git_hash_algo { 192 + /* 193 + * The name of the algorithm, as appears in the config file and in 194 + * messages. 195 + */ 196 + const char *name; 197 + 198 + /* A four-byte version identifier, used in pack indices. */ 199 + uint32_t format_id; 200 + 201 + /* The length of the hash in binary. */ 202 + size_t rawsz; 203 + 204 + /* The length of the hash in hex characters. */ 205 + size_t hexsz; 206 + 207 + /* The block size of the hash. */ 208 + size_t blksz; 209 + 210 + /* The hash initialization function. */ 211 + git_hash_init_fn init_fn; 212 + 213 + /* The hash context cloning function. */ 214 + git_hash_clone_fn clone_fn; 215 + 216 + /* The hash update function. */ 217 + git_hash_update_fn update_fn; 218 + 219 + /* The hash finalization function. */ 220 + git_hash_final_fn final_fn; 221 + 222 + /* The hash finalization function for object IDs. */ 223 + git_hash_final_oid_fn final_oid_fn; 224 + 225 + /* The OID of the empty tree. */ 226 + const struct object_id *empty_tree; 227 + 228 + /* The OID of the empty blob. */ 229 + const struct object_id *empty_blob; 230 + 231 + /* The all-zeros OID. */ 232 + const struct object_id *null_oid; 233 + }; 234 + extern const struct git_hash_algo hash_algos[GIT_HASH_NALGOS]; 235 + 236 + /* 237 + * Return a GIT_HASH_* constant based on the name. Returns GIT_HASH_UNKNOWN if 238 + * the name doesn't match a known algorithm. 239 + */ 240 + int hash_algo_by_name(const char *name); 241 + /* Identical, except based on the format ID. */ 242 + int hash_algo_by_id(uint32_t format_id); 243 + /* Identical, except based on the length. */ 244 + int hash_algo_by_length(int len); 245 + /* Identical, except for a pointer to struct git_hash_algo. */ 246 + static inline int hash_algo_by_ptr(const struct git_hash_algo *p) 247 + { 248 + return p - hash_algos; 249 + } 250 + 251 + const struct object_id *null_oid(void); 252 + 253 + static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop) 254 + { 255 + /* 256 + * Teach the compiler that there are only two possibilities of hash size 257 + * here, so that it can optimize for this case as much as possible. 258 + */ 259 + if (algop->rawsz == GIT_MAX_RAWSZ) 260 + return memcmp(sha1, sha2, GIT_MAX_RAWSZ); 261 + return memcmp(sha1, sha2, GIT_SHA1_RAWSZ); 262 + } 263 + 264 + static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop) 265 + { 266 + /* 267 + * We write this here instead of deferring to hashcmp so that the 268 + * compiler can properly inline it and avoid calling memcmp. 269 + */ 270 + if (algop->rawsz == GIT_MAX_RAWSZ) 271 + return !memcmp(sha1, sha2, GIT_MAX_RAWSZ); 272 + return !memcmp(sha1, sha2, GIT_SHA1_RAWSZ); 273 + } 274 + 275 + static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src, 276 + const struct git_hash_algo *algop) 277 + { 278 + memcpy(sha_dst, sha_src, algop->rawsz); 279 + } 280 + 281 + static inline void hashclr(unsigned char *hash, const struct git_hash_algo *algop) 282 + { 283 + memset(hash, 0, algop->rawsz); 284 + } 285 + 286 + static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2) 287 + { 288 + return memcmp(oid1->hash, oid2->hash, GIT_MAX_RAWSZ); 289 + } 290 + 291 + static inline int oideq(const struct object_id *oid1, const struct object_id *oid2) 292 + { 293 + return !memcmp(oid1->hash, oid2->hash, GIT_MAX_RAWSZ); 294 + } 295 + 296 + static inline void oidcpy(struct object_id *dst, const struct object_id *src) 297 + { 298 + memcpy(dst->hash, src->hash, GIT_MAX_RAWSZ); 299 + dst->algo = src->algo; 300 + } 301 + 302 + static inline void oidread(struct object_id *oid, const unsigned char *hash, 303 + const struct git_hash_algo *algop) 304 + { 305 + memcpy(oid->hash, hash, algop->rawsz); 306 + if (algop->rawsz < GIT_MAX_RAWSZ) 307 + memset(oid->hash + algop->rawsz, 0, GIT_MAX_RAWSZ - algop->rawsz); 308 + oid->algo = hash_algo_by_ptr(algop); 309 + } 310 + 311 + static inline void oidclr(struct object_id *oid, 312 + const struct git_hash_algo *algop) 313 + { 314 + memset(oid->hash, 0, GIT_MAX_RAWSZ); 315 + oid->algo = hash_algo_by_ptr(algop); 316 + } 317 + 318 + static inline struct object_id *oiddup(const struct object_id *src) 319 + { 320 + struct object_id *dst = xmalloc(sizeof(struct object_id)); 321 + oidcpy(dst, src); 322 + return dst; 323 + } 324 + 325 + static inline void oid_set_algo(struct object_id *oid, const struct git_hash_algo *algop) 326 + { 327 + oid->algo = hash_algo_by_ptr(algop); 328 + } 329 + 330 + /* 331 + * Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code 332 + * for use in hash tables. Cryptographic hashes are supposed to have 333 + * uniform distribution, so in contrast to `memhash()`, this just copies 334 + * the first `sizeof(int)` bytes without shuffling any bits. Note that 335 + * the results will be different on big-endian and little-endian 336 + * platforms, so they should not be stored or transferred over the net. 337 + */ 338 + static inline unsigned int oidhash(const struct object_id *oid) 339 + { 340 + /* 341 + * Equivalent to 'return *(unsigned int *)oid->hash;', but safe on 342 + * platforms that don't support unaligned reads. 343 + */ 344 + unsigned int hash; 345 + memcpy(&hash, oid->hash, sizeof(hash)); 346 + return hash; 347 + } 348 + 349 + static inline int is_null_oid(const struct object_id *oid) 350 + { 351 + static const unsigned char null_hash[GIT_MAX_RAWSZ]; 352 + return !memcmp(oid->hash, null_hash, GIT_MAX_RAWSZ); 353 + } 354 + 355 + const char *empty_tree_oid_hex(const struct git_hash_algo *algop); 356 + 357 + static inline int is_empty_blob_oid(const struct object_id *oid, 358 + const struct git_hash_algo *algop) 359 + { 360 + return oideq(oid, algop->empty_blob); 361 + } 362 + 363 + static inline int is_empty_tree_oid(const struct object_id *oid, 364 + const struct git_hash_algo *algop) 365 + { 366 + return oideq(oid, algop->empty_tree); 367 + } 10 368 11 369 #endif
+1 -1
hex.h
··· 1 1 #ifndef HEX_H 2 2 #define HEX_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "hex-ll.h" 6 6 7 7 /*
+2
loose.h
··· 3 3 4 4 #include "khash.h" 5 5 6 + struct repository; 7 + 6 8 struct loose_object_map { 7 9 kh_oid_map_t *to_compat; 8 10 kh_oid_map_t *to_storage;
+1 -1
merge-ort.h
··· 2 2 #define MERGE_ORT_H 3 3 4 4 #include "merge-recursive.h" 5 - #include "hash-ll.h" 5 + #include "hash.h" 6 6 7 7 struct commit; 8 8 struct tree;
+1 -1
object-file-convert.c
··· 5 5 #include "strbuf.h" 6 6 #include "hex.h" 7 7 #include "repository.h" 8 - #include "hash-ll.h" 8 + #include "hash.h" 9 9 #include "hash.h" 10 10 #include "object.h" 11 11 #include "loose.h"
+1 -1
object.h
··· 1 1 #ifndef OBJECT_H 2 2 #define OBJECT_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 struct buffer_slab; 7 7 struct repository;
+1 -1
oidmap.h
··· 1 1 #ifndef OIDMAP_H 2 2 #define OIDMAP_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "hashmap.h" 6 6 7 7 /*
+1 -1
oidtree.h
··· 2 2 #define OIDTREE_H 3 3 4 4 #include "cbtree.h" 5 - #include "hash-ll.h" 5 + #include "hash.h" 6 6 #include "mem-pool.h" 7 7 8 8 struct oidtree {
+2
packfile.h
··· 101 101 102 102 uint32_t get_pack_fanout(struct packed_git *p, uint32_t value); 103 103 104 + struct raw_object_store; 105 + 104 106 unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *); 105 107 void close_pack_windows(struct packed_git *); 106 108 void close_pack(struct packed_git *);
+1 -1
protocol-caps.c
··· 3 3 #include "gettext.h" 4 4 #include "hex.h" 5 5 #include "pkt-line.h" 6 - #include "hash-ll.h" 6 + #include "hash.h" 7 7 #include "hex.h" 8 8 #include "object.h" 9 9 #include "object-store-ll.h"
+1 -1
read-cache-ll.h
··· 1 1 #ifndef READ_CACHE_LL_H 2 2 #define READ_CACHE_LL_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "hashmap.h" 6 6 #include "statinfo.h" 7 7
+1 -1
refs/ref-cache.h
··· 1 1 #ifndef REFS_REF_CACHE_H 2 2 #define REFS_REF_CACHE_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 struct ref_dir; 7 7 struct ref_store;
+1 -1
reftable/dump.c
··· 7 7 */ 8 8 9 9 #include "git-compat-util.h" 10 - #include "hash-ll.h" 10 + #include "hash.h" 11 11 12 12 #include "reftable-blocksource.h" 13 13 #include "reftable-error.h"
+1 -1
reftable/reftable-record.h
··· 9 9 #ifndef REFTABLE_RECORD_H 10 10 #define REFTABLE_RECORD_H 11 11 12 - #include "hash-ll.h" 12 + #include "hash.h" 13 13 #include <stdint.h> 14 14 15 15 /*
+1 -1
reftable/system.h
··· 15 15 #include "lockfile.h" 16 16 #include "strbuf.h" 17 17 #include "tempfile.h" 18 - #include "hash-ll.h" /* hash ID, sizes.*/ 18 + #include "hash.h" /* hash ID, sizes.*/ 19 19 #include "dir.h" /* remove_dir_recursively, for tests.*/ 20 20 21 21 int hash_size(uint32_t id);
+1 -1
remote.h
··· 1 1 #ifndef REMOTE_H 2 2 #define REMOTE_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "hashmap.h" 6 6 #include "refspec.h" 7 7
+1 -1
reset.h
··· 1 1 #ifndef RESET_H 2 2 #define RESET_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "repository.h" 6 6 7 7 #define GIT_REFLOG_ACTION_ENVIRONMENT "GIT_REFLOG_ACTION"
+1 -1
resolve-undo.h
··· 6 6 struct pathspec; 7 7 struct string_list; 8 8 9 - #include "hash-ll.h" 9 + #include "hash.h" 10 10 11 11 struct resolve_undo_info { 12 12 unsigned int mode[3];
+1 -1
serve.c
··· 3 3 #include "git-compat-util.h" 4 4 #include "repository.h" 5 5 #include "config.h" 6 - #include "hash-ll.h" 6 + #include "hash.h" 7 7 #include "pkt-line.h" 8 8 #include "version.h" 9 9 #include "ls-refs.h"
+1 -1
split-index.h
··· 1 1 #ifndef SPLIT_INDEX_H 2 2 #define SPLIT_INDEX_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 struct index_state; 7 7 struct strbuf;
+1 -1
t/helper/test-hash-speed.c
··· 1 1 #include "test-tool.h" 2 - #include "hash-ll.h" 2 + #include "hash.h" 3 3 4 4 #define NUM_SECONDS 3 5 5
+1 -1
t/helper/test-sha1.c
··· 1 1 #include "test-tool.h" 2 - #include "hash-ll.h" 2 + #include "hash.h" 3 3 4 4 int cmd__sha1(int ac, const char **av) 5 5 {
+1 -1
t/helper/test-sha256.c
··· 1 1 #include "test-tool.h" 2 - #include "hash-ll.h" 2 + #include "hash.h" 3 3 4 4 int cmd__sha256(int ac, const char **av) 5 5 {
+1 -1
t/unit-tests/lib-oid.h
··· 1 1 #ifndef LIB_OID_H 2 2 #define LIB_OID_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 /* 7 7 * Convert arbitrary hex string to object_id.
+1
tree-diff.c
··· 8 8 #include "tree.h" 9 9 #include "tree-walk.h" 10 10 #include "environment.h" 11 + #include "repository.h" 11 12 12 13 /* 13 14 * Some mode bits are also used internally for computations.
+1 -1
tree-walk.h
··· 1 1 #ifndef TREE_WALK_H 2 2 #define TREE_WALK_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 6 6 struct index_state; 7 7 struct repository;
+1 -1
xdiff-interface.h
··· 1 1 #ifndef XDIFF_INTERFACE_H 2 2 #define XDIFF_INTERFACE_H 3 3 4 - #include "hash-ll.h" 4 + #include "hash.h" 5 5 #include "xdiff/xdiff.h" 6 6 7 7 /*