rev-list: allow commit-only bitmap traversals
Ever since we added reachability bitmap support, we've been able to use it with rev-list to get the full list of objects, like: git rev-list --objects --use-bitmap-index --all But you can't do so without --objects, since we weren't ready to just show the commits. However, the internals of the bitmap code are mostly ready for this: they avoid opening up trees when walking to fill in the bitmaps. We just need to actually pass in the rev_info to traverse_bitmap_commit_list() so it knows which types to bother triggering our callback for. For completeness, the perf test now covers both the existing --objects case, as well as the new commits-only behavior (the objects one got way faster when we introduced bitmaps, but obviously isn't improved now). Here are numbers for linux.git: Test HEAD^ HEAD ------------------------------------------------------------------------ 5310.7: rev-list (commits) 8.29(8.10+0.19) 1.76(1.72+0.04) -78.8% 5310.8: rev-list (objects) 8.06(7.94+0.12) 8.14(7.94+0.13) +1.0% That run was cheating a little, as I didn't have any commit-graph in the repository, and we'd built it by default these days when running git-gc. Here are numbers with a commit-graph: Test HEAD^ HEAD ------------------------------------------------------------------------ 5310.7: rev-list (commits) 0.70(0.58+0.12) 0.51(0.46+0.04) -27.1% 5310.8: rev-list (objects) 6.20(6.09+0.10) 6.27(6.16+0.11) +1.1% Still an improvement, but a lot less impressive. We could have the perf script remove any commit-graph to show the out-sized effect, but it probably makes sense to leave it in what would be a more typical setup. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ea047a8eb4
commit
4eb707ebd6
@ -599,6 +599,7 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
|
||||
}
|
||||
|
||||
static void show_extended_objects(struct bitmap_index *bitmap_git,
|
||||
struct rev_info *revs,
|
||||
show_reachable_fn show_reach)
|
||||
{
|
||||
struct bitmap *objects = bitmap_git->result;
|
||||
@ -612,6 +613,11 @@ static void show_extended_objects(struct bitmap_index *bitmap_git,
|
||||
continue;
|
||||
|
||||
obj = eindex->objects[i];
|
||||
if ((obj->type == OBJ_BLOB && !revs->blob_objects) ||
|
||||
(obj->type == OBJ_TREE && !revs->tree_objects) ||
|
||||
(obj->type == OBJ_TAG && !revs->tag_objects))
|
||||
continue;
|
||||
|
||||
show_reach(&obj->oid, obj->type, 0, eindex->hashes[i], NULL, 0);
|
||||
}
|
||||
}
|
||||
@ -872,16 +878,20 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
||||
}
|
||||
|
||||
void traverse_bitmap_commit_list(struct bitmap_index *bitmap_git,
|
||||
struct rev_info *revs,
|
||||
show_reachable_fn show_reachable)
|
||||
{
|
||||
assert(bitmap_git->result);
|
||||
|
||||
show_objects_for_type(bitmap_git, OBJ_COMMIT, show_reachable);
|
||||
show_objects_for_type(bitmap_git, OBJ_TREE, show_reachable);
|
||||
show_objects_for_type(bitmap_git, OBJ_BLOB, show_reachable);
|
||||
show_objects_for_type(bitmap_git, OBJ_TAG, show_reachable);
|
||||
if (revs->tree_objects)
|
||||
show_objects_for_type(bitmap_git, OBJ_TREE, show_reachable);
|
||||
if (revs->blob_objects)
|
||||
show_objects_for_type(bitmap_git, OBJ_BLOB, show_reachable);
|
||||
if (revs->tag_objects)
|
||||
show_objects_for_type(bitmap_git, OBJ_TAG, show_reachable);
|
||||
|
||||
show_extended_objects(bitmap_git, show_reachable);
|
||||
show_extended_objects(bitmap_git, revs, show_reachable);
|
||||
}
|
||||
|
||||
static uint32_t count_object_type(struct bitmap_index *bitmap_git,
|
||||
|
Reference in New Issue
Block a user