]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
2 months agorust: fix linking binaries with cargo
brian m. carlson [Sat, 7 Feb 2026 20:04:41 +0000 (20:04 +0000)] 
rust: fix linking binaries with cargo

When Cargo links binaries with MSVC, it uses the link.exe linker from
PATH to do so.  However, when running under a shell from MSYS, such as
when building with the Git for Windows SDK, which we do in CI, the
/ming64/bin and /usr/bin entries are first in PATH.  That means that the
Unix link binary shows up first, which obviously does not work for
linking binaries in any useful way.

To solve this problem, adjust PATH to place those binaries at the end of
the list instead of the beginning.  This allows access to the normal
Unix tools, but link.exe will be the compiler's linker.  Make sure to
export PATH explicitly: while this should be the default, it's more
robust to not rely on the shell operating in a certain way.

The reason this has not shown up before is that we typically link our
binaries from the C compiler.  However, now that we're about to
introduce a Rust build script (build.rs file), Rust will end up linking
that script to further drive Cargo, in which case we'll invoke the
linker from it.  There are other solutions, such as using LLD, but this
one is simple and reliable and is most likely to work with existing
systems.

Signed-off-by: Ezekiel Newren <ezekielnewren@gmail.com>
Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agohash: expose hash context functions to Rust
brian m. carlson [Sat, 7 Feb 2026 20:04:40 +0000 (20:04 +0000)] 
hash: expose hash context functions to Rust

We'd like to be able to hash our data in Rust using the same contexts as
in C.  However, we need our helper functions to not be inline so they
can be linked into the binary appropriately.  In addition, to avoid
managing memory manually and since we don't know the size of the hash
context structure, we want to have simple alloc and free functions we
can use to make sure a context can be easily dynamically created.

Expose the helper functions and create alloc, free, and init functions
we can call.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agowrite-or-die: add an fsync component for the object map
brian m. carlson [Sat, 7 Feb 2026 20:04:39 +0000 (20:04 +0000)] 
write-or-die: add an fsync component for the object map

We'll soon be writing out an object map using the hashfile code. Add an
fsync component to allow us to handle fsyncing it correctly.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agocsum-file: define hashwrite's count as a uint32_t
brian m. carlson [Sat, 7 Feb 2026 20:04:38 +0000 (20:04 +0000)] 
csum-file: define hashwrite's count as a uint32_t

We want to call this code from Rust and ensure that the types are the
same for compatibility, which is easiest to do if the type is a fixed
size.  Since unsigned int is 32 bits on all the platforms we care about,
define it as a uint32_t instead.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agorust: add additional helpers for ObjectID
brian m. carlson [Sat, 7 Feb 2026 20:04:37 +0000 (20:04 +0000)] 
rust: add additional helpers for ObjectID

Right now, users can internally access the contents of the ObjectID
struct, which can lead to data that is not valid, such as invalid
algorithms or non-zero-padded hash values.  These can cause problems
down the line as we use them more.

Add a constructor for ObjectID that allows us to set these values and
also provide an accessor for the algorithm so that we can access it.  In
addition, provide useful Display and Debug implementations that can
format our data in a useful way.

Now that we have the ability to work with these various components in a
nice way, add some tests as well to make sure that ObjectID and
HashAlgorithm work together as expected.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agohash: add a function to look up hash algo structs
brian m. carlson [Sat, 7 Feb 2026 20:04:36 +0000 (20:04 +0000)] 
hash: add a function to look up hash algo structs

In C, it's easy for us to look up a hash algorithm structure by its
offset by simply indexing the hash_algos array.  However, in Rust, we
sometimes need a pointer to pass to a C function, but we have our own
hash algorithm abstraction.

To get one from the other, let's provide a simple function that looks up
the C structure from the offset and expose it in Rust.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agorust: add a hash algorithm abstraction
brian m. carlson [Sat, 7 Feb 2026 20:04:35 +0000 (20:04 +0000)] 
rust: add a hash algorithm abstraction

This works very similarly to the existing one in C except that it
doesn't provide any functionality to hash an object.  We don't currently
need that right now, but the use of those function pointers do make it
substantially more difficult to write a bit-for-bit identical structure
across the C/Rust interface, so omit them for now.

Instead of the more customary "&self", use "self", because the former is
the size of a pointer and the latter is the size of an integer on most
systems.  Don't define an unknown value but use an Option for that
instead.

Update the object ID structure to allow slicing the data appropriately
for the algorithm.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agorust: add a ObjectID struct
brian m. carlson [Sat, 7 Feb 2026 20:04:34 +0000 (20:04 +0000)] 
rust: add a ObjectID struct

We'd like to be able to write some Rust code that can work with object
IDs.  Add a structure here that's identical to struct object_id in C,
for easy use in sharing across the FFI boundary.  We will use this
structure in several places in hot paths, such as index-pack or
pack-objects when converting between algorithms, so prioritize efficient
interchange over a more idiomatic Rust approach.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agohash: use uint32_t for object_id algorithm
brian m. carlson [Sat, 7 Feb 2026 20:04:33 +0000 (20:04 +0000)] 
hash: use uint32_t for object_id algorithm

We currently use an int for this value, but we'll define this structure
from Rust in a future commit and we want to ensure that our data types
are exactly identical.  To make that possible, use a uint32_t for the
hash algorithm.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoconversion: don't crash when no destination algo
brian m. carlson [Sat, 7 Feb 2026 20:04:32 +0000 (20:04 +0000)] 
conversion: don't crash when no destination algo

When we set up a repository that doesn't have a compatibility hash
algorithm, we set the destination algorithm object to NULL.  In such a
case, we want to silently do nothing instead of crashing, so simply
treat the operation as a no-op and copy the object ID.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agorepository: require Rust support for interoperability
brian m. carlson [Sat, 7 Feb 2026 20:04:31 +0000 (20:04 +0000)] 
repository: require Rust support for interoperability

We'll be implementing some of our interoperability code, like the loose
object map, in Rust.  While the code currently compiles with the old
loose object map format, which is written entirely in C, we'll soon
replace that with the Rust-based implementation.

Require the use of Rust for compatibility mode and die if it is not
supported.  Because the repo argument is not used when Rust is missing,
cast it to void to silence the compiler warning, which we do not care
about.

Add a prerequisite in our tests, RUST, that checks if Rust functionality
is available and use it in the tests that handle interoperability.

This is technically a regression in functionality compared to our
existing state, but pack index v3 is not yet implemented and thus the
functionality is mostly quite broken, which is why we've recently marked
this functionality as experimental.  We don't believe anyone is getting
useful use out of the interoperability code in its current state, so no
actual users should be negatively impacted by this change.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agocompletion: add stash import, export
D. Ben Knoble [Sat, 7 Feb 2026 21:59:16 +0000 (16:59 -0500)] 
completion: add stash import, export

These newer commands lack completion; implement basic support for
options and arguments.

Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agomerge-file: honor merge.conflictStyle outside of a repository
Yannik Tausch [Sat, 7 Feb 2026 21:37:48 +0000 (22:37 +0100)] 
merge-file: honor merge.conflictStyle outside of a repository

When running outside a repository, git merge-file ignores the
merge.conflictStyle configuration variable entirely. Since the
function receives `repo` from the caller (which is NULL outside a
repository), and repo_config() falls back to reading system and user
configuration when passed NULL, pass `repo` to repo_config()
unconditionally.

Also document that merge.conflictStyle is honored.

Signed-off-by: Yannik Tausch <dev@ytausch.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoci: ubuntu: use GNU coreutils for dirname
Colin Stagner [Sat, 7 Feb 2026 04:27:03 +0000 (22:27 -0600)] 
ci: ubuntu: use GNU coreutils for dirname

The uutils version of `dirname` has output that is inconsistent
with GNU coreutils. Prefer the GNU implementation of this command.

Signed-off-by: Colin Stagner <ask+git@howdoi.land>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agomerge-ours: integrate with sparse-index
Sam Bostock [Fri, 6 Feb 2026 19:16:23 +0000 (19:16 +0000)] 
merge-ours: integrate with sparse-index

The merge-ours built-in opens the index to compare it against HEAD.
The machinery used to do this (i.e. run_diff_index()) is capable of
working with a sparse index, but the start-up sequence of this
command does not take the necessary steps, so we end up expanding the
index fully before doing the comparison.

In order to convince sparse-index.c:is_sparse_index_allowed() to
return true, we need to:

 - Read basic configuration with git_default_config so that global
   variables like core_apply_sparse_checkout are populated.
   merge-ours currently does not read configuration at all.

 - Set command_requires_full_index to 0.

With that, the command can work without expanding the index fully
before doing its work.

Signed-off-by: Sam Bostock <sam@sambostock.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agomerge-ours: drop USE_THE_REPOSITORY_VARIABLE
Sam Bostock [Fri, 6 Feb 2026 19:16:22 +0000 (19:16 +0000)] 
merge-ours: drop USE_THE_REPOSITORY_VARIABLE

The merge-ours built-in uses the `the_repository` global to access
the repository. The project is moving away from this global in favor
of the `repo` parameter that is passed to each built-in command.
Since merge-ours is registered with RUN_SETUP, `repo` is guaranteed
to be non-NULL and can be used directly.

Drop the USE_THE_REPOSITORY_VARIABLE macro and use `repo` throughout.

While at it, remove a stray double blank line between the #include
block and the usage string.

Signed-off-by: Sam Bostock <sam@sambostock.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoDocumentation: update add --force option + ignore=all config
Claus Schneider(Eficode) [Fri, 6 Feb 2026 13:23:00 +0000 (13:23 +0000)] 
Documentation: update add --force option + ignore=all config

- git-add.adoc: Update the --force documentation for submodule behaviour
  to be added even the given configuration ignore=all.
- gitmodules.adoc and config/submodule.adoc: The submodule config
  ignore=all now need --force in order to update the index.

Signed-off-by: Claus Schneider(Eficode) <claus.schneider@eficode.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agotests: fix existing tests when add an ignore=all submodule
Claus Schneider(Eficode) [Fri, 6 Feb 2026 13:22:59 +0000 (13:22 +0000)] 
tests: fix existing tests when add an ignore=all submodule

There are tests that rely on "git add <submodule>" to update the in the
reference in the parent repository which have been updated to use the
--force option.

Updated tests:
- t1013-read-tree-submodule.sh ( fixed in: t/lib-submodule-update.sh )
- t2013-checkout-submodule.sh ( fixed in: t/lib-submodule-update.sh )
- t7406-submodule-update.sh
- t7508-status.sh

Signed-off-by: Claus Schneider(Eficode) <claus.schneider@eficode.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agotests: t2206-add-submodule-ignored: ignore=all and add --force tests
Claus Schneider(Eficode) [Fri, 6 Feb 2026 13:22:58 +0000 (13:22 +0000)] 
tests: t2206-add-submodule-ignored: ignore=all and add --force tests

The tests verify that the submodule behavior is intact and updating the
config with ignore=all also behaves as intended with configuration in
.gitmodules and configuration given on the command line.

The usage of --force is showcased and tested in the test suite.

The test file is added to meson.build for execution.

Signed-off-by: Claus Schneider(Eficode) <claus.schneider@eficode.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoread-cache: submodule add need --force given ignore=all configuration
Claus Schneider(Eficode) [Fri, 6 Feb 2026 13:22:57 +0000 (13:22 +0000)] 
read-cache: submodule add need --force given ignore=all configuration

Submodules configured with ignore=all are now skipped during add operations
unless overridden by --force and the submodule path is explicitly specified.

A message is printed (like ignored files) guiding the user to use the
--force flag if the user explicitly wants to update the submodule reference.

The reason for the change is to support branch tracking in submodules
with configuration `submdule.<name>.branch` or similar workflows where the
user is not interested in tracking each update of the sha1 in the submdule.
You can additionally set `submodule.<name>.ignore=all` and the `git status`
will state nothing and, with this patch, the `git add` does not either - as
the default behaviour. This patch changes the workflow to a more logical
behaviour and similar to workflow for ignored files.

The patch gives more scenarios for submodules to be used effectively with
less friction similar to the "repo" tool. A submodule can be added for many
different reasons than a hard dependency. It can be added as loosely
coupled dependencies whereas the user wants the latest based on the
configuration `submoule.<name>.branch`, but are not interested to track
each commit in the `super-repo`. Currently it gives friction of handling
conflicts between branches even the sha1's are fast-forward and the user
just wants the latest in any way. The user can still add a sha1 explicitly
to track updates.

Signed-off-by: Claus Schneider(Eficode) <claus.schneider@eficode.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoread-cache: update add_files_to_cache take param ignored_too
Claus Schneider(Eficode) [Fri, 6 Feb 2026 13:22:56 +0000 (13:22 +0000)] 
read-cache: update add_files_to_cache take param ignored_too

The ignored_too parameter is added to the function
add_files_to_cache for usage of explicit updating the index for the updated
submodule using the explicit patchspec to the submodule.

Signed-off-by: Claus Schneider(Eficode) <claus.schneider@eficode.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: fix repo_config documentation reference
SoutrikDas [Fri, 6 Feb 2026 06:21:08 +0000 (11:51 +0530)] 
doc: fix repo_config documentation reference

In MyFirstContribution.adoc, the link to the repo_config()
documentation is invalid because the related documentation was moved
to a different file.

Replace the path for the repo_config() documentation from
'Documentation/technical/api-config.h' to 'config.h'.

Signed-off-by: SoutrikDas <valusoutrik@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: convert git-show to synopsis style
Jean-Noël Avila [Fri, 6 Feb 2026 04:12:26 +0000 (04:12 +0000)] 
doc: convert git-show to synopsis style

 * add synopsis block definition in asciidoc.conf.in
 * convert commands to synopsis style
 * use _<placeholder>_ for arguments
 * minor formatting fixes

Reviewed-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: fix some style issues in git-clone and for-each-ref-options
Jean-Noël Avila [Fri, 6 Feb 2026 04:12:25 +0000 (04:12 +0000)] 
doc: fix some style issues in git-clone and for-each-ref-options

 * spell out all forms of --[no-]reject-shallow in git-clone
 * use imperative mood for the first line of options
 * Use asciidoc NOTE macro
 * fix markups

Reviewed-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: finalize git-clone documentation conversion to synopsis style
Jean-Noël Avila [Fri, 6 Feb 2026 04:12:24 +0000 (04:12 +0000)] 
doc: finalize git-clone documentation conversion to synopsis style

Use backticks where appropriate for command-line options

Reviewed-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: convert git-submodule to synopsis style
Jean-Noël Avila [Fri, 6 Feb 2026 04:12:23 +0000 (04:12 +0000)] 
doc: convert git-submodule to synopsis style

 * convert commands to synopsis style
 * use _<placeholder>_ for arguments
 * convert inline lists into proper definition lists
 * minor formatting fixes

Reviewed-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agowhitespace: symbolic links usually lack LF at the end
Junio C Hamano [Wed, 4 Feb 2026 21:23:06 +0000 (13:23 -0800)] 
whitespace: symbolic links usually lack LF at the end

For a patch that touches a symbolic link, it is perfectly normal
that the contents ends with "\ No newline at end of file".  The
checks introduced recently to detect incomplete lines (i.e., a text
file that lack the newline on its final line) should not trigger.

Disable the check early for symbolic links, both in "git apply" and
"git diff" and test them.  For "git apply", we check only when the
postimage is a symbolic link regardless of the preimage, and we only
care about preimage when applying in reverse.  Similarly, "git diff"
would warn only when the postimage is a symbolic link, or the
preimage when running "git diff -R".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agogpg-interface: remove an unnecessary NULL initialization
Collin Funk [Fri, 6 Feb 2026 01:46:10 +0000 (17:46 -0800)] 
gpg-interface: remove an unnecessary NULL initialization

We assign this variable unconditionally, so we do not need to
initialize it to NULL where it is defined.

Signed-off-by: Collin Funk <collin.funk1@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoglobal: constify some pointers that are not written to
Collin Funk [Fri, 6 Feb 2026 01:46:09 +0000 (17:46 -0800)] 
global: constify some pointers that are not written to

The recent glibc 2.43 release had the following change listed in its
NEWS file:

    For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
    strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return
    pointers into their input arrays now have definitions as macros that
    return a pointer to a const-qualified type when the input argument is
    a pointer to a const-qualified type.

When compiling with GCC 15, which defaults to -std=gnu23, this causes
many warnings like this:

    merge-ort.c: In function ‘apply_directory_rename_modifications’:
    merge-ort.c:2734:36: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
     2734 |                 char *last_slash = strrchr(cur_path, '/');
          |                                    ^~~~~~~

This patch fixes the more obvious ones by making them const when we do
not write to the returned pointer.

Signed-off-by: Collin Funk <collin.funk1@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoStart 2.54 cycle
Junio C Hamano [Thu, 5 Feb 2026 23:07:22 +0000 (15:07 -0800)] 
Start 2.54 cycle

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'sp/t5500-cleanup'
Junio C Hamano [Thu, 5 Feb 2026 23:42:01 +0000 (15:42 -0800)] 
Merge branch 'sp/t5500-cleanup'

Test clean-up.

* sp/t5500-cleanup:
  t5500: simplify test implementation and fix git exit code suppression

2 months agoMerge branch 'tc/last-modified-options-cleanup'
Junio C Hamano [Thu, 5 Feb 2026 23:42:01 +0000 (15:42 -0800)] 
Merge branch 'tc/last-modified-options-cleanup'

The "-z" and "--max-depth" documentation (and implementation of
"-z") in the "git last-modified" command have been updated.

* tc/last-modified-options-cleanup:
  last-modified: change default max-depth to 0
  last-modified: document option '--max-depth'
  last-modified: document option '-z'
  last-modified: clarify in the docs the command takes a pathspec

2 months agoMerge branch 'lp/diff-stat-utf8-display-width-fix'
Junio C Hamano [Thu, 5 Feb 2026 23:42:01 +0000 (15:42 -0800)] 
Merge branch 'lp/diff-stat-utf8-display-width-fix'

The computation of column width made by "git diff --stat" was
confused when pathnames contain non-ASCII characters.

* lp/diff-stat-utf8-display-width-fix:
  t4073: add test for diffstat paths length when containing UTF-8 chars
  diff: improve scaling of filenames in diffstat to handle UTF-8 chars

2 months agoMerge branch 'ac/sparse-checkout-string-list-cleanup'
Junio C Hamano [Thu, 5 Feb 2026 23:42:00 +0000 (15:42 -0800)] 
Merge branch 'ac/sparse-checkout-string-list-cleanup'

Code clean-up.

* ac/sparse-checkout-string-list-cleanup:
  sparse-checkout: optimize string_list construction and add tests to verify deduplication.

2 months agoMerge branch 'sp/myfirstcontribution-include-update'
Junio C Hamano [Thu, 5 Feb 2026 23:42:00 +0000 (15:42 -0800)] 
Merge branch 'sp/myfirstcontribution-include-update'

Doc update.

* sp/myfirstcontribution-include-update:
  doc: MyFirstContribution: fix missing dependencies and clarify build steps

2 months agoMerge branch 'dd/t5403-modernise'
Junio C Hamano [Thu, 5 Feb 2026 23:42:00 +0000 (15:42 -0800)] 
Merge branch 'dd/t5403-modernise'

Test clean-up.

* dd/t5403-modernise:
  t5403: use test_cmp for post-checkout argument checks
  t5403: introduce check_post_checkout helper function

2 months agoMerge branch 'ap/http-probe-rpc-use-auth'
Junio C Hamano [Thu, 5 Feb 2026 23:41:58 +0000 (15:41 -0800)] 
Merge branch 'ap/http-probe-rpc-use-auth'

HTTP transport failed to authenticate in some code paths, which has
been corrected.

* ap/http-probe-rpc-use-auth:
  remote-curl: use auth for probe_rpc() requests too

2 months agoMerge branch 'ar/submodule-gitdir-tweak'
Junio C Hamano [Thu, 5 Feb 2026 23:41:58 +0000 (15:41 -0800)] 
Merge branch 'ar/submodule-gitdir-tweak'

Avoid local submodule repository directory paths overlapping with
each other by encoding submodule names before using them as path
components.

* ar/submodule-gitdir-tweak:
  submodule: detect conflicts with existing gitdir configs
  submodule: hash the submodule name for the gitdir path
  submodule: fix case-folding gitdir filesystem collisions
  submodule--helper: fix filesystem collisions by encoding gitdir paths
  builtin/credential-store: move is_rfc3986_unreserved to url.[ch]
  submodule--helper: add gitdir migration command
  submodule: allow runtime enabling extensions.submodulePathConfig
  submodule: introduce extensions.submodulePathConfig
  builtin/submodule--helper: add gitdir command
  submodule: always validate gitdirs inside submodule_name_to_gitdir
  submodule--helper: use submodule_name_to_gitdir in add_submodule

2 months agoMerge branch 'aa/add-p-previous-decisions'
Junio C Hamano [Thu, 5 Feb 2026 23:41:58 +0000 (15:41 -0800)] 
Merge branch 'aa/add-p-previous-decisions'

"git add -p" and friends note what the current status of the hunk
being shown is.

* aa/add-p-previous-decisions:
  add -p: show user's hunk decision when selecting hunks

2 months agoMerge branch 'jk/remote-tracking-ref-leakfix'
Junio C Hamano [Thu, 5 Feb 2026 23:41:57 +0000 (15:41 -0800)] 
Merge branch 'jk/remote-tracking-ref-leakfix'

Leakfix.

* jk/remote-tracking-ref-leakfix:
  remote: always allocate branch.push_tracking_ref
  remote: fix leak in branch_get_push_1() with invalid "simple" config
  remote: drop const return of tracking_for_push_dest()
  remote: return non-const pointer from error_buf()

2 months agodoc: send-email: correct --no-signed-off-by-cc misspelling
Matěj Cepl [Thu, 5 Feb 2026 16:24:01 +0000 (17:24 +0100)] 
doc: send-email: correct --no-signed-off-by-cc misspelling

There is no option --signed-off-cc (without -by) for git send-email.

Signed-off-by: Matěj Cepl <mcepl@cepl.eu>
[kh: rebased and changed subject to house style]
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
[jc: minor copyedit in the commit message]
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agotest: optionally test contrib in CI
Junio C Hamano [Mon, 2 Feb 2026 21:07:58 +0000 (13:07 -0800)] 
test: optionally test contrib in CI

Recently it was reported that a topic merged to 'next' broke build
and test for contrib/subtree part of the system.

Instead of having those who run 'next' or 'master' to hit the build
and test breakage and report to us, make sure we notice breakages in
contrib/ area before they hit my tree at all, during their own
presubmit testing.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'pks-meson-fix-missing-msgfmt' of https://github.com/pks-gitlab/gitk
Johannes Sixt [Thu, 5 Feb 2026 12:45:51 +0000 (13:45 +0100)] 
Merge branch 'pks-meson-fix-missing-msgfmt' of https://github.com/pks-gitlab/gitk

* 'pks-meson-fix-missing-msgfmt' of https://github.com/pks-gitlab/gitk:
  gitk: fix msgfmt being required

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2 months agogitk: fix msgfmt being required
Patrick Steinhardt [Thu, 5 Feb 2026 11:50:13 +0000 (12:50 +0100)] 
gitk: fix msgfmt being required

While the Meson build instructions already handle the case where msgfmt
wasn't found, we forgot to mark the dependency itself as optional. This
causes an error in case the executable could not be found:

  Project name: gitk
  Project version: undefined
  Program sh found: YES (C:\Program Files\Git\bin\sh.EXE)
  Program wish found: YES (C:\Program Files\Git\mingw64\bin\wish.EXE)
  Program chmod found: YES (C:\Program Files\Git\usr\bin\chmod.EXE)
  Program mv found: YES (C:\Program Files\Git\usr\bin\mv.EXE)
  Program sed found: YES (C:\Program Files\Git\usr\bin\sed.EXE)
  Program msgfmt found: NO

  subprojects\gitk\meson.build:28:3: ERROR: Program 'msgfmt' not found or not executable

Fix the issue by adding the `required: false` parameter.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
2 months agomeson: wire up gitk and git-gui
Patrick Steinhardt [Wed, 4 Feb 2026 08:38:11 +0000 (09:38 +0100)] 
meson: wire up gitk and git-gui

Wire up both gitk and git-gui in Meson as subprojects. These two
programs should be the last missing pieces for feature compatibility
with our Makefile for distributors.

Note that Meson expects subprojects to live in the "subprojects/"
directory. Create symlinks to fulfill this requirement.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agocontrib/subtree: fix tests with reftable backend
Colin Stagner [Wed, 4 Feb 2026 04:38:11 +0000 (22:38 -0600)] 
contrib/subtree: fix tests with reftable backend

One git-subtree test-case relies on git internals to infer the
default branch name. This test fails with the new reftable
backend.

    GIT_TEST_DEFAULT_REF_FORMAT=reftable \
      meson test t7900-subtree

This test script already sets

    GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main

which eliminates the need to infer a branch name at runtime.
Hardcode the branch name.

Signed-off-by: Colin Stagner <ask+git@howdoi.land>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agogpg-interface: signatures by expired keys are fine
Uwe Kleine-König [Wed, 4 Feb 2026 15:23:06 +0000 (16:23 +0100)] 
gpg-interface: signatures by expired keys are fine

If a signature is made with a valid key and that key later expires, the
signature should still be considered good.

GnuPG emits in this case something like:

[GNUPG:] NEWSIG
gpg: Signature made Wed 26 Nov 2014 05:56:50 AM CET
gpg:                using RSA key FE3958F9067BC667
[GNUPG:] KEYEXPIRED 1478449622
[GNUPG:] KEY_CONSIDERED D783920D6D4F0C06AA4C25F3FE3958F9067BC667 0
[GNUPG:] KEYEXPIRED 1478449622
[GNUPG:] SIG_ID 8tAN3Fx6XB2NAoH5U8neoguQ9MI 2014-11-26 1416977810
[GNUPG:] EXPKEYSIG FE3958F9067BC667 Jason Cooper <jason@lakedaemon.net>
gpg: Good signature from "Jason Cooper <jason@lakedaemon.net>" [expired]
[GNUPG:] VALIDSIG D783920D6D4F0C06AA4C25F3FE3958F9067BC667 2014-11-26 1416977810 0 4 0 1 2 00 D783920D6D4F0C06AA4C25F3FE3958F9067BC667
gpg: Note: This key has expired!
      D783920D6D4F0C06AA4C25F3FE3958F9067BC667

(signature and signed data in this example is taken from Linux commit
756f80cee766574ae282baa97fdcf9cc). So GnuPG is relaxed and the fact that
the key is expired is only worth a "Note" which is weaker than e.g.

gpg: WARNING: The key's User ID is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.

which git still considers ok.

So stop coloring the signature by an expired key red and handle it like
any other good signature.

Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'ar/run-command-hook-take-2' into ar/config-hooks
Junio C Hamano [Wed, 4 Feb 2026 17:22:21 +0000 (09:22 -0800)] 
Merge branch 'ar/run-command-hook-take-2' into ar/config-hooks

* ar/run-command-hook-take-2:
  receive-pack: convert receive hooks to hook API
  receive-pack: convert update hooks to new API
  run-command: poll child input in addition to output
  hook: add jobs option
  reference-transaction: use hook API instead of run-command
  transport: convert pre-push to hook API
  hook: allow separate std[out|err] streams
  hook: convert 'post-rewrite' hook in sequencer.c to hook API
  hook: provide stdin via callback
  run-command: add stdin callback for parallelization
  run-command: add helper for pp child states
  t1800: add hook output stream tests

2 months agodiff-highlight: allow testing with Git 3.0 breaking changes
Junio C Hamano [Tue, 3 Feb 2026 21:26:00 +0000 (13:26 -0800)] 
diff-highlight: allow testing with Git 3.0 breaking changes

The diff-highlight (in contrib/) comes with its own test script,
which relies on the initial branch name being 'master'.  This is not
just encoded in the test logic, but in the illustration in the file
that shows the topology of the history.

Force the initial branch name to 'master' to allow it pass.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months ago.mailmap: fix email for Phil Hord
Phil Hord [Tue, 3 Feb 2026 18:12:13 +0000 (10:12 -0800)] 
.mailmap: fix email for Phil Hord

My canonical and old emails were reversed, somehow. Also add
an entry for a new email that may sneak in.

Signed-off-by: Phil Hord <phil.hord@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agococci: extend MEMZERO_ARRAY() rules
Toon Claes [Tue, 3 Feb 2026 10:29:03 +0000 (11:29 +0100)] 
cocci: extend MEMZERO_ARRAY() rules

Recently the MEMZERO_ARRAY() macro was introduced. In that commit also
coccinelle rules were added to capture cases that can be converted to
use that macro.

Later a few more cases were manually converted to use the macro, but
coccinelle didn't capture those. Extend the rules to capture those as
well.

In various cases the code could be further beautified by removing
parentheses which are no longer needed. Modify the coccinelle rules to
optimize those as well and fix them.

During conversion indentation also used spaces where tabs should be
used, fix that in one go.

Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agosubtree: validate --prefix against commit in split
Pushkar Singh [Tue, 3 Feb 2026 16:48:16 +0000 (16:48 +0000)] 
subtree: validate --prefix against commit in split

git subtree split currently validates --prefix against the working tree.
This breaks when splitting an older commit or when the working tree does
not contain the subtree, even though the commit does.

For example:

  git subtree split --prefix=pkg <commit>

fails if pkg was removed later, even though it exists in <commit>.

Fix this by validating the prefix against the specified commit using
git cat-file instead of the working tree.

Add a test to ensure this behavior does not regress.

Signed-off-by: Pushkar Singh <pushkarkumarsingh1970@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: shortlog: put back trailer paragraphs
Kristoffer Haugsbakk [Tue, 3 Feb 2026 09:48:52 +0000 (10:48 +0100)] 
doc: shortlog: put back trailer paragraphs

47beb37b (shortlog: match commit trailers with --group, 2020-09-27)
added the `trailer` bullet point with three paragraphs.[1] Later,
3dc95e09 (shortlog: support arbitrary commit format `--group`s,
2022-10-24) put the single-paragraph bullet point about `format` right
after the first paragraph about `trailer`. That meant that the second
and third paragraphs for `trailer` got moved to `format`.

Move the two paragraphs back to `trailer`. We now also need one blank
line before the final bullet point so that it does not get joined with
the second bullet point.

† 1: Technically the bullet list formatting was immediately fixed to
     include all three paragraphs in 63d24fa0 (shortlog: allow multiple
     groups to be specified, 2020-09-27)

Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoodb: transparently handle common transaction behavior
Justin Tobler [Tue, 3 Feb 2026 00:10:02 +0000 (18:10 -0600)] 
odb: transparently handle common transaction behavior

A new ODB transaction is created and returned via
`odb_transaction_begin()` and stored in the ODB. Only a single
transaction may be pending at a time. If the ODB already has a
transaction, the function is expected to return NULL. Similarly, when
committing a transaction via `odb_transaction_commit()` the transaction
being committed must match the pending transaction and upon commit reset
the ODB transaction to NULL.

These behaviors apply regardless of the ODB transaction implementation.
Move the corresponding logic into `odb_transaction_{begin,commit}()`
accordingly.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoodb: prepare `struct odb_transaction` to become generic
Justin Tobler [Tue, 3 Feb 2026 00:10:01 +0000 (18:10 -0600)] 
odb: prepare `struct odb_transaction` to become generic

An ODB transaction handles how objects are stored temporarily and
eventually committed. Due to object storage being implemented
differently for a given ODB source, the ODB transactions must be
implemented in a manner specific to the source the objects are being
written to. To provide generic transactions, `struct odb_transaction` is
updated to store a commit callback that can be configured to support a
specific ODB source. For now `struct odb_transaction_files` is the
only transaction type and what is always returned when starting a
transaction.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoobject-file: rename transaction functions
Justin Tobler [Tue, 3 Feb 2026 00:10:00 +0000 (18:10 -0600)] 
object-file: rename transaction functions

In a subsequent commit, ODB transactions are made more generic to
facilitate each ODB source providing its own transaction handling.
Rename `object_file_transaction_{begin,commit}()` to
`odb_transaction_files_{begin,commit}()` to better match the future
source specific transaction implementation.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoodb: store ODB source in `struct odb_transaction`
Justin Tobler [Tue, 3 Feb 2026 00:09:59 +0000 (18:09 -0600)] 
odb: store ODB source in `struct odb_transaction`

Each `struct odb_transaction` currently stores a reference to the
`struct object_database`. Since transactions are handled per object
source, instead store a reference to the source.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoblame: fix coloring for repeated suspects
René Scharfe [Sun, 1 Feb 2026 11:47:53 +0000 (12:47 +0100)] 
blame: fix coloring for repeated suspects

The option --ignore-rev passes the blame to an older commit.  This can
cause adjacent scoreboard entries to blame the same commit.  Currently
we only look at the present entry when determining whether a line needs
to be colored for --color-lines.  Check the previous entry as well.

Reported-by: Seth McDonald <sethmcmail@pm.me>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agot9160:modernize test path checking
HodaSalim [Mon, 2 Feb 2026 16:18:00 +0000 (18:18 +0200)] 
t9160:modernize test path checking

Replace old-style path checks with Git's dedicated test helpers:
- test -f → test_path_is_file
- test -d → test_path_is_dir
- test -s → test_file_not_empty

Fix typos with the word "subsequent"

Found using: git grep "test -[efd]" t/

This improves test readability and provides better error messages
when path checks fail.

Signed-off-by: HodaSalim <hoda.s.salim@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months ago.github/CONTRIBUTING.md: link to SubmittingPatches on git-scm.com
Abdalrhman Mohamed [Sun, 1 Feb 2026 00:26:43 +0000 (02:26 +0200)] 
.github/CONTRIBUTING.md: link to SubmittingPatches on git-scm.com

The relative link to SubmittingPatches is broken when viewed through
GitHub's specialized "Contributing" tab. Update the link to point to
the documentation on git-scm.com to be consistent with other links in
the same file. Also, wrap the line to improve readability.

Signed-off-by: Abdalrhman Mohamed <Eng.Abdalrhman.Abdalmonem@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoGit 2.53 maint v2.53.0
Junio C Hamano [Mon, 2 Feb 2026 02:15:01 +0000 (18:15 -0800)] 
Git 2.53

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po
Junio C Hamano [Mon, 2 Feb 2026 02:13:52 +0000 (18:13 -0800)] 
Merge tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po

l10n-2.53.0-v1

* tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po:
  l10n: zh_CN: standardize glossary terms
  l10n: zh_CN: updated translation for 2.53
  l10n: zh_CN: fix inconsistent use of standard vs. wide colons
  l10n: fr: v2.53
  l10n: zh_TW.po: update Git 2.53 translation
  l10n: tr: Update Turkish translations
  l10n: sv.po: Update Swedish translation
  l10n: po-id for 2.53
  l10n: ga.po: Fix git-po-helper warnings
  l10n: bg.po: Updated Bulgarian translation (6091t)
  l10n: ga.po: Update Irish translation for Git 2.53

2 months agoRelNotes: fully spell negation
Carlo Marcelo Arenas Belón [Sat, 31 Jan 2026 23:08:48 +0000 (15:08 -0800)] 
RelNotes: fully spell negation

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'jx/zh_CN' of github.com:jiangxin/git
Jiang Xin [Sat, 31 Jan 2026 13:32:54 +0000 (21:32 +0800)] 
Merge branch 'jx/zh_CN' of github.com:jiangxin/git

* 'jx/zh_CN' of github.com:jiangxin/git:
  l10n: zh_CN: standardize glossary terms
  l10n: zh_CN: updated translation for 2.53
  l10n: zh_CN: fix inconsistent use of standard vs. wide colons

2 months agoMerge branch 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po
Jiang Xin [Sat, 31 Jan 2026 13:20:06 +0000 (21:20 +0800)] 
Merge branch 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po

* 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po:
  l10n: zh_TW.po: update Git 2.53 translation

2 months agoMerge branch 'po-id' of github.com:bagasme/git-po
Jiang Xin [Sat, 31 Jan 2026 13:15:38 +0000 (21:15 +0800)] 
Merge branch 'po-id' of github.com:bagasme/git-po

* 'po-id' of github.com:bagasme/git-po:
  l10n: po-id for 2.53

2 months agoMerge branch 'l10n-ga-2.53' of github.com:aindriu80/git-po
Jiang Xin [Sat, 31 Jan 2026 13:13:55 +0000 (21:13 +0800)] 
Merge branch 'l10n-ga-2.53' of github.com:aindriu80/git-po

* 'l10n-ga-2.53' of github.com:aindriu80/git-po:
  l10n: ga.po: Fix git-po-helper warnings
  l10n: ga.po: Update Irish translation for Git 2.53

2 months agoMerge branch 'master' of github.com:alshopov/git-po
Jiang Xin [Sat, 31 Jan 2026 13:11:50 +0000 (21:11 +0800)] 
Merge branch 'master' of github.com:alshopov/git-po

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

2 months agoMerge branch 'fr_2.53' of github.com:jnavila/git
Jiang Xin [Sat, 31 Jan 2026 13:08:43 +0000 (21:08 +0800)] 
Merge branch 'fr_2.53' of github.com:jnavila/git

* 'fr_2.53' of github.com:jnavila/git:
  l10n: fr: v2.53

2 months agoMerge branch 'tr-l10n' of github.com:bitigchi/git-po
Jiang Xin [Sat, 31 Jan 2026 13:06:38 +0000 (21:06 +0800)] 
Merge branch 'tr-l10n' of github.com:bitigchi/git-po

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

2 months agoMerge branch 'master' of github.com:nafmo/git-l10n-sv
Jiang Xin [Sat, 31 Jan 2026 13:03:10 +0000 (21:03 +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

2 months agol10n: zh_CN: standardize glossary terms
Jiang Xin [Fri, 30 Jan 2026 02:38:47 +0000 (10:38 +0800)] 
l10n: zh_CN: standardize glossary terms

Add preferred Chinese terminology notes and align existing translations
to the updated glossary. AI-assisted review was used to check and
improve legacy translations.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
2 months agoRelNotes: correct "fast-import" option name
Junio C Hamano [Fri, 30 Jan 2026 17:50:03 +0000 (09:50 -0800)] 
RelNotes: correct "fast-import" option name

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agot/perf/p3400: speed up setup using fast-import
Tian Yuchen [Fri, 30 Jan 2026 17:01:23 +0000 (01:01 +0800)] 
t/perf/p3400: speed up setup using fast-import

The setup phase in 't/perf/p3400-rebase.sh' generates 100 commits to
simulate a noisy history. It currently uses a shell loop that invokes
'git add', 'git commit', 'test_seq', and 'sort' in each iteration.
This incurs significant overhead due to repeated process spawning.

Optimize the setup by using 'git fast-import' to generate the commit
history. Additionally, pre-compute the forward and reversed file contents
to avoid repetitive execution of 'seq' and 'sort'.

To ensure the test measures rebase performance against a consistent
object layout (rather than the suboptimal pack/loose objects created
by the raw import), perform a full repack (`git repack -a -d`) at the
end of the setup.

This reduces the setup time significantly while maintaining the validity
of the subsequent performance tests.

Performance enhancement (Average value of 5 tests):
            Real        Rebase
  Before:  29.045s      13.34s
   After:  21.989s      12.84s

Measured on Lenovo Yoga 2020, Ubuntu 24.04.

Signed-off-by: Tian Yuchen <a3205153416@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoshow-index: use gettext wrapping in user facing error messages
Shreyansh Paliwal [Fri, 30 Jan 2026 15:31:24 +0000 (21:01 +0530)] 
show-index: use gettext wrapping in user facing error messages

Multiple 'die()' calls in show-index.c use literal strings directly.

Wrap all user-facing 'die()' messages with '_()' so they can be translated
via gettext, this ensures better support for users.

Signed-off-by: Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoshow-index: warn when falling back to SHA-1 outside a repository
Shreyansh Paliwal [Fri, 30 Jan 2026 15:31:23 +0000 (21:01 +0530)] 
show-index: warn when falling back to SHA-1 outside a repository

When 'git show-index' is run outside of a repository and no hashing
algorithm is specified via --object-format, it silently falls back
to SHA-1, relying on the historical default.

This works for existing SHA-1 based index files, but the behavior can
be ambiguous and confusing when the input index file uses a different
hash algorithm, such as SHA-256.

Add a warning when this fallback happens to make the assumption
explicit and to guide users toward using --object-format when needed.

Signed-off-by: Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agolast-modified: verify revision argument is a commit-ish
Toon Claes [Fri, 30 Jan 2026 14:26:38 +0000 (15:26 +0100)] 
last-modified: verify revision argument is a commit-ish

Passing a non-committish revision to git-last-modified(1) triggers the
following BUG:

    git last-modified HEAD^{tree}
    BUG: builtin/last-modified.c:456: paths remaining beyond boundary in last-modified

Fix this error by ensuring that the given revision peels to a commit.

This change also adds a test to verify git-last-modified(1) can operate
on an annotated tag. For this an annotated tag is added that points to
the second commit. But this causes ambiguous results when calling
git-name-rev(1) with `--tags`, because now two tags point to the same
commit. To remove this ambiguity, pass `--exclude=<tag>` to
git-name-rev(1) to exclude the new annotated tag.

Reported-by: Gusted <gusted@codeberg.org>
Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agolast-modified: remove double error message
Toon Claes [Fri, 30 Jan 2026 14:26:37 +0000 (15:26 +0100)] 
last-modified: remove double error message

When the user passes two revisions, they get the following output:

    $ git last-modified HEAD HEAD~
    error: last-modified can only operate on one revision at a time
    error: unable to setup last-modified

The error message about "unable to setup" is not very informative,
remove it.

Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agolast-modified: fix memory leak when more than one commit is given
Toon Claes [Fri, 30 Jan 2026 14:26:36 +0000 (15:26 +0100)] 
last-modified: fix memory leak when more than one commit is given

When more than one commit is given, the function
populate_paths_from_revs() leaks a `struct pathspec`. Plug it.

Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agolast-modified: rewrite error message when more than one commit given
Toon Claes [Fri, 30 Jan 2026 14:26:35 +0000 (15:26 +0100)] 
last-modified: rewrite error message when more than one commit given

When more than one commit is passed to the git-last-modified(1) command,
this error message was printed:

    error: last-modified can only operate on one tree at a time

Calling these a "tree" is technically not correct. git-last-modified(1)
expects revisions that peel to a commit.

Rephrase the error message to:

    error: last-modified can only operate on one commit at a time

While at it, modify the test to ensure the correct error message is
printed.

Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agogit-gui: shift tabstops to account for the first column of patch text
Chris Idema [Thu, 29 Jan 2026 11:09:04 +0000 (11:09 +0000)] 
git-gui: shift tabstops to account for the first column of patch text

When reviewing a change before staging, it is desirable to see text after
tabstops aligned the same way as in the text editor. However, since there
is always an additional character in column one in patch text ('+', '-',
or space), the alignment is broken if text before the first tab character
is just long enough to push the stop to the next tab position.

Commit a43c5f51a4b1 (git-gui: add configurable tab size to the diff view,
2012-02-12) added infrastructure that manipulates the tabstop positions
of the Tk text widget. However, it does so only when a 3-way diff is
shown and only so that it takes into account the one additional markup at
the beginning of lines. This only achieved that alignment does not get
worse for 3-way diffs compared to regular patch text, but left misaligned
text in regular patch text unmodified.

Use and modify this infrastructure to shift tabstops by one position for
regular patch text and two positions for 3-way diffs. Existing code
already resets the tabstops to an unshifted position when contents of
untracked files are displayed.

Signed-off-by: Chris Idema <github_chris_idema@proton.me>
[j6t: extend commit message]
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2 months agostring-list: add string_list_sort_u() that mimics "sort -u"
Amisha Chhajed [Thu, 29 Jan 2026 12:12:20 +0000 (17:42 +0530)] 
string-list: add string_list_sort_u() that mimics "sort -u"

Many callsites of string_list_remove_duplicates() call it
immdediately after calling string_list_sort(), understandably
as the former requires string-list to be sorted, it is clear
that these places are sorting only to remove duplicates and
for no other reason.

Introduce a helper function string_list_sort_u that combines
these two calls that often appear together, to simplify
these callsites. Replace the current calls of those methods with
string_list_sort_u().

Signed-off-by: Amisha Chhajed <amishhhaaaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agou-string-list: add unit tests for string-list methods
Amisha Chhajed [Thu, 29 Jan 2026 12:12:19 +0000 (17:42 +0530)] 
u-string-list: add unit tests for string-list methods

Unit tests in u-string-list.c does not cover several methods
in string-list, this gap in coverage makes it difficult to
ensure no regressions are introduced in future changes.

Add unit tests for the following methods to enhance coverage:
string_list_remove_empty_items()
unsorted_string_list_has_string()
unsorted_string_list_delete_item()
string_list_has_string()
string_list_insert()
string_list_sort()
string_list_remove()

Signed-off-by: Amisha Chhajed <amishhhaaaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agol10n: zh_CN: updated translation for 2.53
Jiang Xin [Thu, 29 Jan 2026 12:30:39 +0000 (20:30 +0800)] 
l10n: zh_CN: updated translation for 2.53

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
2 months agol10n: zh_CN: fix inconsistent use of standard vs. wide colons
Jiang Xin [Thu, 29 Jan 2026 13:41:39 +0000 (21:41 +0800)] 
l10n: zh_CN: fix inconsistent use of standard vs. wide colons

Replace mixed usage of standard (ASCII) colons ':' with full-width
(wide) colons ':' in Chinese translations to ensure typographic
consistency, as reported by CAESIUS-TIM [1].

Full-width punctuation is preferred in Chinese localization for better
readability and adherence to typesetting conventions.

[1]: https://github.com/git-l10n/git-po/issues/884

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
2 months agoreceive-pack: convert receive hooks to hook API
Emily Shaffer [Wed, 28 Jan 2026 21:39:27 +0000 (23:39 +0200)] 
receive-pack: convert receive hooks to hook API

This converts the last remaining hooks to the new hook API, for
the same benefits as the previous conversions (no need to toggle
signals, manage custom struct child_process, call find_hook(),
prepares for specifying hooks via configs, etc.).

See the previous three commits for a more in-depth explanation of
how this all works.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoreceive-pack: convert update hooks to new API
Emily Shaffer [Wed, 28 Jan 2026 21:39:26 +0000 (23:39 +0200)] 
receive-pack: convert update hooks to new API

The hook API avoids creating a custom struct child_process and other
internal hook plumbing (e.g. calling find_hook()) and prepares for
the specification of hooks via configs or running parallel hooks.

Execution is still sequential through the run_hooks_opt .jobs == 1,
which is the unchanged default for all hooks.

When use_sideband==1, the async thread redirects the hook outputs to
sideband 2, otherwise it is not used and the hooks write directly to
the fds inherited from the main parent process.

When .jobs == 1, run-command's poll loop is avoided entirely via the
ungroup=1 option like before (this was Jeff's suggestion), achieving
the same real-time output performance.

When running in parallel, run-command with ungroup=0 will capture
and de-interleave the output of each hook, then write to the parent
stderr which is redirected via dup2 to the sideband thread, so that
each parallel hook output is presented clearly to the client.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agorun-command: poll child input in addition to output
Adrian Ratiu [Wed, 28 Jan 2026 21:39:25 +0000 (23:39 +0200)] 
run-command: poll child input in addition to output

Child input feeding might hit the 100ms output poll timeout as a
side-effect of the ungroup=0 design when feeding multiple children
in parallel and buffering their outputs.

This throttles the write throughput as reported by Kristoffer.

Peff also noted that the parent might block if the write pipe is full
and cause a deadlock if both parent + child wait for one another.

Thus we refactor the run-command I/O loop so it polls on both child
input and output fds to eliminate the risk of artificial 100ms
latencies and unnecessarily blocking the main process.

This ensures that parallel hooks are fed data ASAP while maintaining
responsiveness for (sideband) output.

It's worth noting that in our current design, sequential execution
is not affected by this because it still uses the ungroup=1 behavior,
so there are no run-command induced buffering delays since the child
sequentially outputs directly to the parent-inherited fds.

Reported-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agohook: add jobs option
Adrian Ratiu [Wed, 28 Jan 2026 21:39:24 +0000 (23:39 +0200)] 
hook: add jobs option

Allow the API callers to specify the number of jobs across which
hook execution can be parallelized. It defaults to 1 and no hook
currently changes it, so all hooks run sequentially as before.

This allows us to both pave the way for parallel hook execution
(that will be a follow-up patch series building upon this) and to
finish the API conversion of builtin/receive-pack.c, keeping the
output async sideband thread ("muxer") design as Peff suggested.

When .jobs==1 nothing changes, the "copy_to_sideband" async thread
still outputs directly via sideband channel 2, keeping the current
(mostly) real-time output characteristics, avoids unnecessary poll
delays or deadlock risks.

When .jobs > 1, a more complex muxer is needed to buffer the hook
output and avoid interleaving. After working on this mux I quickly
realized I was re-implementing run-command with ungroup=0 so that
idea was dropped in favor of run-command which outputs to stderr.

In other words, run-command itself already can buffer/deinterleave
pp child outputs (ungroup=0), so we can just connect its stderr to
the sideband async task when jobs > 1.

Maybe it helps to illustrate how it works with ascii graphics:

 [ Sequential (jobs = 1) ]             [ Parallel (jobs > 1) ]

 +--------------+                      +--------+   +--------+
 | Hook Process |                      | Hook 1 |   | Hook 2 |
 +--------------+                      +--------+   +--------+
        |                                  |             |
        | stderr (inherited)               | stderr pipe |
        |                                  | (captured)  |
        v                                  v             v
 +-------------------------------------------------------------+
 |                      Parent Process                         |
 |                                                             |
 |      (direct write)              [run-command (buffered)]   |
 |             |                                 |             |
 |             |                                 | writes      |
 |             v                                 v             |
 |      +-------------------------------------------+          |
 |      |             stderr (FD 2)                 |          |
 |      +-------------------------------------------+          |
 |                           |                                 |
 |                           | (dup2'd to pipe)                |
 |                           v                                 |
 |               +-----------------------+                     |
 |               | sideband async thread |                     |
 |               +-----------------------+                     |
 +-------------------------------------------------------------+

When use_sideband == 0, the sideband async thread is missing, so
this same architecture just outputs via the parent stderr stream.

See the following commits for the hook API conversions doing this,
using pre-existing sideband thread logic from `copy_to_sideband`.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoreference-transaction: use hook API instead of run-command
Adrian Ratiu [Wed, 28 Jan 2026 21:39:23 +0000 (23:39 +0200)] 
reference-transaction: use hook API instead of run-command

Convert the reference-transaction hook to the new hook API,
so it doesn't need to set up a struct child_process, call
find_hook or toggle the pipe signals.

The stdin feed callback is processing one ref update per
call. I haven't noticed any performance degradation due
to this, however we can batch as many we want in each call,
to ensure a good pipe throughtput (i.e. the child does not
wait after stdin).

Helped-by: Emily Shaffer <nasamuffin@google.com>
Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-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>
2 months agotransport: convert pre-push to hook API
Emily Shaffer [Wed, 28 Jan 2026 21:39:22 +0000 (23:39 +0200)] 
transport: convert pre-push to hook API

Move the pre-push hook from custom run-command invocations to
the new hook API which doesn't require a custom child_process
structure and signal toggling.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-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>
2 months agohook: allow separate std[out|err] streams
Adrian Ratiu [Wed, 28 Jan 2026 21:39:21 +0000 (23:39 +0200)] 
hook: allow separate std[out|err] streams

The hook API assumes that all hooks merge stdout to stderr.

This assumption is proven wrong by pre-push: some of its users
actually expect separate stdout and stderr streams and merging
them will cause a regression.

Therefore this adds a mechanism to allow pre-push to separate
the streams, which will be used in the next commit.

The mechanism is generic via struct run_hooks_opt just in case
there are any more surprise exceptions like this.

Reported-by: Chris Darroch <chrisd@apache.org>
Suggested-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agohook: convert 'post-rewrite' hook in sequencer.c to hook API
Emily Shaffer [Wed, 28 Jan 2026 21:39:20 +0000 (23:39 +0200)] 
hook: convert 'post-rewrite' hook in sequencer.c to hook API

Replace the custom run-command calls used by post-rewrite with
the newer and simpler hook_run_opt(), which does not need to
create a custom 'struct child_process' or call find_hook().

Another benefit of using the hook API is that hook_run_opt()
handles the SIGPIPE toggle logic.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-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>
2 months agohook: provide stdin via callback
Emily Shaffer [Wed, 28 Jan 2026 21:39:19 +0000 (23:39 +0200)] 
hook: provide stdin via callback

This adds a callback mechanism for feeding stdin to hooks alongside
the existing path_to_stdin (which slurps a file's content to stdin).

The advantage of this new callback is that it can feed stdin without
going through the FS layer. This helps when feeding large amount of
data and uses the run-command parallel stdin callback introduced in
the preceding commit.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-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>
2 months agorun-command: add stdin callback for parallelization
Emily Shaffer [Wed, 28 Jan 2026 21:39:18 +0000 (23:39 +0200)] 
run-command: add stdin callback for parallelization

If a user of the run_processes_parallel() API wants to pipe a large
amount of information to the stdin of each parallel command, that
data could exceed the pipe buffer of the process's stdin and can be
too big to store in-memory via strbuf & friends or to slurp to a file.

Generally this is solved by repeatedly writing to child_process.in
between calls to start_command() and finish_command(). For a specific
pre-existing example of this, see transport.c:run_pre_push_hook().

This adds a generic callback API to run_processes_parallel() to do
exactly that in a unified manner, similar to the existing callback APIs,
which can then be used by hooks.h to convert the remaining hooks to the
new, simpler parallel interface.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-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>
2 months agorun-command: add helper for pp child states
Adrian Ratiu [Wed, 28 Jan 2026 21:39:17 +0000 (23:39 +0200)] 
run-command: add helper for pp child states

There is a recurring pattern of testing parallel process child states
and file descriptors to determine if a child is running, receiving any
input or if it's ready for cleanup.

Name the pp_child structure and introduce a helper to make the checks
more readable.

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>
2 months agot1800: add hook output stream tests
Adrian Ratiu [Wed, 28 Jan 2026 21:39:16 +0000 (23:39 +0200)] 
t1800: add hook output stream tests

Lack of test coverage in this area led to some regressions while
converting the remaining hooks to the newer hook.[ch] API.

Add some tests to verify hooks write to the expected output streams.

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>
2 months agoworktree: clarify that --expire only affects missing worktrees
Sam Bostock [Wed, 28 Jan 2026 05:39:45 +0000 (05:39 +0000)] 
worktree: clarify that --expire only affects missing worktrees

The --expire option for "git worktree list" and "git worktree prune"
only affects worktrees whose working directory path no longer exists.
The help text did not make this clear, and the documentation
inconsistently used "unused" for prune but "missing" for list.

Update the help text and documentation to consistently describe these
as "missing worktrees", and use "prune" instead of "expire" when
describing the effect on missing worktrees since the terminology is
clearer.

While at it, expand the description of the "prune" subcommand itself
to better explain what it does and when to use it, as suggested by
Junio.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Sam Bostock <sam@sambostock.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agol10n: fr: v2.53
Jean-Noël Avila [Fri, 16 Jan 2026 20:14:23 +0000 (21:14 +0100)] 
l10n: fr: v2.53

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
2 months agol10n: zh_TW.po: update Git 2.53 translation
Yi-Jyun Pan [Wed, 28 Jan 2026 14:45:10 +0000 (22:45 +0800)] 
l10n: zh_TW.po: update Git 2.53 translation

Co-authored-by: Lumynous <lumynou5.tw@gmail.com>
Signed-off-by: Yi-Jyun Pan <pan93412@gmail.com>