]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
3 years agogit-cvsexportcommit: port to SHA-256
brian m. carlson [Mon, 22 Jun 2020 18:04:18 +0000 (18:04 +0000)] 
git-cvsexportcommit: port to SHA-256

When we apply a binary patch, we must have the full object ID in the
header in order to apply it; without that, any attempt to apply it will
fail.  If we set GIT_DIR to empty, git apply does not know about the
hash algorithm we're using, and consequently any attempt to apply a
patch using SHA-256 will fail, since the object ID is the wrong length.

The reason we set the GIT_DIR environment variable is because we don't
want to modify the index; we just want to know whether the patch
applies.  Instead, let's just use a temporary file for the index, which
will be cleaned up automatically when the object goes out of scope.

Additionally, read the configuration for the repository and compute the
length of an object ID based on it.  Use that when matching object IDs
with a regex or computing the all-zeros object ID.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agogit-cvsimport: port to SHA-256
brian m. carlson [Mon, 22 Jun 2020 18:04:17 +0000 (18:04 +0000)] 
git-cvsimport: port to SHA-256

Instead of calling the function is_sha1, call it is_oid and update it to
match either a SHA-1 or a SHA-256 hex object ID.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agogit-cvsserver: port to SHA-256
brian m. carlson [Mon, 22 Jun 2020 18:04:16 +0000 (18:04 +0000)] 
git-cvsserver: port to SHA-256

The code of git-cvsserver currently has several hard-coded 20 and 40
constants that are the length of SHA-1.  When parsing the configuration
file, read the extensions.objectformat configuration setting as well as
CVS-related ones and adjust the hash sizes accordingly.  Use these
computed values in all the places we match object IDs.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agogit-svn: set the OID length based on hash algorithm
brian m. carlson [Mon, 22 Jun 2020 18:04:15 +0000 (18:04 +0000)] 
git-svn: set the OID length based on hash algorithm

When reading the configuration or when creating a new repository, load
the extensions.objectFormat value and set the object ID length to 64 if
it's "sha256".  Note that we use the hex length in git-svn because most
of our processing is done on hex values, not binary ones.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoperl: make SVN code hash independent
brian m. carlson [Mon, 22 Jun 2020 18:04:14 +0000 (18:04 +0000)] 
perl: make SVN code hash independent

There are several places throughout git-svn that use various hard-coded
constants.  For matching object IDs, use the $oid variable.  Compute the
record size we use for our revision storage based on the object ID.

When parsing the revision map format, use a wildcard in the pack format
since we know that the data we're parsing is always exactly the record
size.  This lets us continue to use a constant for the pack format.

Finally, update several comments to reflect the fact that an object ID
may be of one of multiple sizes.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoperl: make Git::IndexInfo work with SHA-256
brian m. carlson [Mon, 22 Jun 2020 18:04:13 +0000 (18:04 +0000)] 
perl: make Git::IndexInfo work with SHA-256

Most of the Git modules, git-svn excepted, don't know anything about the
hash algorithm and mostly work.  However, when we're printing an
all-zero object ID in Git::IndexInfo, we need to know the hash length.

Since we don't want to change the API to have that information passed
in, let's query the config to find the hash algorithm and compute the
right value.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoperl: create and switch variables for hash constants
brian m. carlson [Mon, 22 Jun 2020 18:04:12 +0000 (18:04 +0000)] 
perl: create and switch variables for hash constants

git-svn has several variables for SHA-1 constants, including short hash
values and full length hash values.  Since these are no longer SHA-1
specific, let's start them with "oid" instead of "sha1".  Add a
constant, oid_length, which is the length of the hash algorithm in use
in hex.  We use the hex version because overwhelmingly that's what's
used by git-svn.

We don't currently set oid_length based on the repository algorithm, but
we will in a future commit.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot/lib-git-svn: make hash size independent
brian m. carlson [Mon, 22 Jun 2020 18:04:11 +0000 (18:04 +0000)] 
t/lib-git-svn: make hash size independent

The record size used in the git svn storage is four bytes plus the
length of the binary hash.  Pass the hash length into our Perl
invocation and use it to compute the size of the records.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot9101: make hash independent
brian m. carlson [Fri, 19 Jun 2020 22:39:39 +0000 (22:39 +0000)] 
t9101: make hash independent

Instead of hard-coding the object ID for our test .gitignore file, let's
compute it.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot9104: make hash size independent
brian m. carlson [Fri, 19 Jun 2020 22:39:38 +0000 (22:39 +0000)] 
t9104: make hash size independent

The size of a record in the database used by git svn is four bytes plus
the length of the binary hash.  Instead of hard-coding 24, compute this
value based on the size of the hash in use.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot9100: make test work with SHA-256
brian m. carlson [Fri, 19 Jun 2020 22:39:37 +0000 (22:39 +0000)] 
t9100: make test work with SHA-256

Compute the relevant tree objects for SHA-256 and use those when
appropriate instead of using the SHA-1 ones.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot9108: make test hash independent
brian m. carlson [Fri, 19 Jun 2020 22:39:36 +0000 (22:39 +0000)] 
t9108: make test hash independent

Instead of stripping off the first 41 characters of git log output,
let's just strip off the first space-separated component, which will
work for any size hash.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot9168: make test hash independent
brian m. carlson [Fri, 19 Jun 2020 22:39:35 +0000 (22:39 +0000)] 
t9168: make test hash independent

Instead of stripping off the first 41 characters of git log output,
let's just strip off the first space-separated component, which will
work for any size hash.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot9109: make test hash independent
brian m. carlson [Fri, 19 Jun 2020 22:39:34 +0000 (22:39 +0000)] 
t9109: make test hash independent

Instead of stripping off the first 41 characters of git log output,
let's just strip off the first space-separated component, which will
work for any size hash.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoremote-testgit: adapt for object-format
brian m. carlson [Fri, 19 Jun 2020 17:56:01 +0000 (17:56 +0000)] 
remote-testgit: adapt for object-format

When using an algorithm other than SHA-1, we need the remote helper to
advertise support for the object-format extension and provide
information back to us so that we can properly parse refs and return
data. Ensure that the test remote helper understands these extensions.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agobundle: detect hash algorithm when reading refs
brian m. carlson [Fri, 19 Jun 2020 17:56:00 +0000 (17:56 +0000)] 
bundle: detect hash algorithm when reading refs

Much like with the dumb HTTP transport, there isn't a way to explicitly
specify the hash algorithm when dealing with a bundle, so detect the
algorithm based on the length of the object IDs in the prerequisites and
ref advertisements.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot5300: pass --object-format to git index-pack
brian m. carlson [Fri, 19 Jun 2020 17:55:59 +0000 (17:55 +0000)] 
t5300: pass --object-format to git index-pack

git index-pack by default reads the repository to determine the object
format. However, when outside of a repository, it's necessary to specify
the hash algorithm in use so that the pack can be properly indexed. Add
an --object-format argument when invoking git index-pack outside of a
repository.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot5704: send object-format capability with SHA-256
brian m. carlson [Fri, 19 Jun 2020 17:55:58 +0000 (17:55 +0000)] 
t5704: send object-format capability with SHA-256

When we speak protocol v2 in this test, we must pass the object-format
header if the algorithm is not SHA-1.  Otherwise, git upload-pack fails
because the hash algorithm doesn't match and not because we've failed to
speak the protocol correctly.  Pass the header so that our assertions
test what we're really interested in.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot5703: use object-format serve option
brian m. carlson [Fri, 19 Jun 2020 17:55:57 +0000 (17:55 +0000)] 
t5703: use object-format serve option

When we're using an algorithm other than SHA-1, we need to specify the
algorithm in use so we don't get a failure with an "unknown format"
message. Add a wrapper function that specifies this header if required.
Skip specifying this header for SHA-1 to test that it works both with an
without this header.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot5702: offer an object-format capability in the test
brian m. carlson [Fri, 19 Jun 2020 17:55:56 +0000 (17:55 +0000)] 
t5702: offer an object-format capability in the test

In order to make this test work with SHA-256, offer an object-format
capability so that both sides use the same algorithm.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot/helper: initialize the repository for test-sha1-array
brian m. carlson [Fri, 19 Jun 2020 17:55:55 +0000 (17:55 +0000)] 
t/helper: initialize the repository for test-sha1-array

test-sha1-array uses the_hash_algo under the hood. Since t0064 wants to
use the value that is correct for the hash algorithm that we're testing,
make sure the test helper initializes the repository to set
the_hash_algo correctly.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoremote-curl: avoid truncating refs with ls-remote
brian m. carlson [Fri, 19 Jun 2020 17:55:54 +0000 (17:55 +0000)] 
remote-curl: avoid truncating refs with ls-remote

Normally, the remote-curl transport helper is aware of the hash
algorithm we're using because we're in a repo with the appropriate hash
algorithm set. However, when using git ls-remote outside of a
repository, we won't have initialized the hash algorithm properly, so
use hash_to_hex_algop to print the ref corresponding to the algorithm
we've detected.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot1050: pass algorithm to index-pack when outside repo
brian m. carlson [Fri, 19 Jun 2020 17:55:53 +0000 (17:55 +0000)] 
t1050: pass algorithm to index-pack when outside repo

When outside a repository, git index-pack is unable to guess the hash
algorithm in use for a pack, since packs don't contain any information
on the algorithm in use. Pass an option to index-pack to help it out in
this test.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agobuiltin/index-pack: add option to specify hash algorithm
brian m. carlson [Fri, 19 Jun 2020 17:55:52 +0000 (17:55 +0000)] 
builtin/index-pack: add option to specify hash algorithm

git index-pack is usually run in a repository, but need not be. Since
packs don't contains information on the algorithm in use, instead
relying on context, add an option to index-pack to tell it which one
we're using in case someone runs it outside of a repository.  Since
using --stdin necessarily implies a repository, don't allow specifying
an object format if it's provided to prevent users from passing an
option that won't work.  Add documentation for this option.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoremote-curl: detect algorithm for dumb HTTP by size
brian m. carlson [Fri, 19 Jun 2020 17:55:51 +0000 (17:55 +0000)] 
remote-curl: detect algorithm for dumb HTTP by size

When reading the info/refs file for a repository, we have no explicit
way to detect which hash algorithm is in use because the file doesn't
provide one. Detect the hash algorithm in use by the size of the first
object ID.

If we have an empty repository, we don't know what the hash algorithm is
on the remote side, so default to whatever the local side has
configured.  Without doing this, we cannot clone an empty repository
since we don't know its hash algorithm.  Test this case appropriately,
since we currently have no tests for cloning an empty repository with
the dumb HTTP protocol.

We anonymize the URL like elsewhere in the function in case the user has
decided to include a secret in the URL.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/ls-remote: initialize repository based on fetch
brian m. carlson [Mon, 25 May 2020 19:59:19 +0000 (19:59 +0000)] 
builtin/ls-remote: initialize repository based on fetch

ls-remote may or may not operate within a repository, and as such will
not have been initialized with the repository's hash algorithm.  Even if
it were, the remote side could be using a different algorithm and we
would still want to display those refs properly.  Find the hash
algorithm used by the remote side by querying the transport object and
set our hash algorithm accordingly.

Without this change, if the remote side is using SHA-256, we truncate
the refs to 40 hex characters, since that's the length of the default
hash algorithm (SHA-1).

Note that technically this is not a correct setting of the repository
hash algorithm since, if we are in a repository, it might be one of a
different hash algorithm from the remote side.  However, our current
code paths don't handle multiple algorithms and won't for some time, so
this is the best we can do.  We rely on the fact that ls-remote never
modifies the current repository, which is a reasonable assumption to
make.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot5500: make hash independent
brian m. carlson [Mon, 25 May 2020 19:59:18 +0000 (19:59 +0000)] 
t5500: make hash independent

This test has hard-coded pkt-lines with object IDs.  The pkt-line
lengths necessarily differ between hash algorithms, so generate these
lines with the packetize helper so they're always the right size.  In
addition, we will require an object-format capability for SHA-256, so
pass that capability on to the upload-pack process.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoserve: advertise object-format capability for protocol v2
brian m. carlson [Mon, 25 May 2020 19:59:17 +0000 (19:59 +0000)] 
serve: advertise object-format capability for protocol v2

In order to communicate the protocol supported by the server side, add
support for advertising the object-format capability.  We check that the
client side sends us an identical algorithm if it sends us its own
object-format capability, and assume it speaks SHA-1 if not.

In the test, when we're using an algorithm other than SHA-1, we need to
specify the algorithm in use so we don't get a failure with an "unknown
format" message.  Add a test that we handle a mismatched algorithm.
Remove the test_oid_init call since it's no longer necessary.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: parse v2 refs with correct hash algorithm
brian m. carlson [Mon, 25 May 2020 19:59:16 +0000 (19:59 +0000)] 
connect: parse v2 refs with correct hash algorithm

When using protocol v2, we need to know what hash algorithm is used by
the remote end.  See if the server has sent us an object-format
capability, and if so, use it to determine the hash algorithm in use and
set that value in the packet reader.  Parse the refs using this
algorithm.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: pass full packet reader when parsing v2 refs
brian m. carlson [Mon, 25 May 2020 19:59:15 +0000 (19:59 +0000)] 
connect: pass full packet reader when parsing v2 refs

When we're parsing refs, we need to know not only what the line we're
parsing is, but also the hash algorithm we should use to parse it, which
is stored in the reader object.  Pass the packet reader object through
to the protocol v2 ref parsing function.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDocumentation/technical: document object-format for protocol v2
brian m. carlson [Mon, 25 May 2020 19:59:14 +0000 (19:59 +0000)] 
Documentation/technical: document object-format for protocol v2

Document the object-format extension for protocol v2.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot1302: expect repo format version 1 for SHA-256
brian m. carlson [Mon, 25 May 2020 19:59:13 +0000 (19:59 +0000)] 
t1302: expect repo format version 1 for SHA-256

When using SHA-256, we need to take advantage of the extensions section
in the config file, so we need to use repository format version 1.
Update the test to look for the correct value.

Note that test_oid produces a value without a trailing newline, so use
echo to ensure we print a trailing newline to compare it correctly
against the actual results.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/show-index: provide options to determine hash algo
brian m. carlson [Mon, 25 May 2020 19:59:12 +0000 (19:59 +0000)] 
builtin/show-index: provide options to determine hash algo

show-index is capable of reading any possible index file whether or not
the index is inside a repository.  However, because our index files lack
metadata about the hash algorithm in use, it's not possible to
autodetect the algorithm that a particular index file is using.

In order to allow us to read index files of any algorithm, let's set up
the .git directory gently so that we default to the algorithm for the
current repository, and add an --object-format option to allow users to
override this setting and continue to run show-index outside of a
repository altogether.  Let's also document this new option so that
people can find it and use it.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot5302: modernize test formatting
brian m. carlson [Mon, 25 May 2020 19:59:11 +0000 (19:59 +0000)] 
t5302: modernize test formatting

Our style these days is to place the description and the opening quote
of the body on the same line as test_expect_success (if it fits), to
place the trailing quote on a line by itself after the body, and to use
tabs.  Since we're going to be making several significant changes to
this test, modernize the style to aid in readability of the subsequent
patches.

This patch should have no functional change.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopackfile: compute and use the index CRC offset
brian m. carlson [Mon, 25 May 2020 19:59:10 +0000 (19:59 +0000)] 
packfile: compute and use the index CRC offset

Both v2 pack index files and the v3 format specified as part of the
NewHash work have similar data starting at the CRC table.  Much of the
existing code wants to read either this table or the offset entries
following it, and in doing so computes the offset each time.

In order to share as much code between v2 and v3, compute the offset of
the CRC table and store it when the pack is opened.  Use this value to
compute offsets to not only the CRC table, but to the offset entries
beyond it.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot3200: mark assertion with SHA1 prerequisite
brian m. carlson [Mon, 25 May 2020 19:59:09 +0000 (19:59 +0000)] 
t3200: mark assertion with SHA1 prerequisite

One of the test assertions in this test checks that git branch -m works
even without a .git/config file.  However, if the repository requires
configuration extensions, such as because it uses a non-SHA-1 algorithm,
this assertion will fail.  Mark the assertion as requiring SHA-1.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosetup: set the_repository's hash algo when checking format
brian m. carlson [Mon, 25 May 2020 19:59:08 +0000 (19:59 +0000)] 
setup: set the_repository's hash algo when checking format

When we're checking the repository's format, set the hash algorithm at
the same time.  This ensures that we perform a suitable initialization
early enough to avoid confusing any parts of the code.  If we defer
until later, we can end up with portions of the code which are confused
about the hash algorithm, resulting in segfaults when working with
SHA-256 repositories.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofetch-pack: parse and advertise the object-format capability
brian m. carlson [Mon, 25 May 2020 19:59:07 +0000 (19:59 +0000)] 
fetch-pack: parse and advertise the object-format capability

Parse the server's object-format capability and respond accordingly,
dying if there is a mismatch.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot5562: pass object-format in synthesized test data
brian m. carlson [Mon, 25 May 2020 19:59:06 +0000 (19:59 +0000)] 
t5562: pass object-format in synthesized test data

Ensure that we pass the object-format capability in the synthesized test
data so that this test works with algorithms other than SHA-1.

In addition, add an additional test using the old data for when we're
using SHA-1 so that we can be sure that we preserve backwards
compatibility with servers not offering the object-format capability.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/clone: initialize hash algorithm properly
brian m. carlson [Mon, 25 May 2020 19:59:05 +0000 (19:59 +0000)] 
builtin/clone: initialize hash algorithm properly

When performing a clone, we don't know what hash algorithm the other end
will support.  Currently, we don't support fetching data belonging to a
different algorithm, so we must know what algorithm the remote side is
using in order to properly initialize the repository.  We can know that
only after fetching the refs, so if the remote side has any references,
use that information to reinitialize the repository with the correct
hash algorithm information.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoremote-curl: implement object-format extensions
brian m. carlson [Mon, 25 May 2020 19:59:04 +0000 (19:59 +0000)] 
remote-curl: implement object-format extensions

Implement the object-format extensions that let us determine the hash
algorithm in use when pushing, pulling, and fetching.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotransport-helper: implement object-format extensions
brian m. carlson [Mon, 25 May 2020 19:59:03 +0000 (19:59 +0000)] 
transport-helper: implement object-format extensions

Implement the object-format extensions that let us determine the hash
algorithm in use when pushing or pulling data.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodocs: update remote helper docs for object-format extensions
brian m. carlson [Mon, 25 May 2020 19:59:02 +0000 (19:59 +0000)] 
docs: update remote helper docs for object-format extensions

Update the remote helper docs to document the object-format extensions
we will implement in remote-curl and the transport helper code shortly.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/receive-pack: detect when the server doesn't support our hash
brian m. carlson [Mon, 25 May 2020 19:59:01 +0000 (19:59 +0000)] 
builtin/receive-pack: detect when the server doesn't support our hash

Detect when the server doesn't support our hash algorithm and abort.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: detect algorithm when fetching refs
brian m. carlson [Mon, 25 May 2020 19:59:00 +0000 (19:59 +0000)] 
connect: detect algorithm when fetching refs

If we're fetching refs, detect the hash algorithm and parse the refs
using that algorithm.

As mentioned in the documentation, if multiple versions of the
object-format capability are provided, we use the first.  No known
implementation supports multiple algorithms now, but they may in the
future.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofetch-pack: detect when the server doesn't support our hash
brian m. carlson [Mon, 25 May 2020 19:58:59 +0000 (19:58 +0000)] 
fetch-pack: detect when the server doesn't support our hash

Detect when the server doesn't support our hash algorithm and abort.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: make parse_feature_value extern
brian m. carlson [Mon, 25 May 2020 19:58:58 +0000 (19:58 +0000)] 
connect: make parse_feature_value extern

We're going to be using this function in other files, so no longer mark
this function static.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosend-pack: detect when the server doesn't support our hash
brian m. carlson [Mon, 25 May 2020 19:58:57 +0000 (19:58 +0000)] 
send-pack: detect when the server doesn't support our hash

Detect when the server doesn't support our hash algorithm and abort.
If the server does support our hash, advertise it as part of our
capabilities.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: add function to detect supported v1 hash functions
brian m. carlson [Mon, 25 May 2020 19:58:56 +0000 (19:58 +0000)] 
connect: add function to detect supported v1 hash functions

Add a function, server_supports_hash, to see if the remote server
supports a particular hash algorithm when speaking protocol v1.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotransport: add a hash algorithm member
brian m. carlson [Mon, 25 May 2020 19:58:55 +0000 (19:58 +0000)] 
transport: add a hash algorithm member

When connecting to a remote system, we need to know what hash algorithm
it will be using to talk to us.  Add a hash_algo member to struct
transport and add a function to read this data from the transport
object.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopkt-line: add a member for hash algorithm
brian m. carlson [Mon, 25 May 2020 19:58:54 +0000 (19:58 +0000)] 
pkt-line: add a member for hash algorithm

Add a member for the hash algorithm currently in use to the packet
reader so it can parse references correctly.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: add function to fetch value of a v2 server capability
brian m. carlson [Mon, 25 May 2020 19:58:53 +0000 (19:58 +0000)] 
connect: add function to fetch value of a v2 server capability

So far in protocol v2, all of our server capabilities that have values
have not had values that we've been interested in parsing.  For example,
we receive but ignore the agent value.

However, in a future commit, we're going to want to parse out the value
of a server capability.  To make this easy, add a function,
server_feature_v2, that can fetch the value provided as part of the
server capability.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: add function to parse multiple v1 capability values
brian m. carlson [Mon, 25 May 2020 19:58:52 +0000 (19:58 +0000)] 
connect: add function to parse multiple v1 capability values

In a capability response, we can have multiple symref entries.  In the
future, we will also allow for multiple hash algorithms to be specified.
To avoid duplication, expand the parse_feature_value function to take an
optional offset where the parsing should begin next time.  Add a wrapper
function that allows us to query the next server feature value, and use
it in the existing symref parsing code.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoremote: advertise the object-format capability on the server side
brian m. carlson [Mon, 25 May 2020 19:58:51 +0000 (19:58 +0000)] 
remote: advertise the object-format capability on the server side

Advertise the current hash algorithm in use by using the object-format
capability as part of the ref advertisement.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agowrapper: add function to compare strings with different NUL termination
brian m. carlson [Mon, 25 May 2020 19:58:50 +0000 (19:58 +0000)] 
wrapper: add function to compare strings with different NUL termination

When parsing capabilities for the pack protocol, there are times we'll
want to compare the value of a capability to a NUL-terminated string.
Since the data we're reading will be space-terminated, not
NUL-terminated, we need a function that compares the two strings, but
also checks that they're the same length.  Otherwise, if we used strncmp
to compare these strings, we might accidentally accept a parameter that
was a prefix of the expected value.

Add a function, xstrncmpz, that takes a NUL-terminated string and a
non-NUL-terminated string, plus a length, and compares them, ensuring
that they are the same length.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect: have ref processing code take struct packet_reader
brian m. carlson [Mon, 25 May 2020 19:58:49 +0000 (19:58 +0000)] 
connect: have ref processing code take struct packet_reader

In a future patch, we'll want to access multiple members from struct
packet_reader when parsing references.  Therefore, have the ref parsing
code take pointers to struct reader instead of having to pass multiple
arguments to each function.

Rename the len variable to "linelen" to make it clearer what the
variable does in light of the variable change.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDocumentation: document v1 protocol object-format capability
brian m. carlson [Wed, 13 May 2020 00:53:42 +0000 (00:53 +0000)] 
Documentation: document v1 protocol object-format capability

Document a capability that indicates which hash algorithms are in use by
both sides of a remote connection.  Use the term "object-format", since
this is the term used for the repository extension as well.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot1050: match object ID paths in a hash-insensitive way
brian m. carlson [Wed, 13 May 2020 00:53:41 +0000 (00:53 +0000)] 
t1050: match object ID paths in a hash-insensitive way

The pattern here looking for failures is specific to SHA-1.  Let's
create a variable that matches the regex or glob pattern for a path
within the objects directory.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe eighth batch
Junio C Hamano [Fri, 8 May 2020 21:24:44 +0000 (14:24 -0700)] 
The eighth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'cb/test-bash-lineno-fix'
Junio C Hamano [Fri, 8 May 2020 21:25:12 +0000 (14:25 -0700)] 
Merge branch 'cb/test-bash-lineno-fix'

Recent change to show files and line numbers of a breakage during
test (only available when running the tests with bash) were hurting
other shells with syntax errors, which has been corrected.

* cb/test-bash-lineno-fix:
  t/test_lib: avoid naked bash arrays in file_lineno

4 years agoMerge branch 'cb/t0000-use-the-configured-shell'
Junio C Hamano [Fri, 8 May 2020 21:25:12 +0000 (14:25 -0700)] 
Merge branch 'cb/t0000-use-the-configured-shell'

The basic test did not honor $TEST_SHELL_PATH setting, which has
been corrected.

* cb/t0000-use-the-configured-shell:
  t/t0000-basic: make sure subtests also use TEST_SHELL_PATH

4 years agoMerge branch 'bc/doc-credential-helper-value'
Junio C Hamano [Fri, 8 May 2020 21:25:10 +0000 (14:25 -0700)] 
Merge branch 'bc/doc-credential-helper-value'

Doc update.

* bc/doc-credential-helper-value:
  docs: document credential.helper allowed values

4 years agoMerge branch 'dl/doc-stash-remove-mention-of-reflog'
Junio C Hamano [Fri, 8 May 2020 21:25:09 +0000 (14:25 -0700)] 
Merge branch 'dl/doc-stash-remove-mention-of-reflog'

Doc update.

* dl/doc-stash-remove-mention-of-reflog:
  Doc: reference the "stash list" in autostash docs

4 years agoMerge branch 'cb/avoid-colliding-with-netbsd-hmac'
Junio C Hamano [Fri, 8 May 2020 21:25:09 +0000 (14:25 -0700)] 
Merge branch 'cb/avoid-colliding-with-netbsd-hmac'

The <stdlib.h> header on NetBSD brings in its own definition of
hmac() function (eek), which conflicts with our own and unrelated
function with the same name.  Our function has been renamed to work
around the issue.

* cb/avoid-colliding-with-netbsd-hmac:
  builtin/receive-pack: avoid generic function name hmac()

4 years agoMerge branch 'es/restore-staged-from-head-by-default'
Junio C Hamano [Fri, 8 May 2020 21:25:08 +0000 (14:25 -0700)] 
Merge branch 'es/restore-staged-from-head-by-default'

"git restore --staged --worktree" now defaults to take the contents
out of "HEAD", instead of erring out.

* es/restore-staged-from-head-by-default:
  restore: default to HEAD when combining --staged and --worktree

4 years agoMerge branch 'jk/arith-expansion-coding-guidelines'
Junio C Hamano [Fri, 8 May 2020 21:25:07 +0000 (14:25 -0700)] 
Merge branch 'jk/arith-expansion-coding-guidelines'

The coding guideline for shell scripts instructed to refer to a
variable with dollar-sign inside arithmetic expansion to work
around a bug in old versions of dash, which is a thing of the past.
Now we are not forbidden from writing $((var+1)).

* jk/arith-expansion-coding-guidelines:
  CodingGuidelines: drop arithmetic expansion advice to use "$x"

4 years agoMerge branch 'ds/sparse-allow-empty-working-tree'
Junio C Hamano [Fri, 8 May 2020 21:25:06 +0000 (14:25 -0700)] 
Merge branch 'ds/sparse-allow-empty-working-tree'

The sparse-checkout patterns have been forbidden from excluding all
paths, leaving an empty working tree, for a long time.  This
limitation has been lifted.

* ds/sparse-allow-empty-working-tree:
  sparse-checkout: stop blocking empty workdirs

4 years agoMerge branch 'jt/commit-graph-plug-memleak'
Junio C Hamano [Fri, 8 May 2020 21:25:05 +0000 (14:25 -0700)] 
Merge branch 'jt/commit-graph-plug-memleak'

Fix a leak noticed by fuzzer.

* jt/commit-graph-plug-memleak:
  commit-graph: avoid memory leaks

4 years agoMerge branch 'jk/for-each-ref-multi-key-sort-fix'
Junio C Hamano [Fri, 8 May 2020 21:25:04 +0000 (14:25 -0700)] 
Merge branch 'jk/for-each-ref-multi-key-sort-fix'

"git branch" and other "for-each-ref" variants accepted multiple
--sort=<key> options in the increasing order of precedence, but it
had a few breakages around "--ignore-case" handling, and tie-breaking
with the refname, which have been fixed.

* jk/for-each-ref-multi-key-sort-fix:
  ref-filter: apply fallback refname sort only after all user sorts
  ref-filter: apply --ignore-case to all sorting keys

4 years agoMerge branch 'jk/credential-sample-update'
Junio C Hamano [Fri, 8 May 2020 21:25:02 +0000 (14:25 -0700)] 
Merge branch 'jk/credential-sample-update'

The samples in the credential documentation has been updated to
make it clear that we depict what would appear in the .git/config
file, by adding appropriate quotes as needed..

* jk/credential-sample-update:
  gitcredentials(7): make shell-snippet example more realistic
  gitcredentials(7): clarify quoting of helper examples

4 years agoMerge branch 'ah/userdiff-markdown'
Junio C Hamano [Fri, 8 May 2020 21:25:01 +0000 (14:25 -0700)] 
Merge branch 'ah/userdiff-markdown'

The userdiff patterns for Markdown documents have been added.

* ah/userdiff-markdown:
  userdiff: support Markdown

4 years agoMerge branch 'cb/credential-store-ignore-bogus-lines'
Junio C Hamano [Fri, 8 May 2020 21:25:01 +0000 (14:25 -0700)] 
Merge branch 'cb/credential-store-ignore-bogus-lines'

With the recent tightening of the code that is used to parse
various parts of a URL for use in the credential subsystem, a
hand-edited credential-store file causes the credential helper to
die, which is a bit too harsh to the users.  Demote the error
behaviour to just ignore and keep using well-formed lines instead.

* cb/credential-store-ignore-bogus-lines:
  credential-store: ignore bogus lines from store file
  credential-store: document the file format a bit more

4 years agoMerge branch 'dl/switch-c-option-in-error-message'
Junio C Hamano [Fri, 8 May 2020 21:25:00 +0000 (14:25 -0700)] 
Merge branch 'dl/switch-c-option-in-error-message'

In error messages that "git switch" mentions its option to create a
new branch, "-b/-B" options were shown, where "-c/-C" options
should be, which has been corrected.

* dl/switch-c-option-in-error-message:
  switch: fix errors and comments related to -c and -C

4 years agot/test_lib: avoid naked bash arrays in file_lineno
Carlo Marcelo Arenas Belón [Thu, 7 May 2020 17:57:06 +0000 (10:57 -0700)] 
t/test_lib: avoid naked bash arrays in file_lineno

662f9cf154 (tests: when run in Bash, annotate test failures with file
name/line number, 2020-04-11), introduces a way to report the location
(file:lineno) of a failed test case by traversing the bash callstack.

The implementation requires bash and uses shell arrays and is therefore
protected by a guard but NetBSD sh will still have to parse the function
and therefore will result in:

  ** t0000-basic.sh ***
  ./test-lib.sh: 681: Syntax error: Bad substitution

Enclose the bash specific code inside an eval to avoid parsing errors in
the same way than 5826b7b595 (test-lib: check Bash version for '-x'
without using shell arrays, 2019-01-03)

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot/t0000-basic: make sure subtests also use TEST_SHELL_PATH
Carlo Marcelo Arenas Belón [Thu, 7 May 2020 01:07:46 +0000 (18:07 -0700)] 
t/t0000-basic: make sure subtests also use TEST_SHELL_PATH

3f824e91c8 (t/Makefile: introduce TEST_SHELL_PATH, 2017-12-08) allows for
setting a shell for running the tests, but the generated subtests weren't
updated.

Correct that and while at it update it to use write_script.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodocs: document credential.helper allowed values
brian m. carlson [Tue, 5 May 2020 23:12:26 +0000 (23:12 +0000)] 
docs: document credential.helper allowed values

gitcredentials(7) already mentions several possible invocations that one
can use as the value for credential.helper.  However, many people are
not aware that there are other options than a simple credential helper
name, so let's place some explanatory text in the documentation for
credential.helper as well.

We still refer the user to gitcredential(7) for additional explanations
and helpful examples.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoDoc: reference the "stash list" in autostash docs
Denton Liu [Tue, 5 May 2020 13:00:59 +0000 (09:00 -0400)] 
Doc: reference the "stash list" in autostash docs

In documentation pertaining to autostash behavior, we refer to the
"stash reflog". This description is too low-level as the reflog refers
to an implementation detail of how the stash works and, for end-users,
they do not need to be aware of this at all.

Change references of "stash reflog" to "stash list", which should
provide more accessible terminology for end-users.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe seventh batch
Junio C Hamano [Tue, 5 May 2020 21:51:29 +0000 (14:51 -0700)] 
The seventh batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'js/partial-urlmatch'
Junio C Hamano [Tue, 5 May 2020 21:54:29 +0000 (14:54 -0700)] 
Merge branch 'js/partial-urlmatch'

The same as js/partial-urlmatch-2.17, built on more recent codebase
to avoid unnecessary merge conflicts.

* js/partial-urlmatch:
  credential: handle `credential.<partial-URL>.<key>` again
  credential: optionally allow partial URLs in credential_from_url_gently()

4 years agoMerge branch 'js/partial-urlmatch-2.17'
Junio C Hamano [Tue, 5 May 2020 21:54:29 +0000 (14:54 -0700)] 
Merge branch 'js/partial-urlmatch-2.17'

Recent updates broke parsing of "credential.<url>.<key>" where
<url> is not a full URL (e.g. [credential "https://"] helper = ...)
stopped working, which has been corrected.

* js/partial-urlmatch-2.17:
  credential: handle `credential.<partial-URL>.<key>` again
  credential: optionally allow partial URLs in credential_from_url_gently()
  credential: fix grammar

4 years agoMerge branch 'tb/commit-graph-perm-bits'
Junio C Hamano [Tue, 5 May 2020 21:54:28 +0000 (14:54 -0700)] 
Merge branch 'tb/commit-graph-perm-bits'

Some of the files commit-graph subsystem keeps on disk did not
correctly honor the core.sharedRepository settings and some were
left read-write.

* tb/commit-graph-perm-bits:
  commit-graph.c: make 'commit-graph-chain's read-only
  commit-graph.c: ensure graph layers respect core.sharedRepository
  commit-graph.c: write non-split graphs as read-only
  lockfile.c: introduce 'hold_lock_file_for_update_mode'
  tempfile.c: introduce 'create_tempfile_mode'

4 years agoMerge branch 'dl/push-recurse-submodules-fix'
Junio C Hamano [Tue, 5 May 2020 21:54:28 +0000 (14:54 -0700)] 
Merge branch 'dl/push-recurse-submodules-fix'

Code cleanup.

* dl/push-recurse-submodules-fix:
  push: unset PARSE_OPT_OPTARG for --recurse-submodules

4 years agoMerge branch 'dl/opt-callback-cleanup'
Junio C Hamano [Tue, 5 May 2020 21:54:27 +0000 (14:54 -0700)] 
Merge branch 'dl/opt-callback-cleanup'

Code cleanup.

* dl/opt-callback-cleanup:
  Use OPT_CALLBACK and OPT_CALLBACK_F

4 years agoMerge branch 'jk/test-fail-prereqs-fix'
Junio C Hamano [Tue, 5 May 2020 21:54:27 +0000 (14:54 -0700)] 
Merge branch 'jk/test-fail-prereqs-fix'

Test update.

* jk/test-fail-prereqs-fix:
  t0000: disable GIT_TEST_FAIL_PREREQS in sub-tests

4 years agoMerge branch 'dd/iso-8601-updates'
Junio C Hamano [Tue, 5 May 2020 21:54:26 +0000 (14:54 -0700)] 
Merge branch 'dd/iso-8601-updates'

The approxidate parser learns to parse seconds with fraction.

* dd/iso-8601-updates:
  date.c: allow compact version of ISO-8601 datetime
  date.c: skip fractional second part of ISO-8601
  date.c: validate and set time in a helper function
  date.c: s/is_date/set_date/

4 years agoMerge branch 'bc/wildcard-credential'
Junio C Hamano [Tue, 5 May 2020 21:54:26 +0000 (14:54 -0700)] 
Merge branch 'bc/wildcard-credential'

Update the parser used for credential.<URL>.<variable>
configuration, to handle <URL>s with '/' in them correctly.

* bc/wildcard-credential:
  credential: fix matching URLs with multiple levels in path

4 years agorestore: default to HEAD when combining --staged and --worktree
Eric Sunshine [Tue, 5 May 2020 07:17:16 +0000 (03:17 -0400)] 
restore: default to HEAD when combining --staged and --worktree

By default, files are restored from the index for --worktree, and from
HEAD for --staged. When --worktree and --staged are combined, --source
must be specified to disambiguate the restore source[1], thus making it
cumbersome to restore a file in both the worktree and the index.

However, HEAD is also a reasonable default for --worktree when combined
with --staged, so make it the default anytime --staged is used (whether
combined with --worktree or not).

[1]: Due to an oversight, the --source requirement, though documented,
is not actually enforced.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/receive-pack: avoid generic function name hmac()
Carlo Marcelo Arenas Belón [Tue, 5 May 2020 09:53:26 +0000 (02:53 -0700)] 
builtin/receive-pack: avoid generic function name hmac()

fabec2c5c3 (builtin/receive-pack: switch to use the_hash_algo, 2019-08-18)
renames hmac_sha1 to hmac, as it was updated to use the hash function used
by git (which won't be sha1 in the future).

hmac() is provided by NetBSD >= 8 libc and therefore conflicts as shown by :

builtin/receive-pack.c:421:13: error: conflicting types for 'hmac'
 static void hmac(unsigned char *out,
             ^~~~
In file included from ./git-compat-util.h:172:0,
                 from ./builtin.h:4,
                 from builtin/receive-pack.c:1:
/usr/include/stdlib.h:305:10: note: previous declaration of 'hmac' was here
 ssize_t  hmac(const char *, const void *, size_t, const void *, size_t, void *,
          ^~~~

Rename it again to hmac_hash to reflect it will use the git's defined hash
function and avoid the conflict, while at it update a comment to better
describe the HMAC function that was used.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit-graph: avoid memory leaks
Jonathan Tan [Mon, 4 May 2020 19:13:24 +0000 (12:13 -0700)] 
commit-graph: avoid memory leaks

A fuzzer running on the entry point provided by fuzz-commit-graph.c
revealed a memory leak when parse_commit_graph() creates a struct
bloom_filter_settings and then returns early due to error. Fix that
error by always freeing that struct first (if it exists) before
returning early due to error.

While making that change, I also noticed another possible memory leak -
when the BLOOMDATA chunk is provided but not BLOOMINDEXES. Also fix that
error.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Reviewed-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoref-filter: apply fallback refname sort only after all user sorts
Jeff King [Sun, 3 May 2020 09:13:09 +0000 (05:13 -0400)] 
ref-filter: apply fallback refname sort only after all user sorts

Commit 9e468334b4 (ref-filter: fallback on alphabetical comparison,
2015-10-30) taught ref-filter's sort to fallback to comparing refnames.
But it did it at the wrong level, overriding the comparison result for a
single "--sort" key from the user, rather than after all sort keys have
been exhausted.

This worked correctly for a single "--sort" option, but not for multiple
ones. We'd break any ties in the first key with the refname and never
evaluate the second key at all.

To make matters even more interesting, we only applied this fallback
sometimes! For a field like "taggeremail" which requires a string
comparison, we'd truly return the result of strcmp(), even if it was 0.
But for numerical "value" fields like "taggerdate", we did apply the
fallback. And that's why our multiple-sort test missed this: it uses
taggeremail as the main comparison.

So let's start by adding a much more rigorous test. We'll have a set of
commits expressing every combination of two tagger emails, dates, and
refnames. Then we can confirm that our sort is applied with the correct
precedence, and we'll be hitting both the string and value comparators.

That does show the bug, and the fix is simple: moving the fallback to
the outer compare_refs() function, after all ref_sorting keys have been
exhausted.

Note that in the outer function we don't have an "ignore_case" flag, as
it's part of each individual ref_sorting element. It's debatable what
such a fallback should do, since we didn't use the user's keys to match.
But until now we have been trying to respect that flag, so the
least-invasive thing is to try to continue to do so. Since all callers
in the current code either set the flag for all keys or for none, we can
just pull the flag from the first key. In a hypothetical world where the
user really can flip the case-insensitivity of keys separately, we may
want to extend the code to distinguish that case from a blanket
"--ignore-case".

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoref-filter: apply --ignore-case to all sorting keys
Jeff King [Sun, 3 May 2020 09:11:57 +0000 (05:11 -0400)] 
ref-filter: apply --ignore-case to all sorting keys

All of the ref-filter users (for-each-ref, branch, and tag) take an
--ignore-case option which makes filtering and sorting case-insensitive.
However, this option was applied only to the first element of the
ref_sorting list. So:

  git for-each-ref --ignore-case --sort=refname

would do what you expect, but:

  git for-each-ref --ignore-case --sort=refname --sort=taggername

would sort the primary key (taggername) case-insensitively, but sort the
refname case-sensitively. We have two options here:

  - teach callers to set ignore_case on the whole list

  - replace the ref_sorting list with a struct that contains both the
    list of sorting keys, as well as options that apply to _all_
    keys

I went with the first one here, as it gives more flexibility if we later
want to let the users set the flag per-key (presumably through some
special syntax when defining the key; for now it's all or nothing
through --ignore-case).

The new test covers this by sorting on both tagger and subject
case-insensitively, which should compare "a" and "A" identically, but
still sort them before "b" and "B". We'll break ties by sorting on the
refname to give ourselves a stable output (this is actually supposed to
be done automatically, but there's another bug which will be fixed in
the next commit).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosparse-checkout: stop blocking empty workdirs
Derrick Stolee [Mon, 4 May 2020 18:27:43 +0000 (18:27 +0000)] 
sparse-checkout: stop blocking empty workdirs

Remove the error condition when updating the sparse-checkout leaves
an empty working directory.

This behavior was added in 9e1afb167 (sparse checkout: inhibit empty
worktree, 2009-08-20). The comment was added in a7bc906f2 (Add
explanation why we do not allow to sparse checkout to empty working
tree, 2011-09-22) in response to a "dubious" comment in 84563a624
(unpack-trees.c: cosmetic fix, 2010-12-22).

With the recent "cone mode" and "git sparse-checkout init [--cone]"
command, it is common to set a reasonable sparse-checkout pattern
set of

/*
!/*/

which matches only files at root. If the repository has no such files,
then their "git sparse-checkout init" command will fail.

Now that we expect this to be a common pattern, we should not have the
commands fail on an empty working directory. If it is a confusing
result, then the user can recover with "git sparse-checkout disable"
or "git sparse-checkout set". This is especially simple when using cone
mode.

Reported-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoCodingGuidelines: drop arithmetic expansion advice to use "$x"
Jeff King [Mon, 4 May 2020 16:07:09 +0000 (12:07 -0400)] 
CodingGuidelines: drop arithmetic expansion advice to use "$x"

The advice to use "$x" rather than "x" in arithmetric expansion was
working around a dash bug fixed in 0.5.4. Even Debian oldstable has
0.5.8 these days. And in the meantime, we've added almost two dozen
instances of the "x" form which you can find with:

  git grep '$(([a-z]'

and nobody seems to have complained. Let's declare this workaround
obsolete and simplify our style guide.

Helped-by: Danh Doan <congdanhqx@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocredential-store: ignore bogus lines from store file
Carlo Marcelo Arenas Belón [Sat, 2 May 2020 22:34:47 +0000 (15:34 -0700)] 
credential-store: ignore bogus lines from store file

With the added checks for invalid URLs in credentials, any locally
modified store files which might have empty lines or even comments
were reported[1] failing to parse as valid credentials.

Instead of doing a hard check for credentials, do a soft one and
therefore avoid the reported fatal error.

While at it add tests for all known corruptions that are currently
ignored to keep track of them and avoid the risk of regressions.

[1] https://stackoverflow.com/a/61420852/5005936

Reported-by: Dirk <dirk@ed4u.de>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Based-on-patch-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouserdiff: support Markdown
Ash Holland [Sat, 2 May 2020 13:15:43 +0000 (14:15 +0100)] 
userdiff: support Markdown

It's typical to find Markdown documentation alongside source code, and
having better context for documentation changes is useful; see also
commit 69f9c87d4 (userdiff: add support for Fountain documents,
2015-07-21).

The pattern is based on the CommonMark specification 0.29, section 4.2
<https://spec.commonmark.org/> but doesn't match empty headings, as
seeing them in a hunk header is unlikely to be useful.

Only ATX headings are supported, as detecting setext headings would
require printing the line before a pattern matches, or matching a
multiline pattern. The word-diff pattern is the same as the pattern for
HTML, because many Markdown parsers accept inline HTML.

Signed-off-by: Ash Holland <ash@sorrel.sh>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe sixth batch
Junio C Hamano [Fri, 1 May 2020 20:37:35 +0000 (13:37 -0700)] 
The sixth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'jt/v2-fetch-nego-fix'
Junio C Hamano [Fri, 1 May 2020 20:40:00 +0000 (13:40 -0700)] 
Merge branch 'jt/v2-fetch-nego-fix'

The upload-pack protocol v2 gave up too early before finding a
common ancestor, resulting in a wasteful fetch from a fork of a
project.  This has been corrected to match the behaviour of v0
protocol.

* jt/v2-fetch-nego-fix:
  fetch-pack: in protocol v2, reset in_vain upon ACK
  fetch-pack: in protocol v2, in_vain only after ACK
  fetch-pack: return enum from process_acks()

4 years agoMerge branch 'js/anonymise-push-url-in-errors'
Junio C Hamano [Fri, 1 May 2020 20:39:59 +0000 (13:39 -0700)] 
Merge branch 'js/anonymise-push-url-in-errors'

Error and verbose trace messages from "git push" did not redact
credential material embedded in URLs.

* js/anonymise-push-url-in-errors:
  push: anonymize URLs in error messages and warnings

4 years agoMerge branch 'es/bugreport'
Junio C Hamano [Fri, 1 May 2020 20:39:58 +0000 (13:39 -0700)] 
Merge branch 'es/bugreport'

The "bugreport" tool.

* es/bugreport:
  bugreport: drop extraneous includes
  bugreport: add compiler info
  bugreport: add uname info
  bugreport: gather git version and build info
  bugreport: add tool to generate debugging info
  help: move list_config_help to builtin/help

4 years agoMerge branch 'en/rebase-root-and-fork-point-are-incompatible'
Junio C Hamano [Fri, 1 May 2020 20:39:58 +0000 (13:39 -0700)] 
Merge branch 'en/rebase-root-and-fork-point-are-incompatible'

Incompatible options "--root" and "--fork-point" of "git rebase"
have been marked and documented as being incompatible.

* en/rebase-root-and-fork-point-are-incompatible:
  rebase: display an error if --root and --fork-point are both provided