Junio C Hamano [Thu, 7 Mar 2019 00:59:57 +0000 (09:59 +0900)]
Merge branch 'ab/receive-pack-use-after-free-fix'
Memfix.
* ab/receive-pack-use-after-free-fix:
receive-pack: fix use-after-free bug
Junio C Hamano [Thu, 7 Mar 2019 00:59:57 +0000 (09:59 +0900)]
Merge branch 'dl/doc-submodule-wo-subcommand'
Doc update.
* dl/doc-submodule-wo-subcommand:
submodule: document default behavior
Junio C Hamano [Thu, 7 Mar 2019 00:59:56 +0000 (09:59 +0900)]
Merge branch 'jk/unused-params'
Code clean-up.
* jk/unused-params:
ref-filter: drop unused "sz" parameters
ref-filter: drop unused "obj" parameters
ref-filter: drop unused buf/sz pairs
files-backend: drop refs parameter from split_symref_update()
pack-objects: drop unused parameter from oe_map_new_pack()
merge-recursive: drop several unused parameters
diff: drop complete_rewrite parameter from run_external_diff()
diff: drop unused emit data parameter from sane_truncate_line()
diff: drop unused color reset parameters
diff: drop options parameter from diffcore_fix_diff_index()
Junio C Hamano [Thu, 7 Mar 2019 00:59:56 +0000 (09:59 +0900)]
Merge branch 'jk/prune-optim'
"git prune" has been taught to take advantage of reachability
bitmap when able.
* jk/prune-optim:
t5304: rename "sha1" variables to "oid"
prune: check SEEN flag for reachability
prune: use bitmaps for reachability traversal
prune: lazily perform reachability traversal
Junio C Hamano [Thu, 7 Mar 2019 00:59:56 +0000 (09:59 +0900)]
Merge branch 'jh/trace2'
A more structured way to obtain execution trace has been added.
* jh/trace2:
trace2: add for_each macros to clang-format
trace2: t/helper/test-trace2, t0210.sh, t0211.sh, t0212.sh
trace2:data: add subverb for rebase
trace2:data: add subverb to reset command
trace2:data: add subverb to checkout command
trace2:data: pack-objects: add trace2 regions
trace2:data: add trace2 instrumentation to index read/write
trace2:data: add trace2 hook classification
trace2:data: add trace2 transport child classification
trace2:data: add trace2 sub-process classification
trace2:data: add editor/pager child classification
trace2:data: add trace2 regions to wt-status
trace2: collect Windows-specific process information
trace2: create new combined trace facility
trace2: Documentation/technical/api-trace2.txt
Junio C Hamano [Thu, 7 Mar 2019 00:59:56 +0000 (09:59 +0900)]
Merge branch 'js/doc-symref-in-proto-v1'
Doc update.
* js/doc-symref-in-proto-v1:
protocol-capabilities.txt: document symref
Junio C Hamano [Thu, 7 Mar 2019 00:59:56 +0000 (09:59 +0900)]
Merge branch 'nd/split-index-null-base-fix'
Split-index fix.
* nd/split-index-null-base-fix:
read-cache.c: fix writing "link" index ext with null base oid
Junio C Hamano [Thu, 7 Mar 2019 00:59:55 +0000 (09:59 +0900)]
Merge branch 'rj/prune-packed-excess-args'
"git prune-packed" did not notice and complain against excess
arguments given from the command line, which now it does.
* rj/prune-packed-excess-args:
prune-packed: check for too many arguments
Junio C Hamano [Thu, 7 Mar 2019 00:59:54 +0000 (09:59 +0900)]
Merge branch 'jc/test-yes-doc'
Test doc update.
* jc/test-yes-doc:
test: caution on our version of 'yes'
Junio C Hamano [Thu, 7 Mar 2019 00:59:54 +0000 (09:59 +0900)]
Merge branch 'en/combined-all-paths'
Output from "diff --cc" did not show the original paths when the
merge involved renames. A new option adds the paths in the
original trees to the output.
* en/combined-all-paths:
log,diff-tree: add --combined-all-paths option
Junio C Hamano [Thu, 7 Mar 2019 00:59:54 +0000 (09:59 +0900)]
Merge branch 'sc/pack-redundant'
Update the implementation of pack-redundant for performance in a
repository with many packfiles.
* sc/pack-redundant:
pack-redundant: consistent sort method
pack-redundant: rename pack_list.all_objects
pack-redundant: new algorithm to find min packs
pack-redundant: delete redundant code
pack-redundant: delay creation of unique_objects
t5323: test cases for git-pack-redundant
Junio C Hamano [Thu, 7 Mar 2019 00:59:53 +0000 (09:59 +0900)]
Merge branch 'du/branch-show-current'
"git branch" learned a new subcommand "--show-current".
* du/branch-show-current:
branch: introduce --show-current display option
Junio C Hamano [Thu, 7 Mar 2019 00:59:53 +0000 (09:59 +0900)]
Merge branch 'dl/complete-submodule-absorbgitdirs'
Command-line completion (in contrib/) learned to tab-complete the
"git submodule absorbgitdirs" subcommand.
* dl/complete-submodule-absorbgitdirs:
completion: complete git submodule absorbgitdirs
Junio C Hamano [Thu, 7 Mar 2019 00:59:53 +0000 (09:59 +0900)]
Merge branch 'wh/author-committer-ident-config'
Four new configuration variables {author,committer}.{name,email}
have been introduced to override user.{name,email} in more specific
cases.
* wh/author-committer-ident-config:
config: allow giving separate author and committer idents
Junio C Hamano [Thu, 7 Mar 2019 00:59:52 +0000 (09:59 +0900)]
Merge branch 'aw/pretty-trailers'
The %(trailers) formatter in "git log --format=..." now allows to
optionally pick trailers selectively by keyword, show only values,
etc.
* aw/pretty-trailers:
pretty: add support for separator option in %(trailers)
strbuf: separate callback for strbuf_expand:ing literals
pretty: add support for "valueonly" option in %(trailers)
pretty: allow showing specific trailers
pretty: single return path in %(trailers) handling
pretty: allow %(trailers) options with explicit value
doc: group pretty-format.txt placeholders descriptions
Junio C Hamano [Thu, 7 Mar 2019 00:59:52 +0000 (09:59 +0900)]
Merge branch 'nd/diff-parseopt'
The diff machinery, one of the oldest parts of the system, which
long predates the parse-options API, uses fairly long and complex
handcrafted option parser. This is being rewritten to use the
parse-options API.
* nd/diff-parseopt:
diff.c: convert --raw
diff.c: convert -W|--[no-]function-context
diff.c: convert -U|--unified
diff.c: convert -u|-p|--patch
diff.c: prepare to use parse_options() for parsing
diff.h: avoid bit fields in struct diff_flags
diff.h: keep forward struct declarations sorted
parse-options: allow ll_callback with OPTION_CALLBACK
parse-options: avoid magic return codes
parse-options: stop abusing 'callback' for lowlevel callbacks
parse-options: add OPT_BITOP()
parse-options: disable option abbreviation with PARSE_OPT_KEEP_UNKNOWN
parse-options: add one-shot mode
parse-options.h: remove extern on function prototypes
Junio C Hamano [Thu, 7 Mar 2019 00:59:51 +0000 (09:59 +0900)]
Merge branch 'tg/checkout-no-overlay'
"git checkout --no-overlay" can be used to trigger a new mode of
checking out paths out of the tree-ish, that allows paths that
match the pathspec that are in the current index and working tree
and are not in the tree-ish.
* tg/checkout-no-overlay:
revert "checkout: introduce checkout.overlayMode config"
checkout: introduce checkout.overlayMode config
checkout: introduce --{,no-}overlay option
checkout: factor out mark_cache_entry_for_checkout function
checkout: clarify comment
read-cache: add invalidate parameter to remove_marked_cache_entries
entry: support CE_WT_REMOVE flag in checkout_entry
entry: factor out unlink_entry function
move worktree tests to t24*
Junio C Hamano [Tue, 5 Mar 2019 12:53:10 +0000 (21:53 +0900)]
Merge tag 'l10n-2.21.0-rnd2.1' of git://github.com/git-l10n/git-po
L10n for Git 2.21.0 round 2.1
* tag 'l10n-2.21.0-rnd2.1' of git://github.com/git-l10n/git-po:
l10n: Fixes to Catalan translation
l10n: Updated Vietnamese translation for v2.21 rd2
l10n: fr.po remove obsolete entries
Jordi Mas [Sat, 2 Mar 2019 18:12:58 +0000 (19:12 +0100)]
l10n: Fixes to Catalan translation
Signed-off-by: Jordi Mas <jmas@softcatala.org>
Tran Ngoc Quan [Tue, 26 Feb 2019 07:50:59 +0000 (14:50 +0700)]
l10n: Updated Vietnamese translation for v2.21 rd2
Signed-off-by: Tran Ngoc Quan <vnwildman@gmail.com>
Jean-Noël Avila [Mon, 25 Feb 2019 21:11:15 +0000 (22:11 +0100)]
l10n: fr.po remove obsolete entries
On NetBSD, the version of msgfmt is still 0.14.4. There's no hope for
an upgrade due to some GPLv3 allergy of NetBSD's. This version chokes
on heavily decorated commented entries in po files. It's safer to get
rid of all these obsolete entries.
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Junio C Hamano [Sun, 24 Feb 2019 15:55:19 +0000 (07:55 -0800)]
Git 2.21
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano [Sun, 24 Feb 2019 15:18:00 +0000 (07:18 -0800)]
Merge branch 'yn/checkout-doc-fix'
Doc fix.
* yn/checkout-doc-fix:
checkout doc: fix an unmatched double-quote pair
Junio C Hamano [Sun, 24 Feb 2019 15:03:39 +0000 (07:03 -0800)]
Merge tag 'l10n-2.21.0-rnd2' of git://github.com/git-l10n/git-po
l10n-2.21.0-rnd2
* tag 'l10n-2.21.0-rnd2' of git://github.com/git-l10n/git-po:
l10n: bg.po: Updated Bulgarian translation (4363t)
l10n: update German translation
l10n: zh_CN: Revision for git v2.21.0 l10n
l10n: zh_CN: for git v2.21.0 l10n round 1~2
l10n: bg.po: correct typo
l10n: Update Swedish translation (4363t0f0u)
l10n: de.po: fix grammar in message for tag.c
l10n: de.po: fix a message for index-pack.c
l10n: de.po: consistent translation of 'root commit'
l10n: it: update the Italian translation
l10n: es: 2.21.0 round 2
l10n: el: add Greek l10n team and essential translations
l10n: fr.po v2.21.0 rnd 2
l10n: fr.po Fix some typos from round3
l10n: fr.po Fix some typos
l10n: Fixes to Catalan translation
l10n: git.pot: v2.21.0 round 2 (3 new, 3 removed)
l10n: git.pot: v2.21.0 round 1 (214 new, 38 removed)
l10n: zh_CN: fix typo of submodule init message
l10n: Update Catalan translation
Johannes Schindelin [Sat, 23 Feb 2019 14:49:23 +0000 (06:49 -0800)]
README: adjust for final Azure Pipeline ID
During the six months of development of the Azure Pipelines support, the
patches went through quite a few iterations of changes, and to test
those iterations, a temporary build definition was used.
In the meantime, Azure Pipelines support made it to `master`, and we now
have a regular Azure Pipeline, installed via the common GitHub App
workflow. This new pipeline has a different name (git.git instead of
test-git.git), and a new ID (11 instead of 2).
Let's adjust the badge in our README to reflect that final shape of the
Azure Pipeline.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Yoichi Nakayama [Sat, 23 Feb 2019 06:33:40 +0000 (15:33 +0900)]
checkout doc: fix an unmatched double-quote pair
Signed-off-by: Yoichi Nakayama <yoichi.nakayama@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Alexander Shopov [Sat, 23 Feb 2019 16:39:07 +0000 (18:39 +0200)]
l10n: bg.po: Updated Bulgarian translation (4363t)
Signed-off-by: Alexander Shopov <ash@kambanaria.org>
Junio C Hamano [Sat, 23 Feb 2019 05:20:19 +0000 (21:20 -0800)]
Merge branch 'ab/bsd-fixes'
Test portability fix.
* ab/bsd-fixes:
commit-graph tests: fix unportable "dd" invocation
tests: fix unportable "\?" and "\+" regex syntax
Junio C Hamano [Sat, 23 Feb 2019 05:20:19 +0000 (21:20 -0800)]
Merge branch 'ab/workaround-dash-bug-in-test'
* ab/workaround-dash-bug-in-test:
tests: avoid syntax triggering old dash bug
Jeff Hostetler [Fri, 22 Feb 2019 22:25:11 +0000 (14:25 -0800)]
trace2: add for_each macros to clang-format
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:10 +0000 (14:25 -0800)]
trace2: t/helper/test-trace2, t0210.sh, t0211.sh, t0212.sh
Create unit tests for Trace2.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:10 +0000 (14:25 -0800)]
trace2:data: add subverb for rebase
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:09 +0000 (14:25 -0800)]
trace2:data: add subverb to reset command
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:08 +0000 (14:25 -0800)]
trace2:data: add subverb to checkout command
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Derrick Stolee [Fri, 22 Feb 2019 22:25:07 +0000 (14:25 -0800)]
trace2:data: pack-objects: add trace2 regions
When studying the performance of 'git push' we would like to know
how much time is spent at various parts of the command. One area
that could cause performance trouble is 'git pack-objects'.
Add trace2 regions around the three main actions taken in this
command:
1. Enumerate objects.
2. Prepare pack.
3. Write pack-file.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:07 +0000 (14:25 -0800)]
trace2:data: add trace2 instrumentation to index read/write
Add trace2 events to measure reading and writing the index.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:06 +0000 (14:25 -0800)]
trace2:data: add trace2 hook classification
Classify certain child processes as hooks.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:05 +0000 (14:25 -0800)]
trace2:data: add trace2 transport child classification
Add trace2 child classification for transport processes.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:05 +0000 (14:25 -0800)]
trace2:data: add trace2 sub-process classification
Add trace2 classification for long-running processes
started in sub-process.c
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:04 +0000 (14:25 -0800)]
trace2:data: add editor/pager child classification
Add trace2 process classification for editor and pager
child processes.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:03 +0000 (14:25 -0800)]
trace2:data: add trace2 regions to wt-status
Add trace2_region_enter() and trace2_region_leave() calls around the
various phases of a status scan. This gives elapsed time for each
phase in the GIT_TR2_PERF and GIT_TR2_EVENT trace target.
Also, these Trace2 calls now use s->repo rather than the_repository.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:02 +0000 (14:25 -0800)]
trace2: collect Windows-specific process information
Add platform-specific interface to log information about the current
process.
On Windows, this interface is used to indicate whether the git process
is running under a debugger and list names of the process ancestors.
Information for other platforms is left for a future effort.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:01 +0000 (14:25 -0800)]
trace2: create new combined trace facility
Create a new unified tracing facility for git. The eventual intent is to
replace the current trace_printf* and trace_performance* routines with a
unified set of git_trace2* routines.
In addition to the usual printf-style API, trace2 provides higer-level
event verbs with fixed-fields allowing structured data to be written.
This makes post-processing and analysis easier for external tools.
Trace2 defines 3 output targets. These are set using the environment
variables "GIT_TR2", "GIT_TR2_PERF", and "GIT_TR2_EVENT". These may be
set to "1" or to an absolute pathname (just like the current GIT_TRACE).
* GIT_TR2 is intended to be a replacement for GIT_TRACE and logs command
summary data.
* GIT_TR2_PERF is intended as a replacement for GIT_TRACE_PERFORMANCE.
It extends the output with columns for the command process, thread,
repo, absolute and relative elapsed times. It reports events for
child process start/stop, thread start/stop, and per-thread function
nesting.
* GIT_TR2_EVENT is a new structured format. It writes event data as a
series of JSON records.
Calls to trace2 functions log to any of the 3 output targets enabled
without the need to call different trace_printf* or trace_performance*
routines.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff Hostetler [Fri, 22 Feb 2019 22:25:00 +0000 (14:25 -0800)]
trace2: Documentation/technical/api-trace2.txt
Created design document for Trace2 feature.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Ævar Arnfjörð Bjarmason [Thu, 21 Feb 2019 19:28:49 +0000 (20:28 +0100)]
commit-graph tests: fix unportable "dd" invocation
Change an unportable invocation of "dd" with count=0, that wanted to
truncate the commit-graph file. In POSIX it is unspecified what
happens when count=0 is provided[1]. The NetBSD "dd" behavior
differs from GNU (and seemingly other BSDs), which has left this test
broken since
d2b86fbaa1 ("commit-graph: fix buffer read-overflow",
2019-01-15).
Copying from /dev/null would seek/truncate to seek=$zero_pos and
stop immediately after that (without being able to copy anything),
which is the right way to truncate the file.
1. http://pubs.opengroup.org/onlinepubs/
9699919799/utilities/dd.html
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jiang Xin [Fri, 22 Feb 2019 14:18:12 +0000 (22:18 +0800)]
Merge branch 'master' of https://github.com/ralfth/git-po-de
Ralf Thielow [Fri, 22 Feb 2019 07:45:40 +0000 (08:45 +0100)]
l10n: update German translation
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Reviewed-by: Matthias Rüster <matthias.ruester@gmail.com>
Ævar Arnfjörð Bjarmason [Thu, 21 Feb 2019 19:28:48 +0000 (20:28 +0100)]
tests: fix unportable "\?" and "\+" regex syntax
Fix widely supported but non-POSIX basic regex syntax introduced in
[1] and [2]. On GNU, NetBSD and FreeBSD the following works:
$ echo xy >f
$ grep 'xy\?' f; echo $?
xy
0
The same goes for "\+". The "?" and "+" syntax is not in the BRE
syntax, just in ERE, but on some implementations it can be invoked by
prefixing the meta-operator with "\", but not on OpenBSD:
$ uname -a
OpenBSD obsd.my.domain 6.2 GENERIC#132 amd64
$ grep --version
grep version 0.9
$ grep 'xy\?' f; echo $?
1
Let's fix this by moving to ERE syntax instead, where "?" and "+" are
universally supported:
$ grep -E 'xy?' f; echo $?
xy
0
1.
2ed5c8e174 ("describe: setup working tree for --dirty", 2019-02-03)
2.
c801170b0c ("t6120: test for describe with a bare repository",
2019-02-03)
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Josh Steadmon [Wed, 20 Feb 2019 00:32:26 +0000 (16:32 -0800)]
protocol-capabilities.txt: document symref
In
7171d8c15f ("upload-pack: send symbolic ref information as
capability"), we added a symref capability to the pack protocol, but it
was never documented. Adapt the patch notes from that commit and add
them to the capabilities documentation.
While we're at it, add a disclaimer to the top of
protocol-capabilities.txt noting that the doc only applies to v0/v1 of
the wire protocol.
Signed-off-by: Josh Steadmon <steadmon@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Ævar Arnfjörð Bjarmason [Wed, 20 Feb 2019 00:00:33 +0000 (01:00 +0100)]
receive-pack: fix use-after-free bug
The resolve_ref_unsafe() function can, and sometimes will in the case
of this codepath, return the char * passed to it to the caller. In
this case we construct a strbuf, free it, and then continue using the
dst_name after that free().
The code being fixed dates back to
da3efdb17b ("receive-pack: detect
aliased updates which can occur with symrefs", 2010-04-19). When it
was originally added it didn't have this bug, it was introduced when
it was subsequently modified to use strbuf in
6b01ecfe22 ("ref
namespaces: Support remote repositories via upload-pack and
receive-pack", 2011-07-08).
This is theoretically a security issue, the C standard makes no
guarantees that a value you use after free() hasn't been poked at or
changed by something else on the system, but in practice modern OSs
will have mapped the relevant page to this process, so nothing else
would have used it. We do no further allocations between the free()
and use-after-free, so we ourselves didn't corrupt or change the
value.
Jeff investigated that and found: "It probably would be an issue if
the allocation were larger. glibc at least will use mmap()/munmap()
after some cutoff[1], in which case we'd get a segfault from hitting
the unmapped page. But for small allocations, it just bumps brk() and
the memory is still available for further allocations after
free(). [...] If you had a sufficiently large refname you might be
able to trigger the bug [...]. I tried to push such a ref. I had to
manually make a packed-refs file with the long name to avoid
filesystem limits (though probably you could have a long a/b/c/ name
on ext4). But the result can't actually be pushed, because it all has
to fit into a 64k pkt-line as part of the push protocol.".
An a alternative and more succinct way of implementing this would have
been to do the strbuf_release() at the end of check_aliased_update()
and use "goto out" instead of the early "return" statements. Hopefully
this approach of using a helper instead makes it easier to follow.
1. Jeff: "Weirdly, the mmap() cutoff on my glibc system is 135168
bytes. Which is...2^17 + 2^12? 33 pages? I'm sure there's a good
reason for that, but I didn't dig into it."
Reported-by: 王健强 <jianqiang.wang@securitygossip.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jiang Xin [Wed, 20 Feb 2019 13:40:54 +0000 (21:40 +0800)]
Merge branch 'bg-submodule-helper-typo' of github.com:pclouds/git-po
Fangyi Zhou [Mon, 11 Feb 2019 11:28:55 +0000 (11:28 +0000)]
l10n: zh_CN: Revision for git v2.21.0 l10n
Signed-off-by: Fangyi Zhou <fangyi.zhou@yuriko.moe>
Jiang Xin [Tue, 20 Nov 2018 02:18:06 +0000 (10:18 +0800)]
l10n: zh_CN: for git v2.21.0 l10n round 1~2
Translate 214 new messages (4363t0f0u) for git 2.21.0.
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Nguyễn Thái Ngọc Duy [Wed, 20 Feb 2019 09:59:24 +0000 (16:59 +0700)]
l10n: bg.po: correct typo
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Peter Krefting [Mon, 11 Feb 2019 21:34:05 +0000 (22:34 +0100)]
l10n: Update Swedish translation (4363t0f0u)
Signed-off-by: Peter Krefting <peter@softwolves.pp.se>
Junio C Hamano [Tue, 19 Feb 2019 21:20:23 +0000 (13:20 -0800)]
Git 2.21-rc2
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano [Tue, 19 Feb 2019 21:18:08 +0000 (13:18 -0800)]
Merge branch 'js/test-tool-gen-nuls'
* js/test-tool-gen-nuls:
tests: teach the test-tool to generate NUL bytes and use it
Junio C Hamano [Tue, 19 Feb 2019 21:18:08 +0000 (13:18 -0800)]
Merge branch 'mk/t5562-no-input-to-too-large-an-input-test'
* mk/t5562-no-input-to-too-large-an-input-test:
t5562: do not depend on /dev/zero
Revert "t5562: replace /dev/zero with a pipe from generate_zero_bytes"
Junio C Hamano [Tue, 19 Feb 2019 21:18:08 +0000 (13:18 -0800)]
Merge branch 'mk/t5562-do-not-reuse-output-files'
* mk/t5562-do-not-reuse-output-files:
t5562: do not reuse output files
Max Kirillov [Sat, 24 Nov 2018 09:37:19 +0000 (11:37 +0200)]
t5562: do not reuse output files
Some expected failures of git-http-backend leaves running its children
(receive-pack or upload-pack) which still hold opened descriptors
to act.err and with some probability they live long enough to write
there their failure messages after next test has already truncated
the files. This causes occasional failures of the test script.
Avoid the issue by using separated output and error file for each test,
apprending the test number to their name.
Reported-by: Carlo Arenas <carenas@gmail.com>
Helped-by: Carlo Arenas <carenas@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Max Kirillov <max@max630.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Johannes Schindelin [Thu, 14 Feb 2019 21:33:12 +0000 (13:33 -0800)]
tests: teach the test-tool to generate NUL bytes and use it
In
cc95bc2025 (t5562: replace /dev/zero with a pipe from
generate_zero_bytes, 2019-02-09), we replaced usage of /dev/zero (which
is not available on NonStop, apparently) by a Perl script snippet to
generate NUL bytes.
Sadly, it does not seem to work on NonStop, as t5562 reportedly hangs.
Worse, this also hangs in the Ubuntu 16.04 agents of the CI builds on
Azure Pipelines: for some reason, the Perl script snippet that is run
via `generate_zero_bytes` in t5562's 'CONTENT_LENGTH overflow ssite_t'
test case tries to write out an infinite amount of NUL bytes unless a
broken pipe is encountered, that snippet never encounters the broken
pipe, and keeps going until the build times out.
Oddly enough, this does not reproduce on the Windows and macOS agents,
nor in a local Ubuntu 18.04.
This developer tried for a day to figure out the exact circumstances
under which this hang happens, to no avail, the details remain a
mystery.
In the end, though, what counts is that this here change incidentally
fixes that hang (maybe also on NonStop?). Even more positively, it gets
rid of yet another unnecessary Perl invocation.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Max Kirillov [Fri, 15 Feb 2019 16:42:37 +0000 (18:42 +0200)]
t5562: do not depend on /dev/zero
It was reported [1] that NonStop platform does not have /dev/zero.
The test uses /dev/zero as a dummy input. Passing case (http-backed
failed because of too big input size) should not be reading anything
from it. If http-backend would erroneously try to read any data
returning EOF probably would be even safer than providing some
meaningless data.
Replace /dev/zero with /dev/null to avoid issues with platforms which do
not have /dev/zero.
[1] https://public-inbox.org/git/
20190209185930.5256-4-randall.s.becker@rogers.com/
Reported-by: Randall S. Becker <rsbecker@nexbridge.com>
Signed-off-by: Max Kirillov <max@max630.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano [Tue, 19 Feb 2019 18:18:15 +0000 (10:18 -0800)]
Revert "t5562: replace /dev/zero with a pipe from generate_zero_bytes"
Revert
cc95bc20 ("t5562: replace /dev/zero with a pipe from
generate_zero_bytes", 2019-02-09), as not feeding anything to the
command is a better way to test it.
Sebastian Staudt [Sun, 3 Feb 2019 10:33:39 +0000 (11:33 +0100)]
l10n: de.po: fix grammar in message for tag.c
Signed-off-by: Sebastian Staudt <koraktor@gmail.com>
Sebastian Staudt [Sun, 3 Feb 2019 10:32:20 +0000 (11:32 +0100)]
l10n: de.po: fix a message for index-pack.c
Signed-off-by: Sebastian Staudt <koraktor@gmail.com>
Sebastian Staudt [Sun, 3 Feb 2019 10:21:14 +0000 (11:21 +0100)]
l10n: de.po: consistent translation of 'root commit'
'root commit' is usually translated as 'Root-Commit'. But in one
occasion it‘s translated as 'Basis-Commit' which is the translation
for 'base commit'.
Signed-off-by: Sebastian Staudt <koraktor@gmail.com>
Alessandro Menti [Sun, 17 Feb 2019 17:04:51 +0000 (18:04 +0100)]
l10n: it: update the Italian translation
Signed-off-by: Alessandro Menti <alessandro.menti@alessandromenti.it>
Jiang Xin [Sun, 17 Feb 2019 07:28:15 +0000 (15:28 +0800)]
Merge branch 'master' of https://github.com/Softcatala/git-po
Christopher Diaz Riveros [Wed, 6 Feb 2019 13:36:53 +0000 (08:36 -0500)]
l10n: es: 2.21.0 round 2
Signed-off-by: Christopher Diaz Riveros <chrisadr@gentoo.org>
Jiang Xin [Sat, 16 Feb 2019 01:54:53 +0000 (09:54 +0800)]
Merge branch 'fr_2.21.0_rnd2' of git://github.com/jnavila/git
Jimmy Angelakos [Fri, 15 Feb 2019 02:28:19 +0000 (02:28 +0000)]
l10n: el: add Greek l10n team and essential translations
Signed-off-by: Jimmy Angelakos <vyruss@hellug.gr>
Jean-Noël Avila [Wed, 13 Feb 2019 19:35:13 +0000 (20:35 +0100)]
l10n: fr.po v2.21.0 rnd 2
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Fabien Villepinte [Thu, 20 Dec 2018 08:59:45 +0000 (09:59 +0100)]
l10n: fr.po Fix some typos from round3
Signed-off-by: Fabien Villepinte <fabien.villepinte@gmail.com>
Fabien Villepinte [Mon, 17 Dec 2018 11:51:58 +0000 (12:51 +0100)]
l10n: fr.po Fix some typos
Signed-off-by: Fabien Villepinte <fabien.villepinte@gmail.com>
Johannes Schindelin [Fri, 15 Feb 2019 15:17:45 +0000 (07:17 -0800)]
mingw: safe-guard a bit more against getenv() problems
Running up to v2.21.0, we fixed two bugs that were made prominent by the
Windows-specific change to retain copies of only the 30 latest getenv()
calls' returned strings, invalidating any copies of previous getenv()
calls' return values.
While this really shines a light onto bugs of the form where we hold
onto getenv()'s return values without copying them, it is also a real
problem for users.
And even if Jeff King's patches merged via
773e408881 (Merge branch
'jk/save-getenv-result', 2019-01-29) provide further work on that front,
we are far from done. Just one example: on Windows, we unset environment
variables when spawning new processes, which potentially invalidates
strings that were previously obtained via getenv(), and therefore we
have to duplicate environment values that are somehow involved in
spawning new processes (e.g. GIT_MAN_VIEWER in show_man_page()).
We do not have a chance to investigate, let address, all of those issues
in time for v2.21.0, so let's at least help Windows users by increasing
the number of getenv() calls' return values that are kept valid. The
number 64 was determined by looking at the average number of getenv()
calls per process in the entire test suite run on Windows (which is
around 40) and then adding a bit for good measure. And it is a power of
two (which would have hit yesterday's theme perfectly).
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Denton Liu [Fri, 15 Feb 2019 09:26:41 +0000 (01:26 -0800)]
submodule: document default behavior
submodule's default behavior wasn't documented in both git-submodule.txt
and in the usage text of git-submodule. Document the default behavior
similar to how git-remote does it.
Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jordi Mas [Fri, 15 Feb 2019 15:43:59 +0000 (16:43 +0100)]
l10n: Fixes to Catalan translation
Signed-off-by: Jordi Mas <jmas@softcatala.org>
Jiang Xin [Fri, 15 Feb 2019 02:12:14 +0000 (10:12 +0800)]
l10n: git.pot: v2.21.0 round 2 (3 new, 3 removed)
Introduce 3 update messages for v2.21.0 l10n round 2 from commit
32ceace39f (Fix typos in translatable strings for v2.21.0, 2019-02-11).
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Jiang Xin [Fri, 15 Feb 2019 02:09:07 +0000 (10:09 +0800)]
Merge branch 'master' of git://git./git/git
Jeff King [Thu, 14 Feb 2019 05:51:03 +0000 (00:51 -0500)]
ref-filter: drop unused "sz" parameters
Many of our grab_* functions, which parse the object content, take a
buf/sz pair of the object bytes. However, the functions which actually
parse the buffers (like find_wholine() and find_subpos()) never look at
"sz", and instead use functions like strchr() and strchrnul() that
assume the result is NUL-terminated.
This is OK in practice (and common for Git's parsing code), since we
always allocate an extra NUL when loading an object into memory (and
likewise, we are OK with stopping parsing if a commit or tag contains an
embedded NUL).
Let's drop these extra "sz" parameters, as they are misleading about how
the functions intend to access the buffer. We can drop from both the
functions mentioned above, which in turn lets us drop from their
callers, cascading all the way up to the top-level grab_values().
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:50:58 +0000 (00:50 -0500)]
ref-filter: drop unused "obj" parameters
The grab_person() and grab_sub_body_contents() functions take both an
object struct and a buf/sz pair of the object bytes. However, they use
only the latter, since "struct object" does not contain the parsed ident
(nor the whole commit message, of course).
Let's get rid of these misleading "struct object" parameters. It's
possible we may want them in the future (e.g., to generate error
messages that mention the object id), but since these are static
functions, we can easily add them back in later (and if we do want that
information, it's likely we'd pass it through a more generalized
"parsing context" struct anyway).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:50:54 +0000 (00:50 -0500)]
ref-filter: drop unused buf/sz pairs
The grab_tag_values() and grab_commit_values() functions take both the
"struct object" as well as the buf/sz pair for the actual object bytes.
However, neither function uses the latter, as they pull the data
directly from the parsed object struct.
Let's get rid of these misleading parameters.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:50:46 +0000 (00:50 -0500)]
files-backend: drop refs parameter from split_symref_update()
This parameter was added in
fcc42ea0c9 (split_symref_update(): add a
files_ref_store argument, 2016-09-04) without comment, but never used.
The splitting is purely mechanical, and doesn't depend on the particular
ref-store. Let's drop this parameter in the name of simplicity.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:50:32 +0000 (00:50 -0500)]
pack-objects: drop unused parameter from oe_map_new_pack()
Since
43fa44fa3b (pack-objects: move in_pack out of struct object_entry,
2018-04-14), we store the source pack for each object as a small index
rather than as a pointer. When we see a new pack that has no allocated
index, we fall back to generating an array of pointers by calling
oe_map_new_pack().
Perhaps counter-intuitively, that function does not need to actually see
our new index-less pack. It only allocates and populates the array with
the existing packs, after which oe_set_in_pack() actually adds the new
pack to the array.
Let's drop the unused "struct packed_git" argument to oe_map_new_pack()
to avoid confusion.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:50:02 +0000 (00:50 -0500)]
merge-recursive: drop several unused parameters
There are a few functions related to directory renames that have unused
parameters. After consulting with the author in [1], these seem to be
leftover cruft from the development process, and not signs of any bug.
Let's drop them.
[1] https://public-inbox.org/git/CABPp-BHobf8wbBsXF97scNQCzkxQukziODRXq6JOOWq61cAd9g@mail.gmail.com/
Helped-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:49:42 +0000 (00:49 -0500)]
diff: drop complete_rewrite parameter from run_external_diff()
Our builtin_diff() wants to know whether break-detection found a
complete rewrite, because it changes how the diff is shown. However,
when calling out to an external diff, we don't pass this information
along (and doing so would require designing a new interface to the
user-provided program).
Let's drop the unused parameter to make this fact more clear.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:48:27 +0000 (00:48 -0500)]
diff: drop unused emit data parameter from sane_truncate_line()
We pass the "struct emit_callback" (which contains all of the context
for our diff) into sane_truncate_line(), but that function doesn't
actually use it. In theory we might eventually develop a diff option
that impacts this, but in the meantime let's not mislead anybody reading
the code. Since the function is static, it would be easy to pass it
again if it should ever become useful.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:48:13 +0000 (00:48 -0500)]
diff: drop unused color reset parameters
Several of the emit_* functions take a "reset" color parameter, but
never actually look at it (instead, they call into emit_diff_symbol,
which handles the colors itself). Let's drop these unused parameters.
Note that emit_line() does still take a color/reset pair, and actually
uses it. It cannot be refactored to match these other functions because
it's the thing that emit_diff_symbol eventually calls into (i.e., it
does not by itself know which colors to use, and must be told by the
caller).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 05:48:03 +0000 (00:48 -0500)]
diff: drop options parameter from diffcore_fix_diff_index()
The sole purpose of this function is to fix the sorting order of the
queued diff entries. It doesn't need to know about any diff options, so
we can drop the unused parameter.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 11:07:36 +0000 (06:07 -0500)]
t5304: rename "sha1" variables to "oid"
Let's make the script less jarring to read in a post-sha1 world by
using more hash-agnostic variable names.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 04:38:21 +0000 (23:38 -0500)]
prune: check SEEN flag for reachability
The git-prune command checks reachability by doing a traversal, and then
checking whether a given object exists in the global object hash. This
can yield false positives if any other part of the code had to create an
object struct for some reason. It's not clear whether this is even
possible, but it's more robust to rely on something a little more
concrete: the SEEN flag set by our traversal.
Note that there is a slight possibility of regression here, as we're
relying on mark_reachable_objects() to consistently set the flag.
However, it has always done so, and we're already relying on that fact
in prune_shallow(), which is called as part of git-prune. So this is
making these two parts of the prune operation more consistent.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 04:37:43 +0000 (23:37 -0500)]
prune: use bitmaps for reachability traversal
Pruning generally has to traverse the whole commit graph in order to
see which objects are reachable. This is the exact problem that
reachability bitmaps were meant to solve, so let's use them (if they're
available, of course).
Here are timings on git.git:
Test HEAD^ HEAD
------------------------------------------------------------------------
5304.6: prune with bitmaps 3.65(3.56+0.09) 1.01(0.92+0.08) -72.3%
And on linux.git:
Test HEAD^ HEAD
--------------------------------------------------------------------------
5304.6: prune with bitmaps 35.05(34.79+0.23) 3.00(2.78+0.21) -91.4%
The tests show a pretty optimal case, as we'll have just repacked and
should have pretty good coverage of all refs with our bitmaps. But
that's actually pretty realistic: normally prune is run via "gc" right
after repacking.
A few notes on the implementation:
- the change is actually in reachable.c, so it would improve
reachability traversals by "reflog expire --stale-fix", as well.
Those aren't performed regularly, though (a normal "git gc" doesn't
use --stale-fix), so they're not really worth measuring. There's a
low chance of regressing that caller, since the use of bitmaps is
totally transparent from the caller's perspective.
- The bitmap case could actually get away without creating a "struct
object", and instead the caller could just look up each object id in
the bitmap result. However, this would be a marginal improvement in
runtime, and it would make the callers much more complicated. They'd
have to handle both the bitmap and non-bitmap cases separately, and
in the case of git-prune, we'd also have to tweak prune_shallow(),
which relies on our SEEN flags.
- Because we do create real object structs, we go through a few
contortions to create ones of the right type. This isn't strictly
necessary (lookup_unknown_object() would suffice), but it's more
memory efficient to use the correct types, since we already know
them.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King [Thu, 14 Feb 2019 04:35:22 +0000 (23:35 -0500)]
prune: lazily perform reachability traversal
The general strategy of "git prune" is to do a full reachability walk,
then for each loose object see if we found it in our walk. But if we
don't have any loose objects, we don't need to do the expensive walk in
the first place.
This patch postpones that walk until the first time we need to see its
results.
Note that this is really a specific case of a more general optimization,
which is that we could traverse only far enough to find the object under
consideration (i.e., stop the traversal when we find it, then pick up
again when asked about the next object, etc). That could save us in some
instances from having to do a full walk. But it's actually a bit tricky
to do with our traversal code, and you'd need to do a full walk anyway
if you have even a single unreachable object (which you generally do, if
any objects are actually left after running git-repack).
So in practice this lazy-load of the full walk catches one easy but
common case (i.e., you've just repacked via git-gc, and there's nothing
unreachable).
The perf script is fairly contrived, but it does show off the
improvement:
Test HEAD^ HEAD
-------------------------------------------------------------------------
5304.4: prune with no objects 3.66(3.60+0.05) 0.00(0.00+0.00) -100.0%
and would let us know if we accidentally regress this optimization.
Note also that we need to take special care with prune_shallow(), which
relies on us having performed the traversal. So this optimization can
only kick in for a non-shallow repository. Since this is easy to get
wrong and is not covered by existing tests, let's add an extra test to
t5304 that covers this case explicitly.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano [Thu, 14 Feb 2019 22:28:22 +0000 (14:28 -0800)]
Merge branch 'ea/rebase-compat-doc-fix'
* ea/rebase-compat-doc-fix:
docs/git-rebase: remove redundant entry in incompatible options list
Junio C Hamano [Thu, 14 Feb 2019 22:28:21 +0000 (14:28 -0800)]
Merge branch 'jc/no-grepping-for-strerror-in-tests'
* jc/no-grepping-for-strerror-in-tests:
t1404: do not rely on the exact phrasing of strerror()
Junio C Hamano [Thu, 14 Feb 2019 22:28:20 +0000 (14:28 -0800)]
Merge branch 'jt/fetch-v2-sideband'
"git fetch" and "git upload-pack" learned to send all exchange over
the sideband channel while talking the v2 protocol.
* jt/fetch-v2-sideband:
t/lib-httpd: pass GIT_TEST_SIDEBAND_ALL through Apache
Junio C Hamano [Thu, 14 Feb 2019 22:28:20 +0000 (14:28 -0800)]
Merge branch 'en/rebase-merge-on-sequencer'
"git rebase --merge" as been reimplemented by reusing the internal
machinery used for "git rebase -i".
* en/rebase-merge-on-sequencer:
git-rebase.txt: update to reflect merge now implemented on sequencer
Elijah Newren [Thu, 14 Feb 2019 20:25:41 +0000 (12:25 -0800)]
git-rebase.txt: update to reflect merge now implemented on sequencer
Since commit
8fe9c3f21dff (Merge branch 'en/rebase-merge-on-sequencer',
2019-02-06), --merge now uses the interactive backend (and matches its
behavior) so there is no separate merge backend anymore. Fix an
oversight in the docs that should have been updated with the previous
change.
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Todd Zullinger [Thu, 14 Feb 2019 06:35:13 +0000 (01:35 -0500)]
t/lib-httpd: pass GIT_TEST_SIDEBAND_ALL through Apache
07c3c2aa16 ("tests: define GIT_TEST_SIDEBAND_ALL", 2019-01-16) added
GIT_TEST_SIDEBAND_ALL to the apache.conf PassEnv list. Avoid warnings
from Apache when the variable is unset, as we do for GIT_VALGRIND* and
GIT_TRACE, from
f628825481 ("t/lib-httpd: handle running under
--valgrind", 2012-07-24) and
89c57ab3f0 ("t: pass GIT_TRACE through
Apache", 2015-03-13), respectively.
Signed-off-by: Todd Zullinger <tmz@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano [Thu, 14 Feb 2019 20:16:20 +0000 (12:16 -0800)]
t1404: do not rely on the exact phrasing of strerror()
Not even in C locale, it is wrong to expect that the exact phrasing
"File exists" is used to show EEXIST.
Reported-by: Randall S. Becker <rsbecker@nexbridge.com>
Helped-by: Duy Nguyen <pclouds@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>