]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
21 hours agoThe second batch main master
Junio C Hamano [Tue, 12 May 2026 02:04:30 +0000 (11:04 +0900)] 
The second batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agoMerge branch 'js/maintenance-fix-deadlock-on-win10'
Junio C Hamano [Tue, 12 May 2026 02:04:45 +0000 (11:04 +0900)] 
Merge branch 'js/maintenance-fix-deadlock-on-win10'

To help Windows 10 installations, avoid removing files whose
contents are still mmap()'ed.

* js/maintenance-fix-deadlock-on-win10:
  maintenance(geometric): do release the `.idx` files before repacking
  mingw: optionally use legacy (non-POSIX) delete semantics

21 hours agoMerge branch 'jc/t5551-fix-expensive'
Junio C Hamano [Tue, 12 May 2026 02:04:45 +0000 (11:04 +0900)] 
Merge branch 'jc/t5551-fix-expensive'

Test fix.

* jc/t5551-fix-expensive:
  t5551: "GIT_TEST_LONG=Yes make test" is broken

21 hours agoMerge branch 'js/t5564-socks-use-short-path'
Junio C Hamano [Tue, 12 May 2026 02:04:44 +0000 (11:04 +0900)] 
Merge branch 'js/t5564-socks-use-short-path'

Avoid hitting the pathname limit for socks proxy socket during the
test..

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

21 hours agoMerge branch 'js/ci-github-actions-update'
Junio C Hamano [Tue, 12 May 2026 02:04:44 +0000 (11:04 +0900)] 
Merge branch 'js/ci-github-actions-update'

Update various GitHub Actions versions.

* js/ci-github-actions-update:
  l10n: bump mshick/add-pr-comment from v2 to v3
  ci: bump git-for-windows/setup-git-for-windows-sdk from v1 to v2
  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

21 hours agoMerge branch 'jk/revert-aa-reap-transport-child-processes'
Junio C Hamano [Tue, 12 May 2026 02:04:43 +0000 (11:04 +0900)] 
Merge branch 'jk/revert-aa-reap-transport-child-processes'

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"

42 hours agoMerge branch 'jc/neuter-sideband-fixup'
Junio C Hamano [Mon, 11 May 2026 04:49:05 +0000 (13:49 +0900)] 
Merge branch 'jc/neuter-sideband-fixup'

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

46 hours agoStart 2.55 cycle
Junio C Hamano [Mon, 11 May 2026 01:04:56 +0000 (10:04 +0900)] 
Start 2.55 cycle

Signed-off-by: Junio C Hamano <gitster@pobox.com>
46 hours agoMerge branch 'ps/test-set-e-clean'
Junio C Hamano [Mon, 11 May 2026 01:05:54 +0000 (10:05 +0900)] 
Merge branch 'ps/test-set-e-clean'

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`

46 hours agoMerge branch 'bc/rust-by-default'
Junio C Hamano [Mon, 11 May 2026 01:05:54 +0000 (10:05 +0900)] 
Merge branch 'bc/rust-by-default'

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

46 hours agoMerge branch 'sb/userdiff-lisp-family'
Junio C Hamano [Mon, 11 May 2026 01:05:54 +0000 (10:05 +0900)] 
Merge branch 'sb/userdiff-lisp-family'

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

46 hours agoMerge branch 'jc/doc-timestamps-in-stat'
Junio C Hamano [Mon, 11 May 2026 01:05:53 +0000 (10:05 +0900)] 
Merge branch 'jc/doc-timestamps-in-stat'

Doc update.

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

46 hours agoMerge branch 'ar/parallel-hooks'
Junio C Hamano [Mon, 11 May 2026 01:05:53 +0000 (10:05 +0900)] 
Merge branch 'ar/parallel-hooks'

Hook scripts defined via the configuration system can now be
configured to run in parallel.

* 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()

46 hours agoMerge branch 'cc/promisor-auto-config-url'
Junio C Hamano [Mon, 11 May 2026 01:05:53 +0000 (10:05 +0900)] 
Merge branch 'cc/promisor-auto-config-url'

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()

46 hours agoMerge branch 'dl/cache-tree-fully-valid-fix'
Junio C Hamano [Mon, 11 May 2026 01:05:52 +0000 (10:05 +0900)] 
Merge branch 'dl/cache-tree-fully-valid-fix'

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

46 hours agoMerge branch 'ja/doc-difftool-synopsis-style'
Junio C Hamano [Mon, 11 May 2026 01:05:52 +0000 (10:05 +0900)] 
Merge branch 'ja/doc-difftool-synopsis-style'

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

46 hours agoMerge branch 'sp/refs-reduce-the-repository'
Junio C Hamano [Mon, 11 May 2026 01:05:51 +0000 (10:05 +0900)] 
Merge branch 'sp/refs-reduce-the-repository'

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()

3 days agot5551: "GIT_TEST_LONG=Yes make test" is broken
Junio C Hamano [Fri, 8 May 2026 05:31:03 +0000 (14:31 +0900)] 
t5551: "GIT_TEST_LONG=Yes make test" is broken

The "test_expect_success 'tag following always works over v0 http'"
test in t5551 fails when it tries to run "git init tags", but this
happens only when EXPENSIVE test is allowed to run.

This is because the step tries to create a repository with "git init
tags" but the EXPENSIVE test that runs way before it creates and
leaves around a temporary file "tags".  Have the EXPENSIVE test
clean it up after itself.

Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 days agomaintenance(geometric): do release the `.idx` files before repacking
Johannes Schindelin [Thu, 7 May 2026 12:51:13 +0000 (12:51 +0000)] 
maintenance(geometric): do release the `.idx` files before repacking

As is done for all the other maintenance tasks, let's release the ODB
also before starting the geometric repacking. That way, the `.idx` files
won't be `mmap()`ed when they are to be deleted (which does not work on
Windows because you cannot delete files on that platform as long as they
are kept open by a process).

This regression was introduced by 9bc151850c1c (builtin/maintenance:
introduce "geometric-repack" task, 2025-10-24), but was only noticed
once geometric repacking was made the default in 452b12c2e0fe (builtin/
maintenance: use "geometric" strategy by default, 2026-02-24).

The fix recapitulates my work from df76ee7b77f0 (run-command: offer to
close the object store before running, 2021-09-09) & friends.

To guard against future regressions of this kind, add a check to
`run_and_verify_geometric_pack()` in `t7900` that detects orphaned
`.idx` files left behind after repacking. Contrary to interactive
calls, the `git maintenance` call in that test case would _not_ block on
Windows, asking whether to retry deleting that file, which is the reason
why this bug was not caught earlier.

Furthermore, since the default behavior of `DeleteFileW()` was changed
at some point between Windows 10 Build 17134.1304 and Build 18363.657
to use POSIX semantics (see https://stackoverflow.com/a/60512798),
the added orphaned-`.idx` check would be insufficient to catch this
regression on modern Windows without emulating legacy delete semantics
via `GIT_TEST_LEGACY_DELETE=1`.

This fixes https://github.com/git-for-windows/git/issues/6210.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 days agomingw: optionally use legacy (non-POSIX) delete semantics
Johannes Schindelin [Thu, 7 May 2026 12:51:12 +0000 (12:51 +0000)] 
mingw: optionally use legacy (non-POSIX) delete semantics

At some point between Windows 10 Build 17134.1304 and Build 18363.657,
the default behavior of `DeleteFileW()` was changed to use POSIX
semantics (https://stackoverflow.com/a/60512798). Under those semantics,
a file can be deleted even when another process holds an active
`MapViewOfFile` view on it: the directory entry is removed immediately,
but the underlying data persists until the last handle is closed.

On older Windows versions (and Windows 10 builds before that change),
`DeleteFileW()` uses legacy semantics where deletion fails outright if
any process holds a file mapping.

To allow testing code paths that depend on the legacy behavior, introduce
a `GIT_TEST_LEGACY_DELETE` environment variable. When set, `mingw_unlink()`
uses `SetFileInformationByHandle()` with `FileDispositionInfo` (the
non-POSIX variant) instead of `DeleteFileW()`, forcing legacy delete
semantics regardless of the Windows version.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agol10n: bump mshick/add-pr-comment from v2 to v3
Johannes Schindelin [Thu, 30 Apr 2026 07:35:00 +0000 (07:35 +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>
12 days agoci: bump git-for-windows/setup-git-for-windows-sdk from v1 to v2
Johannes Schindelin [Thu, 30 Apr 2026 07:34:59 +0000 (07:34 +0000)] 
ci: bump git-for-windows/setup-git-for-windows-sdk from v1 to v2

The v1 of `git-for-windows/setup-git-for-windows-sdk` runs on
Node.js 20, which GitHub is phasing out of the Actions runners.
v2 moves the action to Node.js 24 so that the CI jobs relying on
a Git for Windows SDK keep working once Node.js 20 is removed.

The risk is very low: v2 contains no functional changes to the
SDK setup itself, only the runtime upgrade. The action still
provisions the same minimal SDK and exposes the same outputs.
The sole precondition is a recent Actions Runner (>= 2.327.1),
which the github.com-hosted runners already satisfy.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agoci: bump actions/checkout from v5 to v6
Johannes Schindelin [Thu, 30 Apr 2026 07:34:58 +0000 (07:34 +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>
12 days agoci: bump actions/github-script from v8 to v9
Johannes Schindelin [Thu, 30 Apr 2026 07:34:57 +0000 (07:34 +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>
12 days agoci: bump actions/{upload,download}-artifact to v7 and v8
Johannes Schindelin [Thu, 30 Apr 2026 07:34:56 +0000 (07:34 +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>
12 days agoci: bump microsoft/setup-msbuild from v2 to v3
Johannes Schindelin [Thu, 30 Apr 2026 07:34:55 +0000 (07:34 +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>
13 days agot5564: use a short path for the SOCKS proxy socket
Johannes Schindelin [Wed, 29 Apr 2026 08:22:54 +0000 (08:22 +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)".

We cannot work around this using the chdir trick our own socket code
employs, because both sides of the connection are outside our control:
the socket is created by socks4-proxy.pl via Perl's IO::Socket::UNIX,
and the client side is libcurl.

Use `mktemp -d` to create a unique temporary directory with a short
path, and place the socket inside it. This avoids collisions between
concurrent test runs (e.g. `--stress`) and tmpdir-race vulnerabilities
that a static `/tmp` path would be susceptible to.

Helped-by: Jeff King <peff@peff.net>
Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoRevert "transport-helper, connect: use clean_on_exit to reap children on abnormal...
Jeff King [Wed, 22 Apr 2026 23:00:20 +0000 (19:00 -0400)] 
Revert "transport-helper, connect: use clean_on_exit to reap children on abnormal exit"

This reverts commit dd3693eb0859274d62feac8047e1d486b3beaf31.

The goal of that commit was to avoid zombie child processes hanging
around when the parent git process is killed. But it doesn't quite work
when the child command is run by the shell:

  1. If there is a shell, then we kill and wait for the shell, not the
     process spawned by the shell. And so the child process, even if it
     eventually exits, will hang around as a zombie forever. And this is
     true of most (all?) shells: bash, dash, etc.

     So we are not really accomplishing our goal in the first place.

  2. Not all shells will exit immediately upon receiving a signal. In
     particular, mksh will wait for its children to exit (but not
     actually propagate the signal to them!) leaving us with a potential
     deadlock: git is wait()ing on mksh, which is wait()ing on a child
     process, but that child process is waiting on git to produce more
     input (or EOF) over a pipe.

     You can see several examples of this deadlock in the test suite,
     for example by running:

       make SHELL_PATH=/bin/mksh
       cd t
       ./t5702-protocol-v2.sh

Because this is a regression for mksh users, and because we did not
achieve our goal even with other shells, let's revert the commit for
now. If there is a more clever way of doing the same thing, we can
consider applying it separately on top (or do nothing and just accept
the zombies and rely on PID 1 to reap them).

Reported-by: Jan Palus <jpalus@fastmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: detect errors outside of test cases
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:25 +0000 (09:34 +0200)] 
t: detect errors outside of test cases

We have recently merged a patch series that had a simple misspelling of
`test_expect_success`. Instead of making our tests fail though, this
typo went completely undetected and all of our tests passed, which is of
course unfortunate. This is a more general issue with our test suite:
all commands that run outside of a specific test case can fail, and if
we don't explicitly check for such failure then this failure will be
silently ignored.

Improve the status quo by enabling the errexit option so that any such
unchecked failures will cause us to abort immediately.

Note that for now, we only enable this option for Bash 5 and newer. This
is because other shells have wildly different behaviour, and older
versions of Bash (especially on macOS) are buggy. The list of enabled
shells may be extended going forward.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot9902: fix use of `read` with `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:24 +0000 (09:34 +0200)] 
t9902: fix use of `read` with `set -e`

In t9902 we're using the `read` builtin to read some values into a
variable. This is done by using `-d ""`, which cause us to read until
the end of the heredoc. As the read is terminated by EOF, the command
will end up returning a non-zero error code. This hasn't been an issue
until now as we didn't run with `set -e`, but that'll change in a
subsequent commit.

Prepare for this change by not using read at all, as we can simply store
the multi-line value directly.

Suggested-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot6002: fix use of `expr` with `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:23 +0000 (09:34 +0200)] 
t6002: fix use of `expr` with `set -e`

In `test_bisection_diff ()` we use `expr` to perform some math. This
command has some gotchas though in that it will only return success when
the result is neither null nor zero. In some of our cases though it
actually _is_ zero, and that will cause the expressions to fail once we
enable `set -e`.

Prepare for this change by instead using `$(( ))`, which doesn't have
the same issue. While at it, modernize the function a tiny bit.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot1301: don't fail in case setfacl(1) doesn't exist or fails
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:22 +0000 (09:34 +0200)] 
t1301: don't fail in case setfacl(1) doesn't exist or fails

In t1301 we're trying to remove any potentially-existing default ACLs
that might exist on the transh directory by executing setfacl(1).
According to 8ed0a740dd (t1301-shared-repo.sh: don't let a default ACL
interfere with the test, 2008-10-16), this is done because we play
around with permissions and umasks in this test suite.

The setfacl(1) binary may not exist on some systems though, even though
tests ultimately still pass. This doesn't matter currently, but will
cause the test to fail once we start running with `set -e`. Silence such
failures by ignoring failures here.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot0008: silence error in subshell when using `grep -v`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:21 +0000 (09:34 +0200)] 
t0008: silence error in subshell when using `grep -v`

In t0008 we use `grep -v` in a subshell, but expect that this command
will sometimes not match anything. This would cause grep(1) to return an
error code, but given that we don't run with `set -e` we swallow this
error.

We're about to enable `set -e`. Prepare for this by ignoring any errors.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare `test_when_finished ()`/`test_atexit()` for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:20 +0000 (09:34 +0200)] 
t: prepare `test_when_finished ()`/`test_atexit()` for `set -e`

Both `test_when_finished ()` and `test_atexit ()` build up a chain of
cleanup commands by prepending each new command to the existing cleanup
string. To preserve the exit code of the test body across cleanup
execution, we append the following logic:

    } && (exit "$eval_ret"); eval_ret=$?; ...

The intent of this is to run the cleanup block and then unconditionally
restore `eval_ret`. The original behaviour of this is is:

   +------------------+---------+------------------------------------+
   |test body         │ cleanup │ old behaviour                      │
   +------------------+---------+------------------------------------+
   │pass (eval_ret=0) | pass    │ && taken -> (exit 0) -> eval_ret=0 |
   +------------------+---------+------------------------------------+
   │pass (eval_ret=0) | fail    │ && not taken -> eval_ret=$?        |
   +------------------+---------+------------------------------------+
   │fail (eval_ret=1) | pass    │ && taken -> (exit 1) -> eval_ret=1 |
   +------------------+---------+------------------------------------+
   │fail (eval_ret=1) | fail    | && not taken -> eval_ret=$?        |
   +------------------+---------+------------------------------------+

This logic will start to fail once we enable `set -e`. When `$eval_ret`
is non-zero, the subshell we create will fail, and with `set -e` we'll
thus bail out without evaluating the logic after the semicolon.

Fix this issue by instead using `|| eval_ret=\$?; ...`. Besides being
a bit simpler, it also retains the original behaviour:

   +------------------+---------+------------------------------------+
   |test body         │ cleanup │ old behaviour                      │
   +------------------+---------+------------------------------------+
   │pass (eval_ret=0) | pass    │ || not taken -> eval_ret unchanged |
   +------------------+---------+------------------------------------+
   │pass (eval_ret=0) | fail    │ || taken -> eval_ret=$?            |
   +------------------+---------+------------------------------------+
   │fail (eval_ret=1) | pass    │ || not taken -> eval_ret unchanged |
   +------------------+---------+------------------------------------+
   │fail (eval_ret=1) | fail    | || taken -> eval_ret=$?            |
   +------------------+---------+------------------------------------+

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare execution of potentially failing commands for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:19 +0000 (09:34 +0200)] 
t: prepare execution of potentially failing commands for `set -e`

Several of our tests verify whether a certain binary can be executed,
potentially skipping tests in case we cannot, for example because the
binary doesn't exist. In those cases we often run the binary outside of
any conditionally.

This will start to fail once we enable `set -e`, as that will cause us
to bail out the test immediately. Improve these tests by executing them
inside of a conditional instead.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare conditional test execution for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:18 +0000 (09:34 +0200)] 
t: prepare conditional test execution for `set -e`

We have some test in our test suite where we use the pattern of
`test ... && test_expect_succeess` to conditionally execute a test. The
problem is that when we decide to not execute the test, we'll indeed
skip the test, but the overall statement will also be unsuccessful. This
will become a problem once we enable `set -e`.

Prepare for this future by turning this into a proper conditional, which
is also a bit easier to read overall.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare `git config --unset` calls for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:17 +0000 (09:34 +0200)] 
t: prepare `git config --unset` calls for `set -e`

We have a couple of calls to `git config --unset` that ultimately end up
as no-ops as the configuration variables aren't set (anymore) in the
first place. These calls are mostly intended to recover unconditionally
from tests that may have executed only partially, but they'll ultimately
fail during a normal test run.

This hasn't been a problem until now as we aren't running tests with
`set -e`. This is about to change though, so let's silence the case
where we cannot unset the config keys.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare `stop_git_daemon ()` for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:16 +0000 (09:34 +0200)] 
t: prepare `stop_git_daemon ()` for `set -e`

We have a couple of calls to `stop_git_daemon ()` outside of specific
test cases that will kill a backgrounded git-daemon(1) process and
expect the process with a specific error code. While these function
calls do end up killing git-daemon(1), the error handling we have in
those contexts is basically ineffective. So while we expect the process
to exit with a specific error code, we will just continue with any error
in case it doesn't.

This will change once we enable `set -e` in a subsequent commit. There's
two issues though that will make this _always_ fail:

  - Our call to `wait` is expected to fail, but because it's not part of
    a condition it will cause us to bail out immediately with `set -e`.

  - We try to kill git-daemon(1) a second time via the pidfile. We can
    generally expect that this is the same PID though as we had in the
    "GIT_DAEMON_PID" environment variable, and thus it's more likely
    than not that we have already killed it, and the call to kill will
    fail.

Prepare for this change by handling the failure of `wait` with `||` and
by silencing failures of the second call to `kill`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare `test_must_fail ()` for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:15 +0000 (09:34 +0200)] 
t: prepare `test_must_fail ()` for `set -e`

The helper function `test_must_fail ()` executes a specific Git command
that may or may not fail in a specific way. This is done by executing
the command in question and then comparing its exit code against a set
of conditions.

This works, but once we run our test suite with `set -e` we may bail out
of `test_must_fail ()` early in case the command actually fails, even
though we expect it to fail. Prepare for this change by handling the
failed case with `||`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agot: prepare `test_match_signal ()` calls for `set -e`
Patrick Steinhardt [Tue, 21 Apr 2026 07:34:14 +0000 (09:34 +0200)] 
t: prepare `test_match_signal ()` calls for `set -e`

We have a couple of calls to `test_match_signal ()` where we execute a
Git command and expect it to die with a specific signal. These calls
will essentially execute the process in a subshell via `foo; echo $?`,
but as we expect `foo` to fail this will cause the overall subshell to
fail once we `set -e`.

Fix this issue by using `foo && echo 0 || echo $?` instead.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agoGit 2.54 v2.54.0
Junio C Hamano [Mon, 20 Apr 2026 02:01:39 +0000 (19:01 -0700)] 
Git 2.54

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agoMerge tag 'l10n-2.54.0-v2' of https://github.com/git-l10n/git-po
Junio C Hamano [Mon, 20 Apr 2026 01:59:09 +0000 (18:59 -0700)] 
Merge tag 'l10n-2.54.0-v2' of https://github.com/git-l10n/git-po

l10n-2.54.0-v2

* tag 'l10n-2.54.0-v2' of https://github.com/git-l10n/git-po:
  l10n: bg.po: Updated Bulgarian translation (6226t)
  l10n: zh_TW: update translation for Git 2.54
  l10n: Update Catalan Translation
  l10n: ga.po: update for Git 2.54
  l10n: fr: v2.54.0
  l10n: tr: Update Turkish translations
  l10n: sv.po: Update Swedish translation
  l10n: sv.po: correct various translations
  l10n: zh_CN: updated translation for 2.54
  l10n: bg.po: Updated Bulgarian translation (6226t)
  l10n: zh_CN: post-2.53 code review
  l10n: document AI and PO helper in po/README
  l10n: docs: add review instructions in AGENTS.md
  l10n: docs: add translation instructions in AGENTS.md
  l10n: docs: add update PO instructions in AGENTS.md
  l10n: docs: add AGENTS.md with update POT instructions
  l10n: add .gitattributes to simplify location filtering
  l10n: fix 'zh_TW.po' 'Applying patch'

3 weeks agoMerge branch 'master' of github.com:alshopov/git-po
Jiang Xin [Sun, 19 Apr 2026 23:37:21 +0000 (07:37 +0800)] 
Merge branch 'master' of github.com:alshopov/git-po

* 'master' of github.com:alshopov/git-po:
  l10n: bg.po: Updated Bulgarian translation (6226t)

3 weeks agol10n: bg.po: Updated Bulgarian translation (6226t)
Alexander Shopov [Sun, 19 Apr 2026 14:07:40 +0000 (16:07 +0200)] 
l10n: bg.po: Updated Bulgarian translation (6226t)

Improvements prompted by AI-assisted review

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
3 weeks agol10n: zh_TW: update translation for Git 2.54
Yi-Jyun Pan [Sun, 19 Apr 2026 13:52:38 +0000 (21:52 +0800)] 
l10n: zh_TW: update translation for Git 2.54

Signed-off-by: Yi-Jyun Pan <pan93412@gmail.com>
3 weeks agoMerge branch 'fr_v2.54.0' of github.com:jnavila/git
Jiang Xin [Sun, 19 Apr 2026 10:41:17 +0000 (18:41 +0800)] 
Merge branch 'fr_v2.54.0' of github.com:jnavila/git

* 'fr_v2.54.0' of github.com:jnavila/git:
  l10n: fr: v2.54.0

3 weeks agoMerge branch 'master' of github.com:alshopov/git-po
Jiang Xin [Sun, 19 Apr 2026 10:26:22 +0000 (18:26 +0800)] 
Merge branch 'master' of github.com:alshopov/git-po

* 'master' of github.com:alshopov/git-po:
  l10n: bg.po: Updated Bulgarian translation (6226t)

3 weeks agol10n: Update Catalan Translation
Mikel Forcada [Fri, 10 Apr 2026 19:55:34 +0000 (21:55 +0200)] 
l10n: Update Catalan Translation

Signed-off-by: Mikel Forcada <mikel.forcada@gmail.com>
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
3 weeks agol10n: ga.po: update for Git 2.54
Aindriú Mac Giolla Eoin [Thu, 9 Apr 2026 14:50:17 +0000 (15:50 +0100)] 
l10n: ga.po: update for Git 2.54

Signed-off-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
3 weeks agoMerge branch 'master' of github.com:nafmo/git-l10n-sv
Jiang Xin [Sun, 19 Apr 2026 08:54:14 +0000 (16:54 +0800)] 
Merge branch 'master' of github.com:nafmo/git-l10n-sv

* 'master' of github.com:nafmo/git-l10n-sv:
  l10n: sv.po: Update Swedish translation
  l10n: sv.po: correct various translations

3 weeks agoMerge branch 'apply-patch-reject' of github.com:A4-Tacks/git-po
Jiang Xin [Sun, 19 Apr 2026 08:50:58 +0000 (16:50 +0800)] 
Merge branch 'apply-patch-reject' of github.com:A4-Tacks/git-po

* 'apply-patch-reject' of github.com:A4-Tacks/git-po:
  l10n: fix 'zh_TW.po' 'Applying patch'

3 weeks agoMerge branch 'tr-l10n' of github.com:bitigchi/git-po
Jiang Xin [Sun, 19 Apr 2026 03:13:45 +0000 (11:13 +0800)] 
Merge branch 'tr-l10n' of github.com:bitigchi/git-po

* 'tr-l10n' of github.com:bitigchi/git-po:
  l10n: tr: Update Turkish translations

3 weeks agoMerge branch 'zh_CN-2.54' of github.com:jiangxin/git
Jiang Xin [Sun, 19 Apr 2026 03:01:51 +0000 (11:01 +0800)] 
Merge branch 'zh_CN-2.54' of github.com:jiangxin/git

* 'zh_CN-2.54' of github.com:jiangxin/git:
  l10n: zh_CN: updated translation for 2.54

3 weeks agol10n: fr: v2.54.0
Jean-Noël Avila [Sat, 18 Apr 2026 04:05:05 +0000 (12:05 +0800)] 
l10n: fr: v2.54.0

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
3 weeks agoCodingGuidelines: st_mtimespec vs st_mtim vs st_mtime
Junio C Hamano [Fri, 10 Apr 2026 18:10:48 +0000 (11:10 -0700)] 
CodingGuidelines: st_mtimespec vs st_mtim vs st_mtime

Most unfortunately macOS does not support st_[amc]tim for timestamps
down to nanosecond resolution as POSIX systems.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agodoc: fix grammar errors in submodule description
Elijah Newren [Thu, 16 Apr 2026 23:36:31 +0000 (23:36 +0000)] 
doc: fix grammar errors in submodule description

6cc6d1b4c699 (Documentation: update add --force option + ignore=all
config, 2026-02-06) added text describing both the ignore=none and
ignore=all behaviors.  The former had minor formatting and grammatical
errors, while the latter was a bit garbled.  I have tried to tweak the
wording on the latter to make it read as I think was intended, and fixed
the minor grammatical issues with both as well.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agodoc: fix singular/plural mismatch in git-rerere
Elijah Newren [Thu, 16 Apr 2026 23:36:30 +0000 (23:36 +0000)] 
doc: fix singular/plural mismatch in git-rerere

conflict -> conflicts

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agodoc: fix plural agreement in pack.preferBitmapTips
Elijah Newren [Thu, 16 Apr 2026 23:36:29 +0000 (23:36 +0000)] 
doc: fix plural agreement in pack.preferBitmapTips

hierarchies -> hierarchy

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agodoc: fix self-referential config in sendemail.smtpSSLClientKey
Elijah Newren [Thu, 16 Apr 2026 23:36:28 +0000 (23:36 +0000)] 
doc: fix self-referential config in sendemail.smtpSSLClientKey

a8215a205141 (send-email: add client certificate options, 2026-03-02)
added documentation for sendemail.smtpSSLClientKey that says it works
"in conjunction with `sendemail.smtpSSLClientKey`" -- referring to
itself.  It appears that `sendemail.smtpSSLClientCert` was the intended
reference; fix it.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agoCodingGuidelines: fix subject-verb agreement
Elijah Newren [Thu, 16 Apr 2026 23:36:27 +0000 (23:36 +0000)] 
CodingGuidelines: fix subject-verb agreement

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agoRelNotes/2.54.0: fix typos and grammar
Elijah Newren [Thu, 16 Apr 2026 23:36:26 +0000 (23:36 +0000)] 
RelNotes/2.54.0: fix typos and grammar

Fix various issues in the release notes -- missing/wrong articles, typo,
indentation, quote consistency, and wording improvement or corrections.

Other than the indentation fix for "The way combined list-object filter
options...", this patch is much easier to view with --color-words.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agol10n: tr: Update Turkish translations
Emir SARI [Sat, 4 Apr 2026 19:09:05 +0000 (22:09 +0300)] 
l10n: tr: Update Turkish translations

Signed-off-by: Emir SARI <emir_sari@icloud.com>
3 weeks agoMerge branch 'jk/midx-write-v1-by-default'
Junio C Hamano [Thu, 16 Apr 2026 22:43:26 +0000 (15:43 -0700)] 
Merge branch 'jk/midx-write-v1-by-default'

As writing version 2 MIDX files by default breaks older versions of
Git and its reimplementations, use V2 only when necessary.

* jk/midx-write-v1-by-default:
  MIDX: revert the default version to v1

3 weeks agoMIDX: revert the default version to v1
Jeff King [Thu, 16 Apr 2026 20:06:59 +0000 (16:06 -0400)] 
MIDX: revert the default version to v1

We introduced midx version 2 in b2ec8e90c2 (midx: do not require packs
to be sorted in lexicographic order, 2026-02-24) and now write it by
default. The rationale was that older versions should ignore the v2 midx
and fall back to using the packs (just like we do for other midx
errors). Unfortunately this is not the case, as we have a hard die()
when we see an unknown midx version.

As a result, writing a midx with Git 2.54-rc2 puts the repository into a
state that is unusable with Git 2.53. And this midx write may happen
behind the scenes as part of normal operations, like fetch.

Let's switch back to writing v1 by default to avoid regressing the case
where multiple versions of Git are used on the same repository.

There is one gotcha, though: the v2 format is required for some new
features, like midx compaction, and running "git multi-pack-index
compact" will complain when asked to write a v1 index. The user must set
midx.version to "2" to make the feature work.

So instead of always using v1, we'll base the default on whether the
requested feature requires v2. That does mean that running midx
compaction will create a repository that can't be read by older versions
of Git. But we never do that by default; only people experimenting with
the new feature will be affected.

We have to adjust the test expectation in t5319, since it will now
generate v1 files. And our "auto-select v2" is covered by the tests in
t5335, which continue to check that compaction works without having to
set midx.version manually (and also explicitly check that asking for v1
with compaction reports the problem).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agol10n: sv.po: Update Swedish translation
Peter Krefting [Thu, 16 Apr 2026 11:30:54 +0000 (12:30 +0100)] 
l10n: sv.po: Update Swedish translation

Signed-off-by: Peter Krefting <peter@softwolves.pp.se>
3 weeks agol10n: sv.po: correct various translations
Stefan Björnelund [Fri, 13 Feb 2026 20:14:23 +0000 (21:14 +0100)] 
l10n: sv.po: correct various translations

- correct translation of pathspec msgs
  Corrects cases where the “pathspec” is translated as if it was a
  path
- correct translation of refspec msgs
  Corrects cases where the “refspec” were not consistently translated
- correct translation of credential msgs
  Corrects cases where the “credential” were not correctly translated

Signed-off-by: Stefan Björnelund <stefan.bjornelund.gnome@gmail.com>
Modified-by: Peter Krefting <peter@softwolves.pp.se>
3 weeks agol10n: zh_CN: updated translation for 2.54
Jiang Xin [Tue, 31 Mar 2026 02:17:35 +0000 (10:17 +0800)] 
l10n: zh_CN: updated translation for 2.54

Translate 198 previously fuzzy or untranslated messages, bringing the
total number of translated messages to 6226.

Reviewed-by: 依云 <lilydjwg@gmail.com>
Reviewed-by: Fangyi Zhou <me@fangyi.io>
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
3 weeks agocodeql: bump actions/cache from 4 to 5
Johannes Schindelin [Mon, 13 Apr 2026 16:24:17 +0000 (16:24 +0000)] 
codeql: bump actions/cache from 4 to 5

Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major

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 weeks agol10n: bg.po: Updated Bulgarian translation (6226t)
Alexander Shopov [Tue, 7 Apr 2026 07:32:08 +0000 (09:32 +0200)] 
l10n: bg.po: Updated Bulgarian translation (6226t)

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
3 weeks agouserdiff: extend Scheme support to cover other Lisp dialects
Scott L. Burson [Wed, 15 Apr 2026 02:27:43 +0000 (02:27 +0000)] 
userdiff: extend Scheme support to cover other Lisp dialects

Common Lisp has top-level forms, such as 'defun' and 'defmacro', that
are not matched by the current Scheme pattern.  Also, it is more
common in CL, when defining user macros intended as top-level forms,
to prefix their names with "def" instead of "define"; such forms are
also not matched.  And some top-level forms don't even begin with
"def".

On the other hand, it is an established formatting convention in the
Lisp community that only top-level forms start at the left margin.  So
matching any unindented line starting with an open parenthesis is an
acceptable heuristic; false positives will be rare.

However, there are also cases where notionally top-level forms are
grouped together within some containing form.  At least in the Common
Lisp community, it is conventional to indent these by two spaces, or
sometimes one.  But matching just an open parenthesis indented by two
spaces would be too broad; so the pattern added by this commit
requires an indented form to start with "(def".  It is believed that
this strikes a good balance between potential false positives and
false negatives.

Signed-off-by: Scott L. Burson <Scott@sympoiesis.com>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agouserdiff: tighten word-diff test case of the scheme driver
Johannes Sixt [Wed, 15 Apr 2026 02:27:42 +0000 (02:27 +0000)] 
userdiff: tighten word-diff test case of the scheme driver

The scheme driver separates identifiers only at parentheses of all
sorts and whitespace, except that vertical bars act as brackets that
enclose an identifier.

The test case attempts to demonstrate the vertical bars with a change
from 'some-text' to '|a greeting|'. However, this misses the goal
because the same word coloring would be applied if '|a greeting|'
were parsed as two words.

Have an identifier between vertical bars with a space in both the pre-
and the post-image and change only one side of the space to show that
the single word exists between the vertical bars.

Also add cases that change parentheses of all kinds in a sequence of
parentheses to show that they are their own word each.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Scott L. Burson <Scott@sympoiesis.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoGit 2.54-rc2 v2.54.0-rc2
Junio C Hamano [Tue, 14 Apr 2026 13:22:50 +0000 (06:22 -0700)] 
Git 2.54-rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoHopefully the final tweak before -rc2
Junio C Hamano [Mon, 13 Apr 2026 20:54:45 +0000 (13:54 -0700)] 
Hopefully the final tweak before -rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoMerge branch 'jc/ci-github-actions-use-checkout-v5'
Junio C Hamano [Mon, 13 Apr 2026 20:54:57 +0000 (13:54 -0700)] 
Merge branch 'jc/ci-github-actions-use-checkout-v5'

CI dependency updates.

* jc/ci-github-actions-use-checkout-v5:
  CI: bump actions/checkout from 4 to 5 for rust-analysis job

4 weeks agoMerge branch 'jk/doc-markup-sub-list-indentation'
Junio C Hamano [Mon, 13 Apr 2026 20:54:57 +0000 (13:54 -0700)] 
Merge branch 'jk/doc-markup-sub-list-indentation'

Doc mark-up update for entries in the glossary with bulleted lists.

* jk/doc-markup-sub-list-indentation:
  gitglossary: fix indentation of sub-lists

4 weeks agoMerge branch 'kh/doc-am-xref'
Junio C Hamano [Mon, 13 Apr 2026 20:54:57 +0000 (13:54 -0700)] 
Merge branch 'kh/doc-am-xref'

Doc update.

* kh/doc-am-xref:
  doc: am: correct to full --no-message-id
  doc: am: revert Message-ID trailer claim

4 weeks agogitglossary: fix indentation of sub-lists
Jeff King [Sat, 11 Apr 2026 21:55:18 +0000 (17:55 -0400)] 
gitglossary: fix indentation of sub-lists

The glossary entry is a list of terms and their definitions, so
multi-paragraph definitions need "+" continuation lines to indicate
that they are part of a single entry.

When an entry contains a sub-list (say, a bulleted list), the final "+"
may become ambiguous: is it connecting the next paragraph to the final
entry of the sub-list, or to the original list of definition paragraphs?

Asciidoc generally connects it to the former, even when we mean the
latter, and you end up with the next paragraph indented incorrectly,
like this:

  glob
    ...defines glob...

    Two consecutive asterisks ("**") in patterns matched
    against full pathname may have special meaning:

    - ...some special meaning of **...

    - ...another special meaning of **...

    - Other consecutive asterisks are considered invalid.

      Glob magic is incompatible with literal magic.

That final "Glob magic is incompatible" paragraph is in the wrong spot.
It should be at the same level as "Two consecutive asterisks", as it is
not part of the final "Other consecutive asterisks" bullet point.

The same problem appears in several other spots in the glossary.

Usually we'd fix this by using "--" markers, which put the sub-list into
its own block. But there's a catch: in some of these spots we are
already in an open block, and nesting open blocks is a problem. It seems
to work for me using Asciidoc 10.2.1, but Asciidoctor 2.0.26 makes a
mess of it (our intent to open a new block seems to close the old one).

Fortunately there's a work-around: when using a "+" list-continuation,
the number of empty lines above the continuation indicates which level
of parent list to continue. So by adding an empty line after our
unordered list (before the "+"), we should be able to continue the
definition list item.

But asciidoc being asciidoc, of course that is not the end of the story.
That technique works fine for the "glob" and "attr" lists in this patch,
but under the "refs" item it works for only 1 of the 2 lists! I can't
figure out why, and this may be an asciidoctor bug. But we can work
around it by using "--" open-block markers here, since we're not
already in an open block.

So using the extra blank line for the first two instances, and "--"
markers for the second two, this patch produces identical output from
"doc-diff HEAD^ HEAD" for both --asciidoctor and --asciidoc modes.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoCI: bump actions/checkout from 4 to 5 for rust-analysis job
Junio C Hamano [Mon, 13 Apr 2026 18:24:44 +0000 (11:24 -0700)] 
CI: bump actions/checkout from 4 to 5 for rust-analysis job

GitHub Actions started complaining about use of Node.js 20 and I was
wondering why only one job uses actions/checkout@v4, while everybody
else already uses actions/checkout@v5.

It turns out that it is caused by a semantic mismerge between
e75cd059 (ci: check formatting of our Rust code, 2025-10-15) that
added a new use of actions/checkout@v4 that happened very close to
another change 63541ed9 (build(deps): bump actions/checkout from 4
to 5, 2025-10-16) that updated all uses of actions/checkout@v4 to
use vactions/checkout@v5.

Update the leftover and the last use of actions/checkout@v4 to use
actions/checkout@v5 to help ourselves to move away from Node.js 20.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agodoc: am: correct to full --no-message-id
Kristoffer Haugsbakk [Sat, 11 Apr 2026 20:20:10 +0000 (22:20 +0200)] 
doc: am: correct to full --no-message-id

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agodoc: am: revert Message-ID trailer claim
Kristoffer Haugsbakk [Sat, 11 Apr 2026 20:15:50 +0000 (22:15 +0200)] 
doc: am: revert Message-ID trailer claim

I claimed in 3c18135b (doc: am: say that --message-id adds a trailer,
2026-02-09) that `git am --message-id` adds a Git trailer. But that
isn’t the case; for the case of a commit message with a subject, body,
and no trailer block:

    <subject>

    <paragrah>

It just appends the line right after `paragraph`:

    <subject>

    <paragraph>
    Message-ID: <message-id_trailer.323@msgid.xyz>

It does work for two other cases though, namely subject-only and with an
existing trailer block.

This is at best an inconsistency and arguably a bug, but we’re at the
trailing end of the release cycle now. So reverting the doc is safer
than making msg-id act as a trailer, for now.

Revert this hunk from commit 3c18135b except the only useful
change (“Also use inline-verbatim for `Message-ID`”).

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoMerge branch 'jc/no-writev-does-not-work'
Junio C Hamano [Fri, 10 Apr 2026 23:47:35 +0000 (16:47 -0700)] 
Merge branch 'jc/no-writev-does-not-work'

We used writev() in limited code paths and supplied emulation for
platforms without working writev(), but the emulation was too
faithful to the spec to make the result useless to send even 64kB;
revert the topic and plan to restart the effort later.

* jc/no-writev-does-not-work:
  Revert "compat/posix: introduce writev(3p) wrapper"
  Revert "wrapper: introduce writev(3p) wrappers"
  Revert "sideband: use writev(3p) to send pktlines"
  Revert "cmake: use writev(3p) wrapper as needed"

4 weeks agoMerge branch 'ps/archive-prefix-doc'
Junio C Hamano [Fri, 10 Apr 2026 17:05:33 +0000 (10:05 -0700)] 
Merge branch 'ps/archive-prefix-doc'

Doc update.

* ps/archive-prefix-doc:
  archive: document --prefix handling of absolute and parent paths

4 weeks agoMerge branch 'bc/ref-storage-default-doc-update'
Junio C Hamano [Fri, 10 Apr 2026 17:05:32 +0000 (10:05 -0700)] 
Merge branch 'bc/ref-storage-default-doc-update'

Doc update.

* bc/ref-storage-default-doc-update:
  docs: correct information about reftable

4 weeks agorust: we are way beyond 2.53
Junio C Hamano [Fri, 10 Apr 2026 14:52:50 +0000 (07:52 -0700)] 
rust: we are way beyond 2.53

Earlier we timelined that we'd tune our build procedures to build
with Rust by default in Git 2.53, but we are already in prerelease
freeze for 2.54 now.  Update the BreakingChanges document to delay
it until Git 2.55 (slated for the end of June 2026).

Noticed-by: brian m. carlson <sandals@crustytoothpaste.net>
Helped-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agot1800: test SIGPIPE with parallel hooks
Jeff King [Fri, 10 Apr 2026 09:06:08 +0000 (12:06 +0300)] 
t1800: test SIGPIPE with parallel hooks

We recently fixed a bug in commit 2226ffaacd (run_processes_parallel():
fix order of sigpipe handling, 2026-04-08) where a hook that caused us
to get SIGPIPE would accidentally trigger the run_processes_parallel()
cleanup handler killing the child processes.

For a single hook, this meant killing the already-exited hook. This case
was triggered by our tests, but was only a problem on some platforms.

But if you have multiple hooks running in parallel, this causes a
problem everywhere, since one hook failing to read its input would take
down all hooks. Now that we have parallel hook support, we can add a
test for this case. It should pass already, due to the existing fix.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: allow hook.jobs=-1 to use all available CPU cores
Adrian Ratiu [Fri, 10 Apr 2026 09:06:07 +0000 (12:06 +0300)] 
hook: allow hook.jobs=-1 to use all available CPU cores

Allow -1 as a value for hook.jobs, hook.<event>.jobs, and the -j
CLI flag to mean "use as many jobs as there are CPU cores", matching
the convention used by fetch.parallel and other Git subsystems.

The value is resolved to online_cpus() at parse time so the rest
of the code always works with a positive resolved count.

Other non-positive values (0, -2, etc) are rejected with a warning
(config) or die (CLI).

Suggested-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: add hook.<event>.enabled switch
Adrian Ratiu [Fri, 10 Apr 2026 09:06:06 +0000 (12:06 +0300)] 
hook: add hook.<event>.enabled switch

Add a hook.<event>.enabled config key that disables all hooks for
a given event, when set to false, acting as a high-level switch
above the existing per-hook hook.<friendly-name>.enabled.

Event-disabled hooks are shown in "git hook list" with an
"event-disabled" tab-separated prefix before the name:

$ git hook list test-hook
event-disabled  hook-1
event-disabled  hook-2

With --show-scope:

$ git hook list --show-scope test-hook
local   event-disabled  hook-1

When a hook is both per-hook disabled and event-disabled, only
"event-disabled" is shown: the event-level switch is the more
relevant piece of information, and the per-hook "disabled" status
will surface once the event is re-enabled.

Using an event name as a friendly-name (e.g. hook.<event>.enabled)
can cause ambiguity, so a fatal error is issued when using a known
event name and a warning is issued for unknown event name, since
a collision cannot be detected with certainty for unknown events.

Suggested-by: Patrick Steinhardt <ps@pks.im>
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: move is_known_hook() to hook.c for wider use
Adrian Ratiu [Fri, 10 Apr 2026 09:06:05 +0000 (12:06 +0300)] 
hook: move is_known_hook() to hook.c for wider use

Move is_known_hook() from builtin/hook.c (static) into hook.c and
export it via hook.h so it can be reused.

Make it return bool and the iterator `h` for clarity (iterate hooks).

Both meson.build and the Makefile are updated to reflect that the
header is now used by libgit, not the builtin sources.

The next commit will use this to reject hook friendly-names that
collide with known event names.

Co-authored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: warn when hook.<friendly-name>.jobs is set
Adrian Ratiu [Fri, 10 Apr 2026 09:06:04 +0000 (12:06 +0300)] 
hook: warn when hook.<friendly-name>.jobs is set

Issue a warning when the user confuses the hook process and event
namespaces by setting hook.<friendly-name>.jobs.

Detect this by checking whether the name carrying .jobs also has
.command, .event, or .parallel configured.  Extract is_friendly_name()
as a helper for this check, to be reused by future per-event config
handling.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: add per-event jobs config
Adrian Ratiu [Fri, 10 Apr 2026 09:06:03 +0000 (12:06 +0300)] 
hook: add per-event jobs config

Add a hook.<event>.jobs count config that allows users to override the
global hook.jobs setting for specific hook events.

This allows finer-grained control over parallelism on a per-event basis.

For example, to run `post-receive` hooks with up to 4 parallel jobs
while keeping other events at their global default:

[hook]
    post-receive.jobs = 4

Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: add -j/--jobs option to git hook run
Emily Shaffer [Fri, 10 Apr 2026 09:06:02 +0000 (12:06 +0300)] 
hook: add -j/--jobs option to git hook run

Expose the parallel job count as a command-line flag so callers can
request parallelism without relying only on the hook.jobs config.

Add tests covering serial/parallel execution and TTY behaviour under
-j1 vs -jN.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: mark non-parallelizable hooks
Emily Shaffer [Fri, 10 Apr 2026 09:06:01 +0000 (12:06 +0300)] 
hook: mark non-parallelizable hooks

Several hooks are known to be inherently non-parallelizable, so initialize
them with RUN_HOOKS_OPT_INIT_FORCE_SERIAL. This pins jobs=1 and overrides
any hook.jobs or runtime -j flags.

These hooks are:
applypatch-msg, pre-commit, prepare-commit-msg, commit-msg, post-commit,
post-checkout, and push-to-checkout.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: allow pre-push parallel execution
Adrian Ratiu [Fri, 10 Apr 2026 09:06:00 +0000 (12:06 +0300)] 
hook: allow pre-push parallel execution

pre-push is the only hook that keeps stdout and stderr separate (for
backwards compatibility with git-lfs and potentially other users). This
prevents parallelizing it because run-command needs stdout_to_stderr=1
to buffer and de-interleave parallel outputs.

Since we now default to jobs=1, backwards compatibility is maintained
without needing any extension or extra config: when no parallelism is
requested, pre-push behaves exactly as before.

When the user explicitly opts into parallelism via hook.jobs > 1,
hook.<event>.jobs > 1, or -jN, they accept the changed output behavior.

Document this and let get_hook_jobs() set stdout_to_stderr=1 automatically
when jobs > 1, removing the need for any extension infrastructure.

Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: allow parallel hook execution
Emily Shaffer [Fri, 10 Apr 2026 09:05:59 +0000 (12:05 +0300)] 
hook: allow parallel hook execution

Hooks always run in sequential order due to the hardcoded jobs == 1
passed to run_process_parallel(). Remove that hardcoding to allow
users to run hooks in parallel (opt-in).

Users need to decide which hooks to run in parallel, by specifying
"parallel = true" in the config, because Git cannot know if their
specific hooks are safe to run or not in parallel (for e.g. two hooks
might write to the same file or call the same program).

Some hooks are unsafe to run in parallel by design: these will marked
in the next commit using RUN_HOOKS_OPT_INIT_FORCE_SERIAL.

The hook.jobs config specifies the default number of jobs applied to all
hooks which have parallelism enabled.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agohook: parse the hook.jobs config
Adrian Ratiu [Fri, 10 Apr 2026 09:05:58 +0000 (12:05 +0300)] 
hook: parse the hook.jobs config

The hook.jobs config is a global way to set hook parallelization for
all hooks, in the sense that it is not per-event nor per-hook.

Finer-grained configs will be added in later commits which can override
it, for e.g. via a per-event type job options. Next commits will also
add to this item's documentation.

Parse hook.jobs config key in hook_config_lookup_all() and store its
value in hook_all_config_cb.jobs, then transfer it into r->jobs after
the config pass completes.

This is mostly plumbing and the cached value is not yet used.

Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoconfig: add a repo_config_get_uint() helper
Adrian Ratiu [Fri, 10 Apr 2026 09:05:57 +0000 (12:05 +0300)] 
config: add a repo_config_get_uint() helper

Next commits add a 'hook.jobs' config option of type 'unsigned int',
so add a helper to parse it since the API only supports int and ulong.

An alternative is to make 'hook.jobs' an 'int' or parse it as an 'int'
then cast it to unsigned, however it's better to use proper helpers for
the type. Using 'ulong' is another option which already has helpers, but
it's a bit excessive in size for just the jobs number.

Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agorepository: fix repo_init() memleak due to missing _clear()
Adrian Ratiu [Fri, 10 Apr 2026 09:05:56 +0000 (12:05 +0300)] 
repository: fix repo_init() memleak due to missing _clear()

There is an old pre-existing memory leak in repo_init() due to failing
to call clear_repository_format() in the error case.

It went undetected because a specific bug is required to trigger it:
enable a v1 extension in a repository with format v0. Obviously this
can only happen in a development environment, so it does not trigger
in normal usage, however the memleak is real and needs fixing.

Fix it by also calling clear_repository_format() in the error case.

Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agol10n: zh_CN: post-2.53 code review
Jiang Xin [Thu, 5 Feb 2026 01:21:28 +0000 (09:21 +0800)] 
l10n: zh_CN: post-2.53 code review

Update Simplified Chinese translation for post-2.53 code review.

Reviewed-by: 依云 <lilydjwg@gmail.com>
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
4 weeks agoEnable Rust by default
brian m. carlson [Thu, 9 Apr 2026 22:44:34 +0000 (22:44 +0000)] 
Enable Rust by default

Our breaking changes document says that we'll enable Rust by default in
Git 2.54.  Adjust the Makefile to switch the option from WITH_RUST to
NO_RUST to enable it by default and update the help text accordingly.
Similarly, for Meson, enable the option by default and do not
automatically disable it if Cargo is missing, since the goal is to help
users find where they are likely to have problems in the future.

Update our CI tests to swap out the single Linux job with Rust to a
single job without, both for Makefile and Meson.  Similarly, update the
Windows Makefile job to not use Rust, while the Meson job (which does
not build with ci/lib.sh) will default to having it enabled.

Move the check for Cargo in the Meson build because it is no longer
needed in the main script.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 weeks agoLinux: link against libdl
brian m. carlson [Thu, 9 Apr 2026 22:44:33 +0000 (22:44 +0000)] 
Linux: link against libdl

Older versions of Rust on Linux, such as that used in Debian 11 in our
CI, require linking against libdl.  Were we linking with Cargo, this
would be included automatically, but since we're not, explicitly set it
in the system-specific config.

This library is part of libc, so linking against it if it happens to be
unnecessary will add no dependencies to the resulting binary.  In
addition, it is provided by both glibc and musl, so it should be
portable to almost all Linux systems.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>