]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
4 years agocat-file: disable refs/replace with --batch-all-objects
Jeff King [Tue, 5 Oct 2021 20:36:07 +0000 (16:36 -0400)] 
cat-file: disable refs/replace with --batch-all-objects

When we're enumerating all objects in the object database, it doesn't
make sense to respect refs/replace. The point of this option is to
enumerate all of the objects in the database at a low level. By
definition we'd already show the replacement object's contents (under
its real oid), and showing those contents under another oid is almost
certainly working against what the user is trying to do.

Note that you could make the same argument for something like:

  git show-index <foo.idx |
  awk '{print $2}' |
  git cat-file --batch

but there we can't know in cat-file exactly what the user intended,
because we don't know the source of the input. They could be trying to
do low-level debugging, or they could be doing something more high-level
(e.g., imagine a porcelain built around cat-file for its object
accesses). So in those cases, we'll have to rely on the user specifying
"git --no-replace-objects" to tell us what to do.

One _could_ make an argument that "cat-file --batch" is sufficiently
low-level plumbing that it should not respect replace-objects at all
(and the caller should do any replacement if they want it).  But we have
been doing so for some time. The history is a little tangled:

  - looking back as far as v1.6.6, we would not respect replace refs for
    --batch-check, but would for --batch (because the former used
    sha1_object_info(), and the replace mechanism only affected actual
    object reads)

  - this discrepancy was made even weirder by 98e2092b50 (cat-file:
    teach --batch to stream blob objects, 2013-07-10), where we always
    output the header using the --batch-check code, and then printed the
    object separately. This could lead to "cat-file --batch" dying (when
    it notices the size or type changed for a non-blob object) or even
    producing bogus output (in streaming mode, we didn't notice that we
    wrote the wrong number of bytes).

  - that persisted until 1f7117ef7a (sha1_file: perform object
    replacement in sha1_object_info_extended(), 2013-12-11), which then
    respected replace refs for both forms.

So it has worked reliably this way for over 7 years, and we should make
sure it continues to do so. That could also be an argument that
--batch-all-objects should not change behavior (which this patch is
doing), but I really consider the current behavior to be an unintended
bug. It's a side effect of how the code is implemented (feeding the oids
back into oid_object_info() rather than looking at what we found while
reading the loose and packed object storage).

The implementation is straight-forward: we just disable the global
read_replace_refs flag when we're in --batch-all-objects mode. It would
perhaps be a little cleaner to change the flag we pass to
oid_object_info_extended(), but that's not enough. We also read objects
via read_object_file() and stream_blob_to_fd(). The former could switch
to its _extended() form, but the streaming code has no mechanism for
disabling replace refs. Setting the global flag works, and as a bonus,
it's impossible to have any "oops, we're sometimes replacing the object
and sometimes not" bugs in the output (like the ones caused by
98e2092b50 above).

The tests here cover the regular-input and --batch-all-objects cases,
for both --batch-check and --batch. There is a test in t6050 that covers
the regular-input case with --batch already, but this new one goes much
further in actually verifying the output (plus covering --batch-check
explicitly). This is perhaps a little overkill and the tests would be
simpler just covering --batch-check, but I wanted to make sure we're
checking that --batch output is consistent between the header and the
content. The global-flag technique used here makes that easy to get
right, but this is future-proofing us against regressions.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocat-file: mention --unordered along with --batch-all-objects
Jeff King [Tue, 5 Oct 2021 20:31:08 +0000 (16:31 -0400)] 
cat-file: mention --unordered along with --batch-all-objects

The note on ordering for --batch-all-objects was written when that was
the only possible ordering. These days we have --unordered, too, so
let's point to it.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot1006: clean up broken objects
Jeff King [Tue, 5 Oct 2021 20:30:36 +0000 (16:30 -0400)] 
t1006: clean up broken objects

A few of the tests create intentionally broken objects with broken
types. Let's clean them up after we're done with them, so that later
tests don't get confused (we hadn't noticed because this only affects
tests which use --batch-all-objects, but I'm about to add more).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: trace adding submodule ODB as alternate
Jonathan Tan [Fri, 8 Oct 2021 21:08:20 +0000 (14:08 -0700)] 
submodule: trace adding submodule ODB as alternate

Submodule ODBs are never added as alternates during the execution of the
test suite, but there may be a rare interaction that the test suite does
not have coverage of. Add a trace message when this happens, so that
users who trace their commands can notice such occurrences.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: pass repo to check_has_commit()
Jonathan Tan [Fri, 8 Oct 2021 21:08:19 +0000 (14:08 -0700)] 
submodule: pass repo to check_has_commit()

Pass the repo explicitly when calling check_has_commit() to avoid
relying on add_submodule_odb(). With this commit and the parent commit,
the last remaining tests no longer rely on add_submodule_odb(), so mark
these tests accordingly.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoobject-file: only register submodule ODB if needed
Jonathan Tan [Fri, 8 Oct 2021 21:08:18 +0000 (14:08 -0700)] 
object-file: only register submodule ODB if needed

In a35e03dee0 ("submodule: lazily add submodule ODBs as alternates",
2021-09-08), Git was taught to add all known submodule ODBs as
alternates when attempting to read an object that doesn't exist, as a
fallback for when a submodule object is read as if it were in
the_repository. However, this behavior wasn't restricted to happen only
when reading from the_repository. Fix this.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agomerge-{ort,recursive}: remove add_submodule_odb()
Jonathan Tan [Fri, 8 Oct 2021 21:08:17 +0000 (14:08 -0700)] 
merge-{ort,recursive}: remove add_submodule_odb()

After the parent commit and some of its ancestors, the only place
commits are being accessed through alternates is in the user-facing
message formatting code. Fix those, and remove the add_submodule_odb()
calls.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: peeling non-the_repository iterators is BUG
Jonathan Tan [Fri, 8 Oct 2021 21:08:16 +0000 (14:08 -0700)] 
refs: peeling non-the_repository iterators is BUG

There is currently no support for peeling the current ref of an iterator
iterating over a non-the_repository ref store, and none is needed. Thus,
for now, BUG() if that happens.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: teach arbitrary repo support to iterators
Jonathan Tan [Fri, 8 Oct 2021 21:08:15 +0000 (14:08 -0700)] 
refs: teach arbitrary repo support to iterators

Note that should_pack_ref() is called when writing refs, which is only
supported for the_repository, hence the_repository is hardcoded there.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: plumb repo into ref stores
Jonathan Tan [Fri, 8 Oct 2021 21:08:14 +0000 (14:08 -0700)] 
refs: plumb repo into ref stores

In preparation for the next 2 patches that adds (partial) support for
arbitrary repositories to ref iterators, plumb a repository into all ref
stores. There are no changes to program logic.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopretty: colorize pattern matches in commit messages
Hamza Mahfooz [Thu, 7 Oct 2021 20:31:47 +0000 (16:31 -0400)] 
pretty: colorize pattern matches in commit messages

The "git log" command limits its output to the commits that contain strings
matched by a pattern when the "--grep=<pattern>" option is used, but unlike
output from "git grep -e <pattern>", the matches are not highlighted,
making them harder to spot.

Teach the pretty-printer code to highlight matches from the
"--grep=<pattern>", "--author=<pattern>" and "--committer=<pattern>"
options (to view the last one, you may have to ask for --pretty=fuller).

Also, it must be noted that we are effectively greping the content twice
(because it would be a hassle to rework the existing matching code to do
a /g match and then pass it all down to the coloring code), however it only
slows down "git log --author=^H" on this repository by around 1-2%
(compared to v2.33.0), so it should be a small enough slow down to justify
the addition of the feature.

Signed-off-by: Hamza Mahfooz <someguy@effective-light.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options: change OPT_{SHORT,UNSET} to an enum
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:46 +0000 (21:07 +0200)] 
parse-options: change OPT_{SHORT,UNSET} to an enum

Change the comparisons against OPT_SHORT and OPT_UNSET to an enum
which keeps track of how a given option got parsed. The case of "0"
was an implicit OPT_LONG, so let's add an explicit label for it.

Due to the xor in 0f1930c5875 (parse-options: allow positivation of
options starting, with no-, 2012-02-25) the code already relied on
this being set back to 0. To avoid refactoring the logic involved in
that let's just start the enum at "0" instead of the usual "1<<0" (1),
but BUG() out if we don't have one of our expected flags.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options tests: test optname() output
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:45 +0000 (21:07 +0200)] 
parse-options tests: test optname() output

There were no tests for checking the specific output that we'll
generate in optname(), let's add some. That output was added back in
4a59fd13122 (Add a simple option parser., 2007-10-15).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.[ch]: make opt{bug,name}() "static"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:44 +0000 (21:07 +0200)] 
parse-options.[ch]: make opt{bug,name}() "static"

Change these two functions to "static", the last user of "optname()"
outside of parse-options.c itself went away in the preceding commit,
for the reasons noted in 9440b831ad5 (parse-options: replace
opterror() with optname(), 2018-11-10) we shouldn't be adding any more
users of it.

The "optbug()" function was never used outside of parse-options.c, but
was made non-static in 1f275b7c4ca (parse-options: export opterr,
optbug, 2011-08-11). I think the only external user of optname() was
the commit-graph.c caller added in 09e0327f57 (builtin/commit-graph.c:
introduce '--max-new-filters=<n>', 2020-09-18).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit-graph: stop using optname()
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:43 +0000 (21:07 +0200)] 
commit-graph: stop using optname()

Stop using optname() in builtin/commit-graph.c to emit an error with
the --max-new-filters option. This changes code added in 809e0327f57
(builtin/commit-graph.c: introduce '--max-new-filters=<n>',
2020-09-18).

See 9440b831ad5 (parse-options: replace opterror() with optname(),
2018-11-10) for why using optname() like this is considered bad,
i.e. it's assembling human-readable output piecemeal, and the "option
`X'" at the start can't be translated.

It didn't matter in this case, but this code was also buggy in its use
of "opt->flags" to optname(), that function expects flags, but not
*those* flags.

Let's pass "max-new-filters" to the new error because the option name
isn't translatable, and because we can re-use a translation added in
f7e68a08780 (parse-options: check empty value in OPT_INTEGER and
OPT_ABBREV, 2019-05-29).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.c: move optname() earlier in the file
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:42 +0000 (21:07 +0200)] 
parse-options.c: move optname() earlier in the file

In preparation for making "optname" a static function move it above
its first user in parse-options.c.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.h: make the "flags" in "struct option" an enum
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:41 +0000 (21:07 +0200)] 
parse-options.h: make the "flags" in "struct option" an enum

Change the "flags" members of "struct option" to refer to their
corresponding "enum" defined earlier in the file.

The benefit of changing this to an enum isn't as great as with some
"enum parse_opt_type" as we'll always check this as a bitfield, so we
can't rely on the compiler checking "case" arms for us. But let's do
it for consistency with the rest of the file.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.c: use exhaustive "case" arms for "enum parse_opt_result"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:40 +0000 (21:07 +0200)] 
parse-options.c: use exhaustive "case" arms for "enum parse_opt_result"

Change the "default" case in parse_options() that handles the return
value of parse_options_step() to simply have a "case" arm for
PARSE_OPT_UNKNOWN, instead of leaving it to a comment. This means the
compiler can warn us about any missing case arms.

This adjusts code added in ff43ec3e2d2 (parse-opt: create
parse_options_step., 2008-06-23), given its age it may pre-date the
existence (or widespread use) of this coding style, which we've since
adopted more widely.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.[ch]: consistently use "enum parse_opt_result"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:39 +0000 (21:07 +0200)] 
parse-options.[ch]: consistently use "enum parse_opt_result"

Use the "enum parse_opt_result" instead of an "int flags" as the
return value of the applicable functions in parse-options.c.

This will help catch future bugs, such as the missing "case" arms in
the two existing users of the API in "blame.c" and "shortlog.c". A
third caller in 309be813c9b (update-index: migrate to parse-options
API, 2010-12-01) was already checking for these.

As can be seen when trying to sort through the deluge of warnings
produced when compiling this with CC=g++ (mostly unrelated to this
change) we're not consistently using "enum parse_opt_result" even now,
i.e. we'll return error() and "return 0;". See f41179f16ba
(parse-options: avoid magic return codes, 2019-01-27) for a commit
which started changing some of that.

I'm not doing any more of that exhaustive migration here, and it's
probably not worthwhile past the point of being able to check "enum
parse_opt_result" in switch().

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.[ch]: consistently use "enum parse_opt_flags"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:38 +0000 (21:07 +0200)] 
parse-options.[ch]: consistently use "enum parse_opt_flags"

Use the "enum parse_opt_flags" instead of an "int flags" as arguments
to the various functions in parse-options.c.

Even though this is an enum bitfield there's there's a benefit to
doing this when it comes to the wider C ecosystem. E.g. the GNU
debugger (gdb) will helpfully detect and print out meaningful enum
labels in this case. Here's the output before and after when breaking
in "parse_options()" after invoking "git stash show":

Before:

    (gdb) p flags
    $1 = 9

After:

    (gdb) p flags
    $1 = (PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN)

Of course as noted in[1] there's a limit to this smartness,
i.e. manually setting it with unrelated enum labels won't be
caught. There are some third-party extensions to do more exhaustive
checking[2], perhaps we'll be able to make use of them sooner than
later.

We've also got prior art using this pattern in the codebase. See
e.g. "enum bloom_filter_computed" added in 312cff52074 (bloom: split
'get_bloom_filter()' in two, 2020-09-16) and the "permitted" enum
added in ce910287e72 (add -p: fix checking of user input, 2020-08-17).

1. https://lore.kernel.org/git/87mtnvvj3c.fsf@evledraar.gmail.com/
2. https://github.com/sinelaw/elfs-clang-plugins/blob/master/enums_conversion/README.md

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoblame: document --color-* options
Bagas Sanjaya [Fri, 8 Oct 2021 09:16:14 +0000 (16:16 +0700)] 
blame: document --color-* options

Commit cdc2d5f11f1a (builtin/blame: dim uninteresting metadata lines,
2018-04-23) and 25d5f52901f0 (builtin/blame: highlight recently changed
lines, 2018-04-23) introduce --color-lines and --color-by-age options to
git blame, respectively. While both options are mentioned in usage help,
they aren't documented in git-blame(1). Document them.

Co-authored-by: Dr. Matthias St. Pierre <m.st.pierre@ncp-e.com>
Signed-off-by: Dr. Matthias St. Pierre <m.st.pierre@ncp-e.com>
Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouserdiff-cpp: tighten word regex
Johannes Sixt [Fri, 8 Oct 2021 19:09:55 +0000 (19:09 +0000)] 
userdiff-cpp: tighten word regex

Generally, word regex can be written such that they match tokens
liberally and need not model the actual syntax because it can be assumed
that the regex will only be applied to syntactically correct text.

The regex for cpp (C/C++) is too liberal, though. It regards these
sequences as single tokens:

   1+2
   1.5-e+2+f

and the following amalgams as one token:

   .l      as in str.length
   .f      as in str.find
   .e      as in str.erase

Tighten the regex in the following way:

- Accept + and - only in one position in the exponent. + and - are no
  longer regarded as the sign of a number and are treated by the
  catcher-all that is not visible in the driver's regex.

- Accept a leading decimal point only when it is followed by a digit.

For readability, factor hex- and binary numbers into an own term.

As a drive-by, this fixes that floating point numbers such as 12E5
(with upper-case E) were split into two tokens.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot4034: add tests showing problematic cpp tokenizations
Johannes Sixt [Fri, 8 Oct 2021 19:09:54 +0000 (19:09 +0000)] 
t4034: add tests showing problematic cpp tokenizations

The word regex is too loose and matches long streaks of characters
that should actually be separate tokens.  Add these problematic test
cases. Separate the lines with text that will remain identical in the
pre- and post-image so that the diff algorithm will not lump removals
and additions of consecutive lines together. This makes the expected
output easier to read.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot4034/cpp: actually test that operator tokens are not split
Johannes Sixt [Fri, 8 Oct 2021 19:09:53 +0000 (19:09 +0000)] 
t4034/cpp: actually test that operator tokens are not split

8d96e7288f2b (t4034: bulk verify builtin word regex sanity, 2010-12-18)
added many tests with the intent to verify that operators consisting of
more than one symbol are kept together. These are tested by probing a
transition from, e.g., a!=b to x!=y, which results in the word-diff

  [-a-]{+x+}!=[-b-]{+y+}

But that proves only that the letters and operators are separate tokens.
To prove that != is an unseparable token, we have to probe a transition
from, e.g., a=b to a!=b having a word-diff

  a[-=-]{+!=+}b

that proves that the ! is not separate from the =.

In the post-image, add to or remove from operators a character that
turns it into another valid operator.

Change the identifiers used around operators such that the diff
algorithm does not have an incentive to match, e.g., a<b in one spot
in the pre-image with a<b elsewhere in the post-image.

Adjust the expected output to match the new differences. Notice that
there are some undesirable tokenizations around e, ., and -.  This will
be addressed in a later change.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoAdd "test-tool dump-reftable" command.
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:15 +0000 (20:25 +0000)] 
Add "test-tool dump-reftable" command.

This command dumps individual tables or a stack of of tables.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add dump utility
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:14 +0000 (20:25 +0000)] 
reftable: add dump utility

provide a command-line utility for inspecting individual tables, and
inspecting a complete ref database

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: implement stack, a mutable database of reftable files.
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:13 +0000 (20:25 +0000)] 
reftable: implement stack, a mutable database of reftable files.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: implement refname validation
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:12 +0000 (20:25 +0000)] 
reftable: implement refname validation

The packed/loose format has restrictions on refnames: a and a/b cannot
coexist. This limitation does not apply to reftable per se, but must be
maintained for interoperability. This code adds validation routines to
abort transactions that are trying to add invalid names.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add merged table view
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:11 +0000 (20:25 +0000)] 
reftable: add merged table view

This adds an abstract, read-only interface to the ref database.

This primitive is used to construct the read view of the ref database
(the read view is constructed by merging several *.ref files). It also
provides the mechanism to provide a unified view of the refs in the main
repository and the per-worktree refs.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add a heap-based priority queue for reftable records
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:10 +0000 (20:25 +0000)] 
reftable: add a heap-based priority queue for reftable records

This is needed to create a merged view multiple reftables

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: reftable file level tests
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:09 +0000 (20:25 +0000)] 
reftable: reftable file level tests

With support for reading and writing files in place, we can construct files (in
memory) and attempt to read them back.

Because some sections of the format are optional (eg. indices, log entries), we
have to exercise this code using multiple sizes of input data

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: read reftable files
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:08 +0000 (20:25 +0000)] 
reftable: read reftable files

This supports reading a single reftable file.

The commit introduces an abstract iterator type, which captures the usecases
both of reading individual refs, and iterating over a segment of the ref
namespace.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: generic interface to tables
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:07 +0000 (20:25 +0000)] 
reftable: generic interface to tables

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: write reftable files
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:06 +0000 (20:25 +0000)] 
reftable: write reftable files

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: a generic binary tree implementation
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:05 +0000 (20:25 +0000)] 
reftable: a generic binary tree implementation

The reftable format includes support for an (OID => ref) map. This map can speed
up visibility and reachability checks. In particular, various operations along
the fetch/push path within Gerrit have ben sped up by using this structure.

The map is constructed with help of a binary tree. Object IDs are hashes, so
they are uniformly distributed. Hence, the tree does not attempt forced
rebalancing.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: reading/writing blocks
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:04 +0000 (20:25 +0000)] 
reftable: reading/writing blocks

The reftable format is structured as a sequence of block. Within a block,
records are prefix compressed, with an index of offsets for fully expand keys to
enable binary search within blocks.

This commit provides the logic to read and write these blocks.

Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoProvide zlib's uncompress2 from compat/zlib-compat.c
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:03 +0000 (20:25 +0000)] 
Provide zlib's uncompress2 from compat/zlib-compat.c

This will be needed for reading reflog blocks in reftable.

Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: (de)serialization for the polymorphic record type.
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:02 +0000 (20:25 +0000)] 
reftable: (de)serialization for the polymorphic record type.

The reftable format is structured as a sequence of blocks, and each block
contains a sequence of prefix-compressed key-value records. There are 4 types of
records, and they have similarities in how they must be handled. This is
achieved by introducing a polymorphic 'record' type that encapsulates ref, log,
index and object records.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add blocksource, an abstraction for random access reads
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:01 +0000 (20:25 +0000)] 
reftable: add blocksource, an abstraction for random access reads

The reftable format is usually used with files for storage. However, we abstract
away this using the blocksource data structure. This has two advantages:

* log blocks are zlib compressed, and handling them is simplified if we can
  discard byte segments from within the block layer.

* for unittests, it is useful to read and write in-memory. The blocksource
  allows us to abstract the data away from on-disk files.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: utility functions
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:00 +0000 (20:25 +0000)] 
reftable: utility functions

This commit provides basic utility classes for the reftable library.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add error related functionality
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:24:59 +0000 (20:24 +0000)] 
reftable: add error related functionality

The reftable/ directory is structured as a library, so it cannot
crash on misuse. Instead, it returns an error code.

In addition to signaling errors, the error code can be used to signal
conditions from lower levels of the library to be handled by higher
levels of the library. For example, in a transaction we might
legitimately write an empty reftable file, but in that case, we want to
shortcut the transaction.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add LICENSE
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:24:58 +0000 (20:24 +0000)] 
reftable: add LICENSE

The objective of this code is to be usable as a C library, so it can be reused
in libgit2.

This is currently using a BSD license as it is the liberal license I could find,
but this could be changed to whatever fits the stated goal above.

This code is currently imported from github.com/hanwen/reftable. Once this code
lands in git.git, the C code will be removed from github.com/hanwen/reftable,
and the git.git code will be the source of truth.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotest-mergesort: use repeatable random numbers
René Scharfe [Fri, 8 Oct 2021 04:04:42 +0000 (06:04 +0200)] 
test-mergesort: use repeatable random numbers

Use MINSTD to generate pseudo-random numbers consistently instead of
using rand(3), whose output can vary from system to system, and reset
its seed before filling in the test values.  This gives repeatable
results across versions and systems, which simplifies sharing and
comparing of results between developers.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreset: rename is_missing to !is_in_reset_tree
Victoria Dye [Thu, 7 Oct 2021 21:15:31 +0000 (21:15 +0000)] 
reset: rename is_missing to !is_in_reset_tree

Rename and invert value of `is_missing` to `is_in_reset_tree` to make the
variable more descriptive of what it represents.

Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoread-cache: let verify_path() reject trailing dir separators again
René Scharfe [Thu, 7 Oct 2021 20:31:58 +0000 (22:31 +0200)] 
read-cache: let verify_path() reject trailing dir separators again

6e773527b6 (sparse-index: convert from full to sparse, 2021-03-30) made
verify_path() accept trailing directory separators for directories,
which is necessary for sparse directory entries.  This clemency causes
"git stash" to stumble over sub-repositories, though, and there may be
more unintended side-effects.

Avoid them by restoring the old verify_path() behavior and accepting
trailing directory separators only in places that are supposed to handle
sparse directory entries.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoread-cache: add verify_path_internal()
René Scharfe [Thu, 7 Oct 2021 20:31:44 +0000 (22:31 +0200)] 
read-cache: add verify_path_internal()

Turn verify_path() into an internal function that distinguishes between
valid paths and those with trailing directory separators and rename it
to verify_path_internal().  Provide a wrapper with the old behavior
under the old name.  No functional change intended.  The new function
will be used in the next patch.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot3905: show failure to ignore sub-repo
René Scharfe [Thu, 7 Oct 2021 20:31:01 +0000 (22:31 +0200)] 
t3905: show failure to ignore sub-repo

"git stash" used to ignore sub-repositories until 6e773527b6
(sparse-index: convert from full to sparse, 2021-03-30).  Add a test
that demonstrates this regression.

Reported-by: Robert Leftwich <robert@gitpod.io>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agomerge: add missing strbuf_release()
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:37 +0000 (12:01 +0200)] 
merge: add missing strbuf_release()

We strbuf_reset() this "struct strbuf" in a loop earlier, but never
freed it. Plugs a memory leak that's been here ever since this code
got introduced in 1c7b76be7d6 (Build in merge, 2008-07-07).

This takes us from 68 failed tests in "t7600-merge.sh" to 59 under
SANITIZE=leak, and makes "t7604-merge-custom-message.sh" pass!

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agols-files: add missing string_list_clear()
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:36 +0000 (12:01 +0200)] 
ls-files: add missing string_list_clear()

Fix a memory leak that's been here ever since 72aeb18772d (clean.c,
ls-files.c: respect encapsulation of exclude_list_groups, 2013-01-16),
we dup'd the argument in option_parse_exclude(), but never freed the
string_list.

This makes almost all of t3001-ls-files-others-exclude.sh pass (it had
a lot of failures before). Let's mark it as passing with
TEST_PASSES_SANITIZE_LEAK=true, and then exclude the tests that still
failed with a !SANITIZE_LEAK prerequisite check until we fix those
leaks. We can still see the failed tests under
GIT_TEST_FAIL_PREREQS=true.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agols-files: fix a trivial dir_clear() leak
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:35 +0000 (12:01 +0200)] 
ls-files: fix a trivial dir_clear() leak

Fix an edge case that was missed when the dir_clear() call was added
in eceba532141 (dir: fix problematic API to avoid memory leaks,
2020-08-18), we need to also clean up when we're about to exit with
non-zero.

That commit says, on the topic of the dir_clear() API and UNLEAK():

    [...]two of them clearly thought about leaks since they had an
    UNLEAK(dir) directive, which to me suggests that the method to
    free the data was too unclear.

I think that 0e5bba53af7 (add UNLEAK annotation for reducing leak
false positives, 2017-09-08) which added the UNLEAK() makes it clear
that that wasn't the case, rather it was the desire to avoid the
complexity of freeing the memory at the end of the program.

This does add a bit of complexity, but I think it's worth it to just
fix these leaks when it's easy in built-ins. It allows them to serve
as canaries for underlying APIs that shouldn't be leaking, it
encourages us to make those freeing APIs nicer for all their users,
and it prevents other leaking regressions by being able to mark the
entire test as TEST_PASSES_SANITIZE_LEAK=true.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotests: fix test-oid-array leak, test in SANITIZE=leak
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:34 +0000 (12:01 +0200)] 
tests: fix test-oid-array leak, test in SANITIZE=leak

Fix a trivial memory leak present ever since 38d905bf585 (sha1-array:
add test-sha1-array and basic tests, 2014-10-01), now that that's
fixed we can test this under GIT_TEST_PASSING_SANITIZE_LEAK=true.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotests: fix a memory leak in test-oidtree.c
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:33 +0000 (12:01 +0200)] 
tests: fix a memory leak in test-oidtree.c

Fix a memory leak in t/helper/test-oidtree.c, we were not freeing the
"struct strbuf" we used for the stdin input we parsed. This leak has
been here ever since 92d8ed8ac10 (oidtree: a crit-bit tree for
odb_loose_cache, 2021-07-07).

Now that it's fixed we can declare that t0069-oidtree.sh will pass
under GIT_TEST_PASSING_SANITIZE_LEAK=true.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotests: fix a memory leak in test-parse-options.c
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:32 +0000 (12:01 +0200)] 
tests: fix a memory leak in test-parse-options.c

Fix a memory leak in t/helper/test-parse-options.c, we were not
freeing the allocated "struct string_list" or its items. Let's move
the declaration of the "list" variable into the cmd__parse_options()
and release it at the end.

In c8ba1639165 (parse-options: add OPT_STRING_LIST helper, 2011-06-09)
the "list" variable was added, and later on in
c8ba1639165 (parse-options: add OPT_STRING_LIST helper, 2011-06-09)
the "expect" was added.

The "list" variable was last touched in 2721ce21e43 (use string_list
initializer consistently, 2016-06-13), but it was still left at the
static scope, it's better to move it to the function for consistency.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotests: fix a memory leak in test-prio-queue.c
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 10:01:31 +0000 (12:01 +0200)] 
tests: fix a memory leak in test-prio-queue.c

Fix a memory leak in t/helper/test-prio-queue.c, the lack of freeing
the memory with clear_prio_queue() has been there ever since this code
was originally added in b4b594a3154 (prio-queue: priority queue of
pointers to structs, 2013-06-06).

By fixing this leak we can cleanly run t0009-prio-queue.sh under
SANITIZE=leak, so annotate it as such with
TEST_PASSES_SANITIZE_LEAK=true.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'ab/sanitize-leak-ci' into ab/mark-leak-free-tests-more
Junio C Hamano [Thu, 7 Oct 2021 22:28:38 +0000 (15:28 -0700)] 
Merge branch 'ab/sanitize-leak-ci' into ab/mark-leak-free-tests-more

* ab/sanitize-leak-ci:
  tests: add a test mode for SANITIZE=leak, run it in CI
  Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONS

4 years agoMerge branch 'ab/sanitize-leak-ci' into ab/mark-leak-free-tests
Junio C Hamano [Thu, 7 Oct 2021 22:28:38 +0000 (15:28 -0700)] 
Merge branch 'ab/sanitize-leak-ci' into ab/mark-leak-free-tests

* ab/sanitize-leak-ci:
  tests: add a test mode for SANITIZE=leak, run it in CI
  Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONS

4 years agounpack-trees: don't leak memory in verify_clean_subdirectory()
Ævar Arnfjörð Bjarmason [Thu, 7 Oct 2021 09:46:09 +0000 (11:46 +0200)] 
unpack-trees: don't leak memory in verify_clean_subdirectory()

Fix two different but related memory leaks in
verify_clean_subdirectory(). We leaked both the "pathbuf" if
read_directory() returned non-zero, and we never cleaned up our own
"struct dir_struct" either.

 * "pathbuf": When the read_directory() call followed by the
   free(pathbuf) was added in c81935348be (Fix switching to a branch
   with D/F when current branch has file D., 2007-03-15) we didn't
   bother to free() before we called die().

   But when this code was later libified in 203a2fe1170 (Allow callers
   of unpack_trees() to handle failure, 2008-02-07) we started to leak
   as we returned data to the caller. This fixes that memory leak,
   which can be observed under SANITIZE=leak with e.g. the
   "t1001-read-tree-m-2way.sh" test.

 * "struct dir_struct": We've leaked the dir_struct ever since this
   code was added back in c81935348be.

   When that commit was written there wasn't an equivalent of
   dir_clear(). Since it was added in 270be816049 (dir.c: provide
   clear_directory() for reclaiming dir_struct memory, 2013-01-06)
   we've omitted freeing the memory allocated here.

   This memory leak could also be observed under SANITIZE=leak and the
   "t1001-read-tree-m-2way.sh" test.

This makes all the test in "t1001-read-tree-m-2way.sh" pass under
"GIT_TEST_PASSING_SANITIZE_LEAK=true", we'd previously die in tests
25, 26 & 28.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'ab/sanitize-leak-ci' into ab/unpack-trees-leakfix
Junio C Hamano [Thu, 7 Oct 2021 22:28:38 +0000 (15:28 -0700)] 
Merge branch 'ab/sanitize-leak-ci' into ab/unpack-trees-leakfix

* ab/sanitize-leak-ci:
  tests: add a test mode for SANITIZE=leak, run it in CI
  Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONS

4 years agosparse index: fix use-after-free bug in cache_tree_verify()
Phillip Wood [Thu, 7 Oct 2021 18:07:21 +0000 (18:07 +0000)] 
sparse index: fix use-after-free bug in cache_tree_verify()

In a sparse index it is possible for the tree that is being verified
to be freed while it is being verified. This happens when the index is
sparse but the cache tree is not and index_name_pos() looks up a path
from the cache tree that is a descendant of a sparse index entry. That
triggers a call to ensure_full_index() which frees the cache tree that
is being verified.  Carrying on trying to verify the tree after this
results in a use-after-free bug. Instead restart the verification if a
sparse index is converted to a full index. This bug is triggered by a
call to reset_head() in "git rebase --apply". Thanks to René Scharfe
and Derrick Stolee for their help analyzing the problem.

==74345==ERROR: AddressSanitizer: heap-use-after-free on address 0x606000001b20 at pc 0x557cbe82d3a2 bp 0x7ffdfee08090 sp 0x7ffdfee08080
READ of size 4 at 0x606000001b20 thread T0
    #0 0x557cbe82d3a1 in verify_one /home/phil/src/git/cache-tree.c:863
    #1 0x557cbe82ca9d in verify_one /home/phil/src/git/cache-tree.c:840
    #2 0x557cbe82ca9d in verify_one /home/phil/src/git/cache-tree.c:840
    #3 0x557cbe82ca9d in verify_one /home/phil/src/git/cache-tree.c:840
    #4 0x557cbe830a2b in cache_tree_verify /home/phil/src/git/cache-tree.c:910
    #5 0x557cbea53741 in write_locked_index /home/phil/src/git/read-cache.c:3250
    #6 0x557cbeab7fdd in reset_head /home/phil/src/git/reset.c:87
    #7 0x557cbe72147f in cmd_rebase builtin/rebase.c:2074
    #8 0x557cbe5bd151 in run_builtin /home/phil/src/git/git.c:461
    #9 0x557cbe5bd151 in handle_builtin /home/phil/src/git/git.c:714
    #10 0x557cbe5c0503 in run_argv /home/phil/src/git/git.c:781
    #11 0x557cbe5c0503 in cmd_main /home/phil/src/git/git.c:912
    #12 0x557cbe5bad28 in main /home/phil/src/git/common-main.c:52
    #13 0x7fdd4b82eb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)
    #14 0x557cbe5bcb8d in _start (/home/phil/src/git/git+0x1b9b8d)

0x606000001b20 is located 0 bytes inside of 56-byte region [0x606000001b20,0x606000001b58)
freed by thread T0 here:
    #0 0x7fdd4bacff19 in __interceptor_free /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:127
    #1 0x557cbe82af60 in cache_tree_free /home/phil/src/git/cache-tree.c:35
    #2 0x557cbe82aee5 in cache_tree_free /home/phil/src/git/cache-tree.c:31
    #3 0x557cbe82aee5 in cache_tree_free /home/phil/src/git/cache-tree.c:31
    #4 0x557cbe82aee5 in cache_tree_free /home/phil/src/git/cache-tree.c:31
    #5 0x557cbeb2557a in ensure_full_index /home/phil/src/git/sparse-index.c:310
    #6 0x557cbea45c4a in index_name_stage_pos /home/phil/src/git/read-cache.c:588
    #7 0x557cbe82ce37 in verify_one /home/phil/src/git/cache-tree.c:850
    #8 0x557cbe82ca9d in verify_one /home/phil/src/git/cache-tree.c:840
    #9 0x557cbe82ca9d in verify_one /home/phil/src/git/cache-tree.c:840
    #10 0x557cbe82ca9d in verify_one /home/phil/src/git/cache-tree.c:840
    #11 0x557cbe830a2b in cache_tree_verify /home/phil/src/git/cache-tree.c:910
    #12 0x557cbea53741 in write_locked_index /home/phil/src/git/read-cache.c:3250
    #13 0x557cbeab7fdd in reset_head /home/phil/src/git/reset.c:87
    #14 0x557cbe72147f in cmd_rebase builtin/rebase.c:2074
    #15 0x557cbe5bd151 in run_builtin /home/phil/src/git/git.c:461
    #16 0x557cbe5bd151 in handle_builtin /home/phil/src/git/git.c:714
    #17 0x557cbe5c0503 in run_argv /home/phil/src/git/git.c:781
    #18 0x557cbe5c0503 in cmd_main /home/phil/src/git/git.c:912
    #19 0x557cbe5bad28 in main /home/phil/src/git/common-main.c:52
    #20 0x7fdd4b82eb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)

previously allocated by thread T0 here:
    #0 0x7fdd4bad0459 in __interceptor_calloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:154
    #1 0x557cbebc1807 in xcalloc /home/phil/src/git/wrapper.c:140
    #2 0x557cbe82b7d8 in cache_tree /home/phil/src/git/cache-tree.c:17
    #3 0x557cbe82b7d8 in prime_cache_tree_rec /home/phil/src/git/cache-tree.c:763
    #4 0x557cbe82b837 in prime_cache_tree_rec /home/phil/src/git/cache-tree.c:764
    #5 0x557cbe82b837 in prime_cache_tree_rec /home/phil/src/git/cache-tree.c:764
    #6 0x557cbe8304e1 in prime_cache_tree /home/phil/src/git/cache-tree.c:779
    #7 0x557cbeab7fa7 in reset_head /home/phil/src/git/reset.c:85
    #8 0x557cbe72147f in cmd_rebase builtin/rebase.c:2074
    #9 0x557cbe5bd151 in run_builtin /home/phil/src/git/git.c:461
    #10 0x557cbe5bd151 in handle_builtin /home/phil/src/git/git.c:714
    #11 0x557cbe5c0503 in run_argv /home/phil/src/git/git.c:781
    #12 0x557cbe5c0503 in cmd_main /home/phil/src/git/git.c:912
    #13 0x557cbe5bad28 in main /home/phil/src/git/common-main.c:52
    #14 0x7fdd4b82eb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotest-read-midx: fix leak of bitmap_index struct
Jeff King [Thu, 7 Oct 2021 02:24:40 +0000 (22:24 -0400)] 
test-read-midx: fix leak of bitmap_index struct

In read_midx_preferred_pack(), we open the bitmap index but never free
it. This isn't a big deal since this is just a test helper, and we exit
immediately after, but since we're trying to keep our leak-checking tidy
now, it's worth fixing.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe eleventh batch
Junio C Hamano [Wed, 6 Oct 2021 20:40:32 +0000 (13:40 -0700)] 
The eleventh batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'ab/retire-decl-of-missing-unused-funcs'
Junio C Hamano [Wed, 6 Oct 2021 20:40:14 +0000 (13:40 -0700)] 
Merge branch 'ab/retire-decl-of-missing-unused-funcs'

Remove external declaration of functions that no longer exist.

* ab/retire-decl-of-missing-unused-funcs:
  config.h: remove unused git_config_get_untracked_cache() declaration
  log-tree.h: remove unused function declarations
  grep.h: remove unused grep_threads_ok() declaration
  builtin.h: remove cmd_tar_tree() declaration

4 years agoMerge branch 'lh/systemd-timers'
Junio C Hamano [Wed, 6 Oct 2021 20:40:13 +0000 (13:40 -0700)] 
Merge branch 'lh/systemd-timers'

Testfix.

* lh/systemd-timers:
  maintenance: fix test t7900-maintenance.sh

4 years agoMerge branch 'ab/retire-string-list-init'
Junio C Hamano [Wed, 6 Oct 2021 20:40:13 +0000 (13:40 -0700)] 
Merge branch 'ab/retire-string-list-init'

Code cleanup.

* ab/retire-string-list-init:
  string-list.[ch]: remove string_list_init() compatibility function

4 years agoMerge branch 'ab/retire-refs-unused-funcs'
Junio C Hamano [Wed, 6 Oct 2021 20:40:13 +0000 (13:40 -0700)] 
Merge branch 'ab/retire-refs-unused-funcs'

Code cleanup.

* ab/retire-refs-unused-funcs:
  refs/ref-cache.[ch]: remove "incomplete" from create_dir_entry()
  refs/ref-cache.c: remove "mkdir" parameter from find_containing_dir()
  refs/ref-cache.[ch]: remove unused add_ref_entry()
  refs/ref-cache.[ch]: remove unused remove_entry_from_dir()
  refs.[ch]: remove unused ref_storage_backend_exists()

4 years agoMerge branch 'os/status-docfix'
Junio C Hamano [Wed, 6 Oct 2021 20:40:13 +0000 (13:40 -0700)] 
Merge branch 'os/status-docfix'

Docfix.

* os/status-docfix:
  doc: fix capitalization in "git status --porcelain=v2" description

4 years agoMerge branch 'ws/refer-to-forkpoint-config-in-rebase-doc'
Junio C Hamano [Wed, 6 Oct 2021 20:40:12 +0000 (13:40 -0700)] 
Merge branch 'ws/refer-to-forkpoint-config-in-rebase-doc'

Doc update.

* ws/refer-to-forkpoint-config-in-rebase-doc:
  Document `rebase.forkpoint` in rebase man page

4 years agoMerge branch 'gc/doc-first-contribution-reroll'
Junio C Hamano [Wed, 6 Oct 2021 20:40:12 +0000 (13:40 -0700)] 
Merge branch 'gc/doc-first-contribution-reroll'

Doc update.

* gc/doc-first-contribution-reroll:
  MyFirstContribution: Document --range-diff option when writing v2

4 years agoMerge branch 'pw/rebase-reread-todo-after-editing'
Junio C Hamano [Wed, 6 Oct 2021 20:40:12 +0000 (13:40 -0700)] 
Merge branch 'pw/rebase-reread-todo-after-editing'

The code to re-read the edited todo list in "git rebase -i" was
made more robust.

* pw/rebase-reread-todo-after-editing:
  rebase: fix todo-list rereading
  sequencer.c: factor out a function

4 years agoMerge branch 'ew/midx-doc-update'
Junio C Hamano [Wed, 6 Oct 2021 20:40:12 +0000 (13:40 -0700)] 
Merge branch 'ew/midx-doc-update'

Doc tweak.

* ew/midx-doc-update:
  doc/technical: update note about core.multiPackIndex

4 years agoMerge branch 'ab/repo-settings-cleanup'
Junio C Hamano [Wed, 6 Oct 2021 20:40:11 +0000 (13:40 -0700)] 
Merge branch 'ab/repo-settings-cleanup'

Code cleanup.

* ab/repo-settings-cleanup:
  repository.h: don't use a mix of int and bitfields
  repo-settings.c: simplify the setup
  read-cache & fetch-negotiator: check "enum" values in switch()
  environment.c: remove test-specific "ignore_untracked..." variable
  wrapper.c: add x{un,}setenv(), and use xsetenv() in environment.c

4 years agoMerge branch 'jk/grep-haystack-is-read-only'
Junio C Hamano [Wed, 6 Oct 2021 20:40:11 +0000 (13:40 -0700)] 
Merge branch 'jk/grep-haystack-is-read-only'

Code clean-up in the "grep" machinery.

* jk/grep-haystack-is-read-only:
  grep: store grep_source buffer as const
  grep: mark "haystack" buffers as const
  grep: stop modifying buffer in grep_source_1()
  grep: stop modifying buffer in show_line()
  grep: stop modifying buffer in strip_timestamp

4 years agoMerge branch 'tb/commit-graph-usage-fix'
Junio C Hamano [Wed, 6 Oct 2021 20:40:11 +0000 (13:40 -0700)] 
Merge branch 'tb/commit-graph-usage-fix'

Regression in "git commit-graph" command line parsing has been
corrected.

* tb/commit-graph-usage-fix:
  builtin/multi-pack-index.c: disable top-level --[no-]progress
  builtin/commit-graph.c: don't accept common --[no-]progress

4 years agoMerge branch 'pw/rebase-of-a-tag-fix'
Junio C Hamano [Wed, 6 Oct 2021 20:40:11 +0000 (13:40 -0700)] 
Merge branch 'pw/rebase-of-a-tag-fix'

"git rebase <upstream> <tag>" failed when aborted in the middle, as
it mistakenly tried to write the tag object instead of peeling it
to HEAD.

* pw/rebase-of-a-tag-fix:
  rebase: dereference tags
  rebase: use lookup_commit_reference_by_name()
  rebase: use our standard error return value
  t3407: rework rebase --quit tests
  t3407: strengthen rebase --abort tests
  t3407: use test_path_is_missing
  t3407: rename a variable
  t3407: use test_cmp_rev
  t3407: use test_commit
  t3407: run tests in $TEST_DIRECTORY

4 years agoMerge branch 'jt/add-submodule-odb-clean-up'
Junio C Hamano [Wed, 6 Oct 2021 20:40:10 +0000 (13:40 -0700)] 
Merge branch 'jt/add-submodule-odb-clean-up'

More code paths that use the hack to add submodule's object
database to the set of alternate object store have been cleaned up.

* jt/add-submodule-odb-clean-up:
  revision: remove "submodule" from opt struct
  repository: support unabsorbed in repo_submodule_init
  submodule: remove unnecessary unabsorbed fallback

4 years agoeditor: save and reset terminal after calling EDITOR
Carlo Marcelo Arenas Belón [Tue, 5 Oct 2021 07:46:48 +0000 (00:46 -0700)] 
editor: save and reset terminal after calling EDITOR

When EDITOR is invoked to modify a commit message, it will likely
change the terminal settings, and if it misbehaves will leave the
terminal output damaged as shown in a recent report from Windows
Terminal[1]

Instead use the functions provided by compat/terminal to save the
settings and recover safely.

[1] https://github.com/microsoft/terminal/issues/9359

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoterminal: teach git how to save/restore its terminal settings
Carlo Marcelo Arenas Belón [Tue, 5 Oct 2021 07:46:47 +0000 (00:46 -0700)] 
terminal: teach git how to save/restore its terminal settings

Currently, git will share its console with all its children (unless
they create their own), and is therefore possible that any of them
that might change the settings for it could affect its operations once
completed.

Refactor the platform specific functionality to save the terminal
settings and expand it to also do so for the output handler.

This will allow for the state of the terminal to be saved and
restored around a child that might misbehave (ex vi) which will
be implemented next.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot/perf/perf-lib.sh: remove test_times.* at the end test_perf_()
Jeff Hostetler [Mon, 4 Oct 2021 22:29:03 +0000 (22:29 +0000)] 
t/perf/perf-lib.sh: remove test_times.* at the end test_perf_()

Teach test_perf_() to remove the temporary test_times.* files
at the end of each test.

test_perf_() runs a particular GIT_PERF_REPEAT_COUNT times and creates
./test_times.[123...].  It then uses a perl script to find the minimum
over "./test_times.*" (note the wildcard) and writes that time to
"test-results/<testname>.<testnumber>.result".

If the repeat count is changed during the pXXXX test script, stale
test_times.* files (from previous steps) may be included in the min()
computation.  For example:

...
GIT_PERF_REPEAT_COUNT=3 \
test_perf "status" "
git status
"

GIT_PERF_REPEAT_COUNT=1 \
test_perf "checkout other" "
git checkout other
"
...

The time reported in the summary for "XXXX.2 checkout other" would
be "min( checkout[1], status[2], status[3] )".

We prevent that error by removing the test_times.* files at the end of
each test.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot/perf/aggregate.perl: tolerate leading spaces
Taylor Blau [Sun, 3 Oct 2021 05:14:49 +0000 (01:14 -0400)] 
t/perf/aggregate.perl: tolerate leading spaces

When using `test_size` with `wc -c`, users on certain platforms can run
into issues when `wc` emits leading space characters in its output,
which confuses get_times.

Callers could switch to use test_file_size instead of `wc -c` (the
former never prints leading space characters, so will always work with
test_size regardless of platform), but this is an easy enough spot to
miss that we should teach get_times to be more tolerant of the input it
accepts.

Teach get_times to do just that by stripping any leading space
characters.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDocumentation/git-status: mention how to detect copies
Johannes Altmanninger [Mon, 4 Oct 2021 19:00:50 +0000 (21:00 +0200)] 
Documentation/git-status: mention how to detect copies

The man page documents that git-status can find copies, but does not
mention how. Whereas git-diff has command line options -C, there is
no such option for git-status - it will only detect copies when the
"status.renames" config option is "copies" or "copy". Document that
in git-status.txt because this has confused me and others[1].

[1]: https://www.reddit.com/r/git/comments/ppc2l9/how_to_get_a_file_with_copied_status/

Signed-off-by: Johannes Altmanninger <aclopte@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDocumentation/git-status: document porcelain status T (typechange)
Johannes Altmanninger [Mon, 4 Oct 2021 19:00:49 +0000 (21:00 +0200)] 
Documentation/git-status: document porcelain status T (typechange)

As reported in [1], T is missing from the description of porcelain
status letters in git-status(1) (whereas T *is* documented in
git-diff-files(1) and friends). Document T right after M (modified)
because the two are very similar.

[1] https://github.com/fish-shell/fish-shell/issues/8311

Signed-off-by: Johannes Altmanninger <aclopte@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDocumentation/diff-format: state in which cases porcelain status is T
Johannes Altmanninger [Mon, 4 Oct 2021 19:00:48 +0000 (21:00 +0200)] 
Documentation/diff-format: state in which cases porcelain status is T

Porcelain status letter T is documented as "type of the file", which
is technically correct but not enough information for users that are
not so familiar with this term from systems programming. In particular,
given that the only supported file types are "regular file", "symbolic
link" and "submodule", the term "file type" is surely opaque to the
many(?) users who are not aware that symbolic links can be tracked -
I thought that a "chmod +x" could cause the T status (wrong, it's M).

Explicitly document the three file types so users know if/how they
want to handle this.

Signed-off-by: Johannes Altmanninger <aclopte@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDocumentation/git-status: remove impossible porcelain status DR and DC
Johannes Altmanninger [Mon, 4 Oct 2021 19:00:47 +0000 (21:00 +0200)] 
Documentation/git-status: remove impossible porcelain status DR and DC

Commit 176ea74793 ("wt-status.c: handle worktree renames", 2017-12-27)
made a porcelain status like .R or .C possible. They occur only when
the source file is added to the index and the destination file is
added with --intent-to-add.

They also documented DR, but that status is impossible.  The index
change D means that the source file does not exist in the index.
The worktree change R/C states that the file has been renamed/copied
since the index, but that's impossible if it did not exist there.

Reported-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Johannes Altmanninger <aclopte@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agop3400: stop using tac(1)
René Scharfe [Sat, 2 Oct 2021 17:44:14 +0000 (19:44 +0200)] 
p3400: stop using tac(1)

b3dfeebb92 (rebase: avoid computing unnecessary patch IDs, 2016-07-29)
added a perf test that calls tac(1) from GNU core utilities.  Support
systems without it by reversing the generated list using sort -nr
instead.  sort(1) with options -n and -r is already used in other tests.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe tenth batch
Junio C Hamano [Mon, 4 Oct 2021 04:49:43 +0000 (21:49 -0700)] 
The tenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'ah/connect-parse-feature-v0-fix'
Junio C Hamano [Mon, 4 Oct 2021 04:49:21 +0000 (21:49 -0700)] 
Merge branch 'ah/connect-parse-feature-v0-fix'

Protocol v0 clients can get stuck parsing a malformed feature line.

* ah/connect-parse-feature-v0-fix:
  connect: also update offset for features without values

4 years agoMerge branch 'ab/make-compdb-fix'
Junio C Hamano [Mon, 4 Oct 2021 04:49:21 +0000 (21:49 -0700)] 
Merge branch 'ab/make-compdb-fix'

Build update.

* ab/make-compdb-fix:
  Makefile: pass -Wno-pendantic under GENERATE_COMPILATION_DATABASE=yes

4 years agoMerge branch 'bs/difftool-msg-tweak'
Junio C Hamano [Mon, 4 Oct 2021 04:49:21 +0000 (21:49 -0700)] 
Merge branch 'bs/difftool-msg-tweak'

Message tweak.

* bs/difftool-msg-tweak:
  difftool: fix word spacing in the usage strings

4 years agoMerge branch 'rs/close-pack-leakfix'
Junio C Hamano [Mon, 4 Oct 2021 04:49:20 +0000 (21:49 -0700)] 
Merge branch 'rs/close-pack-leakfix'

Leakfix.

* rs/close-pack-leakfix:
  packfile: release bad_objects in close_pack()

4 years agoMerge branch 'ab/bundle-remove-verbose-option'
Junio C Hamano [Mon, 4 Oct 2021 04:49:20 +0000 (21:49 -0700)] 
Merge branch 'ab/bundle-remove-verbose-option'

Doc update.

* ab/bundle-remove-verbose-option:
  bundle: remove ignored & undocumented "--verbose" flag

4 years agoMerge branch 'ab/auto-depend-with-pedantic'
Junio C Hamano [Mon, 4 Oct 2021 04:49:20 +0000 (21:49 -0700)] 
Merge branch 'ab/auto-depend-with-pedantic'

Improve build procedure for developers.

* ab/auto-depend-with-pedantic:
  Makefile: make COMPUTE_HEADER_DEPENDENCIES=auto work with DEVOPTS=pedantic

4 years agoMerge branch 'ab/make-clean-depend-dirs'
Junio C Hamano [Mon, 4 Oct 2021 04:49:19 +0000 (21:49 -0700)] 
Merge branch 'ab/make-clean-depend-dirs'

"make clean" has been updated to remove leftover .depend/
directories, even when it is not told to use them to compute header
dependencies.

* ab/make-clean-depend-dirs:
  Makefile: clean .depend dirs under COMPUTE_HEADER_DEPENDENCIES != yes

4 years agoMerge branch 'ds/perf-test-built-path-fix'
Junio C Hamano [Mon, 4 Oct 2021 04:49:19 +0000 (21:49 -0700)] 
Merge branch 'ds/perf-test-built-path-fix'

Perf test fix.

* ds/perf-test-built-path-fix:
  t/perf/run: fix bin-wrappers computation

4 years agoMerge branch 'jk/http-redact-fix'
Junio C Hamano [Mon, 4 Oct 2021 04:49:19 +0000 (21:49 -0700)] 
Merge branch 'jk/http-redact-fix'

Sensitive data in the HTTP trace were supposed to be redacted, but
we failed to do so in HTTP/2 requests.

* jk/http-redact-fix:
  http: match headers case-insensitively when redacting

4 years agoMerge branch 'bs/ls-files-opt-help-text-update'
Junio C Hamano [Mon, 4 Oct 2021 04:49:19 +0000 (21:49 -0700)] 
Merge branch 'bs/ls-files-opt-help-text-update'

Help text for "ls-files" options have been updated.

* bs/ls-files-opt-help-text-update:
  ls-files: use imperative mood for -X and -z option description

4 years agoMerge branch 'da/difftool-dir-diff-symlink-fix'
Junio C Hamano [Mon, 4 Oct 2021 04:49:18 +0000 (21:49 -0700)] 
Merge branch 'da/difftool-dir-diff-symlink-fix'

"git difftool --dir-diff" mishandled symbolic links.

* da/difftool-dir-diff-symlink-fix:
  difftool: fix symlink-file writing in dir-diff mode

4 years agoMerge branch 'hn/refs-errno-cleanup'
Junio C Hamano [Mon, 4 Oct 2021 04:49:18 +0000 (21:49 -0700)] 
Merge branch 'hn/refs-errno-cleanup'

Futz with the way 'errno' is relied on in the refs API to carry the
failure modes up the call chain.

* hn/refs-errno-cleanup:
  refs: make errno output explicit for read_raw_ref_fn
  refs/files-backend: stop setting errno from lock_ref_oid_basic
  refs: remove EINVAL errno output from specification of read_raw_ref_fn
  refs file backend: move raceproof_create_file() here

4 years agoMerge branch 'ab/refs-files-cleanup'
Junio C Hamano [Mon, 4 Oct 2021 04:49:18 +0000 (21:49 -0700)] 
Merge branch 'ab/refs-files-cleanup'

Continued work on top of the hn/refs-errno-cleanup topic.

* ab/refs-files-cleanup:
  refs/files: remove unused "errno != ENOTDIR" condition
  refs/files: remove unused "errno == EISDIR" code
  refs/files: remove unused "oid" in lock_ref_oid_basic()
  refs API: remove OID argument to reflog_expire()
  reflog expire: don't lock reflogs using previously seen OID
  refs/files: add a comment about refs_reflog_exists() call
  refs: make repo_dwim_log() accept a NULL oid
  refs/debug: re-indent argument list for "prepare"
  refs/files: remove unused "skip" in lock_raw_ref() too
  refs/files: remove unused "extras/skip" in lock_ref_oid_basic()
  refs: drop unused "flags" parameter to lock_ref_oid_basic()
  refs/files: remove unused REF_DELETING in lock_ref_oid_basic()
  refs/packet: add missing BUG() invocations to reflog callbacks

4 years agoMerge branch 'cb/cvsserver'
Junio C Hamano [Mon, 4 Oct 2021 04:49:17 +0000 (21:49 -0700)] 
Merge branch 'cb/cvsserver'

"git cvsserver" had a long-standing bug in its authentication code,
which has finally been corrected (it is unclear and is a separate
question if anybody is seriously using it, though).

* cb/cvsserver:
  Documentation: cleanup git-cvsserver
  git-cvsserver: protect against NULL in crypt(3)
  git-cvsserver: use crypt correctly to compare password hashes

4 years agoMerge branch 'jx/ci-l10n'
Junio C Hamano [Mon, 4 Oct 2021 04:49:17 +0000 (21:49 -0700)] 
Merge branch 'jx/ci-l10n'

CI help for l10n.

* jx/ci-l10n:
  ci: new github-action for git-l10n code review