Re: [PATCH] t5304: add a test for pruning with bitmaps
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Apr 20, 2019, 01:01 UTC
- Message-ID
- <ba16afb4-25c1-8148-602e-130b0e17fc89@gmail.com>
- In-Reply-To
- <20190418200827.GB15249@sigill.intra.peff.net>
On 4/18/2019 4:08 PM, Jeff King wrote:
Show 6 quoted lines
> 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]
Show 9 quoted lines
> +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; }