git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 30/30] tree-walk.h API: move canon_mode() back out of decode_tree_entry()

From
Elijah Newren <newren@gmail.com>
Date
Mar 9, 2021, 20:23 UTC
Message-ID
<CABPp-BEPkukGz32rrro1hzMvSQzX4v7U17CAcV-G2NS6v0u55g@mail.gmail.com>
In-Reply-To
<20210308150650.18626-31-avarab@gmail.com>
On Mon, Mar 8, 2021 at 7:07 AM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
Show 32 quoted lines
>
> Move the canon_mode() call back out of decode_tree_entry(), and
> instead make it the responsibility of its callers to canonicalize the
> tree modes we get.
>
> This effectively reverts 7146e66f086 (tree-walk: finally switch over
> tree descriptors to contain a pre-parsed entry, 2014-02-06), with the
> recent of most callers away from "mode" (now "raw_mode") towards "enum
> object_id" in recent commit the motivation for that commit effectively
> doesn't exist anymore.
>
> I.e. I'm not adding the canon_mode() call back to
> tree_entry_extract(), instead it's now become sane to move this
> responsibility to those callers that still care about the "raw_mode".
>
> That change was meant as a pure optimization change, but it actually
> introduced a subtle bug. We were left without any low-level API to get
> non-standard mode bits out of trees. Having non-standard modes isn't
> the norm, and fsck should warn about it.
>
> Except after 7146e66f086 it couldn't anymore, since the modes
> fsck_tree() got would be pre-sanitized for it. I believe that fsck
> issue is per-se a serious bug, the "bad mode" was a default warning,
> not an error.
>
> This change makes that fsck check work again, why aren't there any
> test changes for fsck here? Because we didn't have a test for that
> fsck feature in the first place, which is why the regression in
> 7146e66f086 snuck by us. A follow-up commit will add such a test.
>
> It is possible that this commit is introducing some subtle regression
> that I've missed.

I'm sure there are at least a few, and I suspect many more. This is a super scary change to me, even if it's only about corner cases that should only exist in repositories that had objects created with super old (or new and broken) git clients.

Show 26 quoted lines
> We are now propagating the "raw_mode" outside of everything downstream
> of decode_tree_entry(), which is everything we have that decodes
> trees. It's our most low-level tree decoding API.
>
> As shown here we rely parsing out a "raw" (and possibly something fsck
> would complain about) mode as-is, but when we run merge, add something
> new to the index, create an archive etc. we don't want to propagate
> that bad mode when we create new data. We want to canon_mode() it.
>
> I'm also pretty sure that we don't have good enough test coverage for
> those scenarios. We barely have tests for these bad mode bits at
> all (not even one for fsck). We definitely are not testing all
> merge/index/archive etc. interactions.
>
> Still, I think this change is worth it overall, because:
>
>  1. We must have a way to get at these raw modes in some way, even if
>     just for fsck. There's also other things that care, see e.g. the
>     FIXME comment in 62fdec17a11 (merge-ort: flesh out implementation of
>     handle_content_merge(), 2021-01-01)
>
>  2. #1 is not a justification for this change, I could have e.g. just
>     added the ability to pass some "want_raw" flag into
>     decode_tree_entry() for use in fsck. But I think with the migration
>     of most tree iteration towards "enum object_type" it's become worth
>     it.

This seems like the safer route. Then we can slowly convert callers over to using the want_raw as we audit them and add appropriate tests.

Show 5 quoted lines
>  3. Yes our test coverage sucks, but before 7146e66f086 we were also
>     spreading what's now the "raw_mode" all over the place. That commit
>     was first released with Git v2.0.0 in mid-2014. A while ago for sure,
>     but most of this code existed in something approximating its current
>     form then. This isn't new territory.

That's very helpful to know, actually. That does lower my worry some. But the fact that it was released as part of v2.0.0, a new major release, suggests we knew there were potential breaking changes. And code has been built on top of those assumptions for quite a few years, so we might again break things by reverting back, and having it be part of a non-major release is worrisome without appropriate tests and audits of the relevant code paths.

Show 11 quoted lines
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> ---
>  archive.c              |  2 +-
>  builtin/checkout.c     |  1 +
>  builtin/ls-files.c     |  2 +-
>  builtin/merge-tree.c   |  6 +++---
>  builtin/update-index.c |  1 +
>  merge-ort.c            | 13 ++++++++++++-
>  notes.c                |  1 +
>  tree-walk.c            |  1 -
>  unpack-trees.c         |  4 +++-

No tests...oh boy. You did mention this in the commit message, but I'm still having a hard time getting past making a very low level change like this without either tests or bumping the major version number of git.

Show 87 quoted lines
>  9 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/archive.c b/archive.c
> index 5b85aae8106..8083f15f3ba 100644
> --- a/archive.c
> +++ b/archive.c
> @@ -236,7 +236,7 @@ static int queue_or_write_archive_entry(const struct object_id *oid,
>                                         void *context)
>  {
>         struct archiver_context *c = context;
> -       unsigned mode = raw_mode;
> +       unsigned mode = canon_mode(raw_mode);
>
>         while (c->bottom &&
>                !(base->len >= c->bottom->len &&
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index d4adfdb5046..7f25b955616 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -132,6 +132,7 @@ static int update_some(const struct object_id *oid, struct strbuf *base,
>         memcpy(ce->name + base->len, pathname, len - base->len);
>         ce->ce_flags = create_ce_flags(0) | CE_UPDATE;
>         ce->ce_namelen = len;
> +       mode = canon_mode(mode);
>         ce->ce_mode = create_ce_mode(mode);
>
>         /*
> diff --git a/builtin/ls-files.c b/builtin/ls-files.c
> index 391e6a9f141..926523d77a7 100644
> --- a/builtin/ls-files.c
> +++ b/builtin/ls-files.c
> @@ -429,7 +429,7 @@ static int read_one_entry_opt(struct index_state *istate,
>  {
>         int len;
>         struct cache_entry *ce;
> -       unsigned mode = raw_mode;
> +       unsigned mode = canon_mode(raw_mode);
>
>         if (S_ISDIR(mode))
>                 return READ_TREE_RECURSIVE;
> diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
> index b4e736e4b72..f8733a86eb7 100644
> --- a/builtin/merge-tree.c
> +++ b/builtin/merge-tree.c
> @@ -197,9 +197,9 @@ static void resolve(const struct traverse_info *info, struct name_entry *ours, s
>                 return;
>
>         path = traverse_path(info, result);
> -       orig_mode = ours->raw_mode;
> +       orig_mode = canon_mode(ours->raw_mode);
>         orig = create_entry(2, orig_mode, &ours->oid, path);
> -       final_mode = result->raw_mode;
> +       final_mode = canon_mode(result->raw_mode);
>         final = create_entry(0, final_mode, &result->oid, path);
>
>         final->link = orig;
> @@ -252,7 +252,7 @@ static struct merge_list *link_entry(unsigned stage, const struct traverse_info
>                 path = entry->path;
>         else
>                 path = traverse_path(info, n);
> -       link_mode = n->raw_mode;
> +       link_mode = canon_mode(n->raw_mode);
>         link = create_entry(stage, link_mode, &n->oid, path);
>
>         link->link = entry;
> diff --git a/builtin/update-index.c b/builtin/update-index.c
> index b489a876392..1996fdd97af 100644
> --- a/builtin/update-index.c
> +++ b/builtin/update-index.c
> @@ -621,6 +621,7 @@ static struct cache_entry *read_one_ent(const char *which,
>         memcpy(ce->name, path, namelen);
>         ce->ce_flags = create_ce_flags(stage);
>         ce->ce_namelen = namelen;
> +       mode = canon_mode(mode);
>         ce->ce_mode = create_ce_mode(mode);
>         return ce;
>  }
> diff --git a/merge-ort.c b/merge-ort.c
> index ea20bbe2af3..d1e8a2823e0 100644
> --- a/merge-ort.c
> +++ b/merge-ort.c
> @@ -502,7 +502,7 @@ static void setup_path_info(struct merge_options *opt,
>         mi->basename_offset = current_dir_name_len;
>         mi->clean = !!resolved;
>         if (resolved) {
> -               mi->result.mode = merged_version->raw_mode;
> +               mi->result.mode = canon_mode(merged_version->raw_mode);

canon_mode() will change a mode of 0 into S_IFGITLINK, so this is wrong. It's wrong in a way that probably doesn't matter, since is_null will be true and that is checked in preference to mode == 0 elsewhere, but the code should still be more careful.

Show 18 quoted lines
>                 oidcpy(&mi->result.oid, &merged_version->oid);
>                 mi->is_null = !!is_null;
>         } else {
> @@ -512,6 +512,16 @@ static void setup_path_info(struct merge_options *opt,
>                 ASSIGN_AND_VERIFY_CI(ci, mi);
>                 for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
>                         ci->pathnames[i] = fullpath;
> +                       /*
> +                        * We must not use canon_mode() here. Will
> +                        * fail on an the is_null assertion in
> +                        * 6a02dd90c99 (merge-ort: add a preliminary
> +                        * simple process_entries() implementation,
> +                        * 2020-12-13) when combined with the tests in
> +                        * "[PATCH 00/11] Complete merge-ort
> +                        * implementation...almost" (see
> +                        * https://lore.kernel.org/git/pull.973.git.git.1614905738.gitgitgadget@gmail.com/)
> +                        */
>                         ci->stages[i].mode = names[i].raw_mode;

I suspect the mapping of 0 to S_IFGITLINK might be the culprit here; we're just lucky an assertion happened to catch this one. (And unlucky that nothing caught the one above.)

If you added a special check for that case and used canon_mode() otherwise, I still think it'd be problematic, because the *only* value of using raw_mode in the first place was that one special corner case FIXME comment in handle_content_merge() -- that FIXME could only be handled by allowing a wider range of modes, and if you canon_mode() here, then handle_content_merge() only gets canonicalized modes. At that point, we might as well ask for special API from traverse_trees() to just canonicalize for us (which, actually, sounds enticing).

Show 7 quoted lines
>                         oidcpy(&ci->stages[i].oid, &names[i].oid);
>                 }
> @@ -546,6 +556,7 @@ static void add_pair(struct merge_options *opt,
>         int names_idx = is_add ? side : 0;
>         const struct object_id *oid = &names[names_idx].oid;
>         unsigned int mode = names[names_idx].raw_mode;
> +       mode = canon_mode(mode);
This is unnecessary; diffcore-rename.c only cares whether S_ISREG(mode).

Given that these are the only changes you made to merge-ort.c, and this is the last patch in the series, my earlier comments and worries about merge-ort from a few patches ago all look like justified concerns and make me pretty sure you've introduced some regressions relating to those. (Namely, the fact that things comparing modes now have to worry not about equality, but equality under canonicalization.)

Show 45 quoted lines
>         one = alloc_filespec(pathname);
>         two = alloc_filespec(pathname);
> diff --git a/notes.c b/notes.c
> index 2817325651a..78b1b38d36b 100644
> --- a/notes.c
> +++ b/notes.c
> @@ -479,6 +479,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
>                         const char *q = oid_to_hex(&subtree->key_oid);
>                         size_t i;
>                         unsigned int mode = entry.raw_mode;
> +                       mode = canon_mode(mode);
>                         for (i = 0; i < prefix_len; i++) {
>                                 strbuf_addch(&non_note_path, *q++);
>                                 strbuf_addch(&non_note_path, *q++);
> diff --git a/tree-walk.c b/tree-walk.c
> index 099a9b3bd77..3175430d049 100644
> --- a/tree-walk.c
> +++ b/tree-walk.c
> @@ -47,7 +47,6 @@ static int decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned l
>
>         /* Initialize the descriptor entry */
>         desc->entry.path = path;
> -       mode = canon_mode(mode);
>         desc->entry.raw_mode = mode;
>         desc->entry.object_type = object_type(mode);
>         desc->entry.pathlen = len - 1;
> diff --git a/unpack-trees.c b/unpack-trees.c
> index dcdf8130745..2fb346714b3 100644
> --- a/unpack-trees.c
> +++ b/unpack-trees.c
> @@ -868,6 +868,7 @@ static int traverse_trees_recursive(int n, unsigned long dirmask,
>         newinfo.name = p->path;
>         newinfo.namelen = p->pathlen;
>         newinfo.mode = p->raw_mode;
> +       newinfo.mode = canon_mode(newinfo.mode);
>         newinfo.pathlen = st_add3(newinfo.pathlen, tree_entry_len(p), 1);
>         newinfo.df_conflicts |= df_conflicts;
>
> @@ -1020,7 +1021,8 @@ static struct cache_entry *create_ce_entry(const struct traverse_info *info,
>                 is_transient ?
>                 make_empty_transient_cache_entry(len) :
>                 make_empty_cache_entry(istate, len);
> -       unsigned int mode = n->raw_mode;
> +       unsigned int mode = canon_mode(n->raw_mode);
> +       mode = canon_mode(mode);

It looks like nearly everything in unpack_trees() goes through create_ce_entry() so perhaps just these two hunks are good enough to make sure unpack-trees.c and all its callers are dealing with canonicalized modes.

Except now merge-recursive.c is some weird hybrid were some of its modes come from unpack-trees (canonicalized), some come diff_tree_oid (non-canonicalized as far as I can tell above) and various calls to get_tree_entry_* (also non-canonicalized). I suspect there are various bugs there, similar in nature to the ones in merge-ort but much harder to stamp out given the facts that merge-recursive gets modes from many more places, and the fact that merge-recursive tends to do many more comparisons due to checking for each type of combination of conflicts and having special code for each one resulting in combinatorial increasing number of nearly-duplicated codepaths. merge-recursive is probably a caller that really needs a way to request that all calls it makes (directly or indirectly) to any tree walking just return canonicalized modes.

>
>         ce->ce_mode = create_ce_mode(mode);
>         ce->ce_flags = create_ce_flags(stage);
> --

The fact that there are no canon_mode() calls in the diff machinery makes me wonder if we've changed the behavior for diff/log whenever there is an object with old modes around. Perhaps that's a desired change, but it seems like it should certainly be tested and documented. What about all callers of the diff machinery, though? Are they prepared for such diffs? One simple example is that fast-export uses the revision walking and diff machinery, and without canonicalized modes anymore, it would just print the raw modes. fast-import sanely won't accept raw modes; it only wants canonical modes. So with this change, people may no longer be able to round-trip fast-export output through fast-import on their existing repositories.

I also don't like the fact that there is no canonicalization of modes before writing objects to the git object store. I believe mktree, merge-ort, notes (unless your one change to that file is enough but I'm suspect that it is) are all affected. match-trees appears to be affected, but is only called by merge-ort and merge-recursive to create a temporary merge-base, though the "temporary" tree object will continue to live in the git object store and could be accessed by users. cache-tree.c also writes trees out, but only using ce_mode which looks like it is everywhere set by calls to e.g. create_ce_mode(...). fast-import also writes direct tree objects, but it doesn't get its modes from reading tree objects, and sanitizes the inputs it does get. So, perhaps most tree writers are still sane, but I'm certain merge-ort would need updates and I suspect mktree and notes do too. I think match-trees ought to be updated just for cleanliness. And I may have missed other places that directly write trees out.

I'm worried there's a number of other regressions lurking; those are just ones I thought about in areas of the code I'm more familiar with.

Previous: Ævar Arnfjörð BjarmasonNext: Ævar Arnfjörð Bjarmason
Message 214 of 262 in “read_tree(): pass "int stage" as context to read_tree_recursive()”
  1. read_tree(): pass "int stage" as context to read_tree_recursive()Nguyễn Thái Ngọc Duy, Apr 18, 2009
  2. 0/7 Move the read_tree() function to its only userÆvar Arnfjörð Bjarmason, Mar 6, 2021
  3. Elijah NewrenMar 6, 2021
  4. 2/6 tree.c API: move read_tree() into builtin/ls-files.cÆvar Arnfjörð Bjarmason, Mar 8, 2021
  5. Junio C HamanoMar 8, 2021
  6. Junio C HamanoMar 12, 2021
  7. 1/6 ls-files tests: add meaningful --with-tree testsÆvar Arnfjörð Bjarmason, Mar 8, 2021
  8. 3/6 ls-files: don't needlessly pass around stage variableÆvar Arnfjörð Bjarmason, Mar 8, 2021
  9. Junio C HamanoMar 8, 2021
  10. 0/6 Move the read_tree() function to its only userÆvar Arnfjörð Bjarmason, Mar 8, 2021
  11. 02/30 notes & match-trees: use name_entry's "pathlen" memberÆvar Arnfjörð Bjarmason, Mar 8, 2021
  12. 00/30 tree-walk: mostly "mode" to "enum object_type"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  13. Elijah NewrenMar 9, 2021
  14. Elijah NewrenMar 9, 2021
  15. Ævar Arnfjörð BjarmasonMar 9, 2021
  16. Elijah NewrenMar 12, 2021
  17. 02/29 notes & match-trees: use name_entry's "pathlen" memberÆvar Arnfjörð Bjarmason, Mar 16, 2021
  18. 00/29 tree-walk: mostly replace "mode" with "enum object_type"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  19. Elijah NewrenMar 16, 2021
  20. Ævar Arnfjörð BjarmasonMar 16, 2021
  21. 01/32 diff.c: remove redundant canon_mode() callÆvar Arnfjörð Bjarmason, Mar 16, 2021
  22. 02/32 notes & match-trees: use name_entry's "pathlen" memberÆvar Arnfjörð Bjarmason, Mar 16, 2021
  23. 03/32 cache.h: add a comment to object_type()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  24. 00/32 tree-walk: mostly replace "mode" with "enum object_type"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  25. Elijah NewrenMar 16, 2021
  26. 00/29 tree-walk: mostly replace "mode" with "enum object_type"Ævar Arnfjörð Bjarmason, Mar 21, 2021
  27. 01/29 notes & match-trees: use name_entry's "pathlen" memberÆvar Arnfjörð Bjarmason, Mar 21, 2021
  28. 02/29 cache.h: add a comment to object_type()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  29. 05/29 fast-import tests: test for sorting dir/file foo v.s. foo.txtÆvar Arnfjörð Bjarmason, Mar 21, 2021
  30. 04/29 tree-walk.c: migrate to using new "object_type" field when possibleÆvar Arnfjörð Bjarmason, Mar 21, 2021
  31. 08/29 cache.h: have base_name_compare() take "is tree?", not "mode"Ævar Arnfjörð Bjarmason, Mar 21, 2021
  32. 09/29 tree-walk.h users: switch object_type(...) to new .object_typeÆvar Arnfjörð Bjarmason, Mar 21, 2021
  33. 15/29 merge-tree tests: test for the mode comparison in same_entry()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  34. 06/29 mktree tests: test that "mode" is passed when sortingÆvar Arnfjörð Bjarmason, Mar 21, 2021
  35. 11/29 tree.h API: make read_tree_fn_t take an "enum object_type"Ævar Arnfjörð Bjarmason, Mar 21, 2021
  36. 03/29 tree-walk.h: add object_type member to name_entryÆvar Arnfjörð Bjarmason, Mar 21, 2021
  37. 13/29 tree-walk.h users: refactor chained "mode" if/else into switchÆvar Arnfjörð Bjarmason, Mar 21, 2021
  38. 14/29 tree-walk.h users: migrate miscellaneous "mode" to "object_type"Ævar Arnfjörð Bjarmason, Mar 21, 2021
  39. 12/29 tree-walk.h users: migrate "p->mode &&" patternÆvar Arnfjörð Bjarmason, Mar 21, 2021
  40. 10/29 tree.h: format argument lists of read_tree_recursive() usersÆvar Arnfjörð Bjarmason, Mar 21, 2021
  41. 18/29 tree-walk.h users: use temporary variable(s) for "mode"Ævar Arnfjörð Bjarmason, Mar 21, 2021
  42. 17/29 fsck.c: switch on "object_type" in fsck_walk_tree()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  43. 07/29 diff tests: test that "mode" is passed when sortingÆvar Arnfjörð Bjarmason, Mar 21, 2021
  44. 16/29 merge-ort: correct reference to test in 62fdec17a11Ævar Arnfjörð Bjarmason, Mar 21, 2021
  45. 21/29 match-trees: use "tmp" for mode in shift_tree_by()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  46. 19/29 tree-walk.h API: formatting changes for subsequent commitÆvar Arnfjörð Bjarmason, Mar 21, 2021
  47. 23/29 tree-walk.h API: document and format tree_entry_extract()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  48. 22/29 tree-walk.h API: add get_tree_entry_type()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  49. 20/29 tree-walk.h API: rename get_tree_entry() to get_tree_entry_mode()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  50. 24/29 tree-entry.h API: rename tree_entry_extract() to tree_entry_extract_mode()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  51. 28/29 blame: emit a better error on 'git blame directory'Ævar Arnfjörð Bjarmason, Mar 21, 2021
  52. 29/29 tree-walk.h API: add a tree_entry_extract_type() functionÆvar Arnfjörð Bjarmason, Mar 21, 2021
  53. 25/29 tree-walk.h API: add a tree_entry_extract_all() functionÆvar Arnfjörð Bjarmason, Mar 21, 2021
  54. 26/29 tree-walk.h API: add get_tree_entry_all()Ævar Arnfjörð Bjarmason, Mar 21, 2021
  55. 27/29 tree-walk.h API: add a get_tree_entry_path() functionÆvar Arnfjörð Bjarmason, Mar 21, 2021
  56. Junio C HamanoMar 21, 2021
  57. Ævar Arnfjörð BjarmasonMar 21, 2021
  58. 0/2 diff --no-index: fix test blind spotsÆvar Arnfjörð Bjarmason, Mar 21, 2021
  59. 2/2 diff --no-index tests: test mode normalizationÆvar Arnfjörð Bjarmason, Mar 21, 2021
  60. 1/2 diff --no-index tests: add test for --exit-codeÆvar Arnfjörð Bjarmason, Mar 21, 2021
  61. Ramsay JonesMar 21, 2021
  62. Junio C HamanoMar 21, 2021
  63. Ævar Arnfjörð BjarmasonMar 21, 2021
  64. 0/2 diff --no-index: fix test blind spotsÆvar Arnfjörð Bjarmason, Mar 21, 2021
  65. 1/2 diff --no-index tests: add test for --exit-codeÆvar Arnfjörð Bjarmason, Mar 21, 2021
  66. 2/2 diff --no-index tests: test mode normalizationÆvar Arnfjörð Bjarmason, Mar 21, 2021
  67. Junio C HamanoMar 22, 2021
  68. Junio C HamanoMar 22, 2021
  69. 0/2 diff --no-index: fix test blind spotsÆvar Arnfjörð Bjarmason, Mar 23, 2021
  70. 2/2 diff --no-index tests: test mode normalizationÆvar Arnfjörð Bjarmason, Mar 23, 2021
  71. 1/2 diff --no-index tests: add test for --exit-codeÆvar Arnfjörð Bjarmason, Mar 23, 2021
  72. Junio C HamanoMar 23, 2021
  73. Junio C HamanoMar 21, 2021
  74. Ævar Arnfjörð BjarmasonMar 21, 2021
  75. 00/18 tree-walk.h: slimmed downÆvar Arnfjörð Bjarmason, Mar 31, 2021
  76. 01/18 cache.h: add a comment to object_type()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  77. Junio C HamanoMar 31, 2021
  78. 02/18 merge-ort: correct reference to test in 62fdec17a11Ævar Arnfjörð Bjarmason, Mar 31, 2021
  79. 05/18 mktree tests: test that "mode" is passed when sortingÆvar Arnfjörð Bjarmason, Mar 31, 2021
  80. Junio C HamanoMar 31, 2021
  81. 04/18 fast-import tests: test for sorting dir/file foo v.s. foo.txtÆvar Arnfjörð Bjarmason, Mar 31, 2021
  82. 03/18 cache.h: have base_name_compare() take "is tree?", not "mode"Ævar Arnfjörð Bjarmason, Mar 31, 2021
  83. Junio C HamanoMar 31, 2021
  84. 08/18 blame: emit a better error on 'git blame directory'Ævar Arnfjörð Bjarmason, Mar 31, 2021
  85. Junio C HamanoMar 31, 2021
  86. Ævar Arnfjörð BjarmasonApr 2, 2021
  87. Junio C HamanoApr 2, 2021
  88. 09/18 notes & match-trees: use name_entry's "pathlen" memberÆvar Arnfjörð Bjarmason, Mar 31, 2021
  89. Junio C HamanoMar 31, 2021
  90. 10/18 tree-walk.h users: use temporary variable(s) for "mode"Ævar Arnfjörð Bjarmason, Mar 31, 2021
  91. 07/18 merge-tree tests: test for the mode comparison in same_entry()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  92. Junio C HamanoMar 31, 2021
  93. 16/18 tree-walk.h API: add a get_tree_entry_path() functionÆvar Arnfjörð Bjarmason, Mar 31, 2021
  94. Junio C HamanoApr 1, 2021
  95. Ævar Arnfjörð BjarmasonApr 2, 2021
  96. 17/18 tree-walk.h API: document and format tree_entry_extract()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  97. Junio C HamanoApr 1, 2021
  98. 13/18 tree-walk.h API: formatting changes for subsequent commitÆvar Arnfjörð Bjarmason, Mar 31, 2021
  99. 15/18 tree-walk.h API: rename get_tree_entry() to get_tree_entry_mode()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  100. 06/18 diff tests: test that "mode" is passed when sortingÆvar Arnfjörð Bjarmason, Mar 31, 2021
  101. Junio C HamanoMar 31, 2021
  102. 12/18 tree.h: format argument lists of read_tree() usersÆvar Arnfjörð Bjarmason, Mar 31, 2021
  103. 11/18 match-trees: use "tmp" for mode in shift_tree_by()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  104. Junio C HamanoMar 31, 2021
  105. 14/18 tree-walk.h API doc: improve documentation of get_tree_entry()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  106. Junio C HamanoApr 1, 2021
  107. Ævar Arnfjörð BjarmasonApr 2, 2021
  108. 18/18 tree-entry.h API: rename tree_entry_extract() to tree_entry_extract_mode()Ævar Arnfjörð Bjarmason, Mar 31, 2021
  109. Junio C HamanoApr 1, 2021
  110. 05/32 tree-walk.c: migrate to using new "object_type" field when possibleÆvar Arnfjörð Bjarmason, Mar 16, 2021
  111. 04/32 tree-walk.h: add object_type member to name_entryÆvar Arnfjörð Bjarmason, Mar 16, 2021
  112. 07/32 mktree tests: test that "mode" is passed when sortingÆvar Arnfjörð Bjarmason, Mar 16, 2021
  113. 08/32 diff tests: test that "mode" is passed when sortingÆvar Arnfjörð Bjarmason, Mar 16, 2021
  114. 13/32 archive: get rid of 'stage' parameterÆvar Arnfjörð Bjarmason, Mar 16, 2021
  115. 10/32 tree-walk.h users: switch object_type(...) to new .object_typeÆvar Arnfjörð Bjarmason, Mar 16, 2021
  116. 09/32 cache.h: have base_name_compare() take "is tree?", not "mode"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  117. 06/32 fast-import tests: test for sorting dir/file foo v.s. foo.txtÆvar Arnfjörð Bjarmason, Mar 16, 2021
  118. 12/32 tree.h users: format argument lists in archive.cÆvar Arnfjörð Bjarmason, Mar 16, 2021
  119. 11/32 tree.h: format argument lists of read_tree_recursive() usersÆvar Arnfjörð Bjarmason, Mar 16, 2021
  120. 14/32 tree.h API: make read_tree_fn_t take an "enum object_type"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  121. 16/32 tree-walk.h users: refactor chained "mode" if/else into switchÆvar Arnfjörð Bjarmason, Mar 16, 2021
  122. 17/32 tree-walk.h users: migrate miscellaneous "mode" to "object_type"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  123. 15/32 tree-walk.h users: migrate "p->mode &&" patternÆvar Arnfjörð Bjarmason, Mar 16, 2021
  124. 18/32 merge-tree tests: test for the mode comparison in same_entry()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  125. 19/32 merge-ort: correct reference to test in 62fdec17a11Ævar Arnfjörð Bjarmason, Mar 16, 2021
  126. 22/32 tree-walk.h API: formatting changes for subsequent commitÆvar Arnfjörð Bjarmason, Mar 16, 2021
  127. 20/32 fsck.c: switch on "object_type" in fsck_walk_tree()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  128. 21/32 tree-walk.h users: use temporary variable(s) for "mode"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  129. 23/32 tree-walk.h API: rename get_tree_entry() to get_tree_entry_mode()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  130. 24/32 match-trees: use "tmp" for mode in shift_tree_by()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  131. 25/32 tree-walk.h API: add get_tree_entry_type()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  132. 26/32 tree-walk.h API: document and format tree_entry_extract()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  133. 29/32 tree-walk.h API: add get_tree_entry_all()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  134. 28/32 tree-walk.h API: add a tree_entry_extract_all() functionÆvar Arnfjörð Bjarmason, Mar 16, 2021
  135. 27/32 tree-entry.h API: rename tree_entry_extract() to tree_entry_extract_mode()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  136. 31/32 blame: emit a better error on 'git blame directory'Ævar Arnfjörð Bjarmason, Mar 16, 2021
  137. 30/32 tree-walk.h API: add a get_tree_entry_path() functionÆvar Arnfjörð Bjarmason, Mar 16, 2021
  138. 32/32 tree-walk.h API: add a tree_entry_extract_type() functionÆvar Arnfjörð Bjarmason, Mar 16, 2021
  139. 03/29 cache.h: add a comment to object_type()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  140. 05/29 tree-walk.c: migrate to using new "object_type" field when possibleÆvar Arnfjörð Bjarmason, Mar 16, 2021
  141. 06/29 cache.h: have base_name_compare() take "is tree?", not "mode"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  142. Elijah NewrenMar 16, 2021
  143. 01/29 diff.c: remove redundant canon_mode() callÆvar Arnfjörð Bjarmason, Mar 16, 2021
  144. 04/29 tree-walk.h: add object_type member to name_entryÆvar Arnfjörð Bjarmason, Mar 16, 2021
  145. 10/29 archive: get rid of 'stage' parameterÆvar Arnfjörð Bjarmason, Mar 16, 2021
  146. 07/29 tree-walk.h users: switch object_type(...) to new .object_typeÆvar Arnfjörð Bjarmason, Mar 16, 2021
  147. 13/29 tree-walk.h users: refactor chained "mode" if/else into switchÆvar Arnfjörð Bjarmason, Mar 16, 2021
  148. 08/29 tree.h: format argument lists of read_tree_recursive() usersÆvar Arnfjörð Bjarmason, Mar 16, 2021
  149. 11/29 tree.h API: make read_tree_fn_t take an "enum object_type"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  150. 15/29 merge-tree tests: test for the mode comparison in same_entry()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  151. 14/29 tree-walk.h users: migrate miscellaneous "mode" to "object_type"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  152. 16/29 merge-ort: correct reference to test in 62fdec17a11Ævar Arnfjörð Bjarmason, Mar 16, 2021
  153. 18/29 tree-walk.h users: use temporary variable(s) for "mode"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  154. 17/29 fsck.c: switch on "object_type" in fsck_walk_tree()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  155. 20/29 tree-walk.h API: rename get_tree_entry() to get_tree_entry_mode()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  156. 21/29 tree-walk.h API users: use "tmp" for mode in shift_tree_by()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  157. Elijah NewrenMar 16, 2021
  158. 23/29 tree-walk.h API: document and format tree_entry_extract()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  159. 22/29 tree-walk.h API: add get_tree_entry_type()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  160. 09/29 tree.h users: format argument lists in archive.cÆvar Arnfjörð Bjarmason, Mar 16, 2021
  161. 26/29 tree-walk.h API: add get_tree_entry_all()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  162. 24/29 tree-entry.h API: rename tree_entry_extract() to tree_entry_extract_mode()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  163. 25/29 tree-walk.h API: add a tree_entry_extract_all() functionÆvar Arnfjörð Bjarmason, Mar 16, 2021
  164. 12/29 tree-walk.h users: migrate "p->mode &&" patternÆvar Arnfjörð Bjarmason, Mar 16, 2021
  165. 27/29 tree-walk.h API: add a get_tree_entry_path() functionÆvar Arnfjörð Bjarmason, Mar 16, 2021
  166. Elijah NewrenMar 16, 2021
  167. 28/29 blame: emit a better error on 'git blame directory'Ævar Arnfjörð Bjarmason, Mar 16, 2021
  168. Elijah NewrenMar 16, 2021
  169. 29/29 tree-walk.h API: add a tree_entry_extract_type() functionÆvar Arnfjörð Bjarmason, Mar 16, 2021
  170. 19/29 tree-walk.h API: formatting changes for subsequent commitÆvar Arnfjörð Bjarmason, Mar 16, 2021
  171. 01/30 diff.c: remove redundant canon_mode() callÆvar Arnfjörð Bjarmason, Mar 8, 2021
  172. 03/30 cache.h: add a comment to object_type()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  173. Elijah NewrenMar 9, 2021
  174. 04/30 tree-walk.h: add object_type member to name_entryÆvar Arnfjörð Bjarmason, Mar 8, 2021
  175. 05/30 tree-walk.c: migrate to using new "object_type" field when possibleÆvar Arnfjörð Bjarmason, Mar 8, 2021
  176. Elijah NewrenMar 9, 2021
  177. 12/30 tree-walk.h users: migrate "p->mode &&" patternÆvar Arnfjörð Bjarmason, Mar 8, 2021
  178. Elijah NewrenMar 9, 2021
  179. 06/30 cache.h: have base_name_compare() take "is tree?", not "mode"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  180. Elijah NewrenMar 9, 2021
  181. 07/30 tree-walk.h users: switch object_type(...) to new .object_typeÆvar Arnfjörð Bjarmason, Mar 8, 2021
  182. 08/30 tree.h: format argument lists of read_tree_recursive() usersÆvar Arnfjörð Bjarmason, Mar 8, 2021
  183. 09/30 tree.h users: format argument lists in archive.cÆvar Arnfjörð Bjarmason, Mar 8, 2021
  184. Elijah NewrenMar 9, 2021
  185. 13/30 tree-walk.h users: refactor chained "mode" if/else into switchÆvar Arnfjörð Bjarmason, Mar 8, 2021
  186. Elijah NewrenMar 9, 2021
  187. 11/30 tree.h API: make read_tree_fn_t take an "enum object_type"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  188. 10/30 archive: get rid of 'stage' parameterÆvar Arnfjörð Bjarmason, Mar 8, 2021
  189. 21/30 tree-walk.h API users: use "tmp" for mode in shift_tree_by()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  190. Elijah NewrenMar 9, 2021
  191. 18/30 tree-walk.h users: use temporary variable(s) for "mode"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  192. 20/30 tree-walk.h API: rename get_tree_entry() to get_tree_entry_mode()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  193. 16/30 merge-ort: correct reference to test in 62fdec17a11Ævar Arnfjörð Bjarmason, Mar 8, 2021
  194. Elijah NewrenMar 9, 2021
  195. 22/30 tree-walk.h API: Add get_tree_entry_type()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  196. Elijah NewrenMar 9, 2021
  197. 14/30 tree-walk.h users: migrate miscellaneous "mode" to "object_type"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  198. 19/30 tree-walk.h API: formatting changes for subsequent commitÆvar Arnfjörð Bjarmason, Mar 8, 2021
  199. 17/30 fsck.c: switch on "object_type" in fsck_walk_tree()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  200. 15/30 merge-tree tests: test for the mode comparison in same_entry()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  201. Elijah NewrenMar 9, 2021
  202. 24/30 tree-walk.h API: document and format tree_entry_extract()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  203. Elijah NewrenMar 9, 2021
  204. 25/30 tree-entry.h API: rename tree_entry_extract() to tree_entry_extract_mode()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  205. 23/30 tree-walk.h API: add a get_tree_entry_path() functionÆvar Arnfjörð Bjarmason, Mar 8, 2021
  206. Elijah NewrenMar 9, 2021
  207. 26/30 tree-walk.h API: add a tree_entry_extract_all() functionÆvar Arnfjörð Bjarmason, Mar 8, 2021
  208. Elijah NewrenMar 9, 2021
  209. 28/30 tree-walk.h API users: rename "struct name_entry"'s "mode" to "raw_mode"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  210. Elijah NewrenMar 9, 2021
  211. 29/30 tree.h API users: rename read_tree_fn_t's "mode" to "raw_mode"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  212. Elijah NewrenMar 9, 2021
  213. 30/30 tree-walk.h API: move canon_mode() back out of decode_tree_entry()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  214. Elijah NewrenMar 9, 2021
  215. 27/30 tree-walk.h API: add a tree_entry_extract_type() functionÆvar Arnfjörð Bjarmason, Mar 8, 2021
  216. Elijah NewrenMar 8, 2021
  217. 1/9 ls-files tests: add meaningful --with-tree testsÆvar Arnfjörð Bjarmason, Mar 15, 2021
  218. 0/9 read_tree() and read_tree_recursive() refactoringÆvar Arnfjörð Bjarmason, Mar 15, 2021
  219. Elijah NewrenMar 16, 2021
  220. 0/9 read_tree() and read_tree_recursive() refactoringÆvar Arnfjörð Bjarmason, Mar 16, 2021
  221. 1/9 ls-files tests: add meaningful --with-tree testsÆvar Arnfjörð Bjarmason, Mar 16, 2021
  222. 3/9 ls-files: don't needlessly pass around stage variableÆvar Arnfjörð Bjarmason, Mar 16, 2021
  223. 4/9 ls-files: refactor away read_tree()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  224. 2/9 tree.c API: move read_tree() into builtin/ls-files.cÆvar Arnfjörð Bjarmason, Mar 16, 2021
  225. 5/9 tree.h API: remove support for starting at prefix != ""Ævar Arnfjörð Bjarmason, Mar 16, 2021
  226. 6/9 tree.h API: remove "stage" parameter from read_tree_recursive()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  227. 8/9 show tests: add test for "git show <tree>"Ævar Arnfjörð Bjarmason, Mar 16, 2021
  228. 9/9 tree.h API: expose read_tree_1() as read_tree_at()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  229. 7/9 tree.h API: rename read_tree_recursive() to read_tree()Ævar Arnfjörð Bjarmason, Mar 16, 2021
  230. Junio C HamanoMar 17, 2021
  231. 0/8 read_tree() and read_tree_recursive() refactoringÆvar Arnfjörð Bjarmason, Mar 20, 2021
  232. 2/8 ls-files tests: add meaningful --with-tree testsÆvar Arnfjörð Bjarmason, Mar 20, 2021
  233. 1/8 show tests: add test for "git show <tree>"Ævar Arnfjörð Bjarmason, Mar 20, 2021
  234. 4/8 ls-files: don't needlessly pass around stage variableÆvar Arnfjörð Bjarmason, Mar 20, 2021
  235. 3/8 tree.c API: move read_tree() into builtin/ls-files.cÆvar Arnfjörð Bjarmason, Mar 20, 2021
  236. 5/8 ls-files: refactor away read_tree()Ævar Arnfjörð Bjarmason, Mar 20, 2021
  237. 6/8 archive: stop passing "stage" through read_tree_recursive()Ævar Arnfjörð Bjarmason, Mar 20, 2021
  238. 7/8 tree.h API: expose read_tree_1() as read_tree_at()Ævar Arnfjörð Bjarmason, Mar 20, 2021
  239. 8/8 tree.h API: simplify read_tree_recursive() signatureÆvar Arnfjörð Bjarmason, Mar 20, 2021
  240. Junio C HamanoMar 20, 2021
  241. 3/9 ls-files: don't needlessly pass around stage variableÆvar Arnfjörð Bjarmason, Mar 15, 2021
  242. 4/9 ls-files: refactor away read_tree()Ævar Arnfjörð Bjarmason, Mar 15, 2021
  243. 2/9 tree.c API: move read_tree() into builtin/ls-files.cÆvar Arnfjörð Bjarmason, Mar 15, 2021
  244. 8/9 show tests: add test for "git show <tree>"Ævar Arnfjörð Bjarmason, Mar 15, 2021
  245. Elijah NewrenMar 16, 2021
  246. 5/9 tree.h API: remove support for starting at prefix != ""Ævar Arnfjörð Bjarmason, Mar 15, 2021
  247. 9/9 tree.h API: expose read_tree_1() as read_tree_at()Ævar Arnfjörð Bjarmason, Mar 15, 2021
  248. 7/9 tree.h API: rename read_tree_recursive() to read_tree()Ævar Arnfjörð Bjarmason, Mar 15, 2021
  249. 6/9 tree.h API: remove "stage" parameter from read_tree_recursive()Ævar Arnfjörð Bjarmason, Mar 15, 2021
  250. 5/6 tree.h API: remove support for starting at prefix != ""Ævar Arnfjörð Bjarmason, Mar 8, 2021
  251. 6/6 tree.h API: remove "stage" parameter from read_tree_recursive()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  252. 4/6 ls-files: refactor away read_tree()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  253. Junio C HamanoMar 8, 2021
  254. 1/7 tree.c API: move read_tree() into builtin/ls-files.cÆvar Arnfjörð Bjarmason, Mar 6, 2021
  255. 5/7 ls-files: refactor read_one_entry_quick() to use a strbufÆvar Arnfjörð Bjarmason, Mar 6, 2021
  256. 2/7 ls-files: don't needlessly pass around stage variableÆvar Arnfjörð Bjarmason, Mar 6, 2021
  257. 3/7 ls-files: remove cache juggling + sortingÆvar Arnfjörð Bjarmason, Mar 6, 2021
  258. Elijah NewrenMar 6, 2021
  259. 6/7 tree.h API: remove support for starting at prefix != ""Ævar Arnfjörð Bjarmason, Mar 6, 2021
  260. Elijah NewrenMar 6, 2021
  261. 7/7 tree.h API: remove "stage" parameter from read_tree_recursive()Ævar Arnfjörð Bjarmason, Mar 6, 2021
  262. 4/7 merge-ort: move cmp_cache_name_compare() from tree.cÆvar Arnfjörð Bjarmason, Mar 6, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.