Tags: gitgitgadget/git
Tags
doc: add missing --message long option to merge docs From: Brandon <brandondong96@gmail.com> Include mention of --message flag in merge docs to match what is accepted (builtin/merge.c) and to make it consistent with the git commit docs. Signed-off-by: Brandon Dong <brandondong96@gmail.com> Submitted-As: https://lore.kernel.org/git/pull.2315.git.git.1780019726297.gitgitgadget@gmail.com
config.mak.uname: avoid macOS linker warning on Xcode 16.3+
From: Harald Nordgren <haraldnordgren@gmail.com>
Building on macOS with Xcode 16.3 or newer emits:
ld: warning: reducing alignment of section __DATA,__common
from 0x8000 to 0x4000 because it exceeds segment maximum
alignment
Pass -fno-common when "ld -v" reports ld-1167 or newer, so tentative
definitions of large arrays go into BSS instead of __DATA,__common.
Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Submitted-As: https://lore.kernel.org/git/pull.2313.v2.git.git.1780065163866.gitgitgadget@gmail.com
In-Reply-To: https://lore.kernel.org/git/pull.2313.git.git.1779901919956.gitgitgadget@gmail.com
index-pack: retain child bases in delta cache From: Arijit Banerjee <arijit@effectiveailabs.com> When resolving a delta whose result has children of its own, index-pack adds the result to work_head, accounts its data in base_cache_used, and calls prune_base_data(). It then immediately frees that same data. This bypasses the existing delta base cache policy and can force later descendants to reconstruct the queued base again. Let the existing delta_base_cache_limit pruning policy decide whether to keep or evict the data instead. Signed-off-by: Arijit Banerjee <arijit@effectiveailabs.com> Submitted-As: https://lore.kernel.org/git/pull.2131.git.1780070763044.gitgitgadget@gmail.com
[RFC] diff: add diff.<driver>.process for external hunk providers Language-aware diff tools (e.g., Difftastic) and format-specific analyzers can produce better line matching than Git's builtin diff algorithm, but diff.<driver>.command replaces Git's output entirely, losing downstream features like word diff, function context, color, and blame. This series adds diff.<driver>.process, a long-running subprocess protocol that lets an external tool control which lines Git considers changed while Git handles all output formatting. The protocol follows filter.<driver>.process: pkt-line over stdin/stdout, capability negotiation, one process per Git invocation. The tool receives both file versions and returns changed regions (line ranges in the old and new file). Git validates and feeds them into the xdiff pipeline in place of the builtin diff algorithm. When the tool returns no hunks, Git treats the files as having no changes. The first two patches add xdiff plumbing for externally supplied hunks and the diff.<driver>.process config key. Patch 3 refactors the subprocess API to separate process lifecycle from hashmap management, since the diff process stores its subprocess on the userdiff driver rather than in a hashmap. The main feature lands in patch 4. Patch 5 wires up bypass knobs (--no-ext-diff, format-patch). Patch 6 integrates with blame so the tool can declare commits as having no changes. Changes since v2: * Extracted subprocess_start_command() from subprocess_start() so the diff process can reuse the startup machinery without a hashmap (new patch 3). * Subprocess stored on userdiff_driver, no global variables. * Differentiated error handling: tool failure warns (with tool name), "not configured" is silent, abort is voluntary. * Single public entry point: diff_process_fill_hunks() handles driver lookup, flag checks, subprocess management, and error reporting for both diff.c and blame.c. * Rewrote gitattributes protocol section to match filter process convention with packet diagrams and fully specified hunk format. * Split bypass knobs (--no-ext-diff, format-patch) into a separate commit. * SIGPIPE protection, stricter input validation, const correctness. * Changed "zero hunks" to "no hunks" throughout. Michael Montalbo (6): xdiff: support external hunks via xpparam_t userdiff: add diff.<driver>.process config sub-process: separate process lifecycle from hashmap management diff: add long-running diff process via diff.<driver>.process diff: bypass diff process with --no-ext-diff and in format-patch blame: consult diff process for no-hunk detection Documentation/config/diff.adoc | 5 + Documentation/diff-algorithm-option.adoc | 3 + Documentation/diff-options.adoc | 4 +- Documentation/gitattributes.adoc | 139 +++++ Makefile | 1 + blame.c | 40 +- builtin/log.c | 7 + diff-process.c | 288 ++++++++++ diff-process.h | 39 ++ diff.c | 29 +- diff.h | 5 + meson.build | 1 + sub-process.c | 29 +- sub-process.h | 9 +- t/.gitattributes | 1 + t/meson.build | 1 + t/t4080-diff-process.sh | 660 +++++++++++++++++++++++ userdiff.c | 7 + userdiff.h | 5 + xdiff-interface.c | 7 +- xdiff/xdiff.h | 13 + xdiff/xdiffi.c | 85 ++- xdiff/xprepare.c | 10 + xdiff/xprepare.h | 1 + 24 files changed, 1368 insertions(+), 21 deletions(-) create mode 100644 diff-process.c create mode 100644 diff-process.h create mode 100755 t/t4080-diff-process.sh base-commit: 94f0577 Submitted-As: https://lore.kernel.org/git/pull.2120.v3.git.1780087700.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2120.git.1779415884.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2120.v2.git.1779733799.gitgitgadget@gmail.com
daemon: fix network address handling bugs Fix three related issues in daemon.c's network address handling: IPv6 address corruption in lookup_hostname(): getaddrinfo() is called with AF_UNSPEC hints, so it may return IPv6 results. However, the code unconditionally casts ai_addr to sockaddr_in and passes AF_INET to inet_ntop(). On IPv6-only hosts, this reads from the wrong struct offset, producing garbage IP addresses. Fixed by checking ai_family and handling both AF_INET and AF_INET6. IPv6 address truncation in ip2str(): The sockaddr struct size (ai_addrlen) is passed as the output buffer size to inet_ntop(). For IPv6, sizeof(sockaddr_in6) is 28 bytes but INET6_ADDRSTRLEN is 46, so long IPv6 addresses are silently truncated. Fixed by passing sizeof(ip) instead, and dropping the now-unused len parameter. NULL pointer in execute() logging: REMOTE_PORT environment variable is used in a format string without a NULL check (only REMOTE_ADDR was checked). If REMOTE_PORT is unset, NULL is passed to printf's %s, which is undefined behavior. Fixed by using a fallback string. Changes since v1: * Split the single patch into three separate commits, one per fix, per Patrick's review. * Deduplicated the address family handling in lookup_hostname(): instead of duplicating the inet_ntop() call for each family, the address pointer is extracted into a local void *addr variable first, then inet_ntop() is called once, per Patrick's suggestion. * The (void *) intermediate cast on ai_addr is used intentionally: C guarantees any object pointer round-trips safely through void *, and it keeps the per-family blocks shorter than spelling out the full struct casts. * For the REMOTE_PORT NULL guard: both REMOTE_ADDR and REMOTE_PORT are set by the same code path in handle(), so neither should be NULL independently. The guard makes the code consistent with the existing REMOTE_ADDR check and avoids undefined behavior from printf %s with a NULL argument. * Die on unexpected address families in lookup_hostname() rather than silently leaving addrbuf uninitialized. Sebastien Tardif (3): daemon: fix IPv6 address corruption in lookup_hostname() daemon: fix IPv6 address truncation in ip2str() daemon: guard NULL REMOTE_PORT in execute() logging daemon.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) base-commit: 59ff488 Submitted-As: https://lore.kernel.org/git/pull.2300.v3.git.git.1779937016.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2300.git.git.1778773592.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2300.v2.git.git.1779905911.gitgitgadget@gmail.com
t3070: skip ls-files tests with backslash patterns on Windows From: Kristofer Karlsson <krka@spotify.com> On Windows (MINGW), backslashes in pathspecs are silently converted to forward slashes (directory separators), which changes the glob semantics. This causes 36 test failures in t3070-wildmatch when the "via ls-files" variants test patterns containing backslash escapes (e.g. '\[ab]', '[\-_]', '[A-\\]'). The wildmatch function itself handles these patterns correctly — only the ls-files code path fails because pathspec parsing converts the backslashes before they reach the glob matcher. Skip these ls-files tests on platforms where BSLASHPSPEC is not set, which is the existing prereq that captures exactly this semantic: "backslashes in pathspec are not directory separators." Signed-off-by: Kristofer Karlsson <krka@spotify.com> Submitted-As: https://lore.kernel.org/git/pull.2128.git.1779958849319.gitgitgadget@gmail.com
rebase: handle --update-refs branch symrefs
git rebase --update-refs can fail after the normal rebase path has
successfully updated the current branch when another local branch is a
symbolic ref to it.
One practical way to arrive at that setup is a default branch rename from
master to main. While the migration is in progress, a user may keep
refs/heads/main as a symbolic ref to refs/heads/master so that both names
continue to work locally.
If pull.rebase is enabled, a plain git pull can then finish the rebase of
master and still fail while trying to update the main alias. The reported
failure looked like this, with line breaks adjusted for the cover letter:
Successfully rebased and updated refs/heads/master.
error: update_ref failed for ref 'refs/heads/main':
cannot lock ref 'refs/heads/main':
is at fc2c7bd5f17abec7861ef759edcd33a1e16662a1
but expected 531cabdfb49098d6ffa502ed4bf91d1b35edfcfa
Updated the following refs with --update-refs:
Failed to update the following refs with --update-refs:
refs/heads/main
The sequencer builds its update-ref todo commands from local branch
decorations. It excludes the current branch by comparing the literal
decoration name with the resolved HEAD ref, so refs/heads/main is not
recognized as the current branch alias. The final update then dereferences
the alias back to master, but master has already moved, so the old-OID check
fails.
This series keeps that failure mode explicit by adding a known-breakage test
first, so that the behavioral expectation is clear before the fix. The fix
then resolves local branch symref decorations before queuing update-ref
commands, skips aliases of the current branch, and skips duplicate
referents. That keeps the existing old-OID protection on the single real
branch update. It also avoids teaching the final ref update step to treat
this race-looking mismatch as success.
Patch overview:
* Patch 1 records the branch-symref failure in t3404.
* Patch 2 flips the test and canonicalizes sequencer behavior.
Son Luong Ngoc (2):
t3404: add failing branch symref test
rebase: skip branch symref aliases
sequencer.c | 63 +++++++++++++++++++++++++++++------
t/t3404-rebase-interactive.sh | 25 ++++++++++++++
2 files changed, 77 insertions(+), 11 deletions(-)
base-commit: c69baaf
Submitted-As: https://lore.kernel.org/git/pull.2126.git.1779946921.gitgitgadget@gmail.com
doc: clarify that --word-diff operates on line-level hunks From: Michael Montalbo <mmontalbo@gmail.com> The --word-diff documentation describes the output modes and word-regex mechanics but does not explain that word-diff operates within the hunks produced by the line-level diff rather than performing an independent word-stream comparison. This can surprise users when the line-level alignment causes word-level changes to appear even though the words in both files are identical. Add an implementation note explaining the two-stage relationship and that the output may change if Git acquires a different implementation in the future. Signed-off-by: Michael Montalbo <mmontalbo@gmail.com> Submitted-As: https://lore.kernel.org/git/pull.2113.v2.git.1779996106005.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2113.git.1778686956622.gitgitgadget@gmail.com
line-log: integrate -L with the standard log output pipeline Since its introduction, git log -L has short-circuited from log_tree_commit() into its own output function, bypassing log_tree_diff() and log_tree_diff_flush(). This skips no_free save/restore, always_show_header, diff_free() cleanup, and means that pickaxe (-S, -G, --find-object) and --diff-filter cannot suppress commits whose pairs are all filtered out, because show_log() runs before diffcore_std(). This series restructures the flow so that -L goes through the same log_tree_diff() -> log_tree_diff_flush() path as normal single-parent and merge diffs, then uses that to enable several non-patch diff formats. Patch 1: revision: move -L setup before output_format-to-diff derivation Preparatory reorder in setup_revisions(). The -L block sets a default DIFF_FORMAT_PATCH when no format is requested; move it before the derivation of revs->diff from output_format so the default is visible to that check. No behavior change on its own. Patch 2: line-log: integrate -L output with the standard log-tree pipeline Rename line_log_print() to line_log_queue_pairs(), stripping it down to only queue pre-computed filepairs. log_tree_diff_flush() handles show_log(), diffcore_std(), and diff_flush(). This fixes pickaxe and --diff-filter suppression, and aligns the commit/diff separator with the rest of log output. Rejects --full-diff, which is not yet supported when filepairs are pre-computed. Patch 3: line-log: allow non-patch diff formats with -L Expand the allowlist to accept --raw, --name-only, --name-status, and --summary. These only read filepair metadata already set by the line-log machinery. Diff stat formats (--stat, --numstat, --shortstat, --dirstat) remain blocked because they call compute_diffstat() on full blob content and would show whole-file statistics rather than range-scoped ones. Changes since v2: * Switch "! test_grep" to "test_grep !" in tests. Michael Montalbo (3): revision: move -L setup before output_format-to-diff derivation line-log: integrate -L output with the standard log-tree pipeline line-log: allow non-patch diff formats with -L Documentation/line-range-options.adoc | 10 +- line-log.c | 30 ++---- line-log.h | 2 +- log-tree.c | 10 +- revision.c | 24 +++-- t/t4211-line-log.sh | 100 +++++++++++++++--- t/t4211/sha1/expect.parallel-change-f-to-main | 1 - .../sha256/expect.parallel-change-f-to-main | 1 - 8 files changed, 121 insertions(+), 57 deletions(-) base-commit: 9f223ef Submitted-As: https://lore.kernel.org/git/pull.2094.v3.git.1780001267.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2094.git.1777349126.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.2094.v2.git.1779738059.gitgitgadget@gmail.com
pkt-line: initialize packet_buffer to avoid macOS linker warning From: Harald Nordgren <haraldnordgren@gmail.com> Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com> Submitted-As: https://lore.kernel.org/git/pull.2313.git.git.1779901919956.gitgitgadget@gmail.com
PreviousNext