Merge branch 'bc/hash-transition-16'
Conversion from unsigned char[20] to struct object_id continues. * bc/hash-transition-16: (35 commits) gitweb: make hash size independent Git.pm: make hash size independent read-cache: read data in a hash-independent way dir: make untracked cache extension hash size independent builtin/difftool: use parse_oid_hex refspec: make hash size independent archive: convert struct archiver_args to object_id builtin/get-tar-commit-id: make hash size independent get-tar-commit-id: parse comment record hash: add a function to lookup hash algorithm by length remote-curl: make hash size independent http: replace sha1_to_hex http: compute hash of downloaded objects using the_hash_algo http: replace hard-coded constant with the_hash_algo http-walker: replace sha1_to_hex http-push: remove remaining uses of sha1_to_hex http-backend: allow 64-character hex names http-push: convert to use the_hash_algo builtin/pull: make hash-size independent builtin/am: make hash size independent ...
This commit is contained in:
@ -18,7 +18,7 @@
|
||||
* commit.
|
||||
*/
|
||||
struct stored_bitmap {
|
||||
unsigned char sha1[20];
|
||||
struct object_id oid;
|
||||
struct ewah_bitmap *root;
|
||||
struct stored_bitmap *xor;
|
||||
int flags;
|
||||
@ -60,8 +60,8 @@ struct bitmap_index {
|
||||
struct ewah_bitmap *blobs;
|
||||
struct ewah_bitmap *tags;
|
||||
|
||||
/* Map from SHA1 -> `stored_bitmap` for all the bitmapped commits */
|
||||
khash_sha1 *bitmaps;
|
||||
/* Map from object ID -> `stored_bitmap` for all the bitmapped commits */
|
||||
kh_oid_map_t *bitmaps;
|
||||
|
||||
/* Number of bitmapped commits */
|
||||
uint32_t entry_count;
|
||||
@ -80,7 +80,7 @@ struct bitmap_index {
|
||||
struct object **objects;
|
||||
uint32_t *hashes;
|
||||
uint32_t count, alloc;
|
||||
khash_sha1_pos *positions;
|
||||
kh_oid_pos_t *positions;
|
||||
} ext_index;
|
||||
|
||||
/* Bitmap result of the last performed walk */
|
||||
@ -138,7 +138,7 @@ static int load_bitmap_header(struct bitmap_index *index)
|
||||
{
|
||||
struct bitmap_disk_header *header = (void *)index->map;
|
||||
|
||||
if (index->map_size < sizeof(*header) + 20)
|
||||
if (index->map_size < sizeof(*header) + the_hash_algo->rawsz)
|
||||
return error("Corrupted bitmap index (missing header data)");
|
||||
|
||||
if (memcmp(header->magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE)) != 0)
|
||||
@ -157,19 +157,19 @@ static int load_bitmap_header(struct bitmap_index *index)
|
||||
"(Git requires BITMAP_OPT_FULL_DAG)");
|
||||
|
||||
if (flags & BITMAP_OPT_HASH_CACHE) {
|
||||
unsigned char *end = index->map + index->map_size - 20;
|
||||
unsigned char *end = index->map + index->map_size - the_hash_algo->rawsz;
|
||||
index->hashes = ((uint32_t *)end) - index->pack->num_objects;
|
||||
}
|
||||
}
|
||||
|
||||
index->entry_count = ntohl(header->entry_count);
|
||||
index->map_pos += sizeof(*header);
|
||||
index->map_pos += sizeof(*header) - GIT_MAX_RAWSZ + the_hash_algo->rawsz;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
|
||||
struct ewah_bitmap *root,
|
||||
const unsigned char *sha1,
|
||||
const unsigned char *hash,
|
||||
struct stored_bitmap *xor_with,
|
||||
int flags)
|
||||
{
|
||||
@ -181,15 +181,15 @@ static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
|
||||
stored->root = root;
|
||||
stored->xor = xor_with;
|
||||
stored->flags = flags;
|
||||
hashcpy(stored->sha1, sha1);
|
||||
oidread(&stored->oid, hash);
|
||||
|
||||
hash_pos = kh_put_sha1(index->bitmaps, stored->sha1, &ret);
|
||||
hash_pos = kh_put_oid_map(index->bitmaps, stored->oid, &ret);
|
||||
|
||||
/* a 0 return code means the insertion succeeded with no changes,
|
||||
* because the SHA1 already existed on the map. this is bad, there
|
||||
* shouldn't be duplicated commits in the index */
|
||||
if (ret == 0) {
|
||||
error("Duplicate entry in bitmap index: %s", sha1_to_hex(sha1));
|
||||
error("Duplicate entry in bitmap index: %s", hash_to_hex(hash));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -306,8 +306,8 @@ static int load_pack_bitmap(struct bitmap_index *bitmap_git)
|
||||
{
|
||||
assert(bitmap_git->map);
|
||||
|
||||
bitmap_git->bitmaps = kh_init_sha1();
|
||||
bitmap_git->ext_index.positions = kh_init_sha1_pos();
|
||||
bitmap_git->bitmaps = kh_init_oid_map();
|
||||
bitmap_git->ext_index.positions = kh_init_oid_pos();
|
||||
if (load_pack_revindex(bitmap_git->pack))
|
||||
goto failed;
|
||||
|
||||
@ -363,10 +363,10 @@ struct include_data {
|
||||
};
|
||||
|
||||
static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
|
||||
const unsigned char *sha1)
|
||||
const struct object_id *oid)
|
||||
{
|
||||
khash_sha1_pos *positions = bitmap_git->ext_index.positions;
|
||||
khiter_t pos = kh_get_sha1_pos(positions, sha1);
|
||||
khash_oid_pos *positions = bitmap_git->ext_index.positions;
|
||||
khiter_t pos = kh_get_oid_pos(positions, *oid);
|
||||
|
||||
if (pos < kh_end(positions)) {
|
||||
int bitmap_pos = kh_value(positions, pos);
|
||||
@ -377,9 +377,9 @@ static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
|
||||
}
|
||||
|
||||
static inline int bitmap_position_packfile(struct bitmap_index *bitmap_git,
|
||||
const unsigned char *sha1)
|
||||
const struct object_id *oid)
|
||||
{
|
||||
off_t offset = find_pack_entry_one(sha1, bitmap_git->pack);
|
||||
off_t offset = find_pack_entry_one(oid->hash, bitmap_git->pack);
|
||||
if (!offset)
|
||||
return -1;
|
||||
|
||||
@ -387,10 +387,10 @@ static inline int bitmap_position_packfile(struct bitmap_index *bitmap_git,
|
||||
}
|
||||
|
||||
static int bitmap_position(struct bitmap_index *bitmap_git,
|
||||
const unsigned char *sha1)
|
||||
const struct object_id *oid)
|
||||
{
|
||||
int pos = bitmap_position_packfile(bitmap_git, sha1);
|
||||
return (pos >= 0) ? pos : bitmap_position_extended(bitmap_git, sha1);
|
||||
int pos = bitmap_position_packfile(bitmap_git, oid);
|
||||
return (pos >= 0) ? pos : bitmap_position_extended(bitmap_git, oid);
|
||||
}
|
||||
|
||||
static int ext_index_add_object(struct bitmap_index *bitmap_git,
|
||||
@ -402,7 +402,7 @@ static int ext_index_add_object(struct bitmap_index *bitmap_git,
|
||||
int hash_ret;
|
||||
int bitmap_pos;
|
||||
|
||||
hash_pos = kh_put_sha1_pos(eindex->positions, object->oid.hash, &hash_ret);
|
||||
hash_pos = kh_put_oid_pos(eindex->positions, object->oid, &hash_ret);
|
||||
if (hash_ret > 0) {
|
||||
if (eindex->count >= eindex->alloc) {
|
||||
eindex->alloc = (eindex->alloc + 16) * 3 / 2;
|
||||
@ -432,7 +432,7 @@ static void show_object(struct object *object, const char *name, void *data_)
|
||||
struct bitmap_show_data *data = data_;
|
||||
int bitmap_pos;
|
||||
|
||||
bitmap_pos = bitmap_position(data->bitmap_git, object->oid.hash);
|
||||
bitmap_pos = bitmap_position(data->bitmap_git, &object->oid);
|
||||
|
||||
if (bitmap_pos < 0)
|
||||
bitmap_pos = ext_index_add_object(data->bitmap_git, object,
|
||||
@ -447,7 +447,7 @@ static void show_commit(struct commit *commit, void *data)
|
||||
|
||||
static int add_to_include_set(struct bitmap_index *bitmap_git,
|
||||
struct include_data *data,
|
||||
const unsigned char *sha1,
|
||||
const struct object_id *oid,
|
||||
int bitmap_pos)
|
||||
{
|
||||
khiter_t hash_pos;
|
||||
@ -458,7 +458,7 @@ static int add_to_include_set(struct bitmap_index *bitmap_git,
|
||||
if (bitmap_get(data->base, bitmap_pos))
|
||||
return 0;
|
||||
|
||||
hash_pos = kh_get_sha1(bitmap_git->bitmaps, sha1);
|
||||
hash_pos = kh_get_oid_map(bitmap_git->bitmaps, *oid);
|
||||
if (hash_pos < kh_end(bitmap_git->bitmaps)) {
|
||||
struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, hash_pos);
|
||||
bitmap_or_ewah(data->base, lookup_stored_bitmap(st));
|
||||
@ -474,13 +474,13 @@ static int should_include(struct commit *commit, void *_data)
|
||||
struct include_data *data = _data;
|
||||
int bitmap_pos;
|
||||
|
||||
bitmap_pos = bitmap_position(data->bitmap_git, commit->object.oid.hash);
|
||||
bitmap_pos = bitmap_position(data->bitmap_git, &commit->object.oid);
|
||||
if (bitmap_pos < 0)
|
||||
bitmap_pos = ext_index_add_object(data->bitmap_git,
|
||||
(struct object *)commit,
|
||||
NULL);
|
||||
|
||||
if (!add_to_include_set(data->bitmap_git, data, commit->object.oid.hash,
|
||||
if (!add_to_include_set(data->bitmap_git, data, &commit->object.oid,
|
||||
bitmap_pos)) {
|
||||
struct commit_list *parent = commit->parents;
|
||||
|
||||
@ -518,7 +518,7 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
|
||||
roots = roots->next;
|
||||
|
||||
if (object->type == OBJ_COMMIT) {
|
||||
khiter_t pos = kh_get_sha1(bitmap_git->bitmaps, object->oid.hash);
|
||||
khiter_t pos = kh_get_oid_map(bitmap_git->bitmaps, object->oid);
|
||||
|
||||
if (pos < kh_end(bitmap_git->bitmaps)) {
|
||||
struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
|
||||
@ -560,7 +560,7 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
|
||||
int pos;
|
||||
|
||||
roots = roots->next;
|
||||
pos = bitmap_position(bitmap_git, object->oid.hash);
|
||||
pos = bitmap_position(bitmap_git, &object->oid);
|
||||
|
||||
if (pos < 0 || base == NULL || !bitmap_get(base, pos)) {
|
||||
object->flags &= ~UNINTERESTING;
|
||||
@ -806,7 +806,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
||||
|
||||
fprintf(stderr, "Failed to reuse at %d (%016llx)\n",
|
||||
reuse_objects, result->words[i]);
|
||||
fprintf(stderr, " %s\n", sha1_to_hex(sha1));
|
||||
fprintf(stderr, " %s\n", hash_to_hex(sha1));
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -926,7 +926,7 @@ static void test_show_object(struct object *object, const char *name,
|
||||
struct bitmap_test_data *tdata = data;
|
||||
int bitmap_pos;
|
||||
|
||||
bitmap_pos = bitmap_position(tdata->bitmap_git, object->oid.hash);
|
||||
bitmap_pos = bitmap_position(tdata->bitmap_git, &object->oid);
|
||||
if (bitmap_pos < 0)
|
||||
die("Object not in bitmap: %s\n", oid_to_hex(&object->oid));
|
||||
|
||||
@ -940,7 +940,7 @@ static void test_show_commit(struct commit *commit, void *data)
|
||||
int bitmap_pos;
|
||||
|
||||
bitmap_pos = bitmap_position(tdata->bitmap_git,
|
||||
commit->object.oid.hash);
|
||||
&commit->object.oid);
|
||||
if (bitmap_pos < 0)
|
||||
die("Object not in bitmap: %s\n", oid_to_hex(&commit->object.oid));
|
||||
|
||||
@ -967,7 +967,7 @@ void test_bitmap_walk(struct rev_info *revs)
|
||||
bitmap_git->version, bitmap_git->entry_count);
|
||||
|
||||
root = revs->pending.objects[0].item;
|
||||
pos = kh_get_sha1(bitmap_git->bitmaps, root->oid.hash);
|
||||
pos = kh_get_oid_map(bitmap_git->bitmaps, root->oid);
|
||||
|
||||
if (pos < kh_end(bitmap_git->bitmaps)) {
|
||||
struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
|
||||
@ -1081,7 +1081,7 @@ int rebuild_existing_bitmaps(struct bitmap_index *bitmap_git,
|
||||
lookup_stored_bitmap(stored),
|
||||
rebuild)) {
|
||||
hash_pos = kh_put_sha1(reused_bitmaps,
|
||||
stored->sha1,
|
||||
stored->oid.hash,
|
||||
&hash_ret);
|
||||
kh_value(reused_bitmaps, hash_pos) =
|
||||
bitmap_to_ewah(rebuild);
|
||||
@ -1109,7 +1109,7 @@ void free_bitmap_index(struct bitmap_index *b)
|
||||
ewah_pool_free(b->trees);
|
||||
ewah_pool_free(b->blobs);
|
||||
ewah_pool_free(b->tags);
|
||||
kh_destroy_sha1(b->bitmaps);
|
||||
kh_destroy_oid_map(b->bitmaps);
|
||||
free(b->ext_index.objects);
|
||||
free(b->ext_index.hashes);
|
||||
bitmap_free(b->result);
|
||||
@ -1117,8 +1117,8 @@ void free_bitmap_index(struct bitmap_index *b)
|
||||
free(b);
|
||||
}
|
||||
|
||||
int bitmap_has_sha1_in_uninteresting(struct bitmap_index *bitmap_git,
|
||||
const unsigned char *sha1)
|
||||
int bitmap_has_oid_in_uninteresting(struct bitmap_index *bitmap_git,
|
||||
const struct object_id *oid)
|
||||
{
|
||||
int pos;
|
||||
|
||||
@ -1127,7 +1127,7 @@ int bitmap_has_sha1_in_uninteresting(struct bitmap_index *bitmap_git,
|
||||
if (!bitmap_git->haves)
|
||||
return 0; /* walk had no "haves" */
|
||||
|
||||
pos = bitmap_position_packfile(bitmap_git, sha1);
|
||||
pos = bitmap_position_packfile(bitmap_git, oid);
|
||||
if (pos < 0)
|
||||
return 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user