thirdparty/git.git
3 days agoFifteenth batch master
Junio C Hamano [Sat, 19 Sep 2020 00:56:18 +0000 (17:56 -0700)] 
Fifteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 days agoMerge branch 'mt/config-fail-nongit-early'
Junio C Hamano [Sat, 19 Sep 2020 00:58:06 +0000 (17:58 -0700)] 
Merge branch 'mt/config-fail-nongit-early'

Unlike "git config --local", "git config --worktree" did not fail
early and cleanly when started outside a git repository.

* mt/config-fail-nongit-early:
  config: complain about --worktree outside of a git repo

3 days agoMerge branch 'jc/dist-tarball-tweak'
Junio C Hamano [Sat, 19 Sep 2020 00:58:05 +0000 (17:58 -0700)] 
Merge branch 'jc/dist-tarball-tweak'

Allow maintainers to tweak $(TAR) invocations done while making
distribution tarballs.

* jc/dist-tarball-tweak:
  Makefile: allow extra tweaking of distribution tarball

3 days agoMerge branch 'mf/submodule-summary-with-correct-repository'
Junio C Hamano [Sat, 19 Sep 2020 00:58:05 +0000 (17:58 -0700)] 
Merge branch 'mf/submodule-summary-with-correct-repository'

"git diff/show" on a change that involves a submodule used to read
the information on commits in the submodule from a wrong repository
and gave a wrong information when the commit-graph is involved.

* mf/submodule-summary-with-correct-repository:
  submodule: use submodule repository when preparing summary
  revision: use repository from rev_info when parsing commits

3 days agoMerge branch 'jc/quote-path-cleanup'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'jc/quote-path-cleanup'

"git status --short" quoted a path with SP in it when tracked, but
not those that are untracked, ignored or unmerged.  They are all
shown quoted consistently.

* jc/quote-path-cleanup:
  quote: turn 'nodq' parameter into a set of flags
  quote: rename misnamed sq_lookup[] to cq_lookup[]
  wt-status: consistently quote paths in "status --short" output
  quote_path: code clarification
  quote_path: optionally allow quoting a path with SP in it
  quote_path: give flags parameter to quote_path()
  quote_path: rename quote_path_relative() to quote_path()

3 days agoMerge branch 'os/collect-changed-submodules-optim'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'os/collect-changed-submodules-optim'

Optimization around submodule handling.

* os/collect-changed-submodules-optim:
  submodule: suppress checking for file name and ref ambiguity for object ids

3 days agoMerge branch 'es/wt-add-detach'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'es/wt-add-detach'

"git worktree add" learns that the "-d" is a synonym to "--detach"
option to create a new worktree without being on a branch.

* es/wt-add-detach:
  git-worktree.txt: discuss branch-based vs. throwaway worktrees
  worktree: teach `add` to recognize -d as shorthand for --detach
  git-checkout.txt: document -d short option for --detach

3 days agoMerge branch 'jk/add-i-fixes'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'jk/add-i-fixes'

"add -i/-p" fixes.

* jk/add-i-fixes:
  add--interactive.perl: specify --no-color explicitly
  add-patch: fix inverted return code of repo_read_index()

3 days agoMerge branch 'pw/add-p-leakfix'
Junio C Hamano [Sat, 19 Sep 2020 00:58:03 +0000 (17:58 -0700)] 
Merge branch 'pw/add-p-leakfix'

Leakfix.

* pw/add-p-leakfix:
  add -p: fix memory leak

3 days agoMerge branch 'jc/add-i-use-builtin-experimental'
Junio C Hamano [Sat, 19 Sep 2020 00:58:02 +0000 (17:58 -0700)] 
Merge branch 'jc/add-i-use-builtin-experimental'

The "add -i/-p" machinery has been written in C but it is not used
by default yet.  It is made default to those who are participating
in feature.experimental experiment.

* jc/add-i-use-builtin-experimental:
  add -i: use the built-in version when feature.experimental is set

3 days agoMerge branch 'al/t3200-back-on-a-branch'
Junio C Hamano [Sat, 19 Sep 2020 00:58:02 +0000 (17:58 -0700)] 
Merge branch 'al/t3200-back-on-a-branch'

Test fix.

* al/t3200-back-on-a-branch:
  t3200: clean side effect of git checkout --orphan

3 days agoMerge branch 'hn/refs-ref-log-only-bit'
Junio C Hamano [Sat, 19 Sep 2020 00:58:01 +0000 (17:58 -0700)] 
Merge branch 'hn/refs-ref-log-only-bit'

A bit of API reshuffling to make sure stuff common to all backends
are not defined only in files backend.

* hn/refs-ref-log-only-bit:
  refs: move REF_LOG_ONLY to refs-internal.h

3 days agoMerge branch 'ea/blame-use-oideq'
Junio C Hamano [Sat, 19 Sep 2020 00:58:01 +0000 (17:58 -0700)] 
Merge branch 'ea/blame-use-oideq'

Code cleanup.

* ea/blame-use-oideq:
  blame.c: replace instance of !oidcmp for oideq

3 days agoMerge branch 'pb/clang-json-compilation-database'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'pb/clang-json-compilation-database'

Developer support.

* pb/clang-json-compilation-database:
  Makefile: add support for generating JSON compilation database

3 days agoMerge branch 'so/log-tree-diff-cleanup'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'so/log-tree-diff-cleanup'

Code cleanup.

* so/log-tree-diff-cleanup:
  log_tree_diff: get rid of extra check for NULL
  log_tree_diff: get rid of code duplication for first_parent_only

3 days agoMerge branch 'rs/parallel-read-cache-fix'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'rs/parallel-read-cache-fix'

A follow-up fix to a topic already in 'master'.

* rs/parallel-read-cache-fix:
  read-cache: fix mem-pool allocation for multi-threaded index loading

3 days agoMerge branch 'rs/refspec-leakfix'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'rs/refspec-leakfix'

Leakfix.

* rs/refspec-leakfix:
  refspec: add and use refspec_appendf()
  push: release strbufs used for refspec formatting

3 days agoMerge branch 'rs/misc-cleanups'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'rs/misc-cleanups'

Misc cleanups.

* rs/misc-cleanups:
  pack-bitmap-write: use hashwrite_be32() in write_hash_cache()
  midx: use hashwrite_u8() in write_midx_header()
  fast-import: use write_pack_header()

12 days agoquote: turn 'nodq' parameter into a set of flags
Junio C Hamano [Thu, 10 Sep 2020 17:01:59 +0000 (10:01 -0700)] 
quote: turn 'nodq' parameter into a set of flags

quote_c_style() and its friend quote_two_c_style() both take an
optional "please omit the double quotes around the quoted body"
parameter.  Turn it into a flag word, assign one bit out of it,
and call it CQUOTE_NODQ bit.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agoquote: rename misnamed sq_lookup[] to cq_lookup[]
Junio C Hamano [Thu, 10 Sep 2020 17:01:58 +0000 (10:01 -0700)] 
quote: rename misnamed sq_lookup[] to cq_lookup[]

This table is used to see if each byte needs quoting when responding
to a request to C-quote the string, not quoting with single-quote in
the shell style.  Similarly, sq_must_quote() is fed each byte from
the string being C-quoted.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agowt-status: consistently quote paths in "status --short" output
Junio C Hamano [Thu, 10 Sep 2020 17:01:57 +0000 (10:01 -0700)] 
wt-status: consistently quote paths in "status --short" output

Tracked paths with SP in them were cquoted in "git status --short"
output, but untracked, ignored, and unmerged paths weren't.

The test was stolen from a patch to fix output for the 'untracked'
paths by brian m. carlson, with similar tests added for 'ignored'
ones.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agoquote_path: code clarification
Junio C Hamano [Thu, 10 Sep 2020 17:01:56 +0000 (10:01 -0700)] 
quote_path: code clarification

The implementation we moved from wt-status to enclose a pathname
that has a SP in it inside a dq-pair is a bit convoluted.  It lets
quote_c_style_counted() do its escaping and then

 (1) if the input string got escaped, which is checked by seeing if
     the result begins with a double-quote, declare that we are
     done.  If there wasn't any SP in the input, that is OK, and if
     there was, the result is quoted already so it is OK, too.

 (2) if the input string did not get escaped, and the result has SP
     in it, enclose the whole thing in a dq-pair ourselves.

Instead we can scan the path upfront to see if the input has SP in
it.  If so, we tell quote_c_style_counted() not to enclose its
output in a dq-pair, and we add a dq-pair ourselves.  Whether the
input had bytes that quote_c_style_counted() uses backslash quoting,
this would give us a desired quoted string.  If the input does not
have SP in it, we just let quote_c_style_counted() do its thing as
usual, which would enclose the result in a dq-pair only when needed.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agoquote_path: optionally allow quoting a path with SP in it
Junio C Hamano [Thu, 10 Sep 2020 17:01:55 +0000 (10:01 -0700)] 
quote_path: optionally allow quoting a path with SP in it

Some code in wt-status.c special case a path with SP in it, which
usually does not have to be c-quoted, and ensure that such a path
does get quoted.  Move the logic to quote_path() and give it a bit
in the flags word, QUOTE_PATH_QUOTE_SP.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agoquote_path: give flags parameter to quote_path()
Junio C Hamano [Thu, 10 Sep 2020 17:01:54 +0000 (10:01 -0700)] 
quote_path: give flags parameter to quote_path()

The quote_path() function computes a path (relative to its base
directory) and c-quotes the result if necessary.  Teach it to take a
flags parameter to allow its behaviour to be enriched later.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 days agoquote_path: rename quote_path_relative() to quote_path()
Junio C Hamano [Thu, 10 Sep 2020 17:01:53 +0000 (10:01 -0700)] 
quote_path: rename quote_path_relative() to quote_path()

There is no quote_path_absolute() or anything that causes confusion,
and one of the two large consumers already rename the long name
locally with a preprocessor macro.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoFourteenth batch
Junio C Hamano [Wed, 9 Sep 2020 20:52:54 +0000 (13:52 -0700)] 
Fourteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoMerge branch 'os/vcbuild'
Junio C Hamano [Wed, 9 Sep 2020 20:53:09 +0000 (13:53 -0700)] 
Merge branch 'os/vcbuild'

Fix build procedure for MSVC.

* os/vcbuild:
  contrib/buildsystems: fix expat library name for generated vcxproj
  vcbuild: fix batch file name in README
  vcbuild: fix library name for expat with make MSVC=1

13 days agoMerge branch 'jt/interpret-branch-name-fallback'
Junio C Hamano [Wed, 9 Sep 2020 20:53:08 +0000 (13:53 -0700)] 
Merge branch 'jt/interpret-branch-name-fallback'

"git status" has trouble showing where it came from by interpreting
reflog entries that recordcertain events, e.g. "checkout @{u}", and
gives a hard/fatal error.  Even though it inherently is impossible
to give a correct answer because the reflog entries lose some
information (e.g. "@{u}" does not record what branch the user was
on hence which branch 'the upstream' needs to be computed, and even
if the record were available, the relationship between branches may
have changed), at least hide the error to allow "status" show its
output.

* jt/interpret-branch-name-fallback:
  wt-status: tolerate dangling marks
  refs: move dwim_ref() to header file
  sha1-name: replace unsigned int with option struct

13 days agoMerge branch 'js/ci-squelch-false-failure'
Junio C Hamano [Wed, 9 Sep 2020 20:53:08 +0000 (13:53 -0700)] 
Merge branch 'js/ci-squelch-false-failure'

CI noise reduction.

* js/ci-squelch-false-failure:
  ci: avoid ugly "failure" in the `ci-config` job
  ci: fix indentation of the `ci-config` job

13 days agoMerge branch 'pb/imap-send-updates'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'pb/imap-send-updates'

"git imap-send" updates.

* pb/imap-send-updates:
  git-imap-send.txt: add note about localized Gmail folders
  git-imap-send.txt: do verify SSL certificate for gmail.com
  git-imap-send.txt: don't duplicate 'Examples' sections

13 days agoMerge branch 'hv/ref-filter-misc'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'hv/ref-filter-misc'

The "--format=" option to the "for-each-ref" command and friends
learned a few more tricks, e.g. the ":short" suffix that applies to
"objectname" now also can be used for "parent", "tree", etc.

* hv/ref-filter-misc:
  ref-filter: add `sanitize` option for 'subject' atom
  pretty: refactor `format_sanitized_subject()`
  ref-filter: add `short` modifier to 'parent' atom
  ref-filter: add `short` modifier to 'tree' atom
  ref-filter: rename `objectname` related functions and fields
  ref-filter: modify error messages in `grab_objectname()`
  ref-filter: refactor `grab_objectname()`
  ref-filter: support different email formats

13 days agoMerge branch 'ss/submodule-summary-in-c-fixes'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'ss/submodule-summary-in-c-fixes'

Fixups to a topic in 'next'.

* ss/submodule-summary-in-c-fixes:
  t7421: eliminate 'grep' check in t7421.4 for mingw compatibility
  submodule: fix style in function definition
  submodule: eliminate unused parameters from print_submodule_summary()

13 days agoMerge branch 'so/separate-field-for-m-and-diff-merges'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'so/separate-field-for-m-and-diff-merges'

Internal API clean-up to handle two options "diff-index" and "log"
have, which happen to share the same short form, more sensibly.

* so/separate-field-for-m-and-diff-merges:
  revision: add separate field for "-m" of "diff-index -m"

13 days agoMerge branch 'es/worktree-repair'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'es/worktree-repair'

"git worktree" gained a "repair" subcommand to help users recover
after moving the worktrees or repository manually without telling
Git.  Also, "git init --separate-git-dir" no longer corrupts
administrative data related to linked worktrees.

* es/worktree-repair:
  init: make --separate-git-dir work from within linked worktree
  init: teach --separate-git-dir to repair linked worktrees
  worktree: teach "repair" to fix outgoing links to worktrees
  worktree: teach "repair" to fix worktree back-links to main worktree
  worktree: add skeleton "repair" command

13 days agoMerge branch 'jk/worktree-check-clean-leakfix'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'jk/worktree-check-clean-leakfix'

Leakfix.

* jk/worktree-check-clean-leakfix:
  worktree: fix leak in check_clean_worktree()

13 days agoMerge branch 'tb/repack-clearing-midx'
Junio C Hamano [Wed, 9 Sep 2020 20:53:06 +0000 (13:53 -0700)] 
Merge branch 'tb/repack-clearing-midx'

When a packfile is removed by "git repack", multi-pack-index gets
cleared; the code was taught to do so less aggressively by first
checking if the midx actually refers to a pack that no longer
exists.

* tb/repack-clearing-midx:
  midx: traverse the local MIDX first
  builtin/repack.c: invalidate MIDX only when necessary

13 days agoMerge branch 'ss/submodule-summary-in-c'
Junio C Hamano [Wed, 9 Sep 2020 20:53:05 +0000 (13:53 -0700)] 
Merge branch 'ss/submodule-summary-in-c'

Yet another subcommand of "git submodule" is getting rewritten in C.

* ss/submodule-summary-in-c:
  submodule: port submodule subcommand 'summary' from shell to C
  t7421: introduce a test script for verifying 'summary' output
  submodule: rename helper functions to avoid ambiguity
  submodule: remove extra line feeds between callback struct and macro

13 days agoconfig: complain about --worktree outside of a git repo
Matheus Tavares [Wed, 9 Sep 2020 13:16:08 +0000 (10:16 -0300)] 
config: complain about --worktree outside of a git repo

Running `git config --worktree` outside of a git repository hits a BUG()
when trying to enumerate the worktrees. Let's catch this error earlier
and die() with a friendlier message.

Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoMakefile: allow extra tweaking of distribution tarball
Junio C Hamano [Wed, 9 Sep 2020 18:53:04 +0000 (11:53 -0700)] 
Makefile: allow extra tweaking of distribution tarball

The maintainer's dist rules are used to produce distribution
tarballs.  They use "$(TAR) cf" and "$(TAR) rf" to produce archives
out of a freshly created local installation area, which means that
the built product can be affected by maintainer's umask and other
local environment.

Implementations of "tar" have ways (implementation specific,
unfortunately) to force permission bits and other stuff to allow the
user to hide these effects coming from the local environment.  Teach
our Makefile to allow the maintainer to tweak the invocation of the
$(TAR) commands by setting TAR_DIST_EXTRA_OPTS.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoblame.c: replace instance of !oidcmp for oideq
Edmundo Carmona Antoranz [Tue, 8 Sep 2020 21:10:53 +0000 (15:10 -0600)] 
blame.c: replace instance of !oidcmp for oideq

0906ac2b (blame: use changed-path Bloom filters, 2020-04-16)
introduced a call to oidcmp() that should have been oideq(), which
was introduced in 14438c44 (introduce hasheq() and oideq(),
2018-08-28).

Signed-off-by: Edmundo Carmona Antoranz <eantoranz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agorefs: move REF_LOG_ONLY to refs-internal.h
Han-Wen Nienhuys [Fri, 28 Aug 2020 15:25:33 +0000 (15:25 +0000)] 
refs: move REF_LOG_ONLY to refs-internal.h

REF_LOG_ONLY is used in the transaction preparation: if a symref is involved in
a transaction, the referent of the symref should be updated, and the symref
itself should only be updated in the reflog.

Other ref backends will need to duplicate this logic too, so move it to a
central place.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agot3200: clean side effect of git checkout --orphan
Aaron Lipman [Sun, 30 Aug 2020 22:42:00 +0000 (18:42 -0400)] 
t3200: clean side effect of git checkout --orphan

The "refuse --edit-description on unborn branch for now" test in t3200
switches to an orphan branch, causing subsequent git commands
referencing HEAD to fail. Avoid this side-effect by switching back to
master after the test finishes.

This has gone undetected, as the next affected test expects failure -
but it currently fails for the wrong reason.

Verbose output of the next test referencing HEAD,
"--merged is incompatible with --no-merged":

  fatal: malformed object name HEAD

Which this commit corrects to:

  error: option `no-merged' is incompatible with --merged

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoadd -i: use the built-in version when feature.experimental is set
Junio C Hamano [Tue, 8 Sep 2020 21:53:36 +0000 (14:53 -0700)] 
add -i: use the built-in version when feature.experimental is set

We have had parallel implementations of "add -i/-p" since 2.25 and
have been using them from various codepaths since 2.26 days, but
never made the built-in version the default.

We have found and fixed a handful of corner case bugs in the
built-in version, and it may be a good time to start switching over
the user base from the scripted version to the built-in version.
Let's enable the built-in version for those who opt into the
feature.experimental guinea-pig program to give wider exposure.

Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoadd -p: fix memory leak
Phillip Wood [Mon, 7 Sep 2020 15:04:00 +0000 (15:04 +0000)] 
add -p: fix memory leak

asan reports that the C version of `add -p` is not freeing all the
memory it allocates. Fix this by introducing a function to clear
`struct add_p_state` and use it instead of freeing individual members.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agocontrib/buildsystems: fix expat library name for generated vcxproj
Orgad Shaneh [Mon, 7 Sep 2020 06:00:05 +0000 (06:00 +0000)] 
contrib/buildsystems: fix expat library name for generated vcxproj

expat.lib -> libexpat.lib (libexpatd.lib for debug build).

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoadd--interactive.perl: specify --no-color explicitly
Jeff King [Mon, 7 Sep 2020 08:17:39 +0000 (04:17 -0400)] 
add--interactive.perl: specify --no-color explicitly

Our color tests of "git add -p" do something a bit different from how a
normal user would behave: we pretend there's a pager in use, so that Git
thinks it's OK to write color to a non-tty stdout.  This comes from
8539b46534 (t3701: avoid depending on the TTY prerequisite, 2019-12-06),
which allows us to avoid a lot of complicated mock-tty code.

However, those environment variables also make their way down to
sub-processes of add--interactive, including the "diff-files" we run to
generate the patches. As a result, it thinks it should output color,
too. So in t3701.50, for example, the machine-readable version of the
diff we get unexpectedly has color in it. We fail to parse it as a diff
and think there are zero hunks.

The test does still pass, though, because even with zero hunks we'll
dump the diff header (and we consider those unparseable bits to be part
of the header!), and so the output still has the expected color codes in
it. We don't notice that the command was totally broken and failed to
apply anything.

And in fact we're not really testing what we think we are about the
color, either. While add--interactive does correctly show the version we
got from running "diff-files --color", we'd also pass the test if we had
accidentally shown the machine-readable version, too, since it
(erroneously) has color codes in it.

One could argue that the test isn't very realistic; it's setting up this
"pretend there's a pager" situation to get around the tty restrictions
of the test environment. So one option would be to move back towards
using a real tty. But the behavior of add--interactive really is
user-visible here. If a user, for whatever reason, did run "git
--paginate add --patch" (perhaps because their pager is really a filter
or something), the command would totally fail to do anything useful.

Since we know that we don't want color in this output, let's just make
add--interactive more defensive, and say "--no-color" explicitly. It
doesn't hurt anything in the common case, but it fixes this odd case and
lets our test function properly again.

Note that the C builtin run_add_p() already passes --no-color, so it
doesn't need a similar fix. That will eventually replace this perl code
anyway, but the test change here will be valuable for ensuring that.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
13 days agoadd-patch: fix inverted return code of repo_read_index()
Jeff King [Mon, 7 Sep 2020 08:08:53 +0000 (04:08 -0400)] 
add-patch: fix inverted return code of repo_read_index()

After applying hunks to a file with "add -p", the C patch_update_file()
function tries to refresh the index (just like the perl version does).
We can only refresh the index if we're able to read it in, so we first
check the return value of repo_read_index(). But unlike many functions,
where "0" is success, that function is documented to return the number
of entries in the index.  Hence we should be checking for success with a
non-negative return value.

Neither the tests nor any users seem to have noticed this, probably due
to a combination of:

  - this affects only the C version, which is not yet the default

  - following it up with any porcelain command like "git diff" or "git
    commit" would refresh the index automatically.

But you can see the problem by running the plumbing "git diff-files"
immediately after "add -p" stages all hunks. Running the new test with
GIT_TEST_ADD_I_USE_BUILTIN=1 fails without the matching code change.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agogit-worktree.txt: discuss branch-based vs. throwaway worktrees
Eric Sunshine [Mon, 7 Sep 2020 00:02:22 +0000 (20:02 -0400)] 
git-worktree.txt: discuss branch-based vs. throwaway worktrees

By default, `git worktree add` creates a new worktree associated with a
particular branch (which may have been created automatically if not
specified explicitly on the command-line). It is also convenient to
create throwaway worktrees not associated with any branch, which can be
handy when making experimental changes or doing testing. However, the
latter use-case may not be obvious to newcomers since the high-level
description of worktrees talks only about checking out "more than one
branch at a time". Therefore, enhance the description to to discuss both
use-cases.

A secondary goal of highlighting the distinction between branch-based
and throwaway worktrees is to help newcomers understand that the
simplest form `git worktree add <path>` automatically creates a new
branch. Stating this early in the description, may help newcomers avoid
creating branches without realizing they are doing so, and later
wondering why `git branch --list` shows branches the user did not
intentionally create.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoworktree: teach `add` to recognize -d as shorthand for --detach
Eric Sunshine [Mon, 7 Sep 2020 00:02:21 +0000 (20:02 -0400)] 
worktree: teach `add` to recognize -d as shorthand for --detach

Like `git switch` and `git checkout`, `git worktree add` can check out a
branch or set up a detached HEAD. However, unlike those other commands,
`git worktree add` does not understand -d as shorthand for --detach,
which may confound users accustomed to using -d for this purpose.
Address this shortcoming by teaching `add` to recognize -d for --detach,
thus bringing it in line with the other commands.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agogit-checkout.txt: document -d short option for --detach
Eric Sunshine [Mon, 7 Sep 2020 00:02:20 +0000 (20:02 -0400)] 
git-checkout.txt: document -d short option for --detach

`git checkout` learned -d as short option for --detach in 163e3b2975
(switch: add short option for --detach, 2019-03-29) but the
documentation was never updated to reflect the change.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agosubmodule: suppress checking for file name and ref ambiguity for object ids
Orgad Shaneh [Sun, 6 Sep 2020 20:53:55 +0000 (20:53 +0000)] 
submodule: suppress checking for file name and ref ambiguity for object ids

The argv argument of collect_changed_submodules() contains only object ids
(the objects references of all the refs).

Notify setup_revisions() that the input is not filenames by passing
assume_dashdash, so it can avoid redundant stat for each ref.

Also suppress refname_ambiguity flag to avoid filesystem lookups for
each object. Similar logic can be found in cat-file, pack-objects and more.

This change reduces the time for git fetch in my repo from 25s to 6s.

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agopack-bitmap-write: use hashwrite_be32() in write_hash_cache()
René Scharfe [Sun, 6 Sep 2020 08:59:06 +0000 (10:59 +0200)] 
pack-bitmap-write: use hashwrite_be32() in write_hash_cache()

Call hashwrite_be32() instead of open-coding it.  This is shorter and
easier to read.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agomidx: use hashwrite_u8() in write_midx_header()
René Scharfe [Sun, 6 Sep 2020 08:59:02 +0000 (10:59 +0200)] 
midx: use hashwrite_u8() in write_midx_header()

Emit byte-sized values using hashwrite_u8() instead of buffering them
locally first.  The hashwrite functions already do their own buffering,
so this double-buffering does not reduce the number of system calls.
Getting rid of it shortens and simplifies the code a bit.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agofast-import: use write_pack_header()
René Scharfe [Sun, 6 Sep 2020 08:39:23 +0000 (10:39 +0200)] 
fast-import: use write_pack_header()

Call write_pack_header() to hash and write a pack header instead of
open-coding this function.  This gets rid of duplicate code and of the
magic version number 2 -- which has been used here since c90be46abd
(Changed fast-import's pack header creation to use pack.h, 2006-08-16)
and in pack.h (again) since 29f049a0c2 (Revert "move pack creation to
version 3", 2006-10-14).

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agorefspec: add and use refspec_appendf()
René Scharfe [Sat, 5 Sep 2020 14:49:30 +0000 (16:49 +0200)] 
refspec: add and use refspec_appendf()

Add a function for building a refspec using printf-style formatting.  It
frees callers from managing their own buffer.  Use it throughout the
tree to shorten and simplify its callers.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agopush: release strbufs used for refspec formatting
René Scharfe [Sat, 5 Sep 2020 14:47:47 +0000 (16:47 +0200)] 
push: release strbufs used for refspec formatting

map_refspec() either returns the passed in ref string or a detached
strbuf.  This makes it hard for callers to release the possibly
allocated memory, and set_refspecs() consequently leaks it.

Let map_refspec() append any refspecs directly and release its own
strbufs after use.  Rename it to refspec_append_mapped() and don't
return anything to reflect its increased responsibility.

set_refspecs() also leaks its strbufs.  Do the same here and directly
call refspec_append() in each if branch instead of holding onto a
detached strbuf, then dispose of the allocated memory after use.  We
need to add an else branch for the final call because all the other
conditional branches already add their formatted refspec now.

setup_push_upstream() and setup_push_current() forgot to release their
strbufs as well; plug these leaks, too, while at it.

None of these leaks were likely to impact users, because the number
and sizes of refspecs are usually small and the allocations are only
done once per program run.  Clean them up nevertheless, as another
step on the long road towards zero memory leaks.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoread-cache: fix mem-pool allocation for multi-threaded index loading
René Scharfe [Fri, 4 Sep 2020 17:33:55 +0000 (19:33 +0200)] 
read-cache: fix mem-pool allocation for multi-threaded index loading

44c7e1a7e0 (mem-pool: use more standard initialization and finalization,
2020-08-15) moved the allocation of the mem-pool structure to callers.
It also added an allocation to load_cache_entries_threaded(), but for an
unrelated mem-pool.  Fix that by allocating the correct one instead --
the one that is initialized two lines later.

Reported-by: Sandor Bodo-Merle <sbodomerle@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoMakefile: add support for generating JSON compilation database
Philippe Blain [Thu, 3 Sep 2020 22:13:38 +0000 (22:13 +0000)] 
Makefile: add support for generating JSON compilation database

Tools based on LibClang [1] can make use of a 'JSON Compilation
Database' [2] that keeps track of the exact options used to compile a set
of source files.

For example, clangd [3], which is a C language server protocol
implementation, can use a JSON compilation database to determine the
flags needed to compile a file so it can provide proper editor
integration.  As a result, editors supporting the language server
protocol (such as VS Code, Emacs, or Vim, with suitable plugins) can
provide better searching, integration, and refactoring tools.

The Clang compiler can generate JSON fragments when compiling [4],
using the `-MJ` flag. These JSON fragments (one per compiled source
file) can then be concatenated to create the compilation database,
commonly called 'compile_commands.json'.

Add support to the Makefile for generating these JSON fragments as well
as the compilation database itself, if the environment variable
'GENERATE_COMPILATION_DATABASE' is set.

If this variable is set, check that $(CC) indeed supports the `-MJ`
flag, following what is done for automatic dependencies.

All JSON fragments are placed in the 'compile_commands/' directory, and
the compilation database 'compile_commands.json' is generated as a
dependency of the 'all' target using a `sed` invocation.

[1] https://clang.llvm.org/docs/Tooling.html
[2] https://clang.llvm.org/docs/JSONCompilationDatabase.html
[3] https://clangd.llvm.org/
[4] https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mj-arg

Helped-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agolog_tree_diff: get rid of extra check for NULL
Sergey Organov [Fri, 28 Aug 2020 11:05:26 +0000 (14:05 +0300)] 
log_tree_diff: get rid of extra check for NULL

Get rid of needless check of 'parents' for NULL. The NULL case
is already handled right above, and 'parents' is dereferenced
without check below anyway.

Signed-off-by: Sergey Organov <sorganov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agolog_tree_diff: get rid of code duplication for first_parent_only
Sergey Organov [Fri, 28 Aug 2020 11:05:25 +0000 (14:05 +0300)] 
log_tree_diff: get rid of code duplication for first_parent_only

Handle first_parent_only by breaking from generic loop early
rather than by duplicating (part of) the loop body.

Signed-off-by: Sergey Organov <sorganov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoThirteenth batch
Junio C Hamano [Thu, 3 Sep 2020 19:23:59 +0000 (12:23 -0700)] 
Thirteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoMerge branch 'pb/doc-external-diff-env'
Junio C Hamano [Thu, 3 Sep 2020 19:37:09 +0000 (12:37 -0700)] 
Merge branch 'pb/doc-external-diff-env'

Doc update.

* pb/doc-external-diff-env:
  git.txt: correct stale 'GIT_EXTERNAL_DIFF' description

2 weeks agoMerge branch 'jk/xrealloc-avoid-use-after-free'
Junio C Hamano [Thu, 3 Sep 2020 19:37:08 +0000 (12:37 -0700)] 
Merge branch 'jk/xrealloc-avoid-use-after-free'

It was possible for xrealloc() to send a non-NULL pointer that has
been freed, which has been fixed.

* jk/xrealloc-avoid-use-after-free:
  xrealloc: do not reuse pointer freed by zero-length realloc()

2 weeks agoMerge branch 'jc/post-checkout-doc'
Junio C Hamano [Thu, 3 Sep 2020 19:37:07 +0000 (12:37 -0700)] 
Merge branch 'jc/post-checkout-doc'

Doc update.

* jc/post-checkout-doc:
  doc: clarify how exit status of post-checkout hook is used

2 weeks agoMerge branch 'pb/doc-sequence-editor-configuration'
Junio C Hamano [Thu, 3 Sep 2020 19:37:06 +0000 (12:37 -0700)] 
Merge branch 'pb/doc-sequence-editor-configuration'

Doc update.

* pb/doc-sequence-editor-configuration:
  doc: mention GIT_SEQUENCE_EDITOR and 'sequence.editor' more

2 weeks agoMerge branch 'hl/bisect-doc-clarify-bad-good-ordering'
Junio C Hamano [Thu, 3 Sep 2020 19:37:06 +0000 (12:37 -0700)] 
Merge branch 'hl/bisect-doc-clarify-bad-good-ordering'

Doc update.

* hl/bisect-doc-clarify-bad-good-ordering:
  bisect: swap command-line options in documentation

2 weeks agoMerge branch 'so/pretty-abbrev-doc'
Junio C Hamano [Thu, 3 Sep 2020 19:37:05 +0000 (12:37 -0700)] 
Merge branch 'so/pretty-abbrev-doc'

Documentation update for "--no-abbrev-commit".

* so/pretty-abbrev-doc:
  pretty-options.txt: fix --no-abbrev-commit description

2 weeks agoMerge branch 'mr/diff-hide-stat-wo-textual-change'
Junio C Hamano [Thu, 3 Sep 2020 19:37:05 +0000 (12:37 -0700)] 
Merge branch 'mr/diff-hide-stat-wo-textual-change'

"git diff --stat -w" showed 0-line changes for paths whose changes
were only whitespaces, which was not intuitive.  We now omit such
paths from the stat output.

* mr/diff-hide-stat-wo-textual-change:
  diff: teach --stat to ignore uninteresting modifications

2 weeks agoMerge branch 'jt/lazy-fetch'
Junio C Hamano [Thu, 3 Sep 2020 19:37:04 +0000 (12:37 -0700)] 
Merge branch 'jt/lazy-fetch'

Updates to on-demand fetching code in lazily cloned repositories.

* jt/lazy-fetch:
  fetch: no FETCH_HEAD display if --no-write-fetch-head
  fetch-pack: remove no_dependents code
  promisor-remote: lazy-fetch objects in subprocess
  fetch-pack: do not lazy-fetch during ref iteration
  fetch: only populate existing_refs if needed
  fetch: avoid reading submodule config until needed
  fetch: allow refspecs specified through stdin
  negotiator/noop: add noop fetch negotiator

2 weeks agoMerge branch 'jc/run-command-use-embedded-args'
Junio C Hamano [Thu, 3 Sep 2020 19:37:03 +0000 (12:37 -0700)] 
Merge branch 'jc/run-command-use-embedded-args'

Various callers of run_command API has been modernized.

* jc/run-command-use-embedded-args:
  run_command: teach API users to use embedded 'args' more

2 weeks agoMerge branch 'jc/undash-in-tree-git-callers'
Junio C Hamano [Thu, 3 Sep 2020 19:37:03 +0000 (12:37 -0700)] 
Merge branch 'jc/undash-in-tree-git-callers'

A handful of places in in-tree code still relied on being able to
execute the git subcommands, especially built-ins, in "git-foo"
form, which have been corrected.

* jc/undash-in-tree-git-callers:
  credential-cache: use child_process.args
  cvsexportcommit: do not run git programs in dashed form
  transport-helper: do not run git-remote-ext etc. in dashed form

2 weeks agoMerge branch 'jk/slimmed-down'
Junio C Hamano [Thu, 3 Sep 2020 19:37:02 +0000 (12:37 -0700)] 
Merge branch 'jk/slimmed-down'

Trim an unused binary and turn a bunch of commands into built-in.

* jk/slimmed-down:
  drop vcs-svn experiment
  make git-fast-import a builtin
  make git-bugreport a builtin
  make credential helpers builtins
  Makefile: drop builtins from MSVC pdb list

2 weeks agoMerge branch 'pw/add-p-allowed-options-fix'
Junio C Hamano [Thu, 3 Sep 2020 19:37:02 +0000 (12:37 -0700)] 
Merge branch 'pw/add-p-allowed-options-fix'

"git add -p" update.

* pw/add-p-allowed-options-fix:
  add -p: fix checking of user input
  add -p: use ALLOC_GROW_BY instead of ALLOW_GROW

2 weeks agoMerge branch 'jt/fetch-pack-loosen-validation-with-packfile-uri'
Junio C Hamano [Thu, 3 Sep 2020 19:37:01 +0000 (12:37 -0700)] 
Merge branch 'jt/fetch-pack-loosen-validation-with-packfile-uri'

Bugfix for "git fetch" when the packfile URI capability is in use.

* jt/fetch-pack-loosen-validation-with-packfile-uri:
  fetch-pack: make packfile URIs work with transfer.fsckobjects
  fetch-pack: document only_packfile in get_pack()
  (various): document from_promisor parameter

2 weeks agoMerge branch 'ss/t7401-modernize'
Junio C Hamano [Thu, 3 Sep 2020 19:37:01 +0000 (12:37 -0700)] 
Merge branch 'ss/t7401-modernize'

Test clean-up.

* ss/t7401-modernize:
  t7401: add a NEEDSWORK
  t7401: change indentation for enhanced readability
  t7401: change syntax of test_i18ncmp calls for clarity
  t7401: use 'short' instead of 'verify' and cut in rev-parse calls
  t7401: modernize style

2 weeks agoMerge branch 'pw/rebase-i-more-options'
Junio C Hamano [Thu, 3 Sep 2020 19:37:01 +0000 (12:37 -0700)] 
Merge branch 'pw/rebase-i-more-options'

"git rebase -i" learns a bit more options.

* pw/rebase-i-more-options:
  t3436: do not run git-merge-recursive in dashed form
  rebase: add --reset-author-date
  rebase -i: support --ignore-date
  rebase -i: support --committer-date-is-author-date
  am: stop exporting GIT_COMMITTER_DATE
  rebase -i: add --ignore-whitespace flag

2 weeks agovcbuild: fix batch file name in README
Orgad Shaneh [Wed, 2 Sep 2020 20:18:20 +0000 (20:18 +0000)] 
vcbuild: fix batch file name in README

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agovcbuild: fix library name for expat with make MSVC=1
Orgad Shaneh [Wed, 2 Sep 2020 20:16:38 +0000 (20:16 +0000)] 
vcbuild: fix library name for expat with make MSVC=1

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agowt-status: tolerate dangling marks
Jonathan Tan [Tue, 1 Sep 2020 22:28:09 +0000 (15:28 -0700)] 
wt-status: tolerate dangling marks

When a user checks out the upstream branch of HEAD, the upstream branch
not being a local branch, and then runs "git status", like this:

  git clone $URL client
  cd client
  git checkout @{u}
  git status

no status is printed, but instead an error message:

  fatal: HEAD does not point to a branch

(This error message when running "git branch" persists even after
checking out other things - it only stops after checking out a branch.)

This is because "git status" reads the reflog when determining the "HEAD
detached" message, and thus attempts to DWIM "@{u}", but that doesn't
work because HEAD no longer points to a branch.

Therefore, when calculating the status of a worktree, tolerate dangling
marks. This is done by adding an additional parameter to
dwim_ref() and repo_dwim_ref().

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agorefs: move dwim_ref() to header file
Jonathan Tan [Tue, 1 Sep 2020 22:28:08 +0000 (15:28 -0700)] 
refs: move dwim_ref() to header file

This makes it clear that dwim_ref() is just repo_dwim_ref() without the
first parameter.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agosha1-name: replace unsigned int with option struct
Jonathan Tan [Tue, 1 Sep 2020 22:28:07 +0000 (15:28 -0700)] 
sha1-name: replace unsigned int with option struct

In preparation for a future patch adding a boolean parameter to
repo_interpret_branch_name(), which might be easily confused with an
existing unsigned int parameter, refactor repo_interpret_branch_name()
to take an option struct instead of the unsigned int parameter.

The static function interpret_branch_mark() is also updated to take the
option struct in preparation for that future patch, since it will also
make use of the to-be-introduced boolean parameter.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agofetch: no FETCH_HEAD display if --no-write-fetch-head
Jonathan Tan [Wed, 2 Sep 2020 21:05:39 +0000 (14:05 -0700)] 
fetch: no FETCH_HEAD display if --no-write-fetch-head

887952b8c6 ("fetch: optionally allow disabling FETCH_HEAD update",
2020-08-18) introduced the ability to disable writing to FETCH_HEAD
during fetch, but did not suppress the "<source> -> FETCH_HEAD" message
when this ability is used. This message is misleading in this case,
because FETCH_HEAD is not written. Also, because "fetch" is used to
lazy-fetch missing objects in a partial clone, this significantly
clutters up the output in that case since the objects to be fetched are
potentially numerous.

Therefore, suppress this message when --no-write-fetch-head is passed
(but not when --dry-run is set).

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoci: avoid ugly "failure" in the `ci-config` job
Johannes Schindelin [Tue, 1 Sep 2020 20:19:27 +0000 (20:19 +0000)] 
ci: avoid ugly "failure" in the `ci-config` job

In the common case where users have _not_ pushed a `ci-config` branch to
configure which branches should be included in the GitHub workflow runs,
there is a big fat ugly annotation about a failure in the run's log:

X Check failure on line 1 in .github

  @github-actions github-actions / ci-config

  .github#L1

  Process completed with exit code 128.

The reason is that the `ci-config` job tries to clone that `ci-config`
branch, and even if it is configured to continue on error, the
annotation is displayed, and it is distracting.

Let's just handle this on the shell script level, so that the job's step
is not marked as a failure.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoci: fix indentation of the `ci-config` job
Johannes Schindelin [Tue, 1 Sep 2020 20:19:26 +0000 (20:19 +0000)] 
ci: fix indentation of the `ci-config` job

The section added in e76eec35540f (ci: allow per-branch config for
GitHub Actions, 2020-05-07) contains a `&&`-chain that connects several
commands. The first command is actually so long that it stretches over
multiple lines, and as per usual, the continuation lines are indented one
more level than the first.

However, the subsequent commands in the `&&`-chain were also indented
one more level than the first command, which was almost certainly
unintended.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 weeks agoxrealloc: do not reuse pointer freed by zero-length realloc()
Jeff King [Wed, 2 Sep 2020 07:54:39 +0000 (03:54 -0400)] 
xrealloc: do not reuse pointer freed by zero-length realloc()

This patch fixes a bug where xrealloc(ptr, 0) can double-free and
corrupt the heap on some platforms (including at least glibc).

The C99 standard says of malloc (section 7.20.3):

  If the size of the space requested is zero, the behavior is
  implementation-defined: either a null pointer is returned, or the
  behavior is as if the size were some nonzero value, except that the
  returned pointer shall not be used to access an object.

So we might get NULL back, or we might get an actual pointer (but we're
not allowed to look at its contents). To simplify our code, our
xmalloc() handles a NULL return by converting it into a single-byte
allocation. That way callers get consistent behavior. This was done way
back in 4e7a2eccc2 (?alloc: do not return NULL when asked for zero
bytes, 2005-12-29).

We also gave xcalloc() and xrealloc() the same treatment. And according
to C99, that is fine; the text above is in a paragraph that applies to
all three. But what happens to the memory we passed to realloc() in such
a case? I.e., if we do:

  ret = realloc(ptr, 0);

and "ptr" is non-NULL, but we get NULL back, is "ptr" still valid? C99
doesn't cover this case specifically, but says (section 7.20.3.4):

  The realloc function deallocates the old object pointed to by ptr and
  returns a pointer to a new object that has the size specified by size.

So "ptr" is now deallocated, and we must only look at "ret". And since
"ret" is NULL, that means we have no allocated object at all. But that's
not quite the whole story. It also says:

  If memory for the new object cannot be allocated, the old object is
  not deallocated and its value is unchanged.
  [...]
  The realloc function returns a pointer to the new object (which may
  have the same value as a pointer to the old object), or a null pointer
  if the new object could not be allocated.

So if we see a NULL return with a non-zero size, we can expect that the
original object _is_ still valid. But with a non-zero size, it's
ambiguous. The NULL return might mean a failure (in which case the
object is valid), or it might mean that we successfully allocated
nothing, and used NULL to represent that.

The glibc manpage for realloc() explicitly says:

  [...]if size is equal to zero, and ptr is not NULL, then the call is
  equivalent to free(ptr).

Likewise, this StackOverflow answer:

  https://stackoverflow.com/a/2135302

claims that C89 gave similar guidance (but I don't have a copy to verify
it). A comment on this answer:

  https://stackoverflow.com/a/2022410

claims that Microsoft's CRT behaves the same.

But our current "retry with 1 byte" code passes the original pointer
again. So on glibc, we effectively free() the pointer and then try to
realloc() it again, which is undefined behavior.

The simplest fix here is to just pass "ret" (which we know to be NULL)
to the follow-up realloc(). But that means that a system which _doesn't_
free the original pointer would leak it. It's not clear if any such
systems exist, and that interpretation of the standard seems unlikely
(I'd expect a system that doesn't deallocate to simply return the
original pointer in this case). But it's easy enough to err on the safe
side, and just never pass a zero size to realloc() at all.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agogit.txt: correct stale 'GIT_EXTERNAL_DIFF' description
Philippe Blain [Tue, 1 Sep 2020 13:20:12 +0000 (13:20 +0000)] 
git.txt: correct stale 'GIT_EXTERNAL_DIFF' description

In fde97d8ac6 (Update documentation to remove incorrect GIT_DIFF_OPTS
example., 2006-11-27), the description of the 'GIT_EXTERNAL_DIFF'
variable was moved from 'diff-format.txt' to 'git.txt', and the
documentation was updated to remove a 'diff(1)' invocation since Git did
not use an external diff program anymore by default.

However, the description of 'GIT_EXTERNAL_DIFF' still mentions "instead
of the diff invocation described above", which is confusing.

Correct that outdated sentence.

Also, link to git(1) in 'diff-generate-patch.txt' when GIT_DIFF_OPTS and
GIT_EXTERNAL_DIFF are mentioned, so that users can easily know what
these variables are about.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agoTwelfth batch
Junio C Hamano [Mon, 31 Aug 2020 22:00:05 +0000 (15:00 -0700)] 
Twelfth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 weeks agoMerge branch 'ps/ref-transaction-hook'
Junio C Hamano [Mon, 31 Aug 2020 22:49:52 +0000 (15:49 -0700)] 
Merge branch 'ps/ref-transaction-hook'

Code simplification by removing ineffective optimization.

* ps/ref-transaction-hook:
  refs: remove lookup cache for reference-transaction hook

3 weeks agoMerge branch 'jk/rev-input-given-fix'
Junio C Hamano [Mon, 31 Aug 2020 22:49:52 +0000 (15:49 -0700)] 
Merge branch 'jk/rev-input-given-fix'

Feeding "$ZERO_OID" to "git log --ignore-missing --stdin", and
running "git log --ignore-missing $ZERO_OID" fell back to start
digging from HEAD; it has been corrected to become a no-op, like
"git log --tags=no-tag-matches-this-pattern" does.

* jk/rev-input-given-fix:
  revision: set rev_input_given in handle_revision_arg()

3 weeks agoMerge branch 'jc/ident-whose-ident'
Junio C Hamano [Mon, 31 Aug 2020 22:49:51 +0000 (15:49 -0700)] 
Merge branch 'jc/ident-whose-ident'

Error message update.

* jc/ident-whose-ident:
  ident: say whose identity is missing when giving user.name hint

3 weeks agoMerge branch 'rp/apply-cached-doc'
Junio C Hamano [Mon, 31 Aug 2020 22:49:51 +0000 (15:49 -0700)] 
Merge branch 'rp/apply-cached-doc'

The description of --cached/--index options in "git apply --help"
has been updated.

* rp/apply-cached-doc:
  git-apply.txt: update descriptions of --cached, --index

3 weeks agoMerge branch 'rs/checkout-no-overlay-pathspec-fix'
Junio C Hamano [Mon, 31 Aug 2020 22:49:50 +0000 (15:49 -0700)] 
Merge branch 'rs/checkout-no-overlay-pathspec-fix'

"git restore/checkout --no-overlay" with wildcarded pathspec
mistakenly removed matching paths in subdirectories, which has been
corrected.

* rs/checkout-no-overlay-pathspec-fix:
  checkout, restore: make pathspec recursive

3 weeks agoMerge branch 'al/bisect-first-parent'
Junio C Hamano [Mon, 31 Aug 2020 22:49:49 +0000 (15:49 -0700)] 
Merge branch 'al/bisect-first-parent'

Finishing touches.

* al/bisect-first-parent:
  bisect: add first-parent option to documentation

3 weeks agoMerge branch 'jk/refspecs-cleanup'
Junio C Hamano [Mon, 31 Aug 2020 22:49:48 +0000 (15:49 -0700)] 
Merge branch 'jk/refspecs-cleanup'

Preliminary code clean-up before introducing "negative refspec".

* jk/refspecs-cleanup:
  refspec: make sure stack refspec_item variables are zeroed
  refspec: fix documentation referring to refspec_item

3 weeks agoMerge branch 'hn/refs-pseudorefs'
Junio C Hamano [Mon, 31 Aug 2020 22:49:48 +0000 (15:49 -0700)] 
Merge branch 'hn/refs-pseudorefs'

Accesses to two pseudorefs have been updated to properly use ref
API.

* hn/refs-pseudorefs:
  sequencer: treat REVERT_HEAD as a pseudo ref
  builtin/commit: suggest update-ref for pseudoref removal
  sequencer: treat CHERRY_PICK_HEAD as a pseudo ref
  refs: make refs_ref_exists public

3 weeks agoMerge branch 'jk/index-pack-w-more-threads'
Junio C Hamano [Mon, 31 Aug 2020 22:49:48 +0000 (15:49 -0700)] 
Merge branch 'jk/index-pack-w-more-threads'

Long ago, we decided to use 3 threads by default when running the
index-pack task in parallel, which has been adjusted a bit upwards.

* jk/index-pack-w-more-threads:
  index-pack: adjust default threading cap
  p5302: count up to online-cpus for thread tests
  p5302: disable thread-count parameter tests by default

3 weeks agoMerge branch 'hv/ref-filter-trailers-atom-parsing-fix'
Junio C Hamano [Mon, 31 Aug 2020 22:49:47 +0000 (15:49 -0700)] 
Merge branch 'hv/ref-filter-trailers-atom-parsing-fix'

The parser for "git for-each-ref --format=..." was too loose when
parsing the "%(trailers...)" atom, and forgot that "trailers" and
"trailers:<modifiers>" are the only two allowed forms, which has
been corrected.

* hv/ref-filter-trailers-atom-parsing-fix:
  ref-filter: 'contents:trailers' show error if `:` is missing
  t6300: unify %(trailers) and %(contents:trailers) tests

3 weeks agoMerge branch 'jt/promisor-pack-fix'
Junio C Hamano [Mon, 31 Aug 2020 22:49:46 +0000 (15:49 -0700)] 
Merge branch 'jt/promisor-pack-fix'

Updates into a lazy/partial clone with a submodule did not work
well with transfer.fsckobjects set.

* jt/promisor-pack-fix:
  fetch-pack: in partial clone, pass --promisor

3 weeks agoMerge branch 'dd/diff-customize-index-line-abbrev'
Junio C Hamano [Mon, 31 Aug 2020 22:49:46 +0000 (15:49 -0700)] 
Merge branch 'dd/diff-customize-index-line-abbrev'

The output from the "diff" family of the commands had abbreviated
object names of blobs involved in the patch, but its length was not
affected by the --abbrev option.  Now it is.

* dd/diff-customize-index-line-abbrev:
  diff: index-line: respect --abbrev in object's name
  t4013: improve diff-post-processor logic

3 weeks agoMerge branch 'am/ci-wsfix'
Junio C Hamano [Mon, 31 Aug 2020 22:49:46 +0000 (15:49 -0700)] 
Merge branch 'am/ci-wsfix'

Aesthetic fix to a CI configuration file.

* am/ci-wsfix:
  ci: fix inconsistent indentation