gitweb.git
stash: optionally use the scripted version againJohannes Schindelin Mon, 25 Feb 2019 23:16:30 +0000 (23:16 +0000)

stash: optionally use the scripted version again

We recently converted the `git stash` command from Unix shell scripts
to builtins.

Let's end users a way out when they discover a bug in the
builtin command: `stash.useBuiltin`.

As the file name `git-stash` is already in use, let's rename the
scripted backend to `git-legacy-stash`.

To make the test suite pass with `stash.useBuiltin=false`, this commit
also backports rudimentary support for `-q` (but only *just* enough
to appease the test suite), and adds a super-ugly hack to force exit
code 129 for `git stash -h`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: add back the original, scripted `git stash`Johannes Schindelin Mon, 25 Feb 2019 23:16:29 +0000 (23:16 +0000)

stash: add back the original, scripted `git stash`

This simply copies the version as of sd/stash-wo-user-name verbatim. As
of now, it is not hooked up.

The next commit will change the builtin `stash` to hand off to the
scripted `git stash` when `stash.useBuiltin=false`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert `stash--helper.c` into `stash.c`Paul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:28 +0000 (23:16 +0000)

stash: convert `stash--helper.c` into `stash.c`

The old shell script `git-stash.sh` was removed and replaced
entirely by `builtin/stash.c`. In order to do that, `create` and
`push` were adapted to work without `stash.sh`. For example, before
this commit, `git stash create` called `git stash--helper create
--message "$*"`. If it called `git stash--helper create "$@"`, then
some of these changes wouldn't have been necessary.

This commit also removes the word `helper` since now stash is
called directly and not by a shell script.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: replace all `write-tree` child processes with... Paul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:27 +0000 (23:16 +0000)

stash: replace all `write-tree` child processes with API calls

Avoid spawning write-tree child processes by replacing the calls with
in-core API calls.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: optimize `get_untracked_files()` and `check_chan... Paul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:26 +0000 (23:16 +0000)

stash: optimize `get_untracked_files()` and `check_changes()`

This commits introduces a optimization by avoiding calling the
same functions again. For example, `git stash push -u`
would call at some points the following functions:

* `check_changes()` (inside `do_push_stash()`)
* `do_create_stash()`, which calls: `check_changes()` and
`get_untracked_files()`

Note that `check_changes()` also calls `get_untracked_files()`.
So, `check_changes()` is called 2 times and `get_untracked_files()`
3 times.

The old function `check_changes()` now consists of two functions:
`get_untracked_files()` and `check_changes_tracked_files()`.

These are the call chains for `push` and `create`:

* `push_stash()` -> `do_push_stash()` -> `do_create_stash()`

* `create_stash()` -> `do_create_stash()`

To prevent calling the same functions over and over again,
`check_changes()` inside `do_create_stash()` is now placed
in the caller functions (`create_stash()` and `do_push_stash()`).
This way `check_changes()` and `get_untracked files()` are called
only one time.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert save to builtinPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:25 +0000 (23:16 +0000)

stash: convert save to builtin

Add stash save to the helper and delete functions which are no
longer needed (`show_help()`, `save_stash()`, `push_stash()`,
`create_stash()`, `clear_stash()`, `untracked_files()` and
`no_changes()`).

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: make push -q quietPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:24 +0000 (23:16 +0000)

stash: make push -q quiet

There is a change in behaviour with this commit. When there was
no initial commit, the shell version of stash would still display
a message. This commit makes `push` to not display any message if
`--quiet` or `-q` is specified. Add tests for `--quiet`.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert push to builtinPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:23 +0000 (23:16 +0000)

stash: convert push to builtin

Add stash push to the helper.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert create to builtinPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:22 +0000 (23:16 +0000)

stash: convert create to builtin

Add stash create to the helper.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Helped-by: Matthew Kraai <mkraai@its.jnj.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert store to builtinPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:21 +0000 (23:16 +0000)

stash: convert store to builtin

Add stash store to the helper and delete the store_stash function
from the shell script.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert show to builtinPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:20 +0000 (23:16 +0000)

stash: convert show to builtin

Add stash show to the helper and delete the show_stash, have_stash,
assert_stash_like, is_stash_like and parse_flags_and_rev functions
from the shell script now that they are no longer needed.

In shell version, although `git stash show` accepts `--index` and
`--quiet` options, it ignores them. In C, both options are passed
further to `git diff`.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert list to builtinPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:19 +0000 (23:16 +0000)

stash: convert list to builtin

Add stash list to the helper and delete the list_stash function
from the shell script.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert pop to builtinJoel Teichroeb Mon, 25 Feb 2019 23:16:18 +0000 (23:16 +0000)

stash: convert pop to builtin

Add stash pop to the helper and delete the pop_stash, drop_stash,
assert_stash_ref functions from the shell script now that they
are no longer needed.

Signed-off-by: Joel Teichroeb <joel@teichroeb.net>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert branch to builtinJoel Teichroeb Mon, 25 Feb 2019 23:16:17 +0000 (23:16 +0000)

stash: convert branch to builtin

Add stash branch to the helper and delete the apply_to_branch
function from the shell script.

Checkout does not currently provide a function for checking out
a branch as cmd_checkout does a large amount of sanity checks
first that we require here.

Signed-off-by: Joel Teichroeb <joel@teichroeb.net>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert drop and clear to builtinJoel Teichroeb Mon, 25 Feb 2019 23:16:16 +0000 (23:16 +0000)

stash: convert drop and clear to builtin

Add the drop and clear commands to the builtin helper. These two
are each simple, but are being added together as they are quite
related.

We have to unfortunately keep the drop and clear functions in the
shell script as functions are called with parameters internally
that are not valid when the commands are called externally. Once
pop is converted they can both be removed.

Signed-off-by: Joel Teichroeb <joel@teichroeb.net>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: convert apply to builtinJoel Teichroeb Mon, 25 Feb 2019 23:16:15 +0000 (23:16 +0000)

stash: convert apply to builtin

Add a builtin helper for performing stash commands. Converting
all at once proved hard to review, so starting with just apply
lets conversion get started without the other commands being
finished.

The helper is being implemented as a drop in replacement for
stash so that when it is complete it can simply be renamed and
the shell script deleted.

Delete the contents of the apply_stash shell function and replace
it with a call to stash--helper apply until pop is also
converted.

Signed-off-by: Joel Teichroeb <joel@teichroeb.net>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: mention options in `show` synopsisPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:14 +0000 (23:16 +0000)

stash: mention options in `show` synopsis

Mention in the documentation, that `show` accepts any
option known to `git diff`.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: add tests for `git stash show` configPaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:13 +0000 (23:16 +0000)

stash: add tests for `git stash show` config

This commit introduces tests for `git stash show`
config. It tests all the cases where `stash.showStat`
and `stash.showPatch` are unset or set to true / false.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: rename test cases to be more descriptivePaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:12 +0000 (23:16 +0000)

stash: rename test cases to be more descriptive

Rename some test cases' labels to be more descriptive and under 80
characters per line.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t3903: add test for --intent-to-add fileMatthew Kraai Mon, 25 Feb 2019 23:16:11 +0000 (23:16 +0000)

t3903: add test for --intent-to-add file

Add a test showing the 'git stash' behaviour with a file that has been
added with 'git add --intent-to-add'. Stash fails to stash the file,
so the purpose of this test is mainly to make sure git doesn't crash,
but exits normally in this situation.

This is in preparation for converting stash into a builtin.

[tg: pulled the test out into a separate commit]

Signed-off-by: Matthew Kraai <mkraai@its.jnj.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t3903: modernize stylePaul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:10 +0000 (23:16 +0000)

t3903: modernize style

Remove whitespaces after redirection operators and wrap
long lines.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: improve option parsing test coverageJoel Teichroeb Mon, 25 Feb 2019 23:16:09 +0000 (23:16 +0000)

stash: improve option parsing test coverage

In preparation for converting the stash command incrementally to
a builtin command, this patch improves test coverage of the option
parsing. Both for having too many parameters, or too few.

Signed-off-by: Joel Teichroeb <joel@teichroeb.net>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

ident: don't require calling prepare_fallback_ident... Thomas Gummerer Wed, 6 Mar 2019 22:09:11 +0000 (22:09 +0000)

ident: don't require calling prepare_fallback_ident first

In fd5a58477c ("ident: add the ability to provide a "fallback
identity"", 2019-02-25) I made it a requirement to call
prepare_fallback_ident as the first function in the ident API.
However in stash we didn't actually end up following that.

This leads to a BUG if user.email and user.name are set. It was not
caught in the test suite because we only rely on environment variables
for setting the user name and email instead of the config.

Instead of making it a bug to call other functions in the ident API
first, just return silently if the identity of a user was already set
up.

Reported-by: Denton Liu <liu.denton@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

ident: add the ability to provide a "fallback identity"Johannes Schindelin Mon, 25 Feb 2019 23:16:08 +0000 (23:16 +0000)

ident: add the ability to provide a "fallback identity"

In 3bc2111fc2e9 (stash: tolerate missing user identity, 2018-11-18),
`git stash` learned to provide a fallback identity for the case that no
proper name/email was given (and `git stash` does not really care about
a correct identity anyway, but it does want to create a commit object).

In preparation for the same functionality in the upcoming built-in
version of `git stash`, let's offer the same functionality as an API
function.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
[tg: add docs; make it a bug to call the function before other
functions in the ident API]
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

strbuf.c: add `strbuf_insertf()` and `strbuf_vinsertf()`Paul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:07 +0000 (23:16 +0000)

strbuf.c: add `strbuf_insertf()` and `strbuf_vinsertf()`

Implement `strbuf_insertf()` and `strbuf_vinsertf()` to
insert data using a printf format string.

Original-idea-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Helped-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

strbuf.c: add `strbuf_join_argv()`Paul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:06 +0000 (23:16 +0000)

strbuf.c: add `strbuf_join_argv()`

Implement `strbuf_join_argv()` to join arguments
into a strbuf.

Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

sha1-name.c: add `get_oidf()` which acts like `get_oid()`Paul-Sebastian Ungureanu Mon, 25 Feb 2019 23:16:05 +0000 (23:16 +0000)

sha1-name.c: add `get_oidf()` which acts like `get_oid()`

Compared to `get_oid()`, `get_oidf()` has as parameters
a pointer to `object_id`, a printf format string and
additional arguments. This will help simplify the code
in subsequent commits.

Original-idea-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'sd/stash-wo-user-name'Junio C Hamano Thu, 3 Jan 2019 23:21:13 +0000 (15:21 -0800)

Merge branch 'sd/stash-wo-user-name'

* sd/stash-wo-user-name:
stash: tolerate missing user identity

Sync with Git 2.20.1Junio C Hamano Sat, 15 Dec 2018 04:00:25 +0000 (13:00 +0900)

Sync with Git 2.20.1

* maint:
Git 2.20.1
.gitattributes: ensure t/oid-info/* has eol=lf
t9902: 'send-email' test case requires PERL
t4256: mark support files as LF-only
parse-options: fix SunCC compiler warning
help -a: handle aliases with long names gracefully
help.h: fix coding style
run-command: report exec failure

Prepare for 2.21 cycle to start soonishJunio C Hamano Sat, 15 Dec 2018 03:36:06 +0000 (12:36 +0900)

Prepare for 2.21 cycle to start soonish

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Git 2.20.1 v2.20.1Junio C Hamano Sat, 15 Dec 2018 03:31:34 +0000 (12:31 +0900)

Git 2.20.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'jc/run-command-report-exec-failure-fix... Junio C Hamano Sat, 15 Dec 2018 03:24:34 +0000 (12:24 +0900)

Merge branch 'jc/run-command-report-exec-failure-fix' into maint

A recent update accidentally squelched an error message when the
run_command API failed to run a missing command, which has been
corrected.

* jc/run-command-report-exec-failure-fix:
run-command: report exec failure

Merge branch 'js/help-commands-verbose-by-default-fix... Junio C Hamano Sat, 15 Dec 2018 03:24:33 +0000 (12:24 +0900)

Merge branch 'js/help-commands-verbose-by-default-fix' into maint

"git help -a" did not work well when an overly long alias is
defined, which has been corrected.

* js/help-commands-verbose-by-default-fix:
help -a: handle aliases with long names gracefully
help.h: fix coding style

Merge branch 'nd/show-gitcomp-compilation-fix' into... Junio C Hamano Sat, 15 Dec 2018 03:24:33 +0000 (12:24 +0900)

Merge branch 'nd/show-gitcomp-compilation-fix' into maint

Portability fix for a recent update to parse-options API.

* nd/show-gitcomp-compilation-fix:
parse-options: fix SunCC compiler warning

Merge branch 'js/t9902-send-email-completion-fix' into... Junio C Hamano Sat, 15 Dec 2018 03:24:32 +0000 (12:24 +0900)

Merge branch 'js/t9902-send-email-completion-fix' into maint

* js/t9902-send-email-completion-fix:
t9902: 'send-email' test case requires PERL

Merge branch 'js/mailinfo-format-flowed-fix' into maintJunio C Hamano Sat, 15 Dec 2018 03:24:32 +0000 (12:24 +0900)

Merge branch 'js/mailinfo-format-flowed-fix' into maint

Test portability fix.

* js/mailinfo-format-flowed-fix:
t4256: mark support files as LF-only

Merge branch 'ds/hash-independent-tests-fix' into maintJunio C Hamano Sat, 15 Dec 2018 03:24:32 +0000 (12:24 +0900)

Merge branch 'ds/hash-independent-tests-fix' into maint

Test portability fix.

* ds/hash-independent-tests-fix:
.gitattributes: ensure t/oid-info/* has eol=lf

.gitattributes: ensure t/oid-info/* has eol=lfDerrick Stolee Tue, 11 Dec 2018 20:35:46 +0000 (12:35 -0800)

.gitattributes: ensure t/oid-info/* has eol=lf

The new test_oid machinery in the test library requires reading
some information from t/oid-info/hash-info and t/oid-info/oid.

The logic to read from these files in shell uses built-in "read"
command, which leaves CR at the end of these text files when they
are checked out with CRLF line endings, at least when run with bash
shipped with Git for Windows. This results in an unexpected value
in the variable these lines are read into, leading the tests to
fail.

Mark them to be checked out always with the LF line endings.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t9902: 'send-email' test case requires PERLJohannes Schindelin Thu, 13 Dec 2018 14:04:19 +0000 (06:04 -0800)

t9902: 'send-email' test case requires PERL

The oneline notwithstanding, 13374987dd (completion: use _gitcompbuiltin
for format-patch, 2018-11-03) changed also the way send-email options
are completed, by asking the git send-email command itself what options
it offers.

Necessarily, this must fail when built with NO_PERL because send-email
itself is a Perl script. Which means that we need the PERL prerequisite
for the send-email test case in t9902.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t4256: mark support files as LF-onlyJohannes Schindelin Wed, 12 Dec 2018 18:14:54 +0000 (10:14 -0800)

t4256: mark support files as LF-only

The test t4256-am-format-flowed.sh requires carefully applying a
patch after ignoring padding whitespace. This breaks if the file
is munged to include CRLF line endings instead of LF.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

parse-options: fix SunCC compiler warningNguyễn Thái Ngọc Duy Tue, 11 Dec 2018 15:35:01 +0000 (16:35 +0100)

parse-options: fix SunCC compiler warning

The compiler reports this because show_gitcomp() never actually
returns a value:

"parse-options.c", line 520: warning: Function has no return
statement : show_gitcomp

We could shut the compiler up. But instead let's not bury exit() too
deep. Do the same as internal -h handling, return a special error code
and handle the exit() in parse_options() (and other
parse_options_step() callers) instead.

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

help -a: handle aliases with long names gracefullyJohannes Schindelin Tue, 11 Dec 2018 14:58:11 +0000 (06:58 -0800)

help -a: handle aliases with long names gracefully

We take pains to determine the longest command beforehand, so that we
can align the category column after printing the command names.

However, then we re-use that value when printing the aliases. If any
alias name is longer than the longest command name, we consequently try
to add a negative number of spaces (but `mput_char()` does not expect
any negative values and simply decrements until the value is 0, i.e.
it tries to add close to 2**31 spaces).

Let's fix this by adjusting the `longest` variable before printing the
aliases.

This fixes https://github.com/git-for-windows/git/issues/1975.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

help.h: fix coding styleJohannes Schindelin Tue, 11 Dec 2018 14:58:10 +0000 (06:58 -0800)

help.h: fix coding style

We want a space after the `while` keyword.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

run-command: report exec failureJunio C Hamano Tue, 11 Dec 2018 05:46:07 +0000 (14:46 +0900)

run-command: report exec failure

In 321fd823 ("run-command: mark path lookup errors with ENOENT",
2018-10-24), we rewrote the logic to execute a command by looking
in the directories on $PATH; as a side effect, a request to run a
command that is not found on $PATH is noticed even before a child
process is forked to execute it.

We however stopped to report an exec failure in such a case by
mistake. Add a logic to report the error unless silent-exec-failure
is requested, to match the original code.

Reported-by: John Passaro <john.a.passaro@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Git 2.20 v2.20.0Junio C Hamano Sun, 9 Dec 2018 04:16:21 +0000 (13:16 +0900)

Git 2.20

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge tag 'l10n-2.20.0-rnd3' of https://github.com... Junio C Hamano Sun, 9 Dec 2018 04:11:36 +0000 (13:11 +0900)

Merge tag 'l10n-2.20.0-rnd3' of https://github.com/git-l10n/git-po

l10n-2.20.0-rnd3

* tag 'l10n-2.20.0-rnd3' of https://github.com/git-l10n/git-po: (22 commits)
l10n: de.po: fix two messages
l10n: zh_CN: for git v2.20.0 l10n round 1 to 3
l10n: update German translation
l10n: bg.po: Updated Bulgarian translation (4187t)
l10n: sv.po: Update Swedish translation (4187t0f0u)
l10n: fr.po v2.20.0 round 3
l10n: vi(4187t): Updated Vietnamese translation for v2.20.0 rd3
l10n: es.po v2.20.0 round 3
l10n: git.pot: v2.20.0 round 3 (5 new, 3 removed)
l10n: vi(4185t): Updated Vietnamese translation for v2.20.0
l10n: es.po v2.20.0 round 1
l10n: bg.po: Updated Bulgarian translation (4185t)
l10n: git.pot: v2.20.0 round 2 (2 new, 2 removed)
l10n: bg.po: Updated Bulgarian translation (4185t)
l10n: sv.po: Update Swedish translation (4185t0f0u)
l10n: fr.po v2.20 rnd 1
l10n: Update Catalan translation
l10n: git.pot: v2.20.0 round 1 (254 new, 27 removed)
l10n: Update Catalan translation
l10n: vi.po: fix typo in pack-objects
...

l10n: de.po: fix two messagesRalf Thielow Fri, 7 Dec 2018 18:43:07 +0000 (19:43 +0100)

l10n: de.po: fix two messages

Reported-by: Phillip Szelat <phillip.szelat@gmail.com>
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>

l10n: zh_CN: for git v2.20.0 l10n round 1 to 3Jiang Xin Tue, 20 Nov 2018 02:18:06 +0000 (10:18 +0800)

l10n: zh_CN: for git v2.20.0 l10n round 1 to 3

Translate 257 new messages (4187t0f0u) for git 2.20.0.

Reviewed-by: Zhou Fangyi <fangyi.zhou@yuriko.moe>
Reviewed-by: 依云 <lilydjwg@gmail.com>
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>

l10n: update German translationRalf Thielow Thu, 6 Dec 2018 06:44:41 +0000 (07:44 +0100)

l10n: update German translation

Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>

Merge branch 'es/format-patch-range-diff-fix-fix'Junio C Hamano Tue, 4 Dec 2018 03:49:50 +0000 (12:49 +0900)

Merge branch 'es/format-patch-range-diff-fix-fix'

* es/format-patch-range-diff-fix-fix:
range-diff: always pass at least minimal diff options

Merge branch 'en/rebase-consistency'Junio C Hamano Tue, 4 Dec 2018 03:49:39 +0000 (12:49 +0900)

Merge branch 'en/rebase-consistency'

* en/rebase-consistency:
rebase docs: fix incorrect format of the section Behavioral Differences

rebase docs: fix incorrect format of the section Behavi... Johannes Sixt Mon, 3 Dec 2018 17:34:49 +0000 (18:34 +0100)

rebase docs: fix incorrect format of the section Behavioral Differences

The text body of section Behavioral Differences is typeset as code,
but should be regular text. Remove the indentation to achieve that.

While here, prettify the language:

- use "the x backend" instead of "x-based rebase";
- use present tense instead of future tense;

and use subsections instead of a list.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

RelNotes 2.20: drop spurious double quoteMartin Ågren Mon, 3 Dec 2018 20:21:51 +0000 (21:21 +0100)

RelNotes 2.20: drop spurious double quote

We have three double-quote characters, which is one too many or too few.
Dropping the last one seems to match the original intention best.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

RelNotes 2.20: clarify sentenceMartin Ågren Mon, 3 Dec 2018 20:21:50 +0000 (21:21 +0100)

RelNotes 2.20: clarify sentence

I had to read this sentence a few times to understand it. Let's try to
clarify it.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

RelNotes 2.20: move some items between sectionsMartin Ågren Mon, 3 Dec 2018 20:21:49 +0000 (21:21 +0100)

RelNotes 2.20: move some items between sections

Some items that should be in "Performance, Internal Implementation,
Development Support etc." have ended up in "UI, Workflows & Features"
and "Fixes since v2.19". Move them, and do s/uses/use/ while at it.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

range-diff: always pass at least minimal diff optionsMartin Ågren Mon, 3 Dec 2018 21:21:31 +0000 (16:21 -0500)

range-diff: always pass at least minimal diff options

Commit d8981c3f88 ("format-patch: do not let its diff-options affect
--range-diff", 2018-11-30) taught `show_range_diff()` to accept a
NULL-pointer as an indication that it should use its own "reasonable
default". That fixed a regression from a5170794 ("Merge branch
'ab/range-diff-no-patch'", 2018-11-18), but unfortunately it introduced
a regression of its own.

In particular, it means we forget the `file` member of the diff options,
so rather than placing a range-diff in the cover-letter, we write it to
stdout. In order to fix this, rewrite the two callers adjusted by
d8981c3f88 to instead create a "dummy" set of diff options where they
only fill in the fields we absolutely require, such as output file and
color.

Modify and extend the existing tests to try and verify that the right
contents end up in the right place.

Don't revert `show_range_diff()`, i.e., let it keep accepting NULL.
Rather than removing what is dead code and figuring out it isn't
actually dead and we've broken 2.20, just leave it for now.

[es: retain diff coloring when going to stdout]

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'master' of git://github.com/alshopov... Jiang Xin Mon, 3 Dec 2018 04:49:45 +0000 (12:49 +0800)

Merge branch 'master' of git://github.com/alshopov/git-po

l10n: bg.po: Updated Bulgarian translation (4187t)Alexander Shopov Sun, 2 Dec 2018 12:42:29 +0000 (13:42 +0100)

l10n: bg.po: Updated Bulgarian translation (4187t)

Signed-off-by: Alexander Shopov <ash@kambanaria.org>

l10n: sv.po: Update Swedish translation (4187t0f0u)Peter Krefting Sun, 2 Dec 2018 14:43:34 +0000 (15:43 +0100)

l10n: sv.po: Update Swedish translation (4187t0f0u)

Signed-off-by: Peter Krefting <peter@softwolves.pp.se>

Merge branch 'fr_2.20_round3' of git://github.com/jnavi... Jiang Xin Sun, 2 Dec 2018 14:36:36 +0000 (22:36 +0800)

Merge branch 'fr_2.20_round3' of git://github.com/jnavila/git

l10n: fr.po v2.20.0 round 3Jean-Noël Avila Sun, 2 Dec 2018 10:03:23 +0000 (11:03 +0100)

l10n: fr.po v2.20.0 round 3

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>

Merge branch 'master' of https://github.com/vnwildman/gitJiang Xin Sun, 2 Dec 2018 09:57:24 +0000 (17:57 +0800)

Merge branch 'master' of https://github.com/vnwildman/git

l10n: vi(4187t): Updated Vietnamese translation for... Tran Ngoc Quan Sun, 2 Dec 2018 07:15:00 +0000 (14:15 +0700)

l10n: vi(4187t): Updated Vietnamese translation for v2.20.0 rd3

Signed-off-by: Tran Ngoc Quan <vnwildman@gmail.com>

l10n: es.po v2.20.0 round 3Christopher Diaz Riveros Sun, 2 Dec 2018 04:12:59 +0000 (23:12 -0500)

l10n: es.po v2.20.0 round 3

Signed-off-by: Christopher Diaz Riveros <chrisadr@gentoo.org>

l10n: git.pot: v2.20.0 round 3 (5 new, 3 removed)Jiang Xin Sun, 2 Dec 2018 02:56:26 +0000 (10:56 +0800)

l10n: git.pot: v2.20.0 round 3 (5 new, 3 removed)

Generate po/git.pot from v2.20.0-rc2 for git v2.20.0 l10n round 3.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>

Merge branch 'master' of git://github.com/git-l10n... Jiang Xin Sun, 2 Dec 2018 02:55:14 +0000 (10:55 +0800)

Merge branch 'master' of git://github.com/git-l10n/git-po

Merge branch 'master' of https://github.com/vnwildman/gitJiang Xin Sun, 2 Dec 2018 02:25:09 +0000 (10:25 +0800)

Merge branch 'master' of https://github.com/vnwildman/git

l10n: vi(4185t): Updated Vietnamese translation for... Tran Ngoc Quan Sun, 2 Dec 2018 01:56:42 +0000 (08:56 +0700)

l10n: vi(4185t): Updated Vietnamese translation for v2.20.0

Signed-off-by: Tran Ngoc Quan <vnwildman@gmail.com>

l10n: es.po v2.20.0 round 1Christopher Diaz Riveros Sat, 1 Dec 2018 18:41:27 +0000 (13:41 -0500)

l10n: es.po v2.20.0 round 1

Signed-off-by: Christopher Diaz Riveros <chrisadr@gentoo.org>

Git 2.20-rc2 v2.20.0-rc2Junio C Hamano Sat, 1 Dec 2018 12:44:56 +0000 (21:44 +0900)

Git 2.20-rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'gh/diff-raw-has-no-ellipses'Junio C Hamano Sat, 1 Dec 2018 12:41:45 +0000 (21:41 +0900)

Merge branch 'gh/diff-raw-has-no-ellipses'

"git diff --raw" lost ellipses to adjust the output columns for
some time now, but the documentation still showed them.

* gh/diff-raw-has-no-ellipses:
doc: update diff-format.txt for removed ellipses in --raw

Merge branch 'ss/msvc-strcasecmp'Junio C Hamano Sat, 1 Dec 2018 12:41:45 +0000 (21:41 +0900)

Merge branch 'ss/msvc-strcasecmp'

MSVC update.

* ss/msvc-strcasecmp:
msvc: directly use MS version (_stricmp) of strcasecmp

Merge branch 'sg/test-BUG'Junio C Hamano Sat, 1 Dec 2018 12:41:44 +0000 (21:41 +0900)

Merge branch 'sg/test-BUG'

test framework has been updated to make a bug in the test script
(as opposed to bugs in Git that are discovered by running the
tests) stand out more prominently.

* sg/test-BUG:
tests: send "bug in the test script" errors to the script's stderr

Merge branch 'sg/test-cmp-rev'Junio C Hamano Sat, 1 Dec 2018 12:41:44 +0000 (21:41 +0900)

Merge branch 'sg/test-cmp-rev'

Test framework update.

* sg/test-cmp-rev:
test-lib-functions: make 'test_cmp_rev' more informative on failure

Merge branch 'ab/push-example-in-doc'Junio C Hamano Sat, 1 Dec 2018 12:41:44 +0000 (21:41 +0900)

Merge branch 'ab/push-example-in-doc'

An error message that sugggests how to give correct arguments to
"git push" has been updated.

* ab/push-example-in-doc:
push: change needlessly ambiguous example in error

Merge branch 'rt/rebase-in-c-message-fix'Junio C Hamano Sat, 1 Dec 2018 12:41:44 +0000 (21:41 +0900)

Merge branch 'rt/rebase-in-c-message-fix'

* rt/rebase-in-c-message-fix:
builtin/rebase.c: remove superfluous space in messages

Merge branch 'sg/daemon-test-signal-fix'Junio C Hamano Sat, 1 Dec 2018 12:41:43 +0000 (21:41 +0900)

Merge branch 'sg/daemon-test-signal-fix'

Test fix.

* sg/daemon-test-signal-fix:
t/lib-git-daemon: fix signal checking

Merge branch 'ma/reset-doc-rendering-fix'Junio C Hamano Sat, 1 Dec 2018 12:41:43 +0000 (21:41 +0900)

Merge branch 'ma/reset-doc-rendering-fix'

Doc updates.

* ma/reset-doc-rendering-fix:
git-reset.txt: render literal examples as monospace
git-reset.txt: render tables correctly under Asciidoctor

Merge branch 'ab/replace-graft-with-replace-advice'Junio C Hamano Sat, 1 Dec 2018 12:41:42 +0000 (21:41 +0900)

Merge branch 'ab/replace-graft-with-replace-advice'

The advice message to tell the user to migrate an existing graft
file to the replace system when a graft file was read was shown
even when "git replace --convert-graft-file" command, which is the
way the message suggests to use, was running, which made little
sense.

* ab/replace-graft-with-replace-advice:
advice: don't pointlessly suggest --convert-graft-file

Merge branch 'js/rebase-stat-unrelated-fix'Junio C Hamano Sat, 1 Dec 2018 12:41:42 +0000 (21:41 +0900)

Merge branch 'js/rebase-stat-unrelated-fix'

"git rebase --stat" to transplant a piece of history onto a totally
unrelated history were not working before and silently showed wrong
result. With the recent reimplementation in C, it started to instead
die with an error message, as the original logic was not prepared
to cope with this case. This has now been fixed.

* js/rebase-stat-unrelated-fix:
rebase --stat: fix when rebasing to an unrelated history

Merge branch 'js/rebase-reflog-action-fix'Junio C Hamano Sat, 1 Dec 2018 12:41:42 +0000 (21:41 +0900)

Merge branch 'js/rebase-reflog-action-fix'

"git rebase" reimplemented recently in C accidentally changed the
way reflog entries are recorded (earlier "rebase -i" identified the
entries it leaves with "rebase -i", but the new version always
marks them with "rebase"). This has been corrected.

* js/rebase-reflog-action-fix:
rebase: fix GIT_REFLOG_ACTION regression

Merge branch 'jc/format-patch-range-diff-fix'Junio C Hamano Sat, 1 Dec 2018 12:41:42 +0000 (21:41 +0900)

Merge branch 'jc/format-patch-range-diff-fix'

"git format-patch --range-diff" by mistake passed the diff options
used to generate the primary output of the command to the
range-diff machinery, which caused the range-diff in the cover
letter to include fairly useless "--stat" output. This has been
corrected by forcing a non-customizable default formatting options
on the range-diff machinery when driven by format-patch.

* jc/format-patch-range-diff-fix:
format-patch: do not let its diff-options affect --range-diff

builtin/rebase.c: remove superfluous space in messagesRalf Thielow Fri, 30 Nov 2018 18:11:45 +0000 (19:11 +0100)

builtin/rebase.c: remove superfluous space in messages

The whitespace breakages in these messages were introduced while
reimplementing the subcommand in C. Match these messages to those
in the original scripted version.

Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

l10n: bg.po: Updated Bulgarian translation (4185t)Alexander Shopov Sat, 1 Dec 2018 10:48:08 +0000 (11:48 +0100)

l10n: bg.po: Updated Bulgarian translation (4185t)

Signed-off-by: Alexander Shopov <ash@kambanaria.org>

l10n: git.pot: v2.20.0 round 2 (2 new, 2 removed)Jiang Xin Sat, 1 Dec 2018 08:15:51 +0000 (16:15 +0800)

l10n: git.pot: v2.20.0 round 2 (2 new, 2 removed)

Generate po/git.pot from v2.20.0-rc1-10-g7068cbc4ab for git v2.20.0 l10n
round 2.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>

Merge branch 'master' of git://github.com/git-l10n... Jiang Xin Sat, 1 Dec 2018 08:14:16 +0000 (16:14 +0800)

Merge branch 'master' of git://github.com/git-l10n/git-po

Merge branch 'master' of git://github.com/alshopov... Jiang Xin Sat, 1 Dec 2018 08:13:31 +0000 (16:13 +0800)

Merge branch 'master' of git://github.com/alshopov/git-po

Merge branch 'master' of git://github.com/nafmo/git... Jiang Xin Sat, 1 Dec 2018 08:11:45 +0000 (16:11 +0800)

Merge branch 'master' of git://github.com/nafmo/git-l10n-sv

Merge branch 'fr_2.20_rnd1' of git://github.com/jnavila/gitJiang Xin Sat, 1 Dec 2018 07:36:53 +0000 (15:36 +0800)

Merge branch 'fr_2.20_rnd1' of git://github.com/jnavila/git

l10n: bg.po: Updated Bulgarian translation (4185t)Alexander Shopov Mon, 29 Oct 2018 12:31:37 +0000 (13:31 +0100)

l10n: bg.po: Updated Bulgarian translation (4185t)

Signed-off-by: Alexander Shopov <ash@kambanaria.org>

rebase --stat: fix when rebasing to an unrelated historyJohannes Schindelin Thu, 29 Nov 2018 13:01:54 +0000 (05:01 -0800)

rebase --stat: fix when rebasing to an unrelated history

When rebasing to a commit history that has no common commits with the
current branch, there is no merge base. In diffstat mode, this means
that we cannot compare to the merge base, but we have to compare to the
empty tree instead.

Also, if running in verbose diffstat mode, we should not output

Changes from <merge-base> to <onto>

as that does not make sense without any merge base.

Note: neither scripted nor built-in versoin of `git rebase` were
prepared for this situation well. We use this opportunity not only to
fix the bug(s), but also to make both versions' output consistent in
this instance. And add a regression test to keep this working in all
eternity.

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rebase: fix GIT_REFLOG_ACTION regressionJohannes Schindelin Thu, 29 Nov 2018 19:09:21 +0000 (11:09 -0800)

rebase: fix GIT_REFLOG_ACTION regression

The scripted version of "rebase" honored the `GIT_REFLOG_ACTION`,
and some automation scripts expected the reflog entries to be
prefixed with "rebase -i", not "rebase", after running "rebase -i".
This regressed in the reimplementation in C.

Fix that, and add a regression test, both with `GIT_REFLOG_ACTION`
set and unset.

Note: the reflog message for "rebase finished" did *not* honor
GIT_REFLOG_ACTION, and as we are very late in the v2.20.0-rcN phase,
we leave that bug for later (as it seems that that bug has been with
us from the very beginning).

Reported by Ian Jackson.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

format-patch: do not let its diff-options affect -... Junio C Hamano Fri, 30 Nov 2018 04:27:11 +0000 (13:27 +0900)

format-patch: do not let its diff-options affect --range-diff

Stop leaking how the primary output of format-patch is customized to
the range-diff machinery and instead let the latter use its own
"reasonable default", in order to correct the breakage introduced by
a5170794 ("Merge branch 'ab/range-diff-no-patch'", 2018-11-18) on
the 'master' front. "git format-patch --range-diff..." without any
weird diff option started to include the "range-diff --stat" output,
which is rather useless right now, that made the whole thing
unusable and this is probably the least disruptive way to whip the
codebase into a shippable shape.

We may want to later make the range-diff driven by format-patch more
configurable, but that would have to wait until we have a good
design.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

l10n: sv.po: Update Swedish translation (4185t0f0u)Peter Krefting Thu, 29 Nov 2018 11:55:22 +0000 (12:55 +0100)

l10n: sv.po: Update Swedish translation (4185t0f0u)

Signed-off-by: Peter Krefting <peter@softwolves.pp.se>

Merge branch 'ja/i18n-fix'Junio C Hamano Thu, 29 Nov 2018 07:28:39 +0000 (16:28 +0900)

Merge branch 'ja/i18n-fix'

* ja/i18n-fix:
i18n: fix small typos

Merge branch 'nd/n18n-fix'Junio C Hamano Thu, 29 Nov 2018 07:28:39 +0000 (16:28 +0900)

Merge branch 'nd/n18n-fix'

* nd/n18n-fix:
transport-helper.c: do not translate a string twice

i18n: fix small typosJean-Noël Avila Wed, 28 Nov 2018 21:43:09 +0000 (22:43 +0100)

i18n: fix small typos

Translating the new strings introduced for v2.20 showed some typos.

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-reset.txt: render literal examples as monospaceMartin Ågren Wed, 28 Nov 2018 19:02:10 +0000 (20:02 +0100)

git-reset.txt: render literal examples as monospace

Large parts of this document do not use `backticks` around literal
examples such as branch names (`topic/wip`), git usages, `HEAD` and
`<commit-ish>` so they render as ordinary text. Fix that.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-reset.txt: render tables correctly under AsciidoctorMartin Ågren Wed, 28 Nov 2018 19:02:09 +0000 (20:02 +0100)

git-reset.txt: render tables correctly under Asciidoctor

Asciidoctor removes the indentation of each line in these tables, so the
last lines of each table have a completely broken alignment.

Similar to 379805051d ("Documentation: render revisions correctly under
Asciidoctor", 2018-05-06), use an explicit literal block to indicate
that we want to keep the leading whitespace in the tables.

Because this gives us some extra indentation, we can remove the one that
we have been carrying explicitly. That is, drop the first six spaces of
indentation on each line. With Asciidoc (8.6.10), this results in
identical rendering before and after this commit, both for git-reset.1
and git-reset.html.

Reported-by: Paweł Samoraj <samoraj.pawel@gmail.com>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

transport-helper.c: do not translate a string twiceNguyễn Thái Ngọc Duy Mon, 26 Nov 2018 19:57:56 +0000 (20:57 +0100)

transport-helper.c: do not translate a string twice

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>