<feed xmlns='http://www.w3.org/2005/Atom'>
<title>git/t, branch seen</title>
<subtitle>Mirror of https://git.kernel.org/pub/scm/git/git.git/
</subtitle>
<id>https://git.shady.money/git/atom?h=seen</id>
<link rel='self' href='https://git.shady.money/git/atom?h=seen'/>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/'/>
<updated>2026-04-18T00:58:46Z</updated>
<entry>
<title>Merge branch 'en/diffstat-utf8-truncation-fix' into seen</title>
<updated>2026-04-18T00:58:46Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-18T00:58:45Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=b7e4cbb83467914adc5505d5de5a99b320c7bd46'/>
<id>urn:sha1:b7e4cbb83467914adc5505d5de5a99b320c7bd46</id>
<content type='text'>
The computation to shorten the filenames shown in diffstat measured
width of individual UTF-8 characters to add up, but forgot to take
into account error cases (e.g., an invalid UTF-8 sequence, or a
control character).

* en/diffstat-utf8-truncation-fix:
  diff: fix out-of-bounds reads and NULL deref in diffstat UTF-8 truncation
</content>
</entry>
<entry>
<title>Merge branch 'en/batch-prefetch' into seen</title>
<updated>2026-04-18T00:58:45Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-18T00:58:45Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=8dfa4d6d2a28d783555f6ebbc90fd3c2ba2edc3e'/>
<id>urn:sha1:8dfa4d6d2a28d783555f6ebbc90fd3c2ba2edc3e</id>
<content type='text'>
In a lazy clone, "git cherry" and "git grep" often fetch necessary
blob objects one by one from promisor remotes.  It has been corrected
to collect necessary object names and fetch them in bulk to gain
reasonable performance.

* en/batch-prefetch:
  grep: prefetch necessary blobs
  builtin/log: prefetch necessary blobs for `git cherry`
  patch-ids.h: add missing trailing parenthesis in documentation comment
</content>
</entry>
<entry>
<title>grep: prefetch necessary blobs</title>
<updated>2026-04-18T00:40:16Z</updated>
<author>
<name>Elijah Newren</name>
<email>newren@gmail.com</email>
</author>
<published>2026-04-18T00:32:27Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=e775693160b65bee01ef56c2f240bfe7a0499d5a'/>
<id>urn:sha1:e775693160b65bee01ef56c2f240bfe7a0499d5a</id>
<content type='text'>
In partial clones, `git grep` fetches necessary blobs on-demand one
at a time, which can be very slow.  In partial clones, add an extra
preliminary walk over the tree similar to grep_tree() which collects
the blobs of interest, and then prefetches them.

Signed-off-by: Elijah Newren &lt;newren@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>builtin/log: prefetch necessary blobs for `git cherry`</title>
<updated>2026-04-18T00:40:16Z</updated>
<author>
<name>Elijah Newren</name>
<email>newren@gmail.com</email>
</author>
<published>2026-04-18T00:32:26Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=578f5d57c12a8c40973408eb603df796523e3a56'/>
<id>urn:sha1:578f5d57c12a8c40973408eb603df796523e3a56</id>
<content type='text'>
In partial clones, `git cherry` fetches necessary blobs on-demand one
at a time, which can be very slow.  We would like to prefetch all
necessary blobs upfront.  To do so, we need to be able to first figure
out which blobs are needed.

`git cherry` does its work in a two-phase approach: first computing
header-only IDs (based on file paths and modes), then falling back to
full content-based IDs only when header-only IDs collide -- or, more
accurately, whenever the oidhash() of the header-only object_ids
collide.

patch-ids.c handles this by creating an ids-&gt;patches hashmap that has
all the data we need, but the problem is that any attempt to query the
hashmap will invoke the patch_id_neq() function on any colliding objects,
which causes the on-demand fetching.

Insert a new prefetch_cherry_blobs() function before checking for
collisions.  Use a temporary replacement on the ids-&gt;patches.cmpfn
in order to enumerate the blobs that would be needed without yet
fetching them, and then fetch them all at once, then restore the old
ids-&gt;patches.cmpfn.

Signed-off-by: Elijah Newren &lt;newren@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>diff: fix out-of-bounds reads and NULL deref in diffstat UTF-8 truncation</title>
<updated>2026-04-18T00:38:31Z</updated>
<author>
<name>Elijah Newren</name>
<email>newren@gmail.com</email>
</author>
<published>2026-04-17T22:45:10Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=41f1ee06d5d6163ae2dcbca1fbd97ef39d8a76bc'/>
<id>urn:sha1:41f1ee06d5d6163ae2dcbca1fbd97ef39d8a76bc</id>
<content type='text'>
f85b49f3d4a (diff: improve scaling of filenames in diffstat to handle
UTF-8 chars, 2026-01-16) introduced a loop in show_stats() that calls
utf8_width() repeatedly to skip leading characters until the displayed
width fits.  However, utf8_width() can return problematic values:

  - For invalid UTF-8 sequences, pick_one_utf8_char() sets the name
    pointer to NULL and utf8_width() returns 0.  Since name_len does
    not change, the loop iterates once more and pick_one_utf8_char()
    dereferences the NULL pointer, crashing.

  - For control characters, utf8_width() returns -1, so name_len
    grows when it is expected to shrink.  This can cause the loop to
    consume more characters than the string contains, reading past
    the trailing NUL.

By default, fill_print_name() will C-quotes filenames which escapes
control characters and invalid bytes to printable text.  That avoids
this bug from being triggered; however, with core.quotePath=false,
raw bytes can reach this code.

Add tests exercising both failure modes with core.quotePath=false and
a narrow --stat-name-width to force truncation: one with a bare 0xC0
byte (invalid UTF-8 lead byte, triggers NULL deref) and one with a
0x01 byte (control character, causes the loop to read past the end
of the string).

Fix both issues by introducing utf8_ish_width(), a thin wrapper
around utf8_width() that guarantees the pointer always advances and
the returned width is never negative:

  - On invalid UTF-8 it restores the pointer, advances by one byte,
    and returns width 1 (matching the strlen()-based fallback used
    by utf8_strwidth()).
  - On a control character it returns 0 (matching utf8_strnwidth()
    which skips them).

Also add a "&amp;&amp; *name" guard to the while-loop condition so it
terminates at end-of-string even when utf8_strwidth()'s strlen()
fallback causes name_len to exceed the sum of per-character widths.

Signed-off-by: Elijah Newren &lt;newren@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'mc/http-emptyauth-negotiate-fix' into seen</title>
<updated>2026-04-17T21:26:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-17T21:26:38Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=7120fe339909193f410dc7cb30b0fafaeee0f64c'/>
<id>urn:sha1:7120fe339909193f410dc7cb30b0fafaeee0f64c</id>
<content type='text'>
The 'http.emptyAuth=auto' configuration now correctly attempts
Negotiate authentication before falling back to manual credentials.
This allows seamless Kerberos ticket-based authentication without
requiring users to explicitly set 'http.emptyAuth=true'.

* mc/http-emptyauth-negotiate-fix:
  t5563: add tests for http.emptyAuth with Negotiate
  http: attempt Negotiate auth in http.emptyAuth=auto mode
  http: extract http_reauth_prepare() from retry paths
</content>
</entry>
<entry>
<title>Merge branch 'en/backfill-fixes-and-edges' into seen</title>
<updated>2026-04-17T21:26:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-17T21:26:38Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=c9a7494880d68d218ae23a67b8fd1d0cafd980ad'/>
<id>urn:sha1:c9a7494880d68d218ae23a67b8fd1d0cafd980ad</id>
<content type='text'>
The 'git backfill' command now rejects revision-limiting options that
are incompatible with its operation, uses standard documentation for
revision ranges, and includes blobs from boundary commits by default
to improve performance of subsequent operations.

* en/backfill-fixes-and-edges:
  backfill: default to grabbing edge blobs too
  backfill: document acceptance of revision-range in more standard manner
  backfill: reject rev-list arguments that do not make sense
</content>
</entry>
<entry>
<title>Merge branch 'ss/t7004-unhide-git-failures' into seen</title>
<updated>2026-04-17T21:26:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-17T21:26:38Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=e6c366d0a46754abd3ea9c85df3844d2d5522dce'/>
<id>urn:sha1:e6c366d0a46754abd3ea9c85df3844d2d5522dce</id>
<content type='text'>
Test clean-up.

* ss/t7004-unhide-git-failures:
  t7004: avoid subshells to capture git exit codes
  t7004: dynamically grab expected state in tests
  t7004: drop hardcoded tag count in invalid name test
</content>
</entry>
<entry>
<title>Merge branch 'tb/pseudo-merge-bugfixes' into seen</title>
<updated>2026-04-17T21:26:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-17T21:26:38Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=dd129710c1d5a2898149b7164c5a69dc860d9667'/>
<id>urn:sha1:dd129710c1d5a2898149b7164c5a69dc860d9667</id>
<content type='text'>
* tb/pseudo-merge-bugfixes:
  pack-bitmap: prevent pattern leak on pseudo-merge re-assignment
  pack-bitmap: reject pseudo-merge "sampleRate" of 0
  pack-bitmap: parse commits in `find_pseudo_merge_group_for_ref()`
  pack-bitmap: fix pseudo-merge lookup for shared commits
  pack-bitmap: fix inverted binary search in `pseudo_merge_at()`
  pack-bitmap-write: sort pseudo-merge commit lookup table in pack order
  t5333: demonstrate various pseudo-merge bugs
  t/helper: add 'test-tool bitmap write' subcommand
</content>
</entry>
<entry>
<title>Merge branch 'sb/userdiff-lisp-family' into seen</title>
<updated>2026-04-17T21:26:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2026-04-17T21:26:37Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=c469a3dab0d04633763e3cb585d529e2ced61179'/>
<id>urn:sha1:c469a3dab0d04633763e3cb585d529e2ced61179</id>
<content type='text'>
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
</content>
</entry>
</feed>
