On Mon, Sep 23, 2019 at 10:00:37AM -0400, Derrick Stolee wrote: > > builtin/pack-objects.c > > 7c59828b 2694) (reuse_packfile_bitmap && > > 7c59828b 2695) bitmap_walk_contains(bitmap_git, reuse_packfile_bitmap, oid)); > > This change to obj_is_packed(oid) is a small change in a > really big commit. Here is the change: I'd suggest not looking too closely at this one yet. This was a preliminary split by Christian of some older code that I had written. I think it needs to be split up more, and probably does need more test coverage (bitmaps are only enabled in a few specific scripts). > @@ -2571,7 +2706,9 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size, > > static int obj_is_packed(const struct object_id *oid) > { > - return !!packlist_find(&to_pack, oid, NULL); > + return packlist_find(&to_pack, oid, NULL) || > + (reuse_packfile_bitmap && > + bitmap_walk_contains(bitmap_git, reuse_packfile_bitmap, oid)); > } > > So, every time this is called, the || is short-circuited because > packlist_find() returns true. That does surprise me, though. I'm not sure if it's insufficient testing, or if there's a bug. > Does this change the meaning of this method? obj_is_packed() would > only return true if we found the object specifically in the to_pack > list. Now, we would also return true if the object is in the bitmap > walk. > > If this is only a performance improvement, and the bitmap_walk_contains() > method would return the same as packlist_find(), then should the order > be swapped? Or rather, should reuse_packfile_bitmap indicate which to use > as the full result? No, there should be cases where the walk mentions some objects that aren't added to the to_pack list (that's the point of the reuse code; it fast-tracks a big chunk of objects directly to the output). -Peff