]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
15 hours agoMerge branch 'js/t5564-socks-use-short-path' into seen seen
Junio C Hamano [Tue, 28 Apr 2026 01:42:13 +0000 (10:42 +0900)] 
Merge branch 'js/t5564-socks-use-short-path' into seen

* js/t5564-socks-use-short-path:
  t5564: use a short path for the SOCKS proxy socket

15 hours agoMerge branch 'kh/doc-log-decorate-list' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:42:12 +0000 (10:42 +0900)] 
Merge branch 'kh/doc-log-decorate-list' into seen

* kh/doc-log-decorate-list:
  doc: log: use the same delimiter in description list
  doc: log: fix --decorate description list

15 hours agoMerge branch 'bc/sign-commit-with-custom-encoding' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:42:11 +0000 (10:42 +0900)] 
Merge branch 'bc/sign-commit-with-custom-encoding' into seen

* bc/sign-commit-with-custom-encoding:
  commit: sign commit after mutating buffer
  commit: name UTF-8 function appropriately

15 hours agoMerge branch 'ua/push-remote-group' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:42:10 +0000 (10:42 +0900)] 
Merge branch 'ua/push-remote-group' into seen

"git push" learned to take a "remote group" name to push to, which
causes pushes to multiple places, just like "git fetch" would do.

* ua/push-remote-group:
  SQUASH??? -Werror=sign-compare workaround
  push: support pushing to a remote group
  remote: move remote group resolution to remote.c

15 hours agoMerge branch 'kn/refs-generic-helpers' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:42:09 +0000 (10:42 +0900)] 
Merge branch 'kn/refs-generic-helpers' into seen

Refactor service routines in the ref subsystem backends.

* kn/refs-generic-helpers:
  refs: use peeled tag values in reference backends
  refs: add peeled object ID to the `ref_update` struct
  refs: move object parsing to the generic layer
  update-ref: handle rejections while adding updates
  update-ref: move `print_rejected_refs()` up
  refs: return `ref_transaction_error` from `ref_transaction_update()`
  refs: extract out reflog config to generic layer
  refs: introduce `ref_store_init_options`
  refs: remove unused typedef 'ref_transaction_commit_fn'

15 hours agoSQUASH??? -Werror=sign-compare workaround
Junio C Hamano [Tue, 28 Apr 2026 01:37:24 +0000 (10:37 +0900)] 
SQUASH??? -Werror=sign-compare workaround

15 hours agoMerge branch 'js/adjust-tests-to-explicitly-access-bare-repo' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:05 +0000 (10:22 +0900)] 
Merge branch 'js/adjust-tests-to-explicitly-access-bare-repo' into seen

Some tests assume that bare repository accesses are by default
allowed; rewrite some of them to avoid the assumption, rewrite
others to explicitly set safe.bareRepository to allow them.

* js/adjust-tests-to-explicitly-access-bare-repo:
  safe.bareRepository: default to "explicit" with WITH_BREAKING_CHANGES
  status tests: filter `.gitconfig` from status output
  ls-files tests: filter `.gitconfig` from `--others` output
  t5601: restore `.gitconfig` after includeIf test
  t1305: use `--git-dir=.` for bare repo in include cycle test
  t1300: remove global config settings injected by test-lib.sh
  t7900: do not let `$HOME/.gitconfig` interfere with XDG tests
  test-lib: allow bare repository access when breaking changes are enabled

15 hours agoMerge branch 'js/parseopt-subcommand-autocorrection' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:04 +0000 (10:22 +0900)] 
Merge branch 'js/parseopt-subcommand-autocorrection' into seen

The parse-options library learned to auto-correct misspelled
subcommand names.

* js/parseopt-subcommand-autocorrection:
  SQUASH???
  doc: document autocorrect API
  parseopt: add tests for subcommand autocorrection
  parseopt: enable subcommand autocorrection for git-remote and git-notes
  parseopt: autocorrect mistyped subcommands
  autocorrect: provide config resolution API
  autocorrect: rename AUTOCORRECT_SHOW to AUTOCORRECT_HINT
  autocorrect: use mode and delay instead of magic numbers
  help: move tty check for autocorrection to autocorrect.c
  help: make autocorrect handling reusable
  parseopt: extract subcommand handling from parse_options_step()

15 hours agoMerge branch 'en/ort-harden-against-corrupt-trees' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:04 +0000 (10:22 +0900)] 
Merge branch 'en/ort-harden-against-corrupt-trees' into seen

"ort" merge backend handles merging corrupt trees better by
aborting when it should.

* en/ort-harden-against-corrupt-trees:
  cache-tree: fix verify_cache() to catch non-adjacent D/F conflicts
  merge-ort: abort merge when trees have duplicate entries
  merge-ort: free diff pairs queue in clear_or_reinit_internal_opts()
  merge-ort: drop unnecessary show_all_errors from collect_merge_info()
  merge-ort: propagate callback errors from traverse_trees_wrapper()

15 hours agoMerge branch 'sg/t6112-unwanted-tilde-expansion-fix' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:04 +0000 (10:22 +0900)] 
Merge branch 'sg/t6112-unwanted-tilde-expansion-fix' into seen

Test fix.

* sg/t6112-unwanted-tilde-expansion-fix:
  t6112: avoid tilde expansion

15 hours agoMerge branch 'pw/status-rebase-todo' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:03 +0000 (10:22 +0900)] 
Merge branch 'pw/status-rebase-todo' into seen

The display of the rebase todo list in "git status" has been
improved to correctly abbreviate object IDs for more commands and
avoid misinterpreting refs as object IDs.

* pw/status-rebase-todo:
  status: improve rebase todo list parsing
  sequencer: factor out parsing of todo commands

15 hours agoMerge branch 'lp/repack-propagate-promisor-debugging-info' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:03 +0000 (10:22 +0900)] 
Merge branch 'lp/repack-propagate-promisor-debugging-info' into seen

When fetching objects into a lazily cloned repository, .promisor
files are created with information meant to help debugging.  "git
repack" has been taught to carry this information forward to
packfiles that are newly created.

Comments?

* lp/repack-propagate-promisor-debugging-info:
  repack-promisor: add missing headers
  t7703: test for promisor file content after geometric repack
  t7700: test for promisor file content after repack
  repack-promisor: preserve content of promisor files after repack
  repack-promisor add helper to fill promisor file after repack
  pack-write: add explanation to promisor file content

15 hours agoMerge branch 'en/diffstat-utf8-truncation-fix' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:03 +0000 (10:22 +0900)] 
Merge branch 'en/diffstat-utf8-truncation-fix' into seen

The computation to shorten the filenames shown in diffstat measured
width of individual UTF-8 characters to add up, but forgot to take
into account error cases (e.g., an invalid UTF-8 sequence, or a
control character).

* en/diffstat-utf8-truncation-fix:
  diff: fix out-of-bounds reads and NULL deref in diffstat UTF-8 truncation

15 hours agoMerge branch 'en/batch-prefetch' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:02 +0000 (10:22 +0900)] 
Merge branch 'en/batch-prefetch' into seen

In a lazy clone, "git cherry" and "git grep" often fetch necessary
blob objects one by one from promisor remotes.  It has been corrected
to collect necessary object names and fetch them in bulk to gain
reasonable performance.

* en/batch-prefetch:
  grep: prefetch necessary blobs
  builtin/log: prefetch necessary blobs for `git cherry`
  patch-ids.h: add missing trailing parenthesis in documentation comment

15 hours agoMerge branch 'en/backfill-fixes-and-edges' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:02 +0000 (10:22 +0900)] 
Merge branch 'en/backfill-fixes-and-edges' into seen

The 'git backfill' command now rejects revision-limiting options that
are incompatible with its operation, uses standard documentation for
revision ranges, and includes blobs from boundary commits by default
to improve performance of subsequent operations.

* en/backfill-fixes-and-edges:
  backfill: default to grabbing edge blobs too
  backfill: document acceptance of revision-range in more standard manner
  backfill: reject rev-list arguments that do not make sense

15 hours agoMerge branch 'tb/pseudo-merge-bugfixes' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:02 +0000 (10:22 +0900)] 
Merge branch 'tb/pseudo-merge-bugfixes' into seen

Fixes many bugs in pseudo-merge code.

* tb/pseudo-merge-bugfixes:
  pack-bitmap: prevent pattern leak on pseudo-merge re-assignment
  Documentation: fix broken `sampleRate` in gitpacking(7)
  pack-bitmap: reject pseudo-merge "sampleRate" of 0
  pack-bitmap: parse commits in `find_pseudo_merge_group_for_ref()`
  pack-bitmap: fix pseudo-merge lookup for shared commits
  pack-bitmap: fix inverted binary search in `pseudo_merge_at()`
  pack-bitmap-write: sort pseudo-merge commit lookup table in pack order
  t5333: demonstrate various pseudo-merge bugs
  t/helper: add 'test-tool bitmap write' subcommand

15 hours agoMerge branch 'pt/fsmonitor-linux' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:02 +0000 (10:22 +0900)] 
Merge branch 'pt/fsmonitor-linux' into seen

The fsmonitor daemon has been implemented for Linux.

* pt/fsmonitor-linux:
  fsmonitor: convert shown khash to strset in do_handle_client
  fsmonitor: add tests for Linux
  fsmonitor: add timeout to daemon stop command
  fsmonitor: close inherited file descriptors and detach in daemon
  run-command: add close_fd_above_stderr option
  fsmonitor: implement filesystem change listener for Linux
  fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c
  fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c
  fsmonitor: use pthread_cond_timedwait for cookie wait
  compat/win32: add pthread_cond_timedwait
  fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon
  fsmonitor: fix khash memory leak in do_handle_client
  t9210, t9211: disable GIT_TEST_SPLIT_INDEX for scalar clone tests

15 hours agoMerge branch 'ps/odb-in-memory' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:01 +0000 (10:22 +0900)] 
Merge branch 'ps/odb-in-memory' into seen

Add a new odb "in-memory" source that is meant to only hold
tentative objects (like the virtual blob object that represents the
working tree file used by "git blame").

* ps/odb-in-memory:
  t/unit-tests: add tests for the in-memory object source
  odb: generic in-memory source
  odb/source-inmemory: stub out remaining functions
  odb/source-inmemory: implement `freshen_object()` callback
  odb/source-inmemory: implement `count_objects()` callback
  odb/source-inmemory: implement `find_abbrev_len()` callback
  odb/source-inmemory: implement `for_each_object()` callback
  odb/source-inmemory: convert to use oidtree
  oidtree: add ability to store data
  cbtree: allow using arbitrary wrapper structures for nodes
  odb/source-inmemory: implement `write_object_stream()` callback
  odb/source-inmemory: implement `write_object()` callback
  odb/source-inmemory: implement `read_object_stream()` callback
  odb/source-inmemory: implement `read_object_info()` callback
  odb: fix unnecessary call to `find_cached_object()`
  odb/source-inmemory: implement `free()` callback
  odb: introduce "in-memory" source

15 hours agoMerge branch 'jt/odb-transaction-write' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:01 +0000 (10:22 +0900)] 
Merge branch 'jt/odb-transaction-write' into seen

ODB transaction interface is being reworked to explicitly handle
object writes.

* jt/odb-transaction-write:
  odb/transaction: make `write_object_stream()` pluggable
  object-file: generalize packfile writes to use odb_write_stream
  object-file: avoid fd seekback by checking object size upfront
  object-file: remove flags from transaction packfile writes
  odb: update `struct odb_write_stream` read() callback
  odb/transaction: use pluggable `begin_transaction()`
  odb: split `struct odb_transaction` into separate header

15 hours agoMerge branch 'ps/shift-root-in-graph' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:01 +0000 (10:22 +0900)] 
Merge branch 'ps/shift-root-in-graph' into seen

In a history with more than one root commit, "git log --graph
--oneline" stuffed an unrelated commit immediately below a root
commit, which has been corrected by making the spot below a root
unavailable.

* ps/shift-root-in-graph:
  graph: add indentation for commits preceded by a parentless commit

15 hours agoMerge branch 'kh/doc-trailers' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:00 +0000 (10:22 +0900)] 
Merge branch 'kh/doc-trailers' into seen

Documentation updates.

* kh/doc-trailers:
  doc: interpret-trailers: document comment line treatment
  doc: interpret-trailers: commit to “trailer block” term
  doc: interpret-trailers: add key format example
  doc: interpret-trailers: explain key format
  doc: interpret-trailers: explain the format after the intro
  doc: interpret-trailers: not just for commit messages
  doc: interpret-trailers: use “metadata” in Name as well
  doc: interpret-trailers: replace “lines” with “metadata”
  doc: interpret-trailers: stop fixating on RFC 822

15 hours agoMerge branch 'ps/setup-wo-the-repository' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:22:00 +0000 (10:22 +0900)] 
Merge branch 'ps/setup-wo-the-repository' into seen

Many uses of the_repository has been updated to use a more
appropriate struct repository instance in setup.c codepath.

* ps/setup-wo-the-repository:
  setup: stop using `the_repository` in `init_db()`
  setup: stop using `the_repository` in `create_reference_database()`
  setup: stop using `the_repository` in `initialize_repository_version()`
  setup: stop using `the_repository` in `check_repository_format()`
  setup: stop using `the_repository` in `upgrade_repository_format()`
  setup: stop using `the_repository` in `setup_git_directory()`
  setup: stop using `the_repository` in `setup_git_directory_gently()`
  setup: stop using `the_repository` in `setup_git_env()`
  setup: stop using `the_repository` in `set_git_work_tree()`
  setup: stop using `the_repository` in `setup_work_tree()`
  setup: stop using `the_repository` in `enter_repo()`
  setup: stop using `the_repository` in `verify_non_filename()`
  setup: stop using `the_repository` in `verify_filename()`
  setup: stop using `the_repository` in `path_inside_repo()`
  setup: stop using `the_repository` in `prefix_path()`
  setup: stop using `the_repository` in `is_inside_git_dir()`
  setup: stop using `the_repository` in `is_inside_worktree()`
  setup: replace use of `the_repository` in static functions

15 hours agoMerge branch 'ps/graph-lane-limit' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:59 +0000 (10:21 +0900)] 
Merge branch 'ps/graph-lane-limit' into seen

The graph output from commands like "git log --graph" can now be
limited to a specified number of lanes, preventing overly wide output
in repositories with many branches.

* ps/graph-lane-limit:
  graph: add truncation mark to capped lanes
  graph: add --graph-lane-limit option
  graph: limit the graph width to a hard-coded max

15 hours agoMerge branch 'jr/bisect-custom-terms-in-output' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:59 +0000 (10:21 +0900)] 
Merge branch 'jr/bisect-custom-terms-in-output' into seen

"git bisect" now uses the selected terms (e.g., old/new) more
consistently in its output.

* jr/bisect-custom-terms-in-output:
  rev-parse: use selected alternate terms to look up refs
  bisect: use selected alternate terms in status output

15 hours agoMerge branch 'kh/name-rev-custom-format' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:58 +0000 (10:21 +0900)] 
Merge branch 'kh/name-rev-custom-format' into seen

"git name-rev" learned to use custom format instead of the object
name in an extended SHA-1 expression form.

* kh/name-rev-custom-format:
  name-rev: learn --format=<pretty>
  name-rev: wrap both blocks in braces

15 hours agoMerge branch 'jc/neuter-sideband-post-3.0' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:58 +0000 (10:21 +0900)] 
Merge branch 'jc/neuter-sideband-post-3.0' into seen

The final step, split from earlier attempt by Dscho, to loosen the
sideband restriction for now and tighten later at Git v3.0 boundary.

* jc/neuter-sideband-post-3.0:
  sideband: delay sanitizing by default to Git v3.0

15 hours agoMerge branch 'ab/clone-default-object-filter' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:58 +0000 (10:21 +0900)] 
Merge branch 'ab/clone-default-object-filter' into seen

"git clone" learns to pay attention to "clone.<url>.defaultObjectFilter"
configuration and behave as if the "--filter=<filter-spec>" option
was given on the command line.

* ab/clone-default-object-filter:
  clone: add clone.<url>.defaultObjectFilter config

15 hours agoMerge branch 'cs/subtree-split-recursion' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:57 +0000 (10:21 +0900)] 
Merge branch 'cs/subtree-split-recursion' into seen

When processing large history graphs on Debian or Ubuntu, "git
subtree" can die with a "recursion depth reached" error.

Comments?

* cs/subtree-split-recursion:
  contrib/subtree: reduce recursion during split
  contrib/subtree: functionalize split traversal
  contrib/subtree: reduce function side-effects

15 hours agoMerge branch 'tb/incremental-midx-part-3.3' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:57 +0000 (10:21 +0900)] 
Merge branch 'tb/incremental-midx-part-3.3' into seen

The repacking code has been refactored and compaction of MIDX layers
have been implemented, and incremental strategy that does not require
all-into-one repacking has been introduced.

* tb/incremental-midx-part-3.3:
  repack: allow `--write-midx=incremental` without `--geometric`
  repack: introduce `--write-midx=incremental`
  repack: implement incremental MIDX repacking
  packfile: ensure `close_pack_revindex()` frees in-memory revindex
  builtin/repack.c: convert `--write-midx` to an `OPT_CALLBACK`
  repack-geometry: prepare for incremental MIDX repacking
  repack-midx: extract `repack_fill_midx_stdin_packs()`
  repack-midx: factor out `repack_prepare_midx_command()`
  midx: expose `midx_layer_contains_pack()`
  repack: track the ODB source via existing_packs
  midx: support custom `--base` for incremental MIDX writes
  midx: introduce `--checksum-only` for incremental MIDX writes
  midx: use `strvec` for `keep_hashes`
  strvec: introduce `strvec_init_alloc()`
  midx: use `string_list` for retained MIDX files
  midx-write: handle noop writes when converting incremental chains

15 hours agoMerge branch 'th/promisor-quiet-per-repo' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:57 +0000 (10:21 +0900)] 
Merge branch 'th/promisor-quiet-per-repo' into seen

The "promisor.quiet" configuration variable was not used from
relevant submodules when commands like "grep --recurse-submodules"
triggered a lazy fetch, which has been corrected.

Comments?

* th/promisor-quiet-per-repo:
  promisor-remote: fix promisor.quiet to use the correct repository

15 hours agoMerge branch 'jt/config-lock-timeout' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:56 +0000 (10:21 +0900)] 
Merge branch 'jt/config-lock-timeout' into seen

The code path to update the configuration file has been taught to
use a short timeout to retry.

* jt/config-lock-timeout:
  config: retry acquiring config.lock for 100ms

15 hours agoMerge branch 'cl/conditional-config-on-worktree-path' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:56 +0000 (10:21 +0900)] 
Merge branch 'cl/conditional-config-on-worktree-path' into seen

The [includeIf "condition"] conditional inclusion facility for
configuration files has learned to use the location of worktree
in its condition.

Comments?

* cl/conditional-config-on-worktree-path:
  config: add "worktree" and "worktree/i" includeIf conditions
  config: refactor include_by_gitdir() into include_by_path()

15 hours agoMerge branch 'ds/fetch-negotiation-options' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:55 +0000 (10:21 +0900)] 
Merge branch 'ds/fetch-negotiation-options' into seen

The negotiation tip options in "git fetch" have been reworked to
allow requiring certain refs to be sent as "have" lines, and to
restrict negotiation to a specific set of refs.

* ds/fetch-negotiation-options:
  send-pack: pass negotiation config in push
  remote: add remote.*.negotiationInclude config
  fetch: add --negotiation-include option for negotiation
  remote: add remote.*.negotiationRestrict config
  transport: rename negotiation_tips
  fetch: add --negotiation-restrict option
  t5516: fix test order flakiness

15 hours agoMerge branch 'sa/cat-file-batch-mailmap-switch' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:55 +0000 (10:21 +0900)] 
Merge branch 'sa/cat-file-batch-mailmap-switch' into seen

"git cat-file --batch" learns an in-line command "mailmap"
that lets the user toggle use of mailmap.

* sa/cat-file-batch-mailmap-switch:
  cat-file: add mailmap subcommand to --batch-command

15 hours agoMerge branch 'pt/promisor-lazy-fetch-no-recurse' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:55 +0000 (10:21 +0900)] 
Merge branch 'pt/promisor-lazy-fetch-no-recurse' into seen

The mechanism to avoid recursive lazy-fetch from promisor remotes
was not propagated properly to child "git fetch" processes, which
has been corrected.

* pt/promisor-lazy-fetch-no-recurse:
  promisor-remote: prevent lazy-fetch recursion in child fetch

15 hours agoMerge branch 'jd/unpack-trees-wo-the-repository' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:55 +0000 (10:21 +0900)] 
Merge branch 'jd/unpack-trees-wo-the-repository' into seen

A handful of inappropriate uses of the_repository have been
rewritten to use the right repository structure instance in the
unpack-trees.c codepath.

Comments?

* jd/unpack-trees-wo-the-repository:
  unpack-trees: use repository from index instead of global
  unpack-trees: use repository from index instead of global

15 hours agoMerge branch 'pw/xdiff-shrink-memory-consumption' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:54 +0000 (10:21 +0900)] 
Merge branch 'pw/xdiff-shrink-memory-consumption' into seen

Shrink wasted memory in Myers diff that does not account for common
prefix and suffix removal.

* pw/xdiff-shrink-memory-consumption:
  xdiff: reduce the size of array
  xprepare: simplify error handling
  xdiff: cleanup xdl_clean_mmatch()
  xdiff: reduce size of action arrays

15 hours agoMerge branch 'en/xdiff-cleanup-3' into seen
Junio C Hamano [Tue, 28 Apr 2026 01:21:54 +0000 (10:21 +0900)] 
Merge branch 'en/xdiff-cleanup-3' into seen

Preparation of the xdiff/ codebase to work with Rust.

* en/xdiff-cleanup-3:
  xdiff/xdl_cleanup_records: put braces around the else clause
  xdiff/xdl_cleanup_records: make setting action easier to follow
  xdiff/xdl_cleanup_records: make limits more clear
  xdiff/xdl_cleanup_records: use unambiguous types
  xdiff: use unambiguous types in xdl_bogo_sqrt()
  xdiff/xdl_cleanup_records: delete local recs pointer

15 hours agoMerge branch 'sb/unpack-index-pack-buffer-resize' into jch jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:29 +0000 (10:13 +0900)] 
Merge branch 'sb/unpack-index-pack-buffer-resize' into jch

Use a larger buffer size in the code paths to ingest pack stream.

* sb/unpack-index-pack-buffer-resize:
  index-pack, unpack-objects: increase input buffer from 4 KiB to 128 KiB

15 hours agoMerge branch 'jh/alias-i18n-fixes' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:29 +0000 (10:13 +0900)] 
Merge branch 'jh/alias-i18n-fixes' into jch

Further update to the i18n alias support to avoid regressions.

* jh/alias-i18n-fixes:
  alias: restore support for simple dotted aliases

15 hours agoMerge branch 'rs/grep-column-only-match-fix' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:28 +0000 (10:13 +0900)] 
Merge branch 'rs/grep-column-only-match-fix' into jch

"git grep" update.

* rs/grep-column-only-match-fix:
  grep: fix --column --only-match for 2nd and later matches

15 hours agoMerge branch 'hn/git-checkout-m-with-stash' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:28 +0000 (10:13 +0900)] 
Merge branch 'hn/git-checkout-m-with-stash' into jch

"git checkout -m another-branch" was invented to deal with local
changes to paths that are different between the current and the new
branch, but it gave only one chance to resolve conflicts.  The command
was taught to create a stash to save the local changes.

* hn/git-checkout-m-with-stash:
  checkout -m: autostash when switching branches
  checkout: rollback lock on early returns in merge_working_tree
  sequencer: teach autostash apply to take optional conflict marker labels
  sequencer: allow create_autostash to run silently
  stash: add --label-ours, --label-theirs, --label-base for apply

15 hours agoMerge branch 'ob/more-repo-config-values' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:28 +0000 (10:13 +0900)] 
Merge branch 'ob/more-repo-config-values' into jch

* ob/more-repo-config-values:
  env: move "warn_on_object_refname_ambiguity" into `struct repo_config_values`
  env: move "sparse_expect_files_outside_of_patterns" into `repo_config_values`
  env: move "core_sparse_checkout_cone" into `struct repo_config_values`
  environment: move "precomposed_unicode" into `struct repo_config_values`
  environment: move "pack_compression_level" into `struct repo_config_values`
  environment: move `zlib_compression_level` into `struct repo_config_values`
  environment: move "check_stat" into `struct repo_config_values`
  environment: move "trust_ctime" into `struct repo_config_values`

15 hours agoMerge branch 'ps/history-fixup' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:27 +0000 (10:13 +0900)] 
Merge branch 'ps/history-fixup' into jch

* ps/history-fixup:
  builtin/history: introduce "fixup" subcommand
  builtin/history: generalize function to commit trees
  replay: allow callers to control what happens with empty commits

15 hours agoMerge branch 'js/ci-github-actions-update' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:27 +0000 (10:13 +0900)] 
Merge branch 'js/ci-github-actions-update' into jch

Update various GitHub Actions versions.

* js/ci-github-actions-update:
  l10n: bump mshick/add-pr-comment from v2 to v3
  ci: bump actions/checkout from v5 to v6
  ci: bump actions/github-script from v8 to v9
  ci: bump actions/{upload,download}-artifact to v7 and v8
  ci: bump microsoft/setup-msbuild from v2 to v3

15 hours agoMerge branch 'mf/format-patch-cover-letter-format-docfix' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:27 +0000 (10:13 +0900)] 
Merge branch 'mf/format-patch-cover-letter-format-docfix' into jch

Docfix.

* mf/format-patch-cover-letter-format-docfix:
  Fix docs for format.commitListFormat

15 hours agoMerge branch 'en/ort-cached-rename-with-trivial-resolution' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:27 +0000 (10:13 +0900)] 
Merge branch 'en/ort-cached-rename-with-trivial-resolution' into jch

"ort" merge backend improvements.

* en/ort-cached-rename-with-trivial-resolution:
  merge-ort: handle cached rename & trivial resolution interaction better

15 hours agoMerge branch 'jk/revert-aa-reap-transport-child-processes' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:27 +0000 (10:13 +0900)] 
Merge branch 'jk/revert-aa-reap-transport-child-processes' into jch

Revert a recent change that introduced a regression to help mksh users.

* jk/revert-aa-reap-transport-child-processes:
  Revert "transport-helper, connect: use clean_on_exit to reap children on abnormal exit"

15 hours agoMerge branch 'ss/t7004-unhide-git-failures' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:26 +0000 (10:13 +0900)] 
Merge branch 'ss/t7004-unhide-git-failures' into jch

Test clean-up.

* ss/t7004-unhide-git-failures:
  t7004: avoid subshells to capture git exit codes
  t7004: dynamically grab expected state in tests
  t7004: drop hardcoded tag count for state verification

15 hours ago### match next
Junio C Hamano [Tue, 28 Apr 2026 01:13:26 +0000 (10:13 +0900)] 
### match next

15 hours agoMerge branch 'ps/test-set-e-clean' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:26 +0000 (10:13 +0900)] 
Merge branch 'ps/test-set-e-clean' into jch

The test suite harness and many individual test scripts have been
updated to work correctly when 'set -e' is in effect, which helps
detect misspelled test commands.

* ps/test-set-e-clean:
  t: detect errors outside of test cases
  t9902: fix use of `read` with `set -e`
  t6002: fix use of `expr` with `set -e`
  t1301: don't fail in case setfacl(1) doesn't exist or fails
  t0008: silence error in subshell when using `grep -v`
  t: prepare `test_when_finished ()`/`test_atexit()` for `set -e`
  t: prepare execution of potentially failing commands for `set -e`
  t: prepare conditional test execution for `set -e`
  t: prepare `git config --unset` calls for `set -e`
  t: prepare `stop_git_daemon ()` for `set -e`
  t: prepare `test_must_fail ()` for `set -e`
  t: prepare `test_match_signal ()` calls for `set -e`

15 hours agoMerge branch 'bc/rust-by-default' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:26 +0000 (10:13 +0900)] 
Merge branch 'bc/rust-by-default' into jch

Rust support is enabled by default (but still allows opting out) in
some future version of Git.

* bc/rust-by-default:
  Enable Rust by default
  Linux: link against libdl
  ci: install cargo on Alpine
  docs: update version with default Rust support

15 hours agoMerge branch 'jc/neuter-sideband-fixup' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:25 +0000 (10:13 +0900)] 
Merge branch 'jc/neuter-sideband-fixup' into jch

Try to resurrect and reboot a stalled "avoid sending risky escape
sequences taken from sideband to the terminal" topic by Dscho.  The
plan is to keep it in 'next' long enough to see if anybody screams
with the "everything dropped except for ANSI color escape sequences"
default.

* jc/neuter-sideband-fixup:
  sideband: drop 'default' configuration
  sideband: offer to configure sanitizing on a per-URL basis
  sideband: add options to allow more control sequences to be passed through
  sideband: do allow ANSI color sequences by default
  sideband: introduce an "escape hatch" to allow control characters
  sideband: mask control characters

15 hours agoMerge branch 'mc/http-emptyauth-negotiate-fix' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:25 +0000 (10:13 +0900)] 
Merge branch 'mc/http-emptyauth-negotiate-fix' into jch

The 'http.emptyAuth=auto' configuration now correctly attempts
Negotiate authentication before falling back to manual credentials.
This allows seamless Kerberos ticket-based authentication without
requiring users to explicitly set 'http.emptyAuth=true'.

* mc/http-emptyauth-negotiate-fix:
  t5563: add tests for http.emptyAuth with Negotiate
  http: attempt Negotiate auth in http.emptyAuth=auto mode
  http: extract http_reauth_prepare() from retry paths

15 hours agoMerge branch 'sb/userdiff-lisp-family' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:25 +0000 (10:13 +0900)] 
Merge branch 'sb/userdiff-lisp-family' into jch

The userdiff driver for the Scheme language has been extended to
cover other Lisp dialects.

* sb/userdiff-lisp-family:
  userdiff: extend Scheme support to cover other Lisp dialects
  userdiff: tighten word-diff test case of the scheme driver

15 hours agoMerge branch 'jc/doc-timestamps-in-stat' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:25 +0000 (10:13 +0900)] 
Merge branch 'jc/doc-timestamps-in-stat' into jch

Doc update.

* jc/doc-timestamps-in-stat:
  CodingGuidelines: st_mtimespec vs st_mtim vs st_mtime

15 hours ago###
Junio C Hamano [Tue, 28 Apr 2026 01:13:24 +0000 (10:13 +0900)] 
###

15 hours agoMerge branch 'ar/parallel-hooks' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:24 +0000 (10:13 +0900)] 
Merge branch 'ar/parallel-hooks' into jch

* ar/parallel-hooks:
  t1800: test SIGPIPE with parallel hooks
  hook: allow hook.jobs=-1 to use all available CPU cores
  hook: add hook.<event>.enabled switch
  hook: move is_known_hook() to hook.c for wider use
  hook: warn when hook.<friendly-name>.jobs is set
  hook: add per-event jobs config
  hook: add -j/--jobs option to git hook run
  hook: mark non-parallelizable hooks
  hook: allow pre-push parallel execution
  hook: allow parallel hook execution
  hook: parse the hook.jobs config
  config: add a repo_config_get_uint() helper
  repository: fix repo_init() memleak due to missing _clear()

15 hours agoMerge branch 'cc/promisor-auto-config-url' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:24 +0000 (10:13 +0900)] 
Merge branch 'cc/promisor-auto-config-url' into jch

Promisor remote handling has been refactored and fixed in
preparation for auto-configuration of advertised remotes.

* cc/promisor-auto-config-url:
  t5710: use proper file:// URIs for absolute paths
  promisor-remote: remove the 'accepted' strvec
  promisor-remote: keep accepted promisor_info structs alive
  promisor-remote: refactor accept_from_server()
  promisor-remote: refactor has_control_char()
  promisor-remote: refactor should_accept_remote() control flow
  promisor-remote: reject empty name or URL in advertised remote
  promisor-remote: clarify that a remote is ignored
  promisor-remote: pass config entry to all_fields_match() directly
  promisor-remote: try accepted remotes before others in get_direct()

15 hours agoMerge branch 'dl/cache-tree-fully-valid-fix' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:24 +0000 (10:13 +0900)] 
Merge branch 'dl/cache-tree-fully-valid-fix' into jch

The check that implements the logic to see if an in-core cache-tree
is fully ready to write out a tree object was broken, which has
been corrected.

* dl/cache-tree-fully-valid-fix:
  cache-tree: fix inverted object existence check in cache_tree_fully_valid

15 hours agoMerge branch 'ja/doc-difftool-synopsis-style' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:23 +0000 (10:13 +0900)] 
Merge branch 'ja/doc-difftool-synopsis-style' into jch

Doc mark-up updates.

* ja/doc-difftool-synopsis-style:
  doc: convert git-describe manual page to synopsis style
  doc: convert git-shortlog manual page to synopsis style
  doc: convert git-range-diff manual page to synopsis style
  doc: convert git-difftool manual page to synopsis style

15 hours agoMerge branch 'sp/refs-reduce-the-repository' into jch
Junio C Hamano [Tue, 28 Apr 2026 01:13:23 +0000 (10:13 +0900)] 
Merge branch 'sp/refs-reduce-the-repository' into jch

Code clean-up to use the right instance of a repository instance in
calls inside refs subsystem.

* sp/refs-reduce-the-repository:
  refs/reftable-backend: drop uses of the_repository
  refs: remove the_hash_algo global state
  refs: add struct repository parameter in get_files_ref_lock_timeout_ms()

16 hours agopush: support pushing to a remote group
Usman Akinyemi [Mon, 27 Apr 2026 14:05:30 +0000 (19:35 +0530)] 
push: support pushing to a remote group

`git fetch` accepts a remote group name (configured via `remotes.<name>`
in config) and fetches from each member remote. `git push` has no
equivalent — it only accepts a single remote name.

Teach `git push` to resolve its repository argument through
`add_remote_or_group()`, which was made public in the previous patch,
so that a user can push to all remotes in a group with:

    git push <group>

When the argument resolves to a single remote, the behaviour is
identical to before. When it resolves to a group, each member remote
is pushed in sequence.

The group push path rebuilds the refspec list (`rs`) from scratch for
each member remote so that per-remote push mappings configured via
`remote.<name>.push` are resolved correctly against each specific
remote. Without this, refspec entries would accumulate across iterations
and each subsequent remote would receive a growing list of duplicated
entries.

Mirror detection (`remote->mirror`) is also evaluated per remote using
a copy of the flags, so that a mirror remote in the group cannot set
TRANSPORT_PUSH_FORCE on subsequent non-mirror remotes in the same group.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agoremote: move remote group resolution to remote.c
Usman Akinyemi [Mon, 27 Apr 2026 14:05:29 +0000 (19:35 +0530)] 
remote: move remote group resolution to remote.c

`get_remote_group`, `add_remote_or_group`, and the `remote_group_data`
struct are currently defined as static helpers inside builtin/fetch.c.
They implement generic remote group resolution that is not specific to
fetch — they parse `remotes.<name>` config entries and resolve a name
to either a list of group members or a single configured remote.

Move them to remote.c and declare them in remote.h so that other
builtins can use the same logic without duplication.

Useful for the next patch.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agocommit: sign commit after mutating buffer
brian m. carlson [Mon, 27 Apr 2026 22:18:34 +0000 (22:18 +0000)] 
commit: sign commit after mutating buffer

The ensure_utf8 function can mutate the buffer to change its encoding,
so we must call it before signing the buffer so that we do not
invalidate the signature, which is made over raw bytes.  Fix a bug which
caused the compatibility code to not convert the compatibility buffer if
the main buffer was invalid UTF-8.  We expect both buffers to be valid
UTF-8 or both invalid, since the only data that would differ between
them would be hex object IDs, which are always valid UTF-8.

Add a test for this case using 0xfe and 0xff, which are never valid in
UTF-8.

Reported-by: Kushal Das <kushal@sunet.se>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agocommit: name UTF-8 function appropriately
brian m. carlson [Mon, 27 Apr 2026 22:18:33 +0000 (22:18 +0000)] 
commit: name UTF-8 function appropriately

We have a function named verify_utf8, but it does more than verify, it
modifies the buffer if it is not UTF-8.  This is different from what
most people would expect, so call the function ensure_utf8, since it
mutates the buffer in some cases.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agoindex-pack, unpack-objects: increase input buffer from 4 KiB to 128 KiB
Scott Bauersfeld [Mon, 27 Apr 2026 19:26:38 +0000 (19:26 +0000)] 
index-pack, unpack-objects: increase input buffer from 4 KiB to 128 KiB

index-pack and unpack-objects both read pack data from stdin through
a 4 KiB static buffer. In index-pack, each fill() flushes consumed
bytes to the pack file via write_or_die(), capping every write(2)
at 4 KiB. unpack-objects uses the same buffer pattern for reads.

On FUSE-backed filesystems every write(2) is a synchronous round
trip through the FUSE protocol (userspace -> kernel -> userspace ->
back), so the 4 KiB buffer turns a clone into many unnecessary tiny
writes with noticeable latency overhead.

Increase the buffer from 4 KiB to 128 KiB. Introduce a shared
DEFAULT_IO_BUFFER_SIZE constant in git-compat-util.h (next to
MAX_IO_SIZE) and use it in index-pack, unpack-objects, and the
hashfile layer in csum-file (which already used 128 KiB but
hardcoded the value).

Syscall counts via strace on HTTPS clones of git/git (~296 MB pack,
5 runs per variant, isolated builds from the same v2.54.0 source):

  index-pack pack file writes: 72,465 -> 24,943 avg (65% fewer)
  total write() syscalls:     310,192 -> 259,530 avg (16% fewer)
  writes of exactly 4096 bytes: ~40,077 -> 0

Wall-clock time of git clone over HTTPS onto a FUSE passthrough
filesystem with writeback caching disabled, 3 runs per variant:

  vscode (~1.26 GB pack): 84.5s -> 75.7s avg (10% faster)
  git/git (~306 MB pack):  22.6s -> 20.0s avg (11% faster)

Signed-off-by: Scott Bauersfeld <sbauersfeld@g.ucla.edu>
Acked-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agodoc: log: use the same delimiter in description list
Kristoffer Haugsbakk [Mon, 27 Apr 2026 19:06:50 +0000 (21:06 +0200)] 
doc: log: use the same delimiter in description list

We must use the same delimiter since this is a meant to be a flat
list. Introducing a new legal delimiter like `::` makes an inner
description list:

    ...
    full
    the full ref name ...

        auto
        if the output ...

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agodoc: log: fix --decorate description list
Kristoffer Haugsbakk [Mon, 27 Apr 2026 19:06:49 +0000 (21:06 +0200)] 
doc: log: fix --decorate description list

026f2e3b (doc: convert git-log to new documentation format, 2025-07-07)
transformed the inline description of `--decorate` options to a
description list:

    We also transform inline descriptions of possible values of option
    --decorate into a list, which is more readable and extensible.

But a source code block was used instead of an open block.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 hours agot5564: use a short path for the SOCKS proxy socket
Johannes Schindelin [Mon, 27 Apr 2026 14:21:09 +0000 (14:21 +0000)] 
t5564: use a short path for the SOCKS proxy socket

The SOCKS proxy test introduced in 0ca365c2ed4 (http: do not ignore
proxy path, 2024-08-02) creates a Unix domain socket in
`$TRASH_DIRECTORY`. When the trash directory path is long (e.g.
when running from a deeply nested worktree), the socket path can
exceed the 108-character limit for `struct sockaddr_un.sun_path` on
Linux, causing the test to fail with "Path length ... is longer
than maximum supported length (108)".

Move the socket to `$TMPDIR` (defaulting to `/tmp`) where the path
is short, following the same approach used in t7528 for the SSH
agent socket in b7fb2194b96 (t7528: work around ETOOMANY in OpenSSH
10.1 and newer, 2025-10-23).

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
27 hours agobuiltin/history: introduce "fixup" subcommand
Patrick Steinhardt [Mon, 27 Apr 2026 05:53:53 +0000 (07:53 +0200)] 
builtin/history: introduce "fixup" subcommand

The newly introduced git-history(1) command provides functionality to
easily edit commit history while also rebasing dependent branches. The
functionality exposed by this command is still somewhat limited though.

One common use case when editing commit history that is not yet covered
is fixing up a specific commit. Introduce a new subcommand that allows
the user to do exactly that by performing a three-way merge into the
target's commit tree, using HEAD's tree as the merge base. The flow is
thus essentially:

    $ echo changes >file
    $ git add file
    $ git history fixup HEAD~

Like with the other commands, this will automatically rebase dependent
branches, as well. Unlike the other commands though:

  - The command does not work in a bare repository as it interacts with
    the index.

  - The command may run into merge conflicts. If so, the command will
    simply abort.

Especially the second item limits the usefulness of this command a bit.
But there are plans to introduce first-class conflicts into Git, which
will help use cases like this one.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
27 hours agobuiltin/history: generalize function to commit trees
Patrick Steinhardt [Mon, 27 Apr 2026 05:53:52 +0000 (07:53 +0200)] 
builtin/history: generalize function to commit trees

The function `commit_tree_with_edited_message_ext()` can be used to
commit a tree with a specific list of parents with an edited commit
message. This function is useful outside of editing the commit message
though, as it also performs the plumbing to extract the original commit
message and strip some headers from it.

Refactor the function to receive a flags field that allows the caller to
control whether or not the commit message should be edited, or whether
it should be retained as-is. This will be used in a subsequent commit.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
27 hours agoreplay: allow callers to control what happens with empty commits
Patrick Steinhardt [Mon, 27 Apr 2026 05:53:51 +0000 (07:53 +0200)] 
replay: allow callers to control what happens with empty commits

When replaying commits it may happen that some of the commits become
empty relative to their parent. Such commits are for now automatically
dropped by the replay subsystem without much control from the user.

Introduce a new enum that allows the caller to drop, keep or abort in
this case.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: use peeled tag values in reference backends
Karthik Nayak [Mon, 27 Apr 2026 10:42:10 +0000 (12:42 +0200)] 
refs: use peeled tag values in reference backends

The reference backends peel tag objects when storing references to them.
This is to provide optimized reads which avoids hitting the odb. The
previous commits ensures that the peeled value is now propagated via the
generic layer. So modify the packed and reftable backend to directly use
this value instead of calling `peel_object()` independently.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: add peeled object ID to the `ref_update` struct
Karthik Nayak [Mon, 27 Apr 2026 10:42:09 +0000 (12:42 +0200)] 
refs: add peeled object ID to the `ref_update` struct

Certain reference backends {packed, reftable}, have the ability to also
store the peeled object ID for a reference pointing to a tag object.
This has the added benefit that during retrieval of such references, we
also obtain the peeled object ID without having to use the ODB.

To provide this functionality, each backend independently calls the ODB
to obtain the peeled OID. To move this functionality to the generic
layer, there must be support infrastructure to pass in a peeled OID for
reference updates.

Add a `peeled` field to the `ref_update` structure and modify
`ref_transaction_add_update()` to receive and copy this object ID to the
`ref_update` structure. Finally, modify `ref_transaction_update()` to
peel tag objects and pass the peeled OID to
`ref_transaction_add_update()`.

Update all callers of these functions with the new function parameters.
Callers which only add reflog updates, need to only pass in NULL, since
for reflogs, we don't store peeled OIDs. Reference deletions also only
need to pass in NULL. For others, pass along the peeled OID if
available.

In a following commit, we'll modify the backends to use this peeled OID
instead of parsing it themselves.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: move object parsing to the generic layer
Karthik Nayak [Mon, 27 Apr 2026 10:42:08 +0000 (12:42 +0200)] 
refs: move object parsing to the generic layer

Regular reference updates made via reference transactions validate that
the provided object ID exists in the object database, which is done by
calling 'parse_object()'. This check is done independently by the
backends which leads to duplicated logic.

Let's move this to the generic layer, ensuring the backends only have to
care about reference storage and not about validation of the object IDs.
With this also remove the 'REF_TRANSACTION_ERROR_INVALID_NEW_VALUE'
error type as its no longer used.

Since we don't iterate over individual references in
`ref_transaction_prepare()`, we add this check to
`ref_transaction_update()`. This means that the validation is done as
soon as an update is queued, without needing to prepare the
transaction. It can be argued that this is more ideal, since this
validation has no dependency on the reference transaction being
prepared.

It must be noted that the change in behavior means that this error
cannot be ignored even with usage of batched updates, since this happens
when the update is being added to the transaction. But since the caller
gets specific error codes, they can either abort the transaction or
continue adding other updates to the transaction.

Modify 'builtin/receive-pack.c' to now capture the error type so that
the error propagated to the client stays the same. Also remove two of
the tests which validates batch-updates with invalid new_oid.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agoupdate-ref: handle rejections while adding updates
Karthik Nayak [Mon, 27 Apr 2026 10:42:07 +0000 (12:42 +0200)] 
update-ref: handle rejections while adding updates

When using git-update-ref(1) with the '--batch-updates' flag, updates
rejected by the reference backend are displayed to the user while other
updates are applied. This only applies during the commit phase of the
transaction.

In the following commits, we'll also extend `ref_transaction_update()`
to reject updates before a transaction is prepared/committed. In
preparation, modify the code in update-ref to also handle non-generic
rejections from `ref_transaction_update()`. This involves propagating
information to each of the commands on whether updates are allowed to be
rejected, and also checking for rejections and only dying for generic
failures.

Errors encountered during updates will be shown to the user immediately
unlike other errors encountered only when the transaction is
prepared/committed. As the verification of object IDs and peeled tag
objects will move into `ref_transaction_update()` in the following
commit, this means that those errors will be shown to the user before
other errors, this changes the order of errors, but the functionality
remains the same.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agoupdate-ref: move `print_rejected_refs()` up
Karthik Nayak [Mon, 27 Apr 2026 10:42:06 +0000 (12:42 +0200)] 
update-ref: move `print_rejected_refs()` up

The `print_rejected_refs()` function is used to print any rejected refs
when using git-updated-ref(1) with the '--batch-updates' option. In the
following commit, we'll need to use this function in another place, so
move the function up to avoid a separate forward declaration.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: return `ref_transaction_error` from `ref_transaction_update()`
Karthik Nayak [Mon, 27 Apr 2026 10:42:05 +0000 (12:42 +0200)] 
refs: return `ref_transaction_error` from `ref_transaction_update()`

The `ref_transaction_update()` function is used to add updates to a
given reference transactions. In the following commit, we'll add more
validation to this function. As such, it would be beneficial if the
function returns specific error types, so callers can differentiate
between different errors.

To facilitate this, return `enum ref_transaction_error` from the
function and covert the existing '-1' returns to
'REF_TRANSACTION_ERROR_GENERIC'. Since this retains the existing
behavior, no changes are made to any of the callers but this sets the
necessary infrastructure for introduction of other errors.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: extract out reflog config to generic layer
Karthik Nayak [Mon, 27 Apr 2026 10:42:04 +0000 (12:42 +0200)] 
refs: extract out reflog config to generic layer

The reference backends need to know when to create reflog entries, this
is dictated by the 'core.logallrefupdates' config. Instead of relying on
the backends to call `repo_settings_get_log_all_ref_updates()` to obtain
this config value, let's do this in the generic layer and pass down the
value to the backends.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: introduce `ref_store_init_options`
Karthik Nayak [Mon, 27 Apr 2026 10:42:03 +0000 (12:42 +0200)] 
refs: introduce `ref_store_init_options`

Reference backends are initiated via the `init()` function. When
initiating the function, the backend is also provided flags which denote
the access levels of the initiator. Create a new structure
`ref_store_init_options` to house such options and move the access flags
to this structure.

This allows easier extension of providing further options to the
backends. In the following commit, we'll also provide config around
reflog creation to the backends via the same structure.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agorefs: remove unused typedef 'ref_transaction_commit_fn'
Karthik Nayak [Mon, 27 Apr 2026 10:42:02 +0000 (12:42 +0200)] 
refs: remove unused typedef 'ref_transaction_commit_fn'

The typedef 'ref_transaction_commit_fn' is not used anywhere in our
code, let's remove it.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agograph: add indentation for commits preceded by a parentless commit
Pablo Sabater [Mon, 27 Apr 2026 10:28:38 +0000 (12:28 +0200)] 
graph: add indentation for commits preceded by a parentless commit

When having a history with multiple root commits or commits
that act like roots (they have excluded parents), let's call
them parentless, and drawing the history near them, the
graphing engine renders the commits one below the other, seeming
that they are related.

This issue has been attempted multiple times:
  https://lore.kernel.org/git/xmqqwnwajbuj.fsf@gitster.c.googlers.com/

This happens because for these parentless commits, in the next
row the column becomes empty and the engine prints from left
to right from the first empty column, filling the gap below
these parentless commits.

Keep a parentless commit for at least one row more to avoid
having the column empty but hide it as indentation,
therefore making the next unrelated commit live in
the next column (column means even positions where edges live:
0, 2, 4), then clean that "placeholder" column and let
the unrelated commit to naturally collapse to the column
where the parentless commit was.

Add is_placeholder to the struct column to mark if a column
is acting as a placeholder for the padding.

When a column is parentless, add a column with the parentless
commit data to prevent segfaults when 'column->commit' and
mark it as a placeholder.

Teach rendering functions to print a padding ' ' instead of
an edge when a placeholder column is met.

Then, unless the next commit is also parentless (then we
need to keep cascading the indentation) clean the mapping
and columns from the placeholder to allow it to
collapse naturally.

Add tests for different cases.

before this patch:

* parentless A
* child B
* parentless B

after this patch:

* parentless A
  * child B
 /
* parentless B

Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 hours agoSQUASH???
Junio C Hamano [Mon, 27 Apr 2026 12:21:45 +0000 (21:21 +0900)] 
SQUASH???

35 hours agosafe.bareRepository: default to "explicit" with WITH_BREAKING_CHANGES
Johannes Schindelin [Sun, 26 Apr 2026 14:38:36 +0000 (14:38 +0000)] 
safe.bareRepository: default to "explicit" with WITH_BREAKING_CHANGES

When an attacker can convince a user to clone a crafted repository
that contains an embedded bare repository with malicious hooks, any Git
command the user runs after entering that subdirectory will discover
the bare repository and execute the hooks. The user does not even need
to run a Git command explicitly: many shell prompts run `git status`
in the background to display branch and dirty state information, and
`git status` in turn may invoke the fsmonitor hook if so configured,
making the user vulnerable the moment they `cd` into the directory. The
`safe.bareRepository` configuration variable (introduced in 8959555cee7e
(setup_git_directory(): add an owner check for the top-level directory,
2022-03-02)) already provides protection against this attack vector by
allowing users to set it to "explicit", but the default remained "all"
for backwards compatibility.

Since Git 3.0 is the natural point to change defaults to safer
values, flip the default from "all" to "explicit" when built with
`WITH_BREAKING_CHANGES`. This means Git will refuse to work with bare
repositories that are discovered implicitly by walking up the directory
tree. Bare repositories specified via `--git-dir` or `GIT_DIR` continue
to work, and directories that look like `.git`, worktrees, or submodule
directories are unaffected (the existing `is_implicit_bare_repo()`
whitelist handles those cases).

Users who rely on implicit bare repository discovery can restore the
previous behavior by setting `safe.bareRepository=all` in their global
or system configuration.

The test for the "safe.bareRepository in the repository" scenario
needed a more involved fix: it writes a `safe.bareRepository=all`
entry into the bare repository's own config to verify that repo-local
config does not override the protected (global) setting. Previously,
`test_config -C` was used to write that entry, but its cleanup runs `git
-C <bare-repo> config --unset`, which itself fails when the default is
"explicit" and the global config has already been cleaned up. Switching
to direct git config --file access avoids going through repository
discovery entirely.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agostatus tests: filter `.gitconfig` from status output
Johannes Schindelin [Sun, 26 Apr 2026 14:38:35 +0000 (14:38 +0000)] 
status tests: filter `.gitconfig` from status output

Since test-lib.sh creates `$HOME/.gitconfig` when
`WITH_BREAKING_CHANGES` is in effect, the file appears in `git
status` output as either untracked (`?? .gitconfig`) or ignored
(`!! .gitconfig` / `! .gitconfig`, depending on porcelain version),
because the `.git/info/exclude` entry causes git to treat it as an
ignored file rather than hiding it entirely.

In t7061 and t7521, which are pervasively affected, introduce a
`filter_gitconfig` helper that strips all status-prefix variants of
`.gitconfig` from the output before comparison. In the remaining
scripts (t7060, t7064, t7508), apply targeted adjustments.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agols-files tests: filter `.gitconfig` from `--others` output
Johannes Schindelin [Sun, 26 Apr 2026 14:38:34 +0000 (14:38 +0000)] 
ls-files tests: filter `.gitconfig` from `--others` output

The global `safe.bareRepository=all` setting in test-lib.sh is
written to `$HOME/.gitconfig`, which unfortunately lives inside the
test repository's working tree. The `.git/info/exclude` entry added
alongside it handles most commands, but `git ls-files --others`
without `--exclude-standard` does not consult `info/exclude` at
all, so the file appears in the output.

Ideally, each test that accesses a bare repository would simply
specify `--git-dir` or `GIT_DIR` explicitly, which would require no
global config and produce no side effects in the working tree. As
that approach was not taken, filter `.gitconfig` from the output
before comparing against expected results. In t7104, the test
already uses `--exclude-standard`, so it suffices to switch from
the bare `git ls-files -o` to `git ls-files -o --exclude-standard`
which respects the `info/exclude` entry; the other tests
deliberately omit `--exclude-standard` because their purpose is to
verify unfiltered `--others` output.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agot5601: restore `.gitconfig` after includeIf test
Johannes Schindelin [Sun, 26 Apr 2026 14:38:33 +0000 (14:38 +0000)] 
t5601: restore `.gitconfig` after includeIf test

One test in t5601 overwrites `$HOME/.gitconfig` with an `includeIf`
configuration snippet and removes the file in its cleanup. This
destroys the `safe.bareRepository=all` entry that test-lib.sh
writes when `WITH_BREAKING_CHANGES` is in effect, causing later
tests that use `git -C <bare-repo> config` to fail with "not in a
git directory".

Back up `.gitconfig` before overwriting and restore it in the
cleanup, so the global config survives into subsequent tests.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agot1305: use `--git-dir=.` for bare repo in include cycle test
Johannes Schindelin [Sun, 26 Apr 2026 14:38:32 +0000 (14:38 +0000)] 
t1305: use `--git-dir=.` for bare repo in include cycle test

Earlier tests in t1305 overwrite `$HOME/.gitconfig` with their own
content as part of testing config includes. This clobbers the
`safe.bareRepository=all` entry that test-lib.sh writes when
`WITH_BREAKING_CHANGES` is in effect, causing `git -C cycle config`
to fail with "not in a git directory" when it tries to access the
bare repository created by `git init --bare cycle`.

Use `--git-dir=.` to access the bare repo explicitly, avoiding the
dependency on global config for repository discovery.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agot1300: remove global config settings injected by test-lib.sh
Johannes Schindelin [Sun, 26 Apr 2026 14:38:31 +0000 (14:38 +0000)] 
t1300: remove global config settings injected by test-lib.sh

Since test-lib.sh now writes `safe.bareRepository=all` to the global
config when `WITH_BREAKING_CHANGES` is in effect, that entry shows
up in `git config --list` output. Tests in t1300 that expect exact
config contents then fail because of this unexpected extra line.

Unlike the working-tree contamination fixed in the preceding
commits, this is not about the file's existence but about its
content leaking into test expectations. Since t1300 does not use
bare repositories, simply remove the injected setting in a
preparatory step.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Assisted-by: Claude Opus 4.6
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agot7900: do not let `$HOME/.gitconfig` interfere with XDG tests
Johannes Schindelin [Sun, 26 Apr 2026 14:38:30 +0000 (14:38 +0000)] 
t7900: do not let `$HOME/.gitconfig` interfere with XDG tests

The XDG config tests for `git maintenance register/unregister`
create a fresh `$XDG_CONFIG_HOME/git/config` and expect git to use
that location. However, if `$HOME/.gitconfig` exists (which may
happen when test-lib.sh writes global config, e.g. to set
`safe.bareRepository`), git prefers `$HOME/.gitconfig` over the XDG
location, and the `maintenance.repo` entry ends up in the wrong
file.

This is an inherent consequence of setting global config in
test-lib.sh rather than adjusting individual tests: writing any
entry to `$HOME/.gitconfig` has side effects beyond the intended
setting, because the mere existence of that file changes which
global config location git prefers for all subsequent writes.
Individual per-test adjustments would not have this interaction.

Fix this by overriding `HOME` to a non-existent directory inside the
subshells that test XDG behavior. Since these subshells already
override `XDG_CONFIG_HOME`, they do not need `$HOME/.gitconfig` at
all, and the subshell scoping ensures the original `HOME` is
restored automatically.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
35 hours agotest-lib: allow bare repository access when breaking changes are enabled
Johannes Schindelin [Sun, 26 Apr 2026 14:38:29 +0000 (14:38 +0000)] 
test-lib: allow bare repository access when breaking changes are enabled

A future patch will change the `safe.bareRepository` default from
`all` to `explicit` under `WITH_BREAKING_CHANGES`. At that point,
every test that operates on a bare repository through implicit
discovery would fail, regardless of whether the test is actually
about discovery or about how a specific command behaves once inside
a bare repository.

The maintainer suggested [1] setting `safe.bareRepository=all` in
the test environment's global config whenever `WITH_BREAKING_CHANGES`
is in effect, rather than adjusting each affected test to access
bare repositories explicitly (via `--git-dir`, `GIT_DIR`, or
similar). This means the test suite continues to exercise only the
historical default behavior even after the user-facing default
changes, relying on a small number of dedicated tests in t0035 to
validate the new, stricter default.

Since `$HOME` points at the trash directory (which doubles as the
test repository's working tree), writing to `$HOME/.gitconfig` also
creates a file inside the working tree. Exclude it via
`.git/info/exclude` to limit the fallout, though this does not
help tests that use `git ls-files --others` without
`--exclude-standard` or `git status --ignored`; those are addressed
by subsequent commits.

The `.git/info/exclude` write is guarded by `test -d .git/info`
rather than using `mkdir -p`, because some tests (e.g. t0008)
expect to create `.git/info/` themselves and would fail with
Patrick Steinhardt's `set -e` preparation (ps/test-set-e-clean) if
the directory already existed. For tests using `TEST_NO_CREATE_REPO`
(where no `.git/` exists at all), the guard also handles that case.

[1] https://lore.kernel.org/git/xmqqse98cc51.fsf@gitster.g/

Original-patch-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agol10n: bump mshick/add-pr-comment from v2 to v3
Johannes Schindelin [Sat, 25 Apr 2026 10:58:40 +0000 (10:58 +0000)] 
l10n: bump mshick/add-pr-comment from v2 to v3

The l10n workflow uses `mshick/add-pr-comment` to post git-po-helper
reports as comments on translation pull requests. It was still pinned
to v2, which runs on Node.js 20. GitHub is phasing out the Node.js 20
runtime on Actions runners, so staying on v2 will eventually cause the
"Create comment in pull request for report" step to fail.

The sole breaking change in v3 is the switch from Node.js 20 to
Node.js 24 (https://github.com/mshick/add-pr-comment/releases/tag/v3.0.0).
The action's inputs and outputs are unchanged, so the upgrade is a
drop-in replacement. Subsequent v3.x releases added new opt-in
features (message truncation, retry with exponential backoff, file
attachments, commit comment support, "delete on status") but none of
them affect existing callers that do not opt in.

See also:

- Changelog: https://github.com/mshick/add-pr-comment/blob/main/CHANGELOG.md
- Compare: https://github.com/mshick/add-pr-comment/compare/v2...v3

Pointed-out-by: Christoph Grüninger <foss@grueninger.de>
Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoci: bump actions/checkout from v5 to v6
Johannes Schindelin [Sat, 25 Apr 2026 10:58:39 +0000 (10:58 +0000)] 
ci: bump actions/checkout from v5 to v6

Every workflow currently pins `actions/checkout` to v5, which was
introduced primarily to move to the Node.js 24 runtime. v6 is the
next release and worth picking up so we stay on a maintained version
of the action.

The one behaviorally interesting change in v6:

  `persist-credentials` now stores the helper credentials under
  `$RUNNER_TEMP` instead of writing them directly into the local
  `.git/config`. Two implications follow:

  1. In the normal case this is an unambiguous improvement -- the
     token no longer lands in `.git/config`, reducing the risk of
     inadvertently leaking it through workspace archiving
     (`upload-artifact` snapshots, cache entries, core dumps, ...).

  2. Docker container actions require an Actions Runner of at least
     v2.329.0 to find the credentials in their new location. The
     github.com-hosted runners our CI uses are already past that
     version, so this does not affect us. Downstream users running
     self-hosted runners may need to update them before adopting
     this version of the action.

Risk analysis: our checkout steps either check out the default
repository (no special credential requirements) or, in the `vs-build`
job, explicitly set `repository: microsoft/vcpkg` and
`path: compat/vcbuild/vcpkg`. Neither case relies on the precise
location of the persisted credentials -- subsequent steps interact
with the API via the runner-provided `GITHUB_TOKEN` directly -- so
the v6 credential-storage change is transparent to our workflows.
The diff is purely the `@vN` identifier; there are no input or
output changes.

See also:

- Release notes: https://github.com/actions/checkout/releases
- Changelog: https://github.com/actions/checkout/blob/main/CHANGELOG.md
- Compare: https://github.com/actions/checkout/compare/v5...v6

Originally-authored-by: dependabot[bot] <support@github.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoci: bump actions/github-script from v8 to v9
Johannes Schindelin [Sat, 25 Apr 2026 10:58:38 +0000 (10:58 +0000)] 
ci: bump actions/github-script from v8 to v9

The only use we have of `actions/github-script` is the "skip if the
commit or tree was already tested" step in `main.yml`, which checks
whether an identical tree-SHA was already built successfully. It
currently pins v8; v9 is the latest release.

What v9 changes:

- The `ACTIONS_ORCHESTRATION_ID` environment variable is now
  appended to the HTTP user-agent string. This is transparent to
  our script.
- A new injected `getOctokit` factory lets scripts create
  additional authenticated clients in the same step without
  importing `@actions/github`. We do not use it.
- Two breaking changes affect scripts that either call
  `require('@actions/github')` (fails at runtime, because
  `@actions/github` v9 is now ESM-only) or that shadow the
  implicit `getOctokit` parameter via `const`/`let` (syntax
  error). Our script does neither -- it only uses the pre-supplied
  `github` REST client and `core` helpers -- so the upgrade is
  safe.

Risk analysis: the step is advisory. It sets `enabled=' but skip'`
as an optimization to avoid re-running CI on a tree that was already
tested successfully. Even if the v9 upgrade broke the script, the
surrounding `try { ... } catch (e) { core.warning(e); }` block would
degrade it to a warning and CI would still run normally. In practice
the script continues to work identically on v9.

See also:

- Release notes: https://github.com/actions/github-script/releases
- Compare: https://github.com/actions/github-script/compare/v8...v9

Originally-authored-by: dependabot[bot] <support@github.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoci: bump actions/{upload,download}-artifact to v7 and v8
Johannes Schindelin [Sat, 25 Apr 2026 10:58:37 +0000 (10:58 +0000)] 
ci: bump actions/{upload,download}-artifact to v7 and v8

`actions/upload-artifact` and `actions/download-artifact` are tightly
coupled: the upload action writes artifact archives in a format that
the download action then reads. Because of this coupling, the two
actions should always be bumped together so that the artifact format
contract between them is satisfied.

All of our `actions/upload-artifact` uses are still on v5, with one
stray v4 occurrence. Keeping them on these versions would leave the
artifact-upload steps running on Node.js 20, which GitHub is phasing
out, and would eventually cause all upload steps to fail.

Going from v5 directly to v7 folds in two release bumps:

- v6 switches the action's default runtime from Node.js 20 to
  Node.js 24 (v5 had preliminary Node 24 support but still defaulted
  to Node 20). This is the main motivation for bumping now: it gets
  us off the deprecated runtime.
- v7 adds two opt-in features: direct (unzipped) single-file uploads
  via a new `archive: false` parameter, and an internal conversion of
  the action to ESM to match the updated `@actions/*` packages.

Risk analysis: we never pass `archive`, so the zip-as-usual behavior
is unchanged. We also do not `require('@actions/*')` from any calling
workflow, so the ESM migration cannot affect us. The upload steps we
care about -- tracked files/build artifacts and failing-test
directories -- keep the same inputs (`name`, `path`) and outputs, so
the diff is purely the `@vN` identifier. The main precondition is a
recent Actions Runner (>= 2.327.1), which the github.com-hosted
runners used by our CI already satisfy.

While at it, align the one remaining `@v4` occurrence with the rest
so that every `upload-artifact` step uses the same version.

See also:

- Release notes: https://github.com/actions/upload-artifact/releases
- Compare: https://github.com/actions/upload-artifact/compare/v5...v7

We use `actions/download-artifact` to pass build artifacts between
the "windows-build" / "vs-build" / "windows-meson-build" jobs and
their corresponding test jobs. All callers are currently on v6;
bumping to v8 keeps this action in lockstep with the `upload-artifact`
bump above.

What v7 and v8 change:

- v7 switches the default runtime from Node.js 20 to Node.js 24 (v6
  had preliminary Node 24 support but still defaulted to Node 20).
  This is the main motivation: it gets us off the deprecated runtime.
- v8 makes three further changes:
  * The package is converted to ESM (invisible to workflow authors).
  * The action now checks the `Content-Type` header before
    attempting to unzip a download, so that directly-uploaded
    (unzipped) artifacts from `upload-artifact` v7 are downloaded
    correctly.
  * The `digest-mismatch` behaviour is changed from warn-and-
    continue to a hard failure by default.

Risk analysis: defaulting hash-mismatch to a hard failure is
strictly safer than the previous warn-and-continue behaviour -- a
mismatch points to real corruption or tampering and should stop the
run. We download archives that the same workflow just uploaded, on
the same runner fleet, so false positives are not expected. Our
usage is limited to the `name` and `path` inputs, which are
unchanged between v6 and v8, so the diff is purely the `@vN`
identifier.

See also:

- Release notes: https://github.com/actions/download-artifact/releases
- Compare: https://github.com/actions/download-artifact/compare/v6...v8

Originally-authored-by: dependabot[bot] <support@github.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoci: bump microsoft/setup-msbuild from v2 to v3
Johannes Schindelin [Sat, 25 Apr 2026 10:58:36 +0000 (10:58 +0000)] 
ci: bump microsoft/setup-msbuild from v2 to v3

The v2 of `microsoft/setup-msbuild` runs on Node.js 20, which GitHub
is phasing out of the Actions runners. v3 is a minimal release whose
only substantive change is moving the action's runtime to Node.js 24,
so that our Visual Studio build jobs keep working once Node.js 20 is
removed from the runners.

The risk of this bump is very low: v3 contains no functional changes
to the action itself -- it merely adds `msbuild.exe` to `PATH`, with
no change to command-line flags, inputs, outputs, or default tool
resolution. The only precondition is a recent-enough Actions Runner,
which the github.com-hosted runners already satisfy.

See also:

- Release notes: https://github.com/microsoft/setup-msbuild/releases
- Compare: https://github.com/microsoft/setup-msbuild/compare/v2...v3

Originally-authored-by: dependabot[bot] <support@github.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoenv: move "warn_on_object_refname_ambiguity" into `struct repo_config_values`
Olamide Caleb Bello [Thu, 23 Apr 2026 16:54:32 +0000 (17:54 +0100)] 
env: move "warn_on_object_refname_ambiguity" into `struct repo_config_values`

The `core.warnAmbiguousRefs` configuration was previously stored in a
global `int` variable, making it shared across repository instances
and risking cross‑repository state leakage.

Store it instead in `repo_config_values`, where eagerly‑parsed
repository configuration lives. This option is parsed eagerly because
ambiguity warnings influence how users interpret object references in
many commands; a lazy parse could cause these warnings to behave
inconsistently or to appear for the wrong repository, confusing users
and hindering libification. This preserves the existing behavior while
tying the value to the repository from which it was read, avoiding
cross‑repository state leakage and continuing the effort to reduce
reliance on global configuration state.

Update all references to use `repo_config_values()`.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoenv: move "sparse_expect_files_outside_of_patterns" into `repo_config_values`
Olamide Caleb Bello [Thu, 23 Apr 2026 16:54:31 +0000 (17:54 +0100)] 
env: move "sparse_expect_files_outside_of_patterns" into `repo_config_values`

The `core.sparseCheckoutExpectFilesOutsideOfPatterns` configuration was
previously stored in a global `int` variable, making it shared across
repository instances and risking cross‑repository state leakage.

Store it instead in `repo_config_values`, where eagerly‑parsed
repository configuration lives. This option is parsed eagerly because
it controls how sparse‑checkout paths are interpreted – a fundamental
behavior that many commands rely on; a lazy parse could cause
inconsistent sparse‑checkout handling and complicate libification.
This preserves the existing behavior while tying the value to the
repository from which it was read, avoiding cross‑repository state
leakage and continuing the effort to reduce reliance on global
configuration state.

Update all references to use `repo_config_values()`.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoenv: move "core_sparse_checkout_cone" into `struct repo_config_values`
Olamide Caleb Bello [Thu, 23 Apr 2026 16:54:30 +0000 (17:54 +0100)] 
env: move "core_sparse_checkout_cone" into `struct repo_config_values`

The `core.sparseCheckoutCone` configuration was previously stored in an
uninitialized global `int` variable, risking cross‑repository state
leakage.

Move it into `repo_config_values`, where eagerly‑parsed repository
configuration lives. `core.sparseCheckoutCone` is parsed eagerly
because it determines the fundamental sparse‑checkout mode and is
consulted very early during repository setup; a lazy parse could
leave the sparse‑checkout state undefined and complicate
libification. This preserves the existing behavior while tying the
value to the repository from which it was read, avoiding cross‑
repository state leakage and continuing the effort to reduce reliance
on global configuration state.

Update all references to use `repo_config_values()`.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>