Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: git/git
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: a3c6459ab6610d93da8c95000d0ffc803ce39892
Choose a base ref
...
head repository: git/git
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: a1dfa5448d583bbfd1ec45642a4495ad499970c9
Choose a head ref
  • 3 commits
  • 11 files changed
  • 2 contributors

Commits on Aug 7, 2025

  1. combine-diff: zero memory used for callback filepairs

    In commit 25e5e2b (combine-diff: support format_callback,
    2011-08-19), the combined-diff code learned how to make a multi-sourced
    `diff_filepair` to pass to a diff callback. When we create each
    filepair, we do not bother to fill in many of the fields, because they
    would make no sense (e.g. there can be no rename score or broken_pair
    flag because we do not go through the diffcore filters). However, we did
    not even bother to zero them, leading to random values. Let's make sure
    everything is blank with xcalloc(), just as the regular diff code does.
    
    We would potentially want to set the `status` flag to
    something non-zero, but it is not clear to what. Possibly a
    new DIFF_STATUS_COMBINED would make sense, as this is not
    strictly a modification, nor does it fit any other category.
    
    Since it is not yet clear what callers would want, this
    patch simply leaves it as `0`, the same empty flag that is
    seen when `diffcore_std` is not used at all.
    
    Signed-off-by: Jeff King <[email protected]>
    Signed-off-by: Toon Claes <[email protected]>
    Signed-off-by: Junio C Hamano <[email protected]>
    peff authored and gitster committed Aug 7, 2025
    Configuration menu
    Copy the full SHA
    9bb4abe View commit details
    Browse the repository at this point in the history
  2. within_depth: fix return for empty path

    The within_depth() function is used to check whether pathspecs limited
    by a max-depth parameter are acceptable. It takes a path to check, a
    maximum depth, and a "base" depth. It counts the components in the
    path (by counting slashes), adds them to the base, and compares them to
    the maximum.
    
    However, if the base does not have any slashes at all, we always return
    `true`. If the base depth is 0, then this is correct; no matter what the
    maximum is, we are always within it. However, if the base depth is
    greater than 0, then we might return an erroneous result.
    
    This ends up not causing any user-visible bugs in the current code. The
    call sites in dir.c always pass a base depth of 0, so are unaffected.
    But tree_entry_interesting() uses this function differently: it will
    pass the prefix of the current entry, along with a `1` if the entry is a
    directory, in essence checking whether items inside the entry would be
    of interest. It turns out not to make a difference in behavior, but the
    reasoning is complex.
    
    Given a tree like:
    
      file
      a/file
      a/b/file
    
    walking the tree and calling tree_entry_interesting() will yield the
    following results:
    
      (with max_depth=0):
          file: yes
             a: yes
        a/file: no
           a/b: no
    
      (with max_depth=1):
          file: yes
             a: yes
        a/file: yes
           a/b: no
    
    So we have inconsistent behavior in considering directories interesting.
    If they are at the edge of our depth but at the root, we will recurse
    into them, but then find all of their entries uninteresting (e.g., in
    the first case, we will look at "a" but find "a/*" uninteresting). But
    if they are at the edge of our depth and not at the root, then we will
    not recurse (in the second example, we do not even bother entering
    "a/b").
    
    This turns out not to matter because the only caller which uses
    max-depth pathspecs is cmd_grep(), which only cares about blob entries.
    From its perspective, it is exactly the same to not recurse into a
    subtree, or to recurse and find that it contains no matching entries.
    Not recursing is merely an optimization.
    
    It is debatable whether tree_entry_interesting() should consider such an
    entry interesting. The only caller does not care if it sees the tree
    itself, and can benefit from the optimization. But if we add a
    "max-depth" limiter to regular diffs, then a diff with
    DIFF_OPT_TREE_IN_RECURSIVE would probably want to show the tree itself,
    but not what it contains.
    
    This patch just fixes within_depth(), which means we consider such
    entries uninteresting (and makes the current caller happy). If we want
    to change that in the future, then this fix is still the correct first
    step, as the current behavior is simply inconsistent.
    
    This has the effect the function tree_entry_interesting() now behaves
    like following on the first example:
    
      (with max_depth=0):
          file: yes
             a: no
        a/file: no
           a/b: no
    
    Meaning we won't step in "a/" no more to realize all "a/*" entries are
    uninterested, but we stop at the tree entry itself.
    
    Based-on-patch-by: Jeff King <[email protected]>
    Signed-off-by: Toon Claes <[email protected]>
    Signed-off-by: Junio C Hamano <[email protected]>
    To1ne authored and gitster committed Aug 7, 2025
    Configuration menu
    Copy the full SHA
    2a43e0e View commit details
    Browse the repository at this point in the history
  3. diff: teach tree-diff a max-depth parameter

    When you are doing a tree-diff, there are basically two options: do not
    recurse into subtrees at all, or recurse indefinitely. While most
    callers would want to always recurse and see full pathnames, some may
    want the efficiency of looking only at a particular level of the tree.
    This is currently easy to do for the top-level (just turn off
    recursion), but you cannot say "show me what changed in subdir/, but do
    not recurse".
    
    This patch adds a max-depth parameter which is measured from the closest
    pathspec match, so that you can do:
    
      git log --raw --max-depth=1 -- a/b/c
    
    and see the raw output for a/b/c/, but not those of a/b/c/d/
    (instead of the raw output you would see for a/b/c/d).
    
    Co-authored-by: Toon Claes <[email protected]>
    Signed-off-by: Toon Claes <[email protected]>
    Signed-off-by: Junio C Hamano <[email protected]>
    2 people authored and gitster committed Aug 7, 2025
    Configuration menu
    Copy the full SHA
    a1dfa54 View commit details
    Browse the repository at this point in the history
Loading