2 years agol10n: fr.po v2.22.0.rnd1
Jean-Noël Avila [Fri, 17 May 2019 17:55:39 +0000 (19:55 +0200)]
l10n: fr.po v2.22.0.rnd1

Signed-off-by: Jean-Noël Avila <>
2 years agopkt-line: drop 'const'-ness of a param to set_packet_header()
Junio C Hamano [Wed, 15 May 2019 01:42:35 +0000 (10:42 +0900)]
pkt-line: drop 'const'-ness of a param to set_packet_header()

The function's definition has a paramter of type "int" qualified as
"const".  The fact that the incoming parameter is used as read-only
in the fuction is an implementation detail that the callers should
not have to be told in the prototype declaring it (and "const" there
has no effect, as C passes parameters by value).

The prototype defined for the function in pkt-line.h lacked the
matching "const" for this reason, but apparently some compilers
(e.g. MS Visual C 2017) complain about the parameter type mismatch.

Let's squelch it by removing the "const" that is pointless in the
definition of a small and trivial function like this, which would
not help optimizing compilers nor reading humans that much.

Noticed-by: Johannes Schindelin <>
Helped-by: Jeff King <>
Signed-off-by: Junio C Hamano <>
2 years agotest-lib: try harder to ensure a working jgit
Todd Zullinger [Wed, 15 May 2019 01:36:33 +0000 (21:36 -0400)]
test-lib: try harder to ensure a working jgit

The JGIT prereq uses `type jgit` to determine whether jgit is present.
While this is usually sufficient, it won't help if the jgit found is
badly broken.  This wastes time running tests which fail due to no fault
of our own.

Use `jgit --version` instead, to guard against cases where jgit is
present on the system, but will fail to run, e.g. because of some JRE
issue, or missing Java dependencies.  Checking that it gets far enough
to process the '--version' argument isn't perfect, but seems to be good
enough in practice.  It's also consistent with how we detect some other
dependencies, see e.g. the CURL and UNZIP prerequisites.

Signed-off-by: Todd Zullinger <>
Signed-off-by: Junio C Hamano <>
2 years agoget_oid: handle NULL repo->index
Jeff King [Tue, 14 May 2019 13:54:55 +0000 (09:54 -0400)]
get_oid: handle NULL repo->index

When get_oid() and its helpers see an index name like ":.gitmodules",
they try to load the index on demand, like:

  if (repo->index->cache)

However, that misses the case when "repo->index" itself is NULL; we'll
segfault in the conditional.

This never happens with the_repository; there we always point its index
field to &the_index. But a submodule repository may have a NULL index
field until somebody calls repo_read_index().

This bug is triggered by t7411, but it was hard to notice because it's
in an expect_failure block. That test was added by 2b1257e463 (t/helper:
add test-submodule-nested-repo-config, 2018-10-25). Back then we had no
easy way to access the .gitmodules blob of a submodule repo, so we
expected (and got) an error message to that effect. Later, d9b8b8f896
(submodule-config.c: use repo_get_oid for reading .gitmodules,
2019-04-16) started looking in the correct repo, which is when we
started triggering the segfault.

With this fix, the test starts passing (once we clean it up as its
comment instructs).

Note that as far as I know, this bug could not be triggered outside of
the test suite. It requires resolving an index name in a submodule, and
all of the code paths (aside from test-tool) which do that either load
the index themselves, or always pass the_repository.

Ultimately it comes from 3a7a698e93 (sha1-name.c: remove implicit
dependency on the_index, 2019-01-12), which replaced a check of
"the_index.cache" with "repo->index->cache". So even if there is another
way to trigger it, it wouldn't affect any versions before then.

Signed-off-by: Jeff King <>
Signed-off-by: Junio C Hamano <>
2 years agohttp-push: prevent format overflow warning with gcc >= 9
Carlo Marcelo Arenas Belón [Tue, 14 May 2019 21:11:17 +0000 (14:11 -0700)]
http-push: prevent format overflow warning with gcc >= 9

In function 'finish_request',
    inlined from 'process_response' at http-push.c:248:2:
http-push.c:587:4: warning: '%s' directive argument is null [-Wformat-overflow=]
  587 |    fprintf(stderr, "Unable to get pack file %s\n%s",
      |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  588 |     request->url, curl_errorstr);
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

request->url is needed for the error message if there was a failure
during fetch but was being cleared unnecessarily earlier.

note that the leak is prevented by calling release_request unconditionally
at the end.

Signed-off-by: Carlo Marcelo Arenas Belón <>
Suggested-by: Eric Sunshine <>
Signed-off-by: Junio C Hamano <>
2 years agostash: document stash.useBuiltin
Johannes Schindelin [Tue, 14 May 2019 09:19:15 +0000 (02:19 -0700)]
stash: document stash.useBuiltin

The stash.useBuiltin variable introduced in 90a462725e ("stash:
optionally use the scripted version again", 2019-02-25) was turned on by
default, but had no documentation.

Let's document it so that users who run into any stability issues with
the C rewrite know there's an escape hatch, and spell out that the
user should please report the bug when they have to turn off the
built-in stash.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agol10n: sv.po: Update Swedish translation (4577t0f0u)
Peter Krefting [Tue, 14 May 2019 14:46:15 +0000 (15:46 +0100)]
l10n: sv.po: Update Swedish translation (4577t0f0u)

Signed-off-by: Peter Krefting <>
2 years agol10n: sv.po: Update Swedish translation
Peter Krefting [Sun, 17 Mar 2019 15:52:33 +0000 (16:52 +0100)]
l10n: sv.po: Update Swedish translation

Fix mistakes reported by Mattias Engdegård <>.

Signed-off-by: Peter Krefting <>
2 years agol10n: git.pot: v2.22.0 round 1 (270 new, 56 removed)
Jiang Xin [Tue, 14 May 2019 09:09:58 +0000 (17:09 +0800)]
l10n: git.pot: v2.22.0 round 1 (270 new, 56 removed)

Generate po/git.pot from v2.22.0-rc0 for git v2.22.0 l10n round 1.

Signed-off-by: Jiang Xin <>
2 years agosha1dc: update from upstream
Ævar Arnfjörð Bjarmason [Mon, 13 May 2019 22:17:01 +0000 (00:17 +0200)]
sha1dc: update from upstream

Update sha1dc from the latest version by the upstream
maintainer[1]. See 07a20f569b ("Makefile: fix unaligned loads in
sha1dc with UBSan", 2019-03-12) for the last update.

This fixes an issue where HP-UX IA64 was wrongly detected as a
Little-endian instead of a Big-endian system, see [2] and [3].


Signed-off-by: Ævar Arnfjörð Bjarmason <>
Signed-off-by: Junio C Hamano <>
2 years agoparse-options: adjust `parse_opt_unknown_cb()`s declared return type
Johannes Schindelin [Mon, 13 May 2019 22:43:17 +0000 (15:43 -0700)]
parse-options: adjust `parse_opt_unknown_cb()`s declared return type

In f41179f16ba2 (parse-options: avoid magic return codes, 2019-01-27),
the signature of the low-level parse-opt callback function was changed
to return an `enum`.

And while the implementations were changed, one declaration was left
unchanged, still claiming to return `int`.

This can potentially lead to problems, as compilers are free to choose
any integral type for an `enum` as long as it can represent all declared

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agoGit 2.22-rc0 v2.22.0-rc0
Junio C Hamano [Mon, 13 May 2019 14:40:13 +0000 (23:40 +0900)]
Git 2.22-rc0

Signed-off-by: Junio C Hamano <>
2 years agoMerge branch 'jh/trace2'
Junio C Hamano [Mon, 13 May 2019 14:50:35 +0000 (23:50 +0900)]
Merge branch 'jh/trace2'

A few embarrassing bugfixes.

* jh/trace2:
  trace2: fix up a missing "leave" entry point
  trace2: fix incorrect function pointer check

2 years agoMerge branch 'cc/access-on-aix-workaround'
Junio C Hamano [Mon, 13 May 2019 14:50:35 +0000 (23:50 +0900)]
Merge branch 'cc/access-on-aix-workaround'

Workaround for standard-compliant but less-than-useful behaviour of
access(2) for the root user.

* cc/access-on-aix-workaround:
  git-compat-util: work around for access(X_OK) under root

2 years agoMerge branch 'pw/clean-sequencer-state-upon-final-commit'
Junio C Hamano [Mon, 13 May 2019 14:50:35 +0000 (23:50 +0900)]
Merge branch 'pw/clean-sequencer-state-upon-final-commit'

"git chery-pick" (and "revert" that shares the same runtime engine)
that deals with multiple commits got confused when the final step
gets stopped with a conflict and the user concluded the sequence
with "git commit".  Attempt to fix it by cleaning up the state
files used by these commands in such a situation.

* pw/clean-sequencer-state-upon-final-commit:
  fix cherry-pick/revert status after commit
  commit/reset: try to clean up sequencer state

2 years agoMerge branch 'pw/rebase-i-internal'
Junio C Hamano [Mon, 13 May 2019 14:50:34 +0000 (23:50 +0900)]
Merge branch 'pw/rebase-i-internal'

The internal implementation of "git rebase -i" has been updated to
avoid forking a separate "rebase--interactive" process.

* pw/rebase-i-internal:
  rebase -i: run without forking rebase--interactive
  rebase: use a common action enum
  rebase -i: use struct rebase_options in do_interactive_rebase()
  rebase -i: use struct rebase_options to parse args
  rebase -i: use struct object_id for squash_onto
  rebase -i: use struct commit when parsing options
  rebase -i: remove duplication
  rebase -i: combine rebase--interactive.c with rebase.c
  rebase: rename write_basic_state()
  rebase: don't translate trace strings
  sequencer: always discard index after checkout

2 years agoMerge branch 'jk/perf-aggregate-wo-libjson'
Junio C Hamano [Mon, 13 May 2019 14:50:34 +0000 (23:50 +0900)]
Merge branch 'jk/perf-aggregate-wo-libjson'

The script to aggregate perf result unconditionally depended on
libjson-perl even though it did not have to, which has been

* jk/perf-aggregate-wo-libjson:
  t/perf: depend on perl JSON only when using --codespeed

2 years agoMerge branch 'dl/rev-tilde-doc-clarify'
Junio C Hamano [Mon, 13 May 2019 14:50:33 +0000 (23:50 +0900)]
Merge branch 'dl/rev-tilde-doc-clarify'


* dl/rev-tilde-doc-clarify:
  revisions.txt: remove ambibuity between <rev>:<path> and :<path>
  revisions.txt: mention <rev>~ form
  revisions.txt: mark optional rev arguments with []
  revisions.txt: change "rev" to "<rev>"

2 years agoMerge branch 'jc/make-dedup-ls-files-output'
Junio C Hamano [Mon, 13 May 2019 14:50:33 +0000 (23:50 +0900)]
Merge branch 'jc/make-dedup-ls-files-output'

A "ls-files" that emulates "find" to enumerate files in the working
tree resulted in duplicated Makefile rules that caused the build to
issue an unnecessary warning during a trial build after merge
conflicts are resolved in working tree *.h files but before the
resolved results are added to the index.  This has been corrected.

* jc/make-dedup-ls-files-output:
  Makefile: dedup list of files obtained from ls-files

2 years agoMerge branch 'jk/ls-files-doc-markup-fix'
Junio C Hamano [Mon, 13 May 2019 14:50:33 +0000 (23:50 +0900)]
Merge branch 'jk/ls-files-doc-markup-fix'


* jk/ls-files-doc-markup-fix:
  doc/ls-files: put nested list for "-t" option into block

2 years agoMerge branch 'jk/p5302-avoid-collision-check-cost'
Junio C Hamano [Mon, 13 May 2019 14:50:32 +0000 (23:50 +0900)]
Merge branch 'jk/p5302-avoid-collision-check-cost'

Fix index-pack perf test so that the repeated invocations always
run in an empty repository, which emulates the initial clone
situation better.

* jk/p5302-avoid-collision-check-cost:
  p5302: create the repo in each index-pack test

2 years agoMerge branch 'dl/no-extern-in-func-decl'
Junio C Hamano [Mon, 13 May 2019 14:50:32 +0000 (23:50 +0900)]
Merge branch 'dl/no-extern-in-func-decl'

Mechanically and systematically drop "extern" from function

* dl/no-extern-in-func-decl:
  *.[ch]: manually align parameter lists
  *.[ch]: remove extern from function declarations using sed
  *.[ch]: remove extern from function declarations using spatch

2 years agoMerge branch 'ew/repack-with-bitmaps-by-default'
Junio C Hamano [Mon, 13 May 2019 14:50:32 +0000 (23:50 +0900)]
Merge branch 'ew/repack-with-bitmaps-by-default'

The connectivity bitmaps are created by default in bare
repositories now; also the pathname hash-cache is created by
default to avoid making crappy deltas when repacking.

* ew/repack-with-bitmaps-by-default:
  pack-objects: default to writing bitmap hash-cache
  t5310: correctly remove bitmaps for jgit test
  repack: enable bitmaps by default on bare repos

2 years agoMerge branch 'js/partial-clone-connectivity-check'
Junio C Hamano [Mon, 13 May 2019 14:50:31 +0000 (23:50 +0900)]
Merge branch 'js/partial-clone-connectivity-check'

During an initial "git clone --depth=..." partial clone, it is
pointless to spend cycles for a large portion of the connectivity
check that enumerates and skips promisor objects (which by
definition is all objects fetched from the other side).  This has
been optimized out.

* js/partial-clone-connectivity-check:
  t/perf: add perf script for partial clones
  clone: do faster object check for partial clones

2 years agoMerge branch 'jh/trace2-sid-fix'
Junio C Hamano [Mon, 13 May 2019 14:50:31 +0000 (23:50 +0900)]
Merge branch 'jh/trace2-sid-fix'

Polishing of the new trace2 facility continues.  The system-level
configuration can specify site-wide trace2 settings, which can be
overridden with per-user configuration and environment variables.

* jh/trace2-sid-fix:
  trace2: fixup access problem on /etc/gitconfig in read_very_early_config
  trace2: update docs to describe system/global config settings
  trace2: make SIDs more unique
  trace2: clarify UTC datetime formatting
  trace2: report peak memory usage of the process
  trace2: use system/global config for default trace2 settings
  config: add read_very_early_config()
  trace2: find exec-dir before trace2 initialization
  trace2: add absolute elapsed time to start event
  trace2: refactor setting process starting time
  config: initialize opts structure in repo_read_config()

2 years agodifftool: fallback on merge.guitool
Denton Liu [Mon, 29 Apr 2019 06:21:20 +0000 (02:21 -0400)]
difftool: fallback on merge.guitool

In git-difftool.txt, it says

'git difftool' falls back to 'git mergetool' config variables when the
difftool equivalents have not been defined.

However, when `diff.guitool` is missing, it doesn't fallback to
anything. Make git-difftool fallback to `merge.guitool` when `diff.guitool` is

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agodifftool: make --gui, --tool and --extcmd mutually exclusive
Denton Liu [Mon, 29 Apr 2019 06:21:17 +0000 (02:21 -0400)]
difftool: make --gui, --tool and --extcmd mutually exclusive

In git-difftool, these options specify which tool to ultimately run. As
a result, they are logically conflicting. Explicitly disallow these
options from being used together.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agomergetool: fallback to tool when guitool unavailable
Denton Liu [Mon, 29 Apr 2019 06:21:14 +0000 (02:21 -0400)]
mergetool: fallback to tool when guitool unavailable

In git-difftool, if the tool is called with --gui but `diff.guitool` is
not set, it falls back to `diff.tool`. Make git-mergetool also fallback
from `merge.guitool` to `merge.tool` if the former is undefined.

If git-difftool, when called with `--gui`, were to use
`get_configured_mergetool` in a future patch, it would also get the
fallback behavior in the following precedence:

1. diff.guitool
2. merge.guitool
3. diff.tool
4. merge.tool

The behavior for when difftool or mergetool are called without `--gui`
should be identical with or without this patch.

Note that the search loop could be written as

if diff_mode
sections="diff $sections"
if gui_mode
keys="guitool $keys"

IFS=' '
for key in $keys
for section in $sections
selected=$(git config $section.$key)
if test -n "$selected"
echo "$selected"

which would make adding a mode in the future much easier. However,
adding a new mode will likely never happen as it is highly discouraged
so, as a result, it is written in its current form so that it is more
readable for future readers.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agomergetool--lib: create gui_mode function
Denton Liu [Mon, 29 Apr 2019 06:21:11 +0000 (02:21 -0400)]
mergetool--lib: create gui_mode function

Before, in `get_configured_merge_tool`, we would test the value of the
first argument directly, which corresponded to whether we were using
guitool. However, since `$GIT_MERGETOOL_GUI` is available as an
environment variable, create the `gui_mode` function which increases the
clarify of functions which use it.

While we're at it, add a space before `()` in function definitions to
fix the style.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agomergetool: use get_merge_tool function
Denton Liu [Mon, 29 Apr 2019 06:21:08 +0000 (02:21 -0400)]
mergetool: use get_merge_tool function

In git-mergetool, the logic for getting which merge tool to use is
duplicated in git-mergetool--lib, except for the fact that it needs to
know whether the tool was guessed or not.

Rewrite `get_merge_tool` to return whether or not the tool was guessed
through the return code and make git-mergetool call this function
instead of duplicating the logic. Note that 1 was chosen to be the
return code of when a tool is guessed because it seems like a slightly
more abnormal condition than getting a tool that's explicitly specified
but this is completely arbitrary.

Also, let `$GIT_MERGETOOL_GUI` be set to determine whether or not the
guitool will be selected.

This change is not completely backwards compatible as there may be
external users of git-mergetool--lib. However, only one user,
git-diffall[1], was found from searching GitHub and Google, and this
tool is superseded by `git difftool --dir-diff` anyway. It seems very
unlikely that there exists an external caller that would take into
account the return code of `get_merge_tool` as it would always return 0
before this change so this change probably does not affect any external


Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agotrace2: add variable description to git.txt
Derrick Stolee [Fri, 10 May 2019 19:44:26 +0000 (12:44 -0700)]
trace2: add variable description to git.txt

Documentation/technical/api-trace2.txt contains the full details
of the trace2 API and the GIT_TR2* environment variables. However,
most environment variables are included in Documentation/git.txt,
including the GIT_TRACE* variables.

Add a brief description of the GIT_TR2* variables with links to
the full technical details. The biggest difference from the
original variables is that we can specify a Unix Domain Socket.
Mention this difference, but leave the details to the technical

Reported-by: Szeder Gábor <>
Signed-off-by: Derrick Stolee <>
Signed-off-by: Junio C Hamano <>
2 years agostatus: fix display of rebase -ir's `label` command
Johannes Schindelin [Fri, 10 May 2019 20:23:14 +0000 (13:23 -0700)]
status: fix display of rebase -ir's `label` command

The argument of a `label` command does *not* want to be turned into an
abbreviated SHA-1.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agotrace2: fix up a missing "leave" entry point
Ævar Arnfjörð Bjarmason [Fri, 10 May 2019 13:37:38 +0000 (15:37 +0200)]
trace2: fix up a missing "leave" entry point

Fix a trivial bug that's been here since the shared/do_write_index
tracing was added in 42fee7a388 ("trace2:data: add trace2
instrumentation to index read/write", 2019-02-22). We should have
enter/leave points, not two enter/enter points. This resulted in an
"enter" event without a corresponding "leave" event.

Signed-off-by: Ævar Arnfjörð Bjarmason <>
Acked-by: Derrick Stolee <>
Signed-off-by: Junio C Hamano <>
2 years agocheck-non-portable-shell: support Perl versions older than 5.10
Eric Sunshine [Sat, 11 May 2019 00:18:53 +0000 (20:18 -0400)]
check-non-portable-shell: support Perl versions older than 5.10

For thoroughness when checking for one-shot environment variable
assignments at shell function call sites, check-non-portable-shell
stitches together incomplete lines (those ending with backslash). This
allows it to correctly flag such undesirable usage even when the
variable assignment and function call are split across lines, for

    FOO=bar \

where 'func' is a shell function.

The stitching is accomplished like this:

    while (<>) {
        # stitch together incomplete lines (those ending with "\")
        while (s/\\$//) {
            $_ .= readline;
        # detect unportable/undesirable shell constructs

Although this implementation is well supported in reasonably modern Perl
versions (5.10 and later), it fails with older versions (such as Perl
5.8 shipped with ancient Mac OS 10.5). In particular, in older Perl
versions, 'readline' is not connected to the file handle associated with
the "magic" while (<>) {...} construct, so 'readline' throws a
"readline() on unopened filehandle" error. Work around this problem by
dropping readline() and instead incorporating the stitching of
incomplete lines directly into the existing while (<>) {...} loop.

Helped-by: Ævar Arnfjörð Bjarmason <>
Signed-off-by: Eric Sunshine <>
Signed-off-by: Junio C Hamano <>
2 years agomingw: enable DEP and ASLR
İsmail Dönmez [Wed, 8 May 2019 11:30:59 +0000 (04:30 -0700)]
mingw: enable DEP and ASLR

Enable DEP (Data Execution Prevention) and ASLR (Address Space Layout
Randomization) support. This applies to both 32bit and 64bit builds
and makes it substantially harder to exploit security holes in Git by
offering a much more unpredictable attack surface.

ASLR interferes with GDB's ability to set breakpoints. A similar issue
holds true when compiling with -O2 (in which case single-stepping is
messed up because GDB cannot map the code back to the original source
code properly). Therefore we simply enable ASLR only when an
optimization flag is present in the CFLAGS, using it as an indicator
that the developer does not want to debug in GDB anyway.

Signed-off-by: İsmail Dönmez <>
Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agomingw: do not let ld strip relocations
İsmail Dönmez [Wed, 8 May 2019 11:30:58 +0000 (04:30 -0700)]
mingw: do not let ld strip relocations

This is the first step for enabling ASLR (Address Space Layout
Randomization) support. We want to enable ASLR for better protection
against exploiting security holes in Git: it makes it harder to attack
software by making code addresses unpredictable.

The problem fixed by this commit is that `ld.exe` seems to be stripping
relocations which in turn will break ASLR support. We just make sure
it's not stripping the main executable entry.

Signed-off-by: İsmail Dönmez <>
Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agotrace2: fix up a missing "leave" entry point
Ævar Arnfjörð Bjarmason [Fri, 10 May 2019 13:37:38 +0000 (15:37 +0200)]
trace2: fix up a missing "leave" entry point

Fix a trivial bug that's been here since the shared/do_write_index
tracing was added in 42fee7a388 ("trace2:data: add trace2
instrumentation to index read/write", 2019-02-22). We should have
enter/leave points, not two enter/enter points. This resulted in an
"enter" event without a corresponding "leave" event.

Signed-off-by: Ævar Arnfjörð Bjarmason <>
Acked-by: Derrick Stolee <>
Signed-off-by: Junio C Hamano <>
2 years agodifftool --no-index: error out on --dir-diff (and don't crash)
Johannes Schindelin [Wed, 8 May 2019 21:52:41 +0000 (14:52 -0700)]
difftool --no-index: error out on --dir-diff (and don't crash)

In `--no-index` mode, we now no longer require a worktree nor a
repository. But some code paths in `difftool` expect those to be

The most notable such code path is the `--dir-diff` one: we use the
existing checkout machinery to copy the files, and that machinery looks
up replacement refs, looks at alternate ODBs, wants to use the worktree
path, etc.

Rather than running into segmentation faults, let's die with an
informative error message.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agotag: fix typo in nested tagging hint
Denton Liu [Wed, 8 May 2019 19:16:41 +0000 (15:16 -0400)]
tag: fix typo in nested tagging hint

In eea9c1e78f (tag: advise on nested tags, 2019-04-04), tag was taught
to hint at the user if a nested tag is made. However, this message had a
typo and it said "The object referred to by your new is...", which was
missing a "tag" after "new". Fix this message by adding the "tag".

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agodiff-highlight: use correct /dev/null for UNIX and Windows
Chris. Webster [Wed, 31 Oct 2018 14:58:00 +0000 (23:58 +0900)]
diff-highlight: use correct /dev/null for UNIX and Windows

Use File::Spec->devnull() for output redirection to avoid messages
when Windows version of Perl is first in path.  The message 'The
system cannot find the path specified.' is displayed each time git is
run to get colors.

Signed-off-by: Chris. Webster <>
Signed-off-by: Junio C Hamano <>
2 years agoThe eighth batch
Junio C Hamano [Wed, 8 May 2019 15:37:54 +0000 (00:37 +0900)]
The eighth batch

Signed-off-by: Junio C Hamano <>
2 years agoMerge branch 'vk/autoconf-gettext'
Junio C Hamano [Wed, 8 May 2019 15:37:29 +0000 (00:37 +0900)]
Merge branch 'vk/autoconf-gettext'

The autoconf generated configure script failed to use the right
gettext() implementations from -libintl by ignoring useless stub
implementations shipped in some C library, which has been

* vk/autoconf-gettext:
  autoconf: #include <libintl.h> when checking for gettext()

2 years agoMerge branch 'cc/aix-has-fileno-as-a-macro'
Junio C Hamano [Wed, 8 May 2019 15:37:28 +0000 (00:37 +0900)]
Merge branch 'cc/aix-has-fileno-as-a-macro'

AIX shared the same build issues with other BSDs around fileno(fp),
which has been corrected.

* cc/aix-has-fileno-as-a-macro:
  Makefile: use fileno macro work around on AIX

2 years agoMerge branch 'jt/submodule-repo-is-with-worktree'
Junio C Hamano [Wed, 8 May 2019 15:37:28 +0000 (00:37 +0900)]
Merge branch 'jt/submodule-repo-is-with-worktree'

The logic to tell if a Git repository has a working tree protects
"git branch -D" from removing the branch that is currently checked
out by mistake.  The implementation of this logic was broken for
repositories with unusual name, which unfortunately is the norm for
submodules these days.  This has been fixed.

* jt/submodule-repo-is-with-worktree:
  worktree: update is_bare heuristics

2 years agoMerge branch 'jk/untracked-cache-more-fixes'
Junio C Hamano [Wed, 8 May 2019 15:37:28 +0000 (00:37 +0900)]
Merge branch 'jk/untracked-cache-more-fixes'

Code clean-up.

* jk/untracked-cache-more-fixes:
  untracked-cache: simplify parsing by dropping "len"
  untracked-cache: simplify parsing by dropping "next"
  untracked-cache: be defensive about missing NULs in index

2 years agoMerge branch 'jk/prune-optim'
Junio C Hamano [Wed, 8 May 2019 15:37:27 +0000 (00:37 +0900)]
Merge branch 'jk/prune-optim'

A follow-up test for an earlier "git prune" improvements.

* jk/prune-optim:
  t5304: add a test for pruning with bitmaps

2 years agoMerge branch 'js/misc-doc-fixes'
Junio C Hamano [Wed, 8 May 2019 15:37:27 +0000 (00:37 +0900)]
Merge branch 'js/misc-doc-fixes'

"make check-docs", "git help -a", etc. did not account for cases
where a particular build may deliberately omit some subcommands,
which has been corrected.

* js/misc-doc-fixes:
  Turn `git serve` into a test helper
  test-tool: handle the `-C <directory>` option just like `git`
  check-docs: do not bother checking for legacy scripts' documentation
  docs: exclude documentation for commands that have been excluded
  check-docs: allow command-list.txt to contain excluded commands
  help -a: do not list commands that are excluded from the build
  Makefile: drop the NO_INSTALL variable
  remote-testgit: move it into the support directory for t5801

2 years agoMerge branch 'dr/ref-filter-push-track-fix'
Junio C Hamano [Wed, 8 May 2019 15:37:26 +0000 (00:37 +0900)]
Merge branch 'dr/ref-filter-push-track-fix'

%(push:track) token used in the --format option to "git
for-each-ref" and friends was not showing the right branch, which
has been fixed.

* dr/ref-filter-push-track-fix:
  ref-filter: use correct branch for %(push:track)

2 years agoMerge branch 'ss/msvc-path-utils-fix'
Junio C Hamano [Wed, 8 May 2019 15:37:26 +0000 (00:37 +0900)]
Merge branch 'ss/msvc-path-utils-fix'

An earlier update for MinGW and Cygwin accidentally broke MSVC build,
which has been fixed.

* ss/msvc-path-utils-fix:
  MSVC: include compat/win32/path-utils.h for MSVC, too, for real_path()

2 years agoMerge branch 'jt/clone-server-option'
Junio C Hamano [Wed, 8 May 2019 15:37:25 +0000 (00:37 +0900)]
Merge branch 'jt/clone-server-option'

"git clone" learned a new --server-option option when talking over
the protocol version 2.

* jt/clone-server-option:
  clone: send server options when using protocol v2
  transport: die if server options are unsupported

2 years agoMerge branch 'tb/unexpected'
Junio C Hamano [Wed, 8 May 2019 15:37:25 +0000 (00:37 +0900)]
Merge branch 'tb/unexpected'

Code tightening against a "wrong" object appearing where an object
of a different type is expected, instead of blindly assuming that
the connection between objects are correctly made.

* tb/unexpected:
  rev-list: detect broken root trees
  rev-list: let traversal die when --missing is not in use
  get_commit_tree(): return NULL for broken tree
  list-objects.c: handle unexpected non-tree entries
  list-objects.c: handle unexpected non-blob entries
  t: introduce tests for unexpected object types
  t: move 'hex2oct' into

2 years agoMerge branch 'nd/sha1-name-c-wo-the-repository'
Junio C Hamano [Wed, 8 May 2019 15:37:24 +0000 (00:37 +0900)]
Merge branch 'nd/sha1-name-c-wo-the-repository'

Further code clean-up to allow the lowest level of name-to-object
mapping layer to work with a passed-in repository other than the
default one.

* nd/sha1-name-c-wo-the-repository: (34 commits)
  sha1-name.c: remove the_repo from get_oid_mb()
  sha1-name.c: remove the_repo from other get_oid_*
  sha1-name.c: remove the_repo from maybe_die_on_misspelt_object_name
  submodule-config.c: use repo_get_oid for reading .gitmodules
  sha1-name.c: add repo_get_oid()
  sha1-name.c: remove the_repo from get_oid_with_context_1()
  sha1-name.c: remove the_repo from resolve_relative_path()
  sha1-name.c: remove the_repo from diagnose_invalid_index_path()
  sha1-name.c: remove the_repo from handle_one_ref()
  sha1-name.c: remove the_repo from get_oid_1()
  sha1-name.c: remove the_repo from get_oid_basic()
  sha1-name.c: remove the_repo from get_describe_name()
  sha1-name.c: remove the_repo from get_oid_oneline()
  sha1-name.c: add repo_interpret_branch_name()
  sha1-name.c: remove the_repo from interpret_branch_mark()
  sha1-name.c: remove the_repo from interpret_nth_prior_checkout()
  sha1-name.c: remove the_repo from get_short_oid()
  sha1-name.c: add repo_for_each_abbrev()
  sha1-name.c: store and use repo in struct disambiguate_state
  sha1-name.c: add repo_find_unique_abbrev_r()

2 years agoMerge branch 'cc/replace-graft-peel-tags'
Junio C Hamano [Wed, 8 May 2019 15:37:24 +0000 (00:37 +0900)]
Merge branch 'cc/replace-graft-peel-tags'

When given a tag that points at a commit-ish, "git replace --graft"
failed to peel the tag before writing a replace ref, which did not
make sense because the old graft mechanism the feature wants to
mimick only allowed to replace one commit object with another.
This has been fixed.

* cc/replace-graft-peel-tags:
  replace: peel tag when passing a tag first to --graft
  replace: peel tag when passing a tag as parent to --graft
  t6050: redirect expected error output to a file
  t6050: use test_line_count instead of wc -l

2 years agoMerge branch 'js/trace2-to-directory'
Junio C Hamano [Wed, 8 May 2019 15:37:24 +0000 (00:37 +0900)]
Merge branch 'js/trace2-to-directory'

The trace2 tracing facility learned to auto-generate a filename
when told to log to a directory.

* js/trace2-to-directory:
  trace2: write to directory targets

2 years agoMerge branch 'dl/merge-cleanup-scissors-fix'
Junio C Hamano [Wed, 8 May 2019 15:37:24 +0000 (00:37 +0900)]
Merge branch 'dl/merge-cleanup-scissors-fix'

The list of conflicted paths shown in the editor while concluding a
conflicted merge was shown above the scissors line when the
clean-up mode is set to "scissors", even though it was commented
out just like the list of updated paths and other information to
help the user explain the merge better.

* dl/merge-cleanup-scissors-fix:
  cherry-pick/revert: add scissors line on merge conflict
  sequencer.c: save and restore cleanup mode
  merge: add scissors line on merge conflict
  merge: cleanup messages like commit
  parse-options.h: extract common --cleanup option
  commit: extract cleanup_mode functions to sequencer
  t7502: clean up style
  t7604: clean up style
  t3507: clean up style
  t7600: clean up style

2 years agoMerge branch 'pw/sequencer-cleanup-with-signoff-x-fix'
Junio C Hamano [Wed, 8 May 2019 15:37:23 +0000 (00:37 +0900)]
Merge branch 'pw/sequencer-cleanup-with-signoff-x-fix'

"git cherry-pick" run with the "-x" or the "--signoff" option used
to (and more importantly, ought to) clean up the commit log message
with the --cleanup=space option by default, but this has been
broken since late 2017.  This has been fixed.

* pw/sequencer-cleanup-with-signoff-x-fix:
  sequencer: fix cleanup with --signoff and -x

2 years agoMerge branch 'jk/pack-objects-reports-num-objects-to-trace2'
Junio C Hamano [Wed, 8 May 2019 15:37:23 +0000 (00:37 +0900)]
Merge branch 'jk/pack-objects-reports-num-objects-to-trace2'

The "git pack-objects" command learned to report the number of
objects it packed via the trace2 mechanism.

* jk/pack-objects-reports-num-objects-to-trace2:
  pack-objects: write objects packed to trace2

2 years agoMerge branch 'tz/git-svn-doc-markup-fix'
Junio C Hamano [Wed, 8 May 2019 15:37:23 +0000 (00:37 +0900)]
Merge branch 'tz/git-svn-doc-markup-fix'

Doc formatting fix.

* tz/git-svn-doc-markup-fix:
  Documentation/git-svn: improve asciidoctor compatibility

2 years agoMerge branch 'km/empty-repo-is-still-a-repo'
Junio C Hamano [Wed, 8 May 2019 15:37:23 +0000 (00:37 +0900)]
Merge branch 'km/empty-repo-is-still-a-repo'

Running "git add" on a repository created inside the current
repository is an explicit indication that the user wants to add it
as a submodule, but when the HEAD of the inner repository is on an
unborn branch, it cannot be added as a submodule.  Worse, the files
in its working tree can be added as if they are a part of the outer
repository, which is not what the user wants.  These problems are
being addressed.

* km/empty-repo-is-still-a-repo:
  add: error appropriately on repository with no commits
  dir: do not traverse repositories with no commits
  submodule: refuse to add repository with no commits

2 years agoMerge branch 'dl/warn-tagging-a-tag'
Junio C Hamano [Wed, 8 May 2019 15:37:22 +0000 (00:37 +0900)]
Merge branch 'dl/warn-tagging-a-tag'

"git tag" learned to give an advice suggesting it might be a
mistake when creating an annotated or signed tag that points at
another tag.

* dl/warn-tagging-a-tag:
  tag: advise on nested tags
  tag: fix formatting

2 years agoMerge branch 'en/merge-directory-renames'
Junio C Hamano [Wed, 8 May 2019 15:37:22 +0000 (00:37 +0900)]
Merge branch 'en/merge-directory-renames'

"git merge-recursive" backend recently learned a new heuristics to
infer file movement based on how other files in the same directory
moved.  As this is inherently less robust heuristics than the one
based on the content similarity of the file itself (rather than
based on what its neighbours are doing), it sometimes gives an
outcome unexpected by the end users.  This has been toned down to
leave the renamed paths in higher/conflicted stages in the index so
that the user can examine and confirm the result.

* en/merge-directory-renames:
  merge-recursive: switch directory rename detection default
  merge-recursive: give callers of handle_content_merge() access to contents
  merge-recursive: track information associated with directory renames
  t6043: fix copied test description to match its purpose
  merge-recursive: switch from (oid,mode) pairs to a diff_filespec
  merge-recursive: cleanup handle_rename_* function signatures
  merge-recursive: track branch where rename occurred in rename struct
  merge-recursive: remove ren[12]_other fields from rename_conflict_info
  merge-recursive: shrink rename_conflict_info
  merge-recursive: move some struct declarations together
  merge-recursive: use 'ci' for rename_conflict_info variable name
  merge-recursive: rename locals 'o' and 'a' to 'obuf' and 'abuf'
  merge-recursive: rename diff_filespec 'one' to 'o'
  merge-recursive: rename merge_options argument from 'o' to 'opt'
  Use 'unsigned short' for mode, like diff_filespec does

2 years agosubmodule--helper: add a missing \n
Nguyễn Thái Ngọc Duy [Tue, 7 May 2019 09:50:37 +0000 (16:50 +0700)]
submodule--helper: add a missing \n

This is a complete line. We're not expecting the next function to add
anything to the same line.

Signed-off-by: Nguyễn Thái Ngọc Duy <>
Signed-off-by: Junio C Hamano <>
2 years agococcicheck: make batch size of 0 mean "unlimited"
Jeff King [Wed, 8 May 2019 07:07:54 +0000 (03:07 -0400)]
coccicheck: make batch size of 0 mean "unlimited"

If you have the memory to handle it, the ideal case is to run a single
spatch invocation with all of the source files. But the only way to do
so now is to pick an arbitrarily large batch size. Let's make "0" do
this, which is a little friendlier (and doesn't otherwise have a useful

Signed-off-by: Jeff King <>
Signed-off-by: Junio C Hamano <>
2 years agot6500(mingw): use the Windows PID of the shell
Johannes Schindelin [Tue, 7 May 2019 21:51:30 +0000 (14:51 -0700)]
t6500(mingw): use the Windows PID of the shell

In Git for Windows, we use the MSYS2 Bash which inherits a non-standard
PID model from Cygwin's POSIX emulation layer: every MSYS2 process has a
regular Windows PID, and in addition it has an MSYS2 PID (which
corresponds to a shadow process that emulates Unix-style signal

With the upgrade to the MSYS2 runtime v3.x, this shadow process cannot
be accessed via `OpenProcess()` any longer, and therefore t6500 thought
incorrectly that the process referenced in `` (which is not
actually a real `gc` process in this context, but the current shell) no
longer exists.

Let's fix this by making sure that the Windows PID is written into
`` in this test script so that `git.exe` is able to understand
that that process does indeed still exist.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agot/lib-httpd: pass LSAN_OPTIONS through apache
Jeff King [Tue, 7 May 2019 22:30:46 +0000 (18:30 -0400)]
t/lib-httpd: pass LSAN_OPTIONS through apache

Just as we instruct Apache to pass through ASAN_OPTIONS (so that
server-side Git programs it spawns will respect our options while
running the tests), we should do the same with LSAN_OPTIONS. Otherwise
trying to collect a list of leaks like:

    export LSAN_OPTIONS=exitcode=0:log_path=/tmp/lsan
    make SANITIZE=leak test

won't work for http tests (the server-side programs won't log their
leaks to the right place, and they'll prematurely die, producing a
spurious test failure).

Signed-off-by: Jeff King <>
Acked-by: Josh Steadmon <>
Signed-off-by: Junio C Hamano <>
2 years agoMake fread/fwrite-like functions in http.c more like fread/fwrite.
Mike Hommey [Tue, 7 May 2019 23:03:54 +0000 (08:03 +0900)]
Make fread/fwrite-like functions in http.c more like fread/fwrite.

The fread/fwrite-like functions in http.c, namely fread_buffer,
fwrite_buffer, fwrite_null, fwrite_sha1_file all return the
multiplication of the size and number of items they are being given.

Practically speaking, it doesn't matter, because in all contexts where
those functions are used, size is 1.

But those functions being similar to fread and fwrite (the curl API is
designed around being able to use fread and fwrite directly), it might
be preferable to make them behave like fread and fwrite, which, from
the fread/fwrite manual page, is:
   On  success, fread() and fwrite() return the number of items read
   or written.  This number equals the number of bytes transferred
   only when size is 1.  If an error occurs, or the end of the file
   is reached, the return value is a short item count (or zero).

Signed-off-by: Mike Hommey <>
Signed-off-by: Junio C Hamano <>
2 years agofsmonitor: force a refresh after the index was discarded
Johannes Schindelin [Tue, 7 May 2019 11:10:21 +0000 (13:10 +0200)]
fsmonitor: force a refresh after the index was discarded

With this change, the `index_state` struct becomes the new home for the
flag that says whether the fsmonitor hook has been run, i.e. it is now

It also gets re-set when the index is discarded, fixing the bug
demonstrated by the "test_expect_failure" test added in the preceding
commit. In that case fsmonitor-enabled Git would miss updates under
certain circumstances, see that preceding commit for details.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agofsmonitor: demonstrate that it is not refreshed after discard_index()
Johannes Schindelin [Tue, 7 May 2019 11:10:20 +0000 (13:10 +0200)]
fsmonitor: demonstrate that it is not refreshed after discard_index()

This one is tricky.

When `core.fsmonitor` is set, a `refresh_index()` will not perform a
full scan of files that might be modified, but will query the fsmonitor
and refresh only the ones that have been actually touched.

Due to implementation details, the fsmonitor is queried in
`refresh_cache_ent()`, but of course it only has to be queried once, so
we set a flag when we did that. But when the index was discarded, we did
not re-set that flag.

So far, this is only covered by our test suite when running with
GIT_TEST_FSMONITOR=$PWD/t7519/fsmonitor-all, and only due to the way the
built-in stash interacts with the recursive merge machinery.

Let's introduce a straight-forward regression test for this.

We simply extend the "read & discard index" loop in `test-tool
read-cache` to optionally refresh the index, report on a given file's
status, and then modify that file. Due to the bug described above, only
the first refresh will actually query the fsmonitor; subsequent loop
iterations will not.

This problem was reported by Ævar Arnfjörð Bjarmason.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years forbid the use of GIT_TEST_INSTALLED
Ævar Arnfjörð Bjarmason [Tue, 7 May 2019 10:54:34 +0000 (12:54 +0200)] forbid the use of GIT_TEST_INSTALLED

As noted in preceding commits setting GIT_TEST_INSTALLED has never
been supported or documented, and as noted in an earlier t/perf/README
change to the extent that it's been documented nobody's notices that
the example hasn't worked since 3c8f12c96c ("test-lib: reorder and
include GIT-BUILD-OPTIONS a lot earlier", 2012-06-24).

We could directly support GIT_TEST_INSTALLED for invocations without
the "run" script, such as:

    GIT_TEST_INSTALLED=../../ ./
    GIT_TEST_INSTALLED=/home/avar/g/git ./

But while not having this "error" will "work", it won't write the the
resulting "test-results/*" files to the right place, and thus a
subsequent call to aggregate.perl won't work as expected.

Let's just tell the user that they need to use the "run" script,
which'll correctly deal with this and set the right

If someone's in desperate need of bypassing "run" for whatever reason
they can trivially do so by setting "PERF_SET_GIT_TEST_INSTALLED", but
not we won't have people who expect GIT_TEST_INSTALLED to just work
wondering why their aggregation doesn't work, even though they're
running the right "git".

Signed-off-by: Ævar Arnfjörð Bjarmason <>
2 years agoperf tests: add "bindir" prefix to git tree test results
Ævar Arnfjörð Bjarmason [Tue, 7 May 2019 10:54:33 +0000 (12:54 +0200)]
perf tests: add "bindir" prefix to git tree test results

Change the output file names in test-results/ to be
"test-results/bindir_<munged dir>" rather than just
"test-results/<munged dir>".

This is for consistency with the "build_" directories we have for
built revisions, i.e. "test-results/build_<SHA-1>".

There's no user-visible functional changes here, it just makes it
easier to see at a glance what "test-results" files are of what "type"
as they're all explicitly grouped together now, and to grep this code
to find both the run_dirs_helper() implementation and its
corresponding aggregate.perl code.

Note that we already guarantee that the rest of the
PERF_RESULTS_PREFIX is an absolute path, and since it'll start with
e.g. "/" which we munge to "_" we'll up with a readable string like

Signed-off-by: Ævar Arnfjörð Bjarmason <>
2 years remove GIT_TEST_INSTALLED from
Ævar Arnfjörð Bjarmason [Tue, 7 May 2019 10:54:32 +0000 (12:54 +0200)] remove GIT_TEST_INSTALLED from

Follow-up my preceding change which fixed the immediate "./run
<revisions>" regression in 0baf78e7bc (" rely on for --tee handling", 2019-03-15) and entirely get rid of
GIT_TEST_INSTALLED from (and aggregate.perl).

As noted in that change the dance we're doing with GIT_TEST_INSTALLED isn't necessary, but there I was doing the most minimal
set of changes to quickly fix a regression.

But it's much simpler to never deal with the "GIT_TEST_INSTALLED" we
were setting in at all. Instead the run_dirs_helper() sets
the previously inferred $PERF_RESULTS_PREFIX directly.

Setting this at the callsite that's already best positioned to
exhaustively know about all the different cases we need to handle
where PERF_RESULTS_PREFIX isn't what we want already (the empty
string) makes the most sense. In one-off cases like:

    ./run ./

We'll just do the right thing because PERF_RESULTS_PREFIX will be
empty, and takes care of finding where our git is.

Any refactoring of this code needs to change both the shell code and
the Perl code in aggregate.perl, because when running e.g.:

    ./run ../../ -- <test>

The "../../" path to a relative bindir needs to be munged to a
filename containing the results, and critically aggregate.perl does
not get passed the path to those aggregations, just "../..".

Let's fix cases where aggregate.perl would print e.g. ".." in its
report output for this, and "git" for "/home/avar/g/git", i.e. it
would always pick the last element. Now'll always print the full path

This also makes the code sturdier, e.g. you can feed "../.."  to
"./run" and then an absolute path to the aggregate.perl script, as
long as the absolute path and "../.." resolved to the same directory
printing the aggregation will work.

Also simplify the "[_*]" on the RHS of "tr -c", we're trimming
everything to "_", so we don't need that.

Signed-off-by: Ævar Arnfjörð Bjarmason <>
2 years make "./run <revisions>" use the correct gits
Ævar Arnfjörð Bjarmason [Tue, 7 May 2019 10:54:31 +0000 (12:54 +0200)] make "./run <revisions>" use the correct gits

Fix a really bad regression in 0baf78e7bc (" rely on for --tee handling", 2019-03-15). Since that change all
runs of different <revisions> of git have used the git found in the
user's $PATH, e.g. /usr/bin/git instead of the <revision> we just
built and wanted to performance test.

The problem starts with GIT_TEST_INSTALLED not working like our
non-perf tests with the "run" script. I.e. you can't run performance
tests against a given installed git. Instead we expect to use it
ourselves to point GIT_TEST_INSTALLED to the <revision> we just built.

However, we had been relying on '$(cd "$GIT_TEST_INSTALLED" && pwd)'
to resolve that relative $GIT_TEST_INSTALLED to an absolute
path *before* was loaded, in cases where it was
e.g. "build/<rev>/bin-wrappers" and we wanted "<abs_path>build/...".

This change post-dates another proposed solution by a few days[1], I
didn't notice that version when I initially wrote this. I'm doing the
most minimal thing to solve the regression here, a follow-up change
will move this result prefix selection logic entirely into the "run"

This makes e.g. these cases all work:

    ./run . $PWD/../../ origin/master origin/next HEAD -- <tests>

As well as just a plain one-off:

    ./run <tests>

And, since we're passing down the new GIT_PERF_DIR_MYDIR_REL we make
sure the bug relating to aggregate.perl not finding our files as
described in 0baf78e7bc doesn't happen again.

What *doesn't* work is setting GIT_TEST_INSTALLED to a relative path,
this will subtly fail in This has always been the case
even before 0baf78e7bc, and as documented in t/README the
GIT_TEST_INSTALLED variable should be set to an absolute path (needs
to be set "to the bindir", which is always absolute), and the "perf"
framework expects to munge it itself.

Perhaps that should be dealt with in the future to allow manually
setting GIT_TEST_INSTALLED, but as a preceding commit showed the user
can just use the "run" script, which'll also pick the right output
directory for the test results as expected by aggregate.perl.


Signed-off-by: Ævar Arnfjörð Bjarmason <>
2 years agoperf aggregate: remove GIT_TEST_INSTALLED from --codespeed
Ævar Arnfjörð Bjarmason [Tue, 7 May 2019 10:54:30 +0000 (12:54 +0200)]
perf aggregate: remove GIT_TEST_INSTALLED from --codespeed

Remove the setting of the "environment" from the --codespeed output. I
don't think this is useful, and it helps with a later refactoring
where we GIT_TEST_INSTALLED stop munging/reading GIT_TEST_INSTALLED in
the perf tests in so many places.

This was added in 05eb1c37ed ("perf/aggregate: implement codespeed
JSON output", 2018-01-05), but since the "run" scripts uses
"GIT_TEST_INSTALLED" internally this was only ever useful for one-off
runs of a single revision as all the "environment" values would be
ones for whatever directory the "run" script ran last.

Let's instead fall back on the "uname -r" case, which is the sort of
thing the environment should be set to, not something that duplicates
other parts of the codpseed output. For setting the "environment" to
something custom the perf.repoName variable can be used. See
19cf57a92e ("perf/run: read GIT_PERF_REPO_NAME from perf.repoName",

Signed-off-by: Ævar Arnfjörð Bjarmason <>
2 years agoperf README: correct docs for 3c8f12c96c regression
Ævar Arnfjörð Bjarmason [Tue, 7 May 2019 10:54:29 +0000 (12:54 +0200)]
perf README: correct docs for 3c8f12c96c regression

Since 3c8f12c96c ("test-lib: reorder and include GIT-BUILD-OPTIONS a
lot earlier", 2012-06-24) the suggested advice of overriding
GIT_BUILD_DIR has not worked. We've printed a hard error like this
given e.g. GIT_BUILD_DIR=/home/avar/g/git:

    /bin-wrappers/git is not executable; using GIT_EXEC_PATH
    error: You haven't built things yet, have you?

Let's just suggest that the user run other gits via the "run"
script. That'll do the right thing for setting the path to the other
git, and running the "aggregate.perl" scripts afterwards will work.

As an aside, if setting GIT_BUILD_DIR had still worked, then the
MODERN_GIT feature/fix added in 1a0962dee5 ("t/perf: fix regression in
testing older versions of git", 2016-06-22) would have broke.

Signed-off-by: Ævar Arnfjörð Bjarmason <>
2 years agorevisions.txt: remove ambibuity between <rev>:<path> and :<path>
Andreas Heiduk [Sun, 5 May 2019 16:07:10 +0000 (12:07 -0400)]
revisions.txt: remove ambibuity between <rev>:<path> and :<path>

The revision ':README' is mentioned as an example for '<rev>:<path>'
but the explanation forwards to the ':<n>:<path>' syntax. At the same
time ':<n>:<path>' did not mark the '<n>:' as optional.

Signed-off-by: Andreas Heiduk <>
Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agorevisions.txt: mention <rev>~ form
Denton Liu [Sun, 5 May 2019 16:07:07 +0000 (12:07 -0400)]
revisions.txt: mention <rev>~ form

In revisions.txt, the '<rev>^' form is mentioned but the '<rev>~' form
is missing. Although both forms are essentially equivalent (they each
get the first parent of the specified revision), we should mention the
latter for completeness. Make this change.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agorevisions.txt: mark optional rev arguments with []
Denton Liu [Sun, 5 May 2019 16:07:03 +0000 (12:07 -0400)]
revisions.txt: mark optional rev arguments with []

In revisions.txt, an optional rev argument was not distinguised.
Instead, a user had to continue and read the description in order to
learn that the argument was optional.

Since the [] notation for an optional argument is common-knowledge in
the Git documentation, mark optional arguments with [] so that it's more
obvious for the reader.

Helped-by: Andreas Heiduk <>
Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agorevisions.txt: change "rev" to "<rev>"
Denton Liu [Sun, 5 May 2019 16:06:59 +0000 (12:06 -0400)]
revisions.txt: change "rev" to "<rev>"

In revisions.txt, there were some instances of a rev argument being
written as "rev". However, since they didn't mean the string literal,
write "<rev>", instead.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agonotes: correct documentation of format_display_notes()
Chris Mayo [Sat, 4 May 2019 18:45:07 +0000 (19:45 +0100)]
notes: correct documentation of format_display_notes()

'flags' parameter was replaced by 'raw' in commit:
76141e2e62 ("format_note(): simplify API", 2012-10-17)

Signed-off-by: Chris Mayo <>
Signed-off-by: Junio C Hamano <>
2 years agomingw: remove obsolete IPv6-related code
Tanushree Tumane [Wed, 27 Feb 2019 08:43:13 +0000 (00:43 -0800)]
mingw: remove obsolete IPv6-related code

To support IPv6, Git provided fall back functions for Windows versions
that did not support IPv6. However, as Git dropped support for Windows
XP and prior, those functions are not needed anymore.

Remove those fallbacks by reverting fe3b2b7b827c (Enable support for
IPv6 on MinGW, 2009-11-24) and using the functions directly (without
'ipv6_' prefix).

Signed-off-by: Tanushree Tumane <>
Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agot5580: verify that alternates can be UNC paths
Johannes Schindelin [Mon, 25 Feb 2019 14:17:45 +0000 (06:17 -0800)]
t5580: verify that alternates can be UNC paths

On Windows, UNC paths are a very convenient way to share data, and
alternates are all about sharing data.

We fixed a bug where alternates specifying UNC paths were not handled
properly, and it is high time that we add a regression test to ensure
that this bug is not reintroduced.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agocvsexportcommit: force crlf translation
Dustin Spicuzza [Mon, 29 Apr 2019 21:58:47 +0000 (14:58 -0700)]
cvsexportcommit: force crlf translation

When using cvsnt + msys + git, it seems like the output of cvs status
had \r\n in it, and caused the command to fail.

This fixes that.

Signed-off-by: Dustin Spicuzza <>
Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>
2 years agoci: install 'libsvn-perl' instead of 'git-svn'
SZEDER Gábor [Tue, 30 Apr 2019 12:37:24 +0000 (14:37 +0200)]
ci: install 'libsvn-perl' instead of 'git-svn'

Since e7e9f5e7a1 (travis-ci: enable Git SVN tests t91xx on Linux,
2016-05-19) some of our Travis CI build jobs install the 'git-svn'
package, because it was a convenient way to install its dependencies,
which are necessary to run our 'git-svn' tests (we don't actually need
the 'git-svn' package itself).  However, from those dependencies,
namely the 'libsvn-perl', 'libyaml-perl', and 'libterm-readkey-perl'
packages, only 'libsvn-perl' is necessary to run those tests, the
others arent, not even to fulfill some prereqs.

So update 'ci/' to install only 'libsvn-perl'
instead of 'git-svn' and its additional dependencies.

Note that this change has more important implications than merely not
installing three unnecessary packages, as it keeps our builds working
with Travis CI's Xenial images.  In our '.travis.yml' we never
explicitly specified which Linux image we want to use to run our Linux
build jobs, and so far they have been run on the default Ubuntu 14.04
Trusty image.  However, 14.04 just reached its EOL, and Travis CI has
already began the transition to use 16.04 Xenial as the default Linux
build environment [1].  Alas, our Linux Clang and GCC build jobs can't
simply 'apt-get install git-svn' in the current Xenial images [2],
like they did in the Trusty images, and, consequently, fail.
Installing only 'libsvn-perl' avoids this issue, while the 'git svn'
tests are still run as they should.


[2] 'apt-get install git-svn' in the Xenial image fails with:

      The following packages have unmet dependencies:
       git-svn : Depends: git (< 1:2.7.4-.)
      E: Unable to correct problems, you have held broken packages.

    The reason is that both the Trusty and Xenial images contain the
    'git' package installed from 'ppa:git-core/ppa', so it's
    considerably newer than the 'git' package in the corresponding
    standard Ubuntu package repositories.  The difference is that the
    Trusty image still contains these third-party apt repositories, so
    the 'git-svn' package was installed from the same PPA, and its
    version matched the version of the already installed 'git'
    package.  In the Xenial image, however, these third-party
    apt-repositories are removed (to reduce the risk of unrelated
    interference and faster 'apt-get update') [3], and the version of
    the 'git-svn' package coming from the standard Ubuntu package
    repositories doesn't match the much more recent version of the
    'git' package installed from the PPA, resulting in this dependecy

    Adding back the 'ppa:git-core/ppa' package repository would solve
    this dependency issue as well, but since the troublesome package
    happens to be unnecessary, not installing it in the first place is


Signed-off-by: SZEDER Gábor <>
Signed-off-by: Junio C Hamano <>
2 years agot4253-am-keep-cr-dos: avoid using pipes
Boxuan Li [Sun, 5 May 2019 08:16:33 +0000 (16:16 +0800)]
t4253-am-keep-cr-dos: avoid using pipes

The exit code of the upstream in a pipe is ignored thus we should avoid
using it. By writing out the output of the git command to a file, we can
test the exit codes of both the commands.

Signed-off-by: Boxuan Li <>
Signed-off-by: Junio C Hamano <>
2 years agocommit-graph: fix memory leak
Josh Steadmon [Mon, 6 May 2019 21:36:58 +0000 (14:36 -0700)]
commit-graph: fix memory leak

Free the commit graph when verify_commit_graph_lite() reports an error.
Credit to OSS-Fuzz for finding this leak.

Signed-off-by: Josh Steadmon <>
Signed-off-by: Junio C Hamano <>
2 years agomidx: add packs to packed_git linked list
Derrick Stolee [Mon, 29 Apr 2019 16:18:56 +0000 (09:18 -0700)]
midx: add packs to packed_git linked list

The multi-pack-index allows searching for objects across multiple
packs using one object list. The original design gains many of
these performance benefits by keeping the packs in the
multi-pack-index out of the packed_git list.

Unfortunately, this has one major drawback. If the multi-pack-index
covers thousands of packs, and a command loads many of those packs,
then we can hit the limit for open file descriptors. The
close_one_pack() method is used to limit this resource, but it
only looks at the packed_git list, and uses an LRU cache to prevent

Instead of complicating this close_one_pack() logic to include
direct references to the multi-pack-index, simply add the packs
opened by the multi-pack-index to the packed_git list. This
immediately solves the file-descriptor limit problem, but requires
some extra steps to avoid performance issues or other problems:

1. Create a multi_pack_index bit in the packed_git struct that is
   one if and only if the pack was loaded from a multi-pack-index.

2. Skip packs with the multi_pack_index bit when doing object
   lookups and abbreviations. These algorithms already check the
   multi-pack-index before the packed_git struct. This has a very
   small performance hit, as we need to walk more packed_git
   structs. This is acceptable, since these operations run binary
   search on the other packs, so this walk-and-ignore logic is
   very fast by comparison.

3. When closing a multi-pack-index file, do not close its packs,
   as those packs will be closed using close_all_packs(). In some
   cases, such as 'git repack', we run 'close_midx()' without also
   closing the packs, so we need to un-set the multi_pack_index bit
   in those packs. This is necessary, and caught by running with GIT_TEST_MULTI_PACK_INDEX=1.

To manually test this change, I inserted trace2 logging into
close_pack_fd() and set pack_max_fds to 10, then ran 'git rev-list
--all --objects' on a copy of the Git repo with 300+ pack-files and
a multi-pack-index. The logs verified the packs are closed as
we read them beyond the file descriptor limit.

Signed-off-by: Derrick Stolee <>
Signed-off-by: Junio C Hamano <>
2 years agomidx: pass a repository pointer
Derrick Stolee [Mon, 29 Apr 2019 16:18:55 +0000 (09:18 -0700)]
midx: pass a repository pointer

Much of the multi-pack-index code focuses on the multi_pack_index
struct, and so we only pass a pointer to the current one. However,
we will insert a dependency on the packed_git linked list in a
future change, so we will need a repository reference. Inserting
these parameters is a significant enough change to split out.

Signed-off-by: Derrick Stolee <>
Signed-off-by: Junio C Hamano <>
2 years agobranch: make create_branch accept a merge base rev
Denton Liu [Sat, 27 Apr 2019 12:02:22 +0000 (05:02 -0700)]
branch: make create_branch accept a merge base rev

When we ran something like

    $ git checkout -b test master...

it would fail with the message

    fatal: Not a valid object name: 'master...'.

This was caused by the call to `create_branch` where `start_name` is
expected to be a valid rev. However, git-checkout allows the branch to
be a valid _merge base_ rev (i.e. with a "...") so it was possible for
an invalid rev to be passed in.

Make `create_branch` accept a merge base rev so that this case does not
error out.

As a side-effect, teach git-branch how to handle merge base revs as

Helped-by: Junio C Hamano <>
Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agot2018: cleanup in current test
Denton Liu [Sat, 27 Apr 2019 12:02:19 +0000 (05:02 -0700)]
t2018: cleanup in current test

Before, in t2018, if do_checkout failed to create `branch2`, the next
test-case would run `git branch -D branch2` but then fail because it was
expecting `branch2` to exist, even though it doesn't. As a result, an
early failure could cause a cascading failure of tests.

Make test-case responsible for cleaning up their own branches so that
future tests can start with a sane environment.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agoparse-options: don't emit "ambiguous option" for aliases
Nguyễn Thái Ngọc Duy [Mon, 29 Apr 2019 10:05:25 +0000 (17:05 +0700)]
parse-options: don't emit "ambiguous option" for aliases

Change the option parsing machinery so that e.g. "clone --recurs ..."
doesn't error out because "clone" understands both "--recursive" and
"--recurse-submodules" to mean the same thing.

Initially "clone" just understood --recursive until the
--recurses-submodules alias was added in ccdd3da652 ("clone: Add the
--recurse-submodules option as alias for --recursive",
2010-11-04). Since bb62e0a99f ("clone: teach --recurse-submodules to
optionally take a pathspec", 2017-03-17) the longer form has been
promoted to the default.

But due to the way the options parsing machinery works this resulted
in the rather absurd situation of:

    $ git clone --recurs [...]
    error: ambiguous option: recurs (could be --recursive or --recurse-submodules)

Add OPT_ALIAS() to express this link between two or more options and use
it in git-clone. Multiple aliases of an option could be written as

    OPT_ALIAS(0, "alias1", "original-name"),
    OPT_ALIAS(0, "alias2", "original-name"),

The current implementation is not exactly optimal in this case. But we
can optimize it when it becomes a problem. So far we don't even have two
aliases of any option.

A big chunk of code is actually from Junio C Hamano.

Signed-off-by: Nguyễn Thái Ngọc Duy <>
Signed-off-by: Junio C Hamano <>
2 years agococcicheck: optionally batch spatch invocations
Jeff King [Mon, 6 May 2019 23:43:34 +0000 (19:43 -0400)]
coccicheck: optionally batch spatch invocations

In our "make coccicheck" rule, we currently feed each source file to its
own individual invocation of spatch. This has a few downsides:

  - it repeats any overhead spatch has for starting up and reading the
    patch file

  - any included header files may get processed from multiple
    invocations. This is slow (we see the same header files multiple
    times) and may produce a resulting patch with repeated hunks (which
    cannot be applied without further cleanup)

Ideally we'd just invoke a single instance of spatch per rule-file and
feed it all source files. But spatch can be rather memory hungry when
run in this way. I measured the peak RSS going from ~90MB for a single
file to ~1900MB for all files. Multiplied by multiple rule files being
processed at the same time (for "make -j"), this can make things slower
or even cause them to fail (e.g., this is reported to happen on our
Travis builds).

Instead, let's provide a tunable knob. We'll leave the default at "1",
but it can be cranked up to "999" for maximum CPU/memory tradeoff, or
people can find points in between that serve their particular machines.

Here are a few numbers running a single rule via:

  SIZES='1 4 16 999'
  for i in $SIZES; do
    make clean
    /usr/bin/time -o $i.out --format='%e | %U | %S | %M' \
      make $RULE.patch SPATCH_BATCH_SIZE=$i
  for i in $SIZES; do
    printf '%4d | %s\n' $i "$(cat $i.out)"

which yields:

     1 | 97.73 | 93.38 | 4.33 | 100128
     4 | 52.80 | 51.14 | 1.69 | 135204
    16 | 35.82 | 35.09 | 0.76 | 284124
   999 | 23.30 | 23.13 | 0.20 | 1903852

The implementation is done with xargs, which should be widely available;
it's in POSIX, we rely on it already in the test suite. And "coccicheck"
is really a developer-only tool anyway, so it's not a big deal if
obscure systems can't run it.

Signed-off-by: Jeff King <>
Signed-off-by: Junio C Hamano <>
2 years agotrace2: fixup access problem on /etc/gitconfig in read_very_early_config
Jeff Hostetler [Mon, 29 Apr 2019 20:14:22 +0000 (13:14 -0700)]
trace2: fixup access problem on /etc/gitconfig in read_very_early_config

Teach do_git_config_sequence() to optionally gently check for access to
the system config.  Use this option in read_very_early_config() when
initializing trace2.

In [1] SZEDER Gábor reported that my changes in [2] introduced a
regression when the user does not have permission to read the system

This commit addresses that problem by optionally ignoring that error.


Signed-off-by: Jeff Hostetler <>
Signed-off-by: Junio C Hamano <>
2 years ago*.[ch]: manually align parameter lists
Denton Liu [Mon, 29 Apr 2019 08:28:23 +0000 (04:28 -0400)]
*.[ch]: manually align parameter lists

In previous patches, extern was mechanically removed from function
declarations without care to formatting, causing parameter lists to be
misaligned. Manually format changed sections such that the parameter
lists should be realigned.

Viewing this patch with 'git diff -w' should produce no output.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years ago*.[ch]: remove extern from function declarations using sed
Denton Liu [Mon, 29 Apr 2019 08:28:20 +0000 (04:28 -0400)]
*.[ch]: remove extern from function declarations using sed

There has been a push to remove extern from function declarations.
Finish the job by removing all instances of "extern" for function
declarations in headers using sed.

This was done by running the following on my system with sed 4.2.2:

    $ git ls-files \*.{c,h} |
        grep -v ^compat/ |
        xargs sed -i'' -e 's/^\(\s*\)extern \([^(]*([^*]\)/\1\2/'

Files under `compat/` are intentionally excluded as some are directly
copied from external sources and we should avoid churning them as much
as possible.

Then, leftover instances of extern were found by running

    $ git grep -w -C3 extern \*.{c,h}

and manually checking the output. No other instances were found.

Note that the regex used specifically excludes function variables which
_should_ be left as extern.

Not the most elegant way to do it but it gets the job done.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years ago*.[ch]: remove extern from function declarations using spatch
Denton Liu [Mon, 29 Apr 2019 08:28:14 +0000 (04:28 -0400)]
*.[ch]: remove extern from function declarations using spatch

There has been a push to remove extern from function declarations.
Remove some instances of "extern" for function declarations which are
caught by Coccinelle. Note that Coccinelle has some difficulty with
processing functions with `__attribute__` or varargs so some `extern`
declarations are left behind to be dealt with in a future patch.

This was the Coccinelle patch used:

type T;
identifier f;
- extern
  T f(...);

and it was run with:

$ git ls-files \*.{c,h} |
grep -v ^compat/ |
xargs spatch --sp-file contrib/coccinelle/noextern.cocci --in-place

Files under `compat/` are intentionally excluded as some are directly
copied from external sources and we should avoid churning them as much
as possible.

Signed-off-by: Denton Liu <>
Signed-off-by: Junio C Hamano <>
2 years agot/perf: add perf script for partial clones
Jeff King [Thu, 2 May 2019 21:45:09 +0000 (17:45 -0400)]
t/perf: add perf script for partial clones

We don't cover the partial clone feature at all in t/perf. Let's at
least run a few basic tests so that we'll notice any regressions.

We'll do a no-blob clone, and split it into two parts: the actual object
transfer, and the subsequent checkout (which will of course require
another transfer to get the blobs). That will help us more clearly
assess the performance of each.

There are obviously a lot more possibilities besides just a no-blob
partial clone, but this should serve as a canary that alerts us to any
generic slow-downs (and we can add more tests later for cases that
aren't exercised here).

There are a few non-ideal things here that make this not an entirely
accurate test, but are probably OK for our purposes:

  1. We have to do some extra prep/cleanup work inside the timing tests,
     since they impact the on-disk state and the perf harness may run
     each one multiple times.

     In practice this is probably OK, since these bits should be much
     less expensive than the operations we are measuring.

  2. The clone time is likely to be dominated by the server's object
     enumeration. In the real world, a repo large enough to drive people
     to partial clones is likely to have reachability bitmaps enabled.

     And in the opposite direction, our object transfer is happening at
     the speed of a local pipe, whereas in the real world it would
     bottle-neck on the network.

     So any percentage speedups should be taken with a grain of salt.
     But hopefully any regressions will produce enough of an effect to
     be noticeable.

This script also demonstrates the recent improvement from dfa33a298d
(clone: do faster object check for partial clones, 2019-04-19):

  Test                          dfa33a298d^         dfa33a298d
  5600.2: clone without blobs   18.41(22.72+1.09)   6.83(11.65+0.50) -62.9%
  5600.3: checkout of result    1.82(3.24+0.26)     1.84(3.24+0.26) +1.1%

Signed-off-by: Jeff King <>
Signed-off-by: Junio C Hamano <>
2 years agotrace2: fix incorrect function pointer check
Josh Steadmon [Thu, 25 Apr 2019 17:08:53 +0000 (10:08 -0700)]
trace2: fix incorrect function pointer check

Fix trace2_data_json_fl() to check for the presence of pfn_data_json_fl
in its targets, rather than pfn_data_fl, which is not actually called.

Signed-off-by: Josh Steadmon <>
Signed-off-by: Junio C Hamano <>
2 years agoHonor core.precomposeUnicode in more places
Elijah Newren [Thu, 25 Apr 2019 14:58:54 +0000 (07:58 -0700)]
Honor core.precomposeUnicode in more places

On Mac's HFS where git sets core.precomposeUnicode to true automatically
by git init/clone, when a user creates a simple unicode refname (in NFC
format) such as españa:

  $ git branch españa

different commands would display the branch name differently.  For
example, git branch, git log --decorate, and git fast-export all used

  65 73 70 61 c3 b1 61  (or "espa\xc3\xb1a")

(NFC form) while show-ref would use

  65 73 70 61 6e cc 83 61  (or "espan\xcc\x83a")

(NFD form).  A stress test for git filter-repo was tripped up by this
inconsistency, though digging in I found that the problems could
compound; for example, if the user ran

  $ git pack-refs --all

and then tried to check out the branch, they would be met with:

  $ git checkout españa
  error: pathspec 'españa' did not match any file(s) known to git

  $ git checkout españa --
  fatal: invalid reference: españa

  $ git branch
  * master

Note that the user could run the `git branch` command first and copy and
paste the `españa` portion of the output and still see the same two
errors.  Also, if the user added --no-prune to the pack-refs command,
then they would see three branches: master, españa, and españa (those
last two are NFC vs. NFD forms, even if they render the same).

Further, if the user had the `españa` branch checked out before
running `git pack-refs --all`, the user would be greeted with (note
that I'm trimming trailing output with an ellipsis):

  $ git rev-parse HEAD
  fatal: ambiguous argument 'HEAD': unknown revision or path...

  $ git status
  On branch españa

  No commits yet...

Or worse, if the user didn't check this stuff first, running `git
commit` will create a new commit with all changes of all of history
being squashed into it.

In addition to pack-refs, one could also get into this state with
upload-pack or anything that calls either pack-refs or upload-pack (e.g.
gc or clone).

Add code in a few places (pack-refs, show-ref, upload-pack) to check and
honor the setting of core.precomposeUnicode to avoid these bugs.

Signed-off-by: Elijah Newren <>
Signed-off-by: Junio C Hamano <>
2 years agogit-compat-util: work around for access(X_OK) under root
Clément Chigot [Thu, 25 Apr 2019 07:01:56 +0000 (07:01 +0000)]
git-compat-util: work around for access(X_OK) under root

On AIX, access(X_OK) may succeed when run as root even if the
execution isn't possible. This behavior is allowed by POSIX
which says:

  ... for a process with appropriate privileges, an implementation
  may indicate success for X_OK even if execute permission is not
  granted to any user.

It can lead hook programs to have their execution refused:

   git commit -m content
   fatal: cannot exec '.git/hooks/pre-commit': Permission denied

Add NEED_ACCESS_ROOT_HANDLER in order to use an access helper function.
It checks with stat if any executable flags is set when the current user
is root.

Signed-off-by: Clément Chigot <>
Signed-off-by: Junio C Hamano <>
2 years agoMakefile: use fileno macro work around on AIX
Clément Chigot [Thu, 18 Apr 2019 08:55:09 +0000 (08:55 +0000)]
Makefile: use fileno macro work around on AIX


On AIX, fileno(fp) is a macro and need to use the work around already made for BSD's.

Signed-off-by: Clément Chigot <>
Signed-off-by: Junio C Hamano <>