mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
![brian m. carlson](/assets/img/avatar_default.png)
Currently, we always read a object ID of the current algorithm with oidread. However, once we start converting objects, we'll need to consider what happens when we want to read an object ID of a specific algorithm, such as the compatibility algorithm. To make this easier, let's define oidread_algop, which specifies which algorithm we should use for our object ID, and define oidread in terms of it. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
108 lines
2.5 KiB
C
108 lines
2.5 KiB
C
#ifndef HASH_H
|
|
#define HASH_H
|
|
|
|
#include "hash-ll.h"
|
|
#include "repository.h"
|
|
|
|
#define the_hash_algo the_repository->hash_algo
|
|
|
|
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
|
|
{
|
|
return hashcmp_algop(sha1, sha2, the_hash_algo);
|
|
}
|
|
|
|
static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2)
|
|
{
|
|
const struct git_hash_algo *algop;
|
|
if (!oid1->algo)
|
|
algop = the_hash_algo;
|
|
else
|
|
algop = &hash_algos[oid1->algo];
|
|
return hashcmp_algop(oid1->hash, oid2->hash, algop);
|
|
}
|
|
|
|
static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2)
|
|
{
|
|
return hasheq_algop(sha1, sha2, the_hash_algo);
|
|
}
|
|
|
|
static inline int oideq(const struct object_id *oid1, const struct object_id *oid2)
|
|
{
|
|
const struct git_hash_algo *algop;
|
|
if (!oid1->algo)
|
|
algop = the_hash_algo;
|
|
else
|
|
algop = &hash_algos[oid1->algo];
|
|
return hasheq_algop(oid1->hash, oid2->hash, algop);
|
|
}
|
|
|
|
static inline int is_null_oid(const struct object_id *oid)
|
|
{
|
|
return oideq(oid, null_oid());
|
|
}
|
|
|
|
static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
|
|
{
|
|
memcpy(sha_dst, sha_src, the_hash_algo->rawsz);
|
|
}
|
|
|
|
/* Like oidcpy() but zero-pads the unused bytes in dst's hash array. */
|
|
static inline void oidcpy_with_padding(struct object_id *dst,
|
|
const struct object_id *src)
|
|
{
|
|
size_t hashsz;
|
|
|
|
if (!src->algo)
|
|
hashsz = the_hash_algo->rawsz;
|
|
else
|
|
hashsz = hash_algos[src->algo].rawsz;
|
|
|
|
memcpy(dst->hash, src->hash, hashsz);
|
|
memset(dst->hash + hashsz, 0, GIT_MAX_RAWSZ - hashsz);
|
|
dst->algo = src->algo;
|
|
}
|
|
|
|
static inline void hashclr(unsigned char *hash)
|
|
{
|
|
memset(hash, 0, the_hash_algo->rawsz);
|
|
}
|
|
|
|
static inline void oidclr(struct object_id *oid)
|
|
{
|
|
memset(oid->hash, 0, GIT_MAX_RAWSZ);
|
|
oid->algo = hash_algo_by_ptr(the_hash_algo);
|
|
}
|
|
|
|
static inline void oidread_algop(struct object_id *oid, const unsigned char *hash, const struct git_hash_algo *algop)
|
|
{
|
|
memcpy(oid->hash, hash, algop->rawsz);
|
|
oid->algo = hash_algo_by_ptr(algop);
|
|
}
|
|
|
|
static inline void oidread(struct object_id *oid, const unsigned char *hash)
|
|
{
|
|
oidread_algop(oid, hash, the_hash_algo);
|
|
}
|
|
|
|
static inline int is_empty_blob_sha1(const unsigned char *sha1)
|
|
{
|
|
return hasheq(sha1, the_hash_algo->empty_blob->hash);
|
|
}
|
|
|
|
static inline int is_empty_blob_oid(const struct object_id *oid)
|
|
{
|
|
return oideq(oid, the_hash_algo->empty_blob);
|
|
}
|
|
|
|
static inline int is_empty_tree_sha1(const unsigned char *sha1)
|
|
{
|
|
return hasheq(sha1, the_hash_algo->empty_tree->hash);
|
|
}
|
|
|
|
static inline int is_empty_tree_oid(const struct object_id *oid)
|
|
{
|
|
return oideq(oid, the_hash_algo->empty_tree);
|
|
}
|
|
|
|
#endif
|