]> git.ipfire.org Git - thirdparty/git.git/commit - fsck.c
tree-walk: add a mechanism for getting non-canonicalized modes
authorJeff King <peff@peff.net>
Wed, 10 Aug 2022 21:01:17 +0000 (17:01 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 10 Aug 2022 21:26:25 +0000 (14:26 -0700)
commitec18b10bf20574fc6d60c966412a11c81f9c17e0
tree3f695fc9baf3eb4c884a042d3bc6b5125fca3c3b
parenta5b4466536668ce595300de249412b2c5b97deb1
tree-walk: add a mechanism for getting non-canonicalized modes

When using init_tree_desc() and tree_entry() to iterate over a tree, we
always canonicalize the modes coming out of the tree. This is a good
thing to prevent bugs or oddities in normal code paths, but it's
counter-productive for tools like fsck that want to see the exact
contents.

We can address this by adding an option to avoid the extra
canonicalization. A few notes on the implementation:

  - I've attached the new option to the tree_desc struct itself. The
    actual code change is in decode_tree_entry(), which is in turn
    called by the public update_tree_entry(), tree_entry(), and
    init_tree_desc() functions, plus their "gently" counterparts.

    By letting it ride along in the struct, we can avoid changing the
    signature of those functions, which are called many times. Plus it's
    conceptually simpler: you really want a particular iteration of a
    tree to be "raw" or not, rather than individual calls.

  - We still have to set the new option somewhere. The struct is
    initialized by init_tree_desc(). I added the new flags field only to
    the "gently" version. That avoids disturbing the much more numerous
    non-gentle callers, and it makes sense that anybody being careful
    about looking at raw modes would also be careful about bogus trees
    (i.e., the caller will be something like fsck in the first place).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fsck.c
packfile.c
tree-walk.c
tree-walk.h