On 4/18/2019 4:08 PM, Jeff King wrote:
> On Thu, Apr 18, 2019 at 03:49:53PM -0400, Jeff King wrote:
>> I dunno. I guess it does not hurt to at least to at least make sure this
>> code is running in the normal suite. I don't think that will find the
>> more interesting regressions, but at least saves us the from the most
>> egregious ones ("oops, the whole thing segfaults because somebody
>> changed the API" kinds of things).
That's the level of coverage I was hoping to see. I won't be picky if
the OBJ_TAG case isn't hit or something.
> So here's a test. This goes on top of jk/prune-optim (which is also
> already in master).
[snip]
> +test_expect_success 'trivial prune with bitmaps enabled' '
> + git repack -adb &&
> + blob=$(echo bitmap-unreachable-blob | git hash-object -w --stdin) &&
> + git prune --expire=now &&
> + git cat-file -e HEAD &&
> + test_must_fail git cat-file -e $blob
> +'
> +
> test_done
This test does cover the 'mark_object_seen()' method, which I tested by
removing the "!" in the "if (!obj) die();" condition.
However, my first inclination was to remove the line
obj->flags |= SEEN;
from the method, and I found that it still worked! This was confusing,
so I looked for places where the SEEN flag was added during bitmap walks,
and it turns out that the objects are marked as SEEN by prepare_bitmap_walk().
This means that we can remove a lot of the implementation from reachable.c
and have the same effect (and drop an iteration through the objects). See the
diff below.
Thoughts?
-Stolee
-->8--
diff --git a/reachable.c b/reachable.c
index 0d00a91de4..7d2762d47f 100644
--- a/reachable.c
+++ b/reachable.c
@@ -159,39 +159,6 @@ int add_unseen_recent_objects_to_traversal(struct rev_info
*revs,
FOR_EACH_OBJECT_LOCAL_ONLY);
}
-static void *lookup_object_by_type(struct repository *r,
- const struct object_id *oid,
- enum object_type type)
-{
- switch (type) {
- case OBJ_COMMIT:
- return lookup_commit(r, oid);
- case OBJ_TREE:
- return lookup_tree(r, oid);
- case OBJ_TAG:
- return lookup_tag(r, oid);
- case OBJ_BLOB:
- return lookup_blob(r, oid);
- default:
- die("BUG: unknown object type %d", type);
- }
-}
-
-static int mark_object_seen(const struct object_id *oid,
- enum object_type type,
- int exclude,
- uint32_t name_hash,
- struct packed_git *found_pack,
- off_t found_offset)
-{
- struct object *obj = lookup_object_by_type(the_repository, oid, type);
- if (!obj)
- die("unable to create object '%s'", oid_to_hex(oid));
-
- obj->flags |= SEEN;
- return 0;
-}
-
void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
timestamp_t mark_recent, struct progress *progress)
{
@@ -225,7 +192,10 @@ void mark_reachable_objects(struct rev_info *revs, int
mark_reflog,
bitmap_git = prepare_bitmap_walk(revs);
if (bitmap_git) {
- traverse_bitmap_commit_list(bitmap_git, mark_object_seen);
+ /*
+ * reachable objects are marked as SEEN
+ * by prepare_bitmap_walk(revs).
+ */
free_bitmap_index(bitmap_git);
return;
}