gitweb.git
doc: move extensions.worktreeConfig to the right placeNguyễn Thái Ngọc Duy Wed, 14 Nov 2018 16:02:47 +0000 (17:02 +0100)

doc: move extensions.worktreeConfig to the right place

All config extensions are described in technical/repository-version.txt.
I made a mistake of adding it in config.txt instead. This patch moves
it back to where it belongs.

Since repository-version.txt is not part of officially generated
documents (it's not even part of DOC_HTML target), it's only visible
to developers who read plain .txt files. Let's include it in
gitrepository-layout.5 for more visibility. Some minor asciidoc fixes
are required in repository-version.txt to make this happen.

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

Tenth batch for 2.20Junio C Hamano Tue, 13 Nov 2018 13:13:52 +0000 (22:13 +0900)

Tenth batch for 2.20

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

Merge branch 'nd/complete-format-patch'Junio C Hamano Tue, 13 Nov 2018 13:37:28 +0000 (22:37 +0900)

Merge branch 'nd/complete-format-patch'

The support for format-patch (and send-email) by the command-line
completion script (in contrib/) has been simplified a bit.

* nd/complete-format-patch:
completion: use __gitcomp_builtin for format-patch

Merge branch 'nd/tree-walk-path-exclusion'Junio C Hamano Tue, 13 Nov 2018 13:37:28 +0000 (22:37 +0900)

Merge branch 'nd/tree-walk-path-exclusion'

Pathspec matching against a tree object were buggy when negative
pathspec elements were involved, which has been fixed.

* nd/tree-walk-path-exclusion:
tree-walk.c: fix overoptimistic inclusion in :(exclude) matching

Merge branch 'sg/travis-install-dependencies'Junio C Hamano Tue, 13 Nov 2018 13:37:27 +0000 (22:37 +0900)

Merge branch 'sg/travis-install-dependencies'

The procedure to install dependencies before testing at Travis CI
is getting revamped for both simplicity and flexibility, taking
advantage of the recent move to the vm-based environment.

* sg/travis-install-dependencies:
travis-ci: install packages in 'ci/install-dependencies.sh'

Merge branch 'bp/add-diff-files-optim'Junio C Hamano Tue, 13 Nov 2018 13:37:27 +0000 (22:37 +0900)

Merge branch 'bp/add-diff-files-optim'

"git add" needs to internally run "diff-files" equivalent, and the
codepath learned the same optimization as "diff-files" has to run
lstat(2) in parallel to find which paths have been updated in the
working tree.

* bp/add-diff-files-optim:
add: speed up cmd_add() by utilizing read_cache_preload()

Merge branch 'jk/xdiff-interface'Junio C Hamano Tue, 13 Nov 2018 13:37:27 +0000 (22:37 +0900)

Merge branch 'jk/xdiff-interface'

The interface into "xdiff" library used to discover the offset and
size of a generated patch hunk by first formatting it into the
textual hunk header "@@ -n,m +k,l @@" and then parsing the numbers
out. A new interface has been introduced to allow callers a more
direct access to them.

* jk/xdiff-interface:
xdiff-interface: drop parse_hunk_header()
range-diff: use a hunk callback
diff: convert --check to use a hunk callback
combine-diff: use an xdiff hunk callback
diff: use hunk callback for word-diff
diff: discard hunk headers for patch-ids earlier
diff: avoid generating unused hunk header lines
xdiff-interface: provide a separate consume callback for hunks
xdiff: provide a separate emit callback for hunks

Merge branch 'jk/misc-unused-fixes'Junio C Hamano Tue, 13 Nov 2018 13:37:26 +0000 (22:37 +0900)

Merge branch 'jk/misc-unused-fixes'

Assorted fixes for bugs found while auditing -Wunused-parameter
warnings.

* jk/misc-unused-fixes:
approxidate: fix NULL dereference in date_time()
pathspec: handle non-terminated strings with :(attr)
approxidate: handle pending number for "specials"
rev-list: handle flags for --indexed-objects

Merge branch 'nd/per-worktree-ref-iteration'Junio C Hamano Tue, 13 Nov 2018 13:37:26 +0000 (22:37 +0900)

Merge branch 'nd/per-worktree-ref-iteration'

The code to traverse objects for reachability, used to decide what
objects are unreferenced and expendable, have been taught to also
consider per-worktree refs of other worktrees as starting points to
prevent data loss.

* nd/per-worktree-ref-iteration:
git-worktree.txt: correct linkgit command name
reflog expire: cover reflog from all worktrees
fsck: check HEAD and reflog from other worktrees
fsck: move fsck_head_link() to get_default_heads() to avoid some globals
revision.c: better error reporting on ref from different worktrees
revision.c: correct a parameter name
refs: new ref types to make per-worktree refs visible to all worktrees
Add a place for (not) sharing stuff between worktrees
refs.c: indent with tabs, not spaces

Merge branch 'bp/refresh-index-using-preload'Junio C Hamano Tue, 13 Nov 2018 13:37:25 +0000 (22:37 +0900)

Merge branch 'bp/refresh-index-using-preload'

The helper function to refresh the cached stat information in the
in-core index has learned to perform the lstat() part of the
operation in parallel on multi-core platforms.

* bp/refresh-index-using-preload:
refresh_index: remove unnecessary calls to preload_index()
speed up refresh_index() by utilizing preload_index()

Merge branch 'ag/rebase-i-in-c'Junio C Hamano Tue, 13 Nov 2018 13:37:25 +0000 (22:37 +0900)

Merge branch 'ag/rebase-i-in-c'

Code clean-up for a topic already in 'master'.

* ag/rebase-i-in-c:
sequencer.c: remove a stray semicolon

Merge branch 'al/send-email-auto-cte-fixup'Junio C Hamano Tue, 13 Nov 2018 13:37:25 +0000 (22:37 +0900)

Merge branch 'al/send-email-auto-cte-fixup'

"git send-email --transfer-encoding=..." in recent versions of Git
sometimes produced an empty "Content-Transfer-Encoding:" header,
which has been corrected.

* al/send-email-auto-cte-fixup:
send-email: avoid empty transfer encoding header

Merge branch 'ds/add-missing-tags'Junio C Hamano Tue, 13 Nov 2018 13:37:24 +0000 (22:37 +0900)

Merge branch 'ds/add-missing-tags'

The history traversal used to implement the tag-following has been
optimized by introducing a new helper.

* ds/add-missing-tags:
remote: make add_missing_tags() linear
test-reach: test get_reachable_subset
commit-reach: implement get_reachable_subset

Merge branch 'sh/mingw-safer-compat-poll'Junio C Hamano Tue, 13 Nov 2018 13:37:24 +0000 (22:37 +0900)

Merge branch 'sh/mingw-safer-compat-poll'

Windows fix.

* sh/mingw-safer-compat-poll:
poll: use GetTickCount64() to avoid wrap-around issues

Merge branch 'js/rebase-p-tests'Junio C Hamano Tue, 13 Nov 2018 13:37:24 +0000 (22:37 +0900)

Merge branch 'js/rebase-p-tests'

In preparation to the day when we can deprecate and remove the
"rebase -p", make sure we can skip and later remove tests for
it.

* js/rebase-p-tests:
tests: optionally skip `git rebase -p` tests
t3418: decouple test cases from a previous `rebase -p` test case
t3404: decouple some test cases from outcomes of previous test cases

Merge branch 'pw/am-rebase-read-author-script'Junio C Hamano Tue, 13 Nov 2018 13:37:23 +0000 (22:37 +0900)

Merge branch 'pw/am-rebase-read-author-script'

Unify code to read the author-script used in "git am" and the
commands that use the sequencer machinery, e.g. "git rebase -i".

* pw/am-rebase-read-author-script:
sequencer: use read_author_script()
add read_author_script() to libgit
am: rename read_author_script()
am: improve author-script error reporting
am: don't die in read_author_script()

Merge branch 'jc/war-on-string-list'Junio C Hamano Tue, 13 Nov 2018 13:37:23 +0000 (22:37 +0900)

Merge branch 'jc/war-on-string-list'

Replace three string-list instances used as look-up tables in "git
fetch" with hashmaps.

* jc/war-on-string-list:
fetch: replace string-list used as a look-up table with a hashmap

Merge branch 'ag/rev-parse-all-exclude-fix'Junio C Hamano Tue, 13 Nov 2018 13:37:23 +0000 (22:37 +0900)

Merge branch 'ag/rev-parse-all-exclude-fix'

"git rev-parse --exclude=* --branches --branches" (i.e. first
saying "add only things that do not match '*' out of all branches"
and then adding all branches, without any exclusion this time")
worked as expected, but "--exclude=* --all --all" did not work the
same way, which has been fixed.

* ag/rev-parse-all-exclude-fix:
rev-parse: clear --exclude list after 'git rev-parse --all'

Merge branch 'jt/tighten-fetch-proto-v2-response'Junio C Hamano Tue, 13 Nov 2018 13:37:22 +0000 (22:37 +0900)

Merge branch 'jt/tighten-fetch-proto-v2-response'

"git fetch" was a bit loose in parsing resposes from the other side
when talking over the protocol v2.

* jt/tighten-fetch-proto-v2-response:
fetch-pack: be more precise in parsing v2 response

Merge branch 'ao/submodule-wo-gitmodules-checked-out'Junio C Hamano Tue, 13 Nov 2018 13:37:22 +0000 (22:37 +0900)

Merge branch 'ao/submodule-wo-gitmodules-checked-out'

The submodule support has been updated to read from the blob at
HEAD:.gitmodules when the .gitmodules file is missing from the
working tree.

* ao/submodule-wo-gitmodules-checked-out:
t/helper: add test-submodule-nested-repo-config
submodule: support reading .gitmodules when it's not in the working tree
submodule: add a helper to check if it is safe to write to .gitmodules
t7506: clean up .gitmodules properly before setting up new scenario
submodule: use the 'submodule--helper config' command
submodule--helper: add a new 'config' subcommand
t7411: be nicer to future tests and really clean things up
t7411: merge tests 5 and 6
submodule: factor out a config_set_in_gitmodules_file_gently function
submodule: add a print_config_from_gitmodules() helper

Merge branch 'nb/worktree-api-doc'Junio C Hamano Tue, 13 Nov 2018 13:37:21 +0000 (22:37 +0900)

Merge branch 'nb/worktree-api-doc'

Code readability fix.

* nb/worktree-api-doc:
worktree: rename is_worktree_locked to worktree_lock_reason
worktree: update documentation for lock_reason and lock_reason_valid

Merge branch 'ma/sequencer-do-reset-saner-loop-termination'Junio C Hamano Tue, 13 Nov 2018 13:37:21 +0000 (22:37 +0900)

Merge branch 'ma/sequencer-do-reset-saner-loop-termination'

Code readability fix.

* ma/sequencer-do-reset-saner-loop-termination:
sequencer: break out of loop explicitly

Merge branch 'js/mingw-utf8-env'Junio C Hamano Tue, 13 Nov 2018 13:37:21 +0000 (22:37 +0900)

Merge branch 'js/mingw-utf8-env'

Windows fix.

* js/mingw-utf8-env:
mingw: reencode environment variables on the fly (UTF-16 <-> UTF-8)
t7800: fix quoting

Merge branch 'js/mingw-perl5lib'Junio C Hamano Tue, 13 Nov 2018 13:37:20 +0000 (22:37 +0900)

Merge branch 'js/mingw-perl5lib'

Windows fix.

* js/mingw-perl5lib:
mingw: unset PERL5LIB by default
config: move Windows-specific config settings into compat/mingw.c
config: allow for platform-specific core.* config settings
config: rename `dummy` parameter to `cb` in git_default_config()

Merge branch 'js/mingw-isatty-and-dup2'Junio C Hamano Tue, 13 Nov 2018 13:37:20 +0000 (22:37 +0900)

Merge branch 'js/mingw-isatty-and-dup2'

Windows fix.

* js/mingw-isatty-and-dup2:
mingw: fix isatty() after dup2()

Merge branch 'ab/pack-tests-cleanup'Junio C Hamano Tue, 13 Nov 2018 13:37:20 +0000 (22:37 +0900)

Merge branch 'ab/pack-tests-cleanup'

A couple of tests used to leave the repository in a state that is
deliberately corrupt, which have been corrected.

* ab/pack-tests-cleanup:
index-pack tests: don't leave test repo dirty at end
pack-objects tests: don't leave test .git corrupt at end
pack-objects test: modernize style

Merge branch 'ds/test-multi-pack-index'Junio C Hamano Tue, 13 Nov 2018 13:37:19 +0000 (22:37 +0900)

Merge branch 'ds/test-multi-pack-index'

Tests for the recently introduced multi-pack index machinery.

* ds/test-multi-pack-index:
packfile: close multi-pack-index in close_all_packs
multi-pack-index: define GIT_TEST_MULTI_PACK_INDEX
midx: close multi-pack-index on repack
midx: fix broken free() in close_midx()

Merge branch 'nd/wildmatch-double-asterisk'Junio C Hamano Tue, 13 Nov 2018 13:37:19 +0000 (22:37 +0900)

Merge branch 'nd/wildmatch-double-asterisk'

A pattern with '**' that does not have a slash on either side used
to be an invalid one, but the code now treats such double-asterisks
the same way as two normal asterisks that happen to be adjacent to
each other.

* nd/wildmatch-double-asterisk:
wildmatch: change behavior of "foo**bar" in WM_PATHNAME mode

Merge branch 'nd/per-worktree-config'Junio C Hamano Tue, 13 Nov 2018 13:37:18 +0000 (22:37 +0900)

Merge branch 'nd/per-worktree-config'

A fourth class of configuration files (in addition to the
traditional "system wide", "per user in the $HOME directory" and
"per repository in the $GIT_DIR/config") has been introduced so
that different worktrees that share the same repository (hence the
same $GIT_DIR/config file) can use different customization.

* nd/per-worktree-config:
worktree: add per-worktree config files
t1300: extract and use test_cmp_config()

Merge branch 'jk/stream-pack-non-delta-clarification'Junio C Hamano Tue, 13 Nov 2018 13:37:18 +0000 (22:37 +0900)

Merge branch 'jk/stream-pack-non-delta-clarification'

Additional comment on a tricky piece of code to help developers.

* jk/stream-pack-non-delta-clarification:
read_istream_pack_non_delta(): document input handling

Merge branch 'jk/proto-v2-ref-prefix-fix'Junio C Hamano Tue, 13 Nov 2018 13:37:17 +0000 (22:37 +0900)

Merge branch 'jk/proto-v2-ref-prefix-fix'

"git ls-remote $there foo" was broken by recent update for the
protocol v2 and stopped showing refs that match 'foo' that are not
refs/{heads,tags}/foo, which has been fixed.

* jk/proto-v2-ref-prefix-fix:
ls-remote: pass heads/tags prefixes to transport
ls-remote: do not send ref prefixes for patterns

Merge branch 'jk/detect-truncated-zlib-input'Junio C Hamano Tue, 13 Nov 2018 13:37:17 +0000 (22:37 +0900)

Merge branch 'jk/detect-truncated-zlib-input'

A regression in Git 2.12 era made "git fsck" fall into an infinite
loop while processing truncated loose objects.

* jk/detect-truncated-zlib-input:
cat-file: handle streaming failures consistently
check_stream_sha1(): handle input underflow
t1450: check large blob in trailing-garbage test

Merge branch 'nd/config-split'Junio C Hamano Tue, 13 Nov 2018 13:37:16 +0000 (22:37 +0900)

Merge branch 'nd/config-split'

Split the overly large Documentation/config.txt file into million
little pieces. This potentially allows each individual piece
included into the manual page of the command it affects more easily.

* nd/config-split: (81 commits)
config.txt: remove config/dummy.txt
config.txt: move worktree.* to a separate file
config.txt: move web.* to a separate file
config.txt: move versionsort.* to a separate file
config.txt: move user.* to a separate file
config.txt: move url.* to a separate file
config.txt: move uploadpack.* to a separate file
config.txt: move uploadarchive.* to a separate file
config.txt: move transfer.* to a separate file
config.txt: move tag.* to a separate file
config.txt: move submodule.* to a separate file
config.txt: move stash.* to a separate file
config.txt: move status.* to a separate file
config.txt: move splitIndex.* to a separate file
config.txt: move showBranch.* to a separate file
config.txt: move sequencer.* to a separate file
config.txt: move sendemail-config.txt to config/
config.txt: move reset.* to a separate file
config.txt: move rerere.* to a separate file
config.txt: move repack.* to a separate file
...

approxidate: fix NULL dereference in date_time()Jeff King Wed, 7 Nov 2018 01:12:53 +0000 (20:12 -0500)

approxidate: fix NULL dereference in date_time()

When we see a time like "noon", we pass "12" to our date_time() helper,
which sets the hour to 12pm. If the current time is before noon, then we
wrap around to yesterday using date_yesterday(). But unlike the normal
calls to date_yesterday() from approxidate_alpha(), we pass a NULL "num"
parameter. Since c27cc94fad (approxidate: handle pending number for
"specials", 2018-11-02), that causes a segfault.

One way to fix this is by checking for NULL. But arguably date_time() is
abusing our helper by passing NULL in the first place (and this is the
only case where one of these "special" parsers is used this way). So
instead, let's have it just do the 1-day subtraction itself. It's still
just a one-liner due to our update_tm() helper.

Note that the test added here is a little funny, as we say "10am noon",
which makes the "10am" seem pointless. But this bug can only be
triggered when it the currently-parsed hour is before the special time.
The latest special time is "tea" at 1700, but t0006 uses a hard-coded
TEST_DATE_NOW of 1900. We could reset TEST_DATE_NOW, but that may lead
to confusion in other tests. Just saying "10am noon" makes this test
self-contained.

Reported-by: Carlo Arenas <carenas@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ninth batch for 2.20Junio C Hamano Tue, 6 Nov 2018 06:51:23 +0000 (15:51 +0900)

Ninth batch for 2.20

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

Merge branch 'sg/test-verbose-log'Junio C Hamano Tue, 6 Nov 2018 06:50:23 +0000 (15:50 +0900)

Merge branch 'sg/test-verbose-log'

Our test scripts can now take the '-V' option as a synonym for the
'--verbose-log' option.

* sg/test-verbose-log:
test-lib: introduce the '-V' short option for '--verbose-log'

Merge branch 'rj/header-cleanup'Junio C Hamano Tue, 6 Nov 2018 06:50:23 +0000 (15:50 +0900)

Merge branch 'rj/header-cleanup'

Code cleanup.

* rj/header-cleanup:
commit-reach.h: add missing declarations (hdr-check)
ewok_rlw.h: add missing 'inline' to function definition
fetch-object.h: add missing declaration (hdr-check)

Merge branch 'ss/travis-ci-force-vm-mode'Junio C Hamano Tue, 6 Nov 2018 06:50:23 +0000 (15:50 +0900)

Merge branch 'ss/travis-ci-force-vm-mode'

The "container" mode of TravisCI is going away. Our .travis.yml
file is getting prepared for the transition.

* ss/travis-ci-force-vm-mode:
travis-ci: no longer use containers

Merge branch 'sg/test-rebase-editor-fix'Junio C Hamano Tue, 6 Nov 2018 06:50:22 +0000 (15:50 +0900)

Merge branch 'sg/test-rebase-editor-fix'

* sg/test-rebase-editor-fix:
t3404-rebase-interactive: test abbreviated commands

Merge branch 'tb/char-may-be-unsigned'Junio C Hamano Tue, 6 Nov 2018 06:50:22 +0000 (15:50 +0900)

Merge branch 'tb/char-may-be-unsigned'

Build portability fix.

* tb/char-may-be-unsigned:
path.c: char is not (always) signed

Merge branch 'js/mingw-ns-filetime'Junio C Hamano Tue, 6 Nov 2018 06:50:21 +0000 (15:50 +0900)

Merge branch 'js/mingw-ns-filetime'

Windows port learned to use nano-second resolution file timestamps.

* js/mingw-ns-filetime:
mingw: implement nanosecond-precision file times
mingw: replace MSVCRT's fstat() with a Win32-based implementation
mingw: factor out code to set stat() data

Merge branch 'md/exclude-promisor-objects-fix'Junio C Hamano Tue, 6 Nov 2018 06:50:21 +0000 (15:50 +0900)

Merge branch 'md/exclude-promisor-objects-fix'

Operations on promisor objects make sense in the context of only a
small subset of the commands that internally use the revisions
machinery, but the "--exclude-promisor-objects" option were taken
and led to nonsense results by commands like "log", to which it
didn't make much sense. This has been corrected.

* md/exclude-promisor-objects-fix:
exclude-promisor-objects: declare when option is allowed
Documentation/git-log.txt: do not show --exclude-promisor-objects

Merge branch 'jw/send-email-no-auth'Junio C Hamano Tue, 6 Nov 2018 06:50:20 +0000 (15:50 +0900)

Merge branch 'jw/send-email-no-auth'

"git send-email" learned to disable SMTP authentication via the
"--smtp-auth=none" option, even when the smtp username is given
(which turns the authentication on by default).

* jw/send-email-no-auth:
send-email: explicitly disable authentication

Merge branch 'nd/submodule-unused-vars'Junio C Hamano Tue, 6 Nov 2018 06:50:20 +0000 (15:50 +0900)

Merge branch 'nd/submodule-unused-vars'

Code clean-up.

* nd/submodule-unused-vars:
submodule.c: remove some of the_repository references

Merge branch 'nd/unpack-trees-with-cache-tree'Junio C Hamano Tue, 6 Nov 2018 06:50:20 +0000 (15:50 +0900)

Merge branch 'nd/unpack-trees-with-cache-tree'

Trivial bugfix.

* nd/unpack-trees-with-cache-tree:
read-cache: use of memory after it is freed

Merge branch 'nd/completion-negation'Junio C Hamano Tue, 6 Nov 2018 06:50:19 +0000 (15:50 +0900)

Merge branch 'nd/completion-negation'

The command line completion machinery (in contrib/) has been
updated to allow the completion script to tweak the list of options
that are reported by the parse-options machinery correctly.

* nd/completion-negation:
completion: fix __gitcomp_builtin no longer consider extra options

Merge branch 'jt/upload-pack-v2-fix-shallow'Junio C Hamano Tue, 6 Nov 2018 06:50:19 +0000 (15:50 +0900)

Merge branch 'jt/upload-pack-v2-fix-shallow'

"git fetch" over protocol v2 into a shallow repository failed to
fetch full history behind a new tip of history that was diverged
before the cut-off point of the history that was previously fetched
shallowly.

* jt/upload-pack-v2-fix-shallow:
upload-pack: clear flags before each v2 request
upload-pack: make want_obj not global
upload-pack: make have_obj not global

Merge branch 'sb/submodule-url-to-absolute'Junio C Hamano Tue, 6 Nov 2018 06:50:19 +0000 (15:50 +0900)

Merge branch 'sb/submodule-url-to-absolute'

Some codepaths failed to form a proper URL when .gitmodules record
the URL to a submodule repository as relative to the repository of
superproject, which has been corrected.

* sb/submodule-url-to-absolute:
submodule helper: convert relative URL to absolute URL if needed

Merge branch 'js/shallow-and-fetch-prune'Junio C Hamano Tue, 6 Nov 2018 06:50:18 +0000 (15:50 +0900)

Merge branch 'js/shallow-and-fetch-prune'

"git repack" in a shallow clone did not correctly update the
shallow points in the repository, leading to a repository that
does not pass fsck.

* js/shallow-and-fetch-prune:
repack -ad: prune the list of shallow commits
shallow: offer to prune only non-existing entries
repack: point out a bug handling stale shallow info

Merge branch 'js/remote-archive-dwimfix'Junio C Hamano Tue, 6 Nov 2018 06:50:18 +0000 (15:50 +0900)

Merge branch 'js/remote-archive-dwimfix'

The logic to determine the archive type "git archive" uses did not
correctly kick in for "git archive --remote", which has been
corrected.

* js/remote-archive-dwimfix:
archive: initialize archivers earlier

completion: use __gitcomp_builtin for format-patchDuy Nguyen Sat, 3 Nov 2018 06:03:18 +0000 (07:03 +0100)

completion: use __gitcomp_builtin for format-patch

This helps format-patch gain completion for a couple new options,
notably --range-diff.

Since send-email completion relies on $__git_format_patch_options
which is now reduced, we need to do something not to regress
send-email completion.

The workaround here is implement --git-completion-helper in
send-email.perl just as a bridge to "format-patch --git-completion-helper".
This is enough to use __gitcomp_builtin on send-email (to take
advantage of caching).

In the end, send-email.perl can probably reuse the same info it passes
to GetOptions() to generate full --git-completion-helper output so
that we don't need to keep track of its options in git-completion.bash
anymore. But that's something for another boring day.

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

refresh_index: remove unnecessary calls to preload_index()Ben Peart Mon, 5 Nov 2018 19:27:51 +0000 (14:27 -0500)

refresh_index: remove unnecessary calls to preload_index()

With refresh_index() learning to utilize preload_index() to speed up its
operation there is no longer any benefit to having the caller preload the
index first. Remove those unneeded calls by calling read_index() instead of
the preload variant.

There is no measurable performance impact of this patch - the 2nd call to
preload_index() bails out quickly but there is no reason to call it twice.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

xdiff-interface: drop parse_hunk_header()Jeff King Fri, 2 Nov 2018 06:40:13 +0000 (02:40 -0400)

xdiff-interface: drop parse_hunk_header()

This function was used only for parsing the hunk headers generated by
xdiff. Now that we can use hunk callbacks to get that information
directly, it has outlived its usefulness.

Note to anyone who wants to resurrect it: the "len" parameter was
totally unused, meaning that the function could read past the end of the
"line" array. In practice this never happened, because we only used it
to parse xdiff's generated header lines. But it would be dangerous to
use it for other cases without fixing this defect.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

range-diff: use a hunk callbackJeff King Fri, 2 Nov 2018 06:39:40 +0000 (02:39 -0400)

range-diff: use a hunk callback

When we count the lines in a diff, we don't actually care about the
contents of each line. By using a hunk callback, we tell xdiff that it
does not need to even bother generating a hunk header line, saving a
small amount of work.

Arguably we could even ignore the hunk headers completely, since we're
just computing a cost function between patches. But doing it this way
maintains the exact same behavior before and after.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff: convert --check to use a hunk callbackJeff King Fri, 2 Nov 2018 06:39:03 +0000 (02:39 -0400)

diff: convert --check to use a hunk callback

The "diff --check" code needs to know the line number on which each hunk
starts in order to generate its output. We get that now by parsing the
hunk header line generated by xdiff, but it's much simpler to just pass
it directly using a hunk callback.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

combine-diff: use an xdiff hunk callbackJeff King Fri, 2 Nov 2018 06:38:20 +0000 (02:38 -0400)

combine-diff: use an xdiff hunk callback

A combined diff has to line up the hunks for all of the individual
pairwise diffs, and thus needs to know their line numbers and sizes. We
get that now by parsing the hunk header line that xdiff generates.
However, now that xdiff supports a hunk callback, we can just use the
values directly.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff: use hunk callback for word-diffJeff King Fri, 2 Nov 2018 06:37:18 +0000 (02:37 -0400)

diff: use hunk callback for word-diff

Our word-diff does not look at the -/+ lines generated by xdiff at all
(because they are not real lines to show the user, but just the
tokenized words split into lines). Instead we use the line numbers from
the hunk headers to index our own data structure.

As a result, our xdi_diff_outf() callback throws away all lines except
hunk headers. We can instead use a hunk callback, which has two
benefits:

1. We don't have to re-parse the generated hunk header line, but can
use the passed parameters directly.

2. By setting our line callback to NULL, we can tell xdiff-interface
that it does not even need to bother generating the other lines,
saving a small amount of work.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff: discard hunk headers for patch-ids earlierJeff King Fri, 2 Nov 2018 06:36:36 +0000 (02:36 -0400)

diff: discard hunk headers for patch-ids earlier

We do not include hunk header lines when computing patch-ids, since
the line numbers would create false negatives. Rather than detect and
skip them in our line callback, we can simply tell xdiff to avoid
generating them.

This is similar to the previous commit, but split out because it
actually requires modifying the matching line callback.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff: avoid generating unused hunk header linesJeff King Fri, 2 Nov 2018 06:36:06 +0000 (02:36 -0400)

diff: avoid generating unused hunk header lines

Some callers of xdi_diff_outf() do not look at the generated hunk header
lines at all. By plugging in a no-op hunk callback, this tells xdiff not
to even bother formatting them.

This patch introduces a stock no-op callback and uses it with a few
callers whose line callbacks explicitly ignore hunk headers (because
they look only for +/- lines).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

poll: use GetTickCount64() to avoid wrap-around issuesSteve Hoelzer Wed, 31 Oct 2018 21:11:36 +0000 (14:11 -0700)

poll: use GetTickCount64() to avoid wrap-around issues

The value of timeout starts as an int value, and for this reason it
cannot overflow unsigned long long aka ULONGLONG. The unsigned version
of this initial value is available in orig_timeout. The difference
(orig_timeout - elapsed) cannot wrap around because it is protected by
a conditional (as can be seen in the patch text). Hence, the ULONGLONG
difference can only have values that are smaller than the initial
timeout value and truncation to int cannot overflow.

Signed-off-by: Steve Hoelzer <shoelzer@gmail.com>
[j6t: improved both implementation and log message]
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

tree-walk.c: fix overoptimistic inclusion in :(exclude... Nguyễn Thái Ngọc Duy Sun, 4 Nov 2018 05:28:51 +0000 (06:28 +0100)

tree-walk.c: fix overoptimistic inclusion in :(exclude) matching

tree_entry_interesting() is used for matching pathspec on a tree. The
interesting thing about this function is that, because the tree
entries are known to be sorted, this function can return more than
just "yes, matched" and "no, not matched". It can also say "yes, this
entry is matched and so is the remaining entries in the tree".

This is where I made a mistake when matching exclude pathspec. For
exclude pathspec, we do matching twice, one with positive patterns and
one with negative ones, then a rule table is applied to determine the
final "include or exclude" result. Note that "matched" does not
necessarily mean include. For negative patterns, "matched" means
exclude.

This particular rule is too eager to include everything. Rule 8 says
that "if all entries are positively matched" and the current entry is
not negatively matched (i.e. not excluded), then all entries are
positively matched and therefore included. But this is not true. If
the _current_ entry is not negatively matched, it does not mean the
next one will not be and we cannot conclude right away that all
remaining entries are positively matched and can be included.

Rules 8 and 18 are now updated to be less eager. We conclude that the
current entry is positively matched and included. But we say nothing
about remaining entries. tree_entry_interesting() will be called again
for those entries where we will determine entries individually.

Reported-by: Christophe Bliard <christophe.bliard@trux.info>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

sequencer.c: remove a stray semicolonNguyễn Thái Ngọc Duy Sat, 3 Nov 2018 14:32:29 +0000 (15:32 +0100)

sequencer.c: remove a stray semicolon

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

git-worktree.txt: correct linkgit command nameNguyễn Thái Ngọc Duy Sat, 3 Nov 2018 05:14:18 +0000 (06:14 +0100)

git-worktree.txt: correct linkgit command name

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

Merge branch 'jc/http-curlver-warnings'Junio C Hamano Fri, 2 Nov 2018 15:53:59 +0000 (00:53 +0900)

Merge branch 'jc/http-curlver-warnings'

Warning message fix.

* jc/http-curlver-warnings:
http: give curl version warnings consistently

Merge branch 'js/mingw-http-ssl'Junio C Hamano Fri, 2 Nov 2018 15:53:58 +0000 (00:53 +0900)

Merge branch 'js/mingw-http-ssl'

On platforms with recent cURL library, http.sslBackend configuration
variable can be used to choose a different SSL backend at runtime.
The Windows port uses this mechanism to switch between OpenSSL and
Secure Channel while talking over the HTTPS protocol.

* js/mingw-http-ssl:
http: when using Secure Channel, ignore sslCAInfo by default
http: add support for disabling SSL revocation checks in cURL
http: add support for selecting SSL backends at runtime

Merge branch 'mg/gpg-fingerprint'Junio C Hamano Fri, 2 Nov 2018 15:53:58 +0000 (00:53 +0900)

Merge branch 'mg/gpg-fingerprint'

New "--pretty=format:" placeholders %GF and %GP that show the GPG
key fingerprints have been invented.

* mg/gpg-fingerprint:
gpg-interface.c: obtain primary key fingerprint as well
gpg-interface.c: support getting key fingerprint via %GF format
gpg-interface.c: use flags to determine key/signer info presence

Merge branch 'mg/gpg-parse-tighten'Junio C Hamano Fri, 2 Nov 2018 15:53:57 +0000 (00:53 +0900)

Merge branch 'mg/gpg-parse-tighten'

Detect and reject a signature block that has more than one GPG
signature.

* mg/gpg-parse-tighten:
gpg-interface.c: detect and reject multiple signatures on commits

Merge branch 'en/merge-cleanup-more'Junio C Hamano Fri, 2 Nov 2018 15:53:57 +0000 (00:53 +0900)

Merge branch 'en/merge-cleanup-more'

Further clean-up of merge-recursive machinery.

* en/merge-cleanup-more:
merge-recursive: avoid showing conflicts with merge branch before HEAD
merge-recursive: improve auto-merging messages with path collisions

add: speed up cmd_add() by utilizing read_cache_preload()Ben Peart Fri, 2 Nov 2018 13:30:50 +0000 (09:30 -0400)

add: speed up cmd_add() by utilizing read_cache_preload()

During an "add", a call is made to run_diff_files() which calls
check_removed() for each index-entry. The preload_index() code
distributes some of the costs across multiple threads.

Because the files checked are restricted to pathspec, adding
individual files makes no measurable impact but on a Windows repo
with ~200K files, 'git add .' drops from 6.3 seconds to 3.3 seconds
for a 47% savings.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote: make add_missing_tags() linearDerrick Stolee Fri, 2 Nov 2018 13:14:49 +0000 (06:14 -0700)

remote: make add_missing_tags() linear

The add_missing_tags() method currently has quadratic behavior.
This is due to a linear number (based on number of tags T) of
calls to in_merge_bases_many, which has linear performance (based
on number of commits C in the repository).

Replace this O(T * C) algorithm with an O(T + C) algorithm by
using get_reachable_subset(). We ignore the return list and focus
instead on the reachable_flag assigned to the commits we care
about, because we need to interact with the tag ref and not just
the commit object.

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

test-reach: test get_reachable_subsetDerrick Stolee Fri, 2 Nov 2018 13:14:47 +0000 (06:14 -0700)

test-reach: test get_reachable_subset

The get_reachable_subset() method returns the list of commits in
the 'to' array that are reachable from at least one commit in the
'from' array. Add tests that check this method works in a few
cases:

1. All commits in the 'to' list are reachable. This exercises the
early-termination condition.

2. Some commits in the 'to' list are reachable. This exercises the
loop-termination condition.

3. No commits in the 'to' list are reachable. This exercises the
NULL return condition.

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

commit-reach: implement get_reachable_subsetDerrick Stolee Fri, 2 Nov 2018 13:14:45 +0000 (06:14 -0700)

commit-reach: implement get_reachable_subset

The existing reachability algorithms in commit-reach.c focus on
finding merge-bases or determining if all commits in a set X can
reach at least one commit in a set Y. However, for two commits sets
X and Y, we may also care about which commits in Y are reachable
from at least one commit in X.

Implement get_reachable_subset() which answers this question. Given
two arrays of commits, 'from' and 'to', return a commit_list with
every commit from the 'to' array that is reachable from at least
one commit in the 'from' array.

The algorithm is a simple walk starting at the 'from' commits, using
the PARENT2 flag to indicate "this commit has already been added to
the walk queue". By marking the 'to' commits with the PARENT1 flag,
we can determine when we see a commit from the 'to' array. We remove
the PARENT1 flag as we add that commit to the result list to avoid
duplicates.

The order of the resulting list is a reverse of the order that the
commits are discovered in the walk.

There are a couple shortcuts to avoid walking more than we need:

1. We determine the minimum generation number of commits in the
'to' array. We do not walk commits with generation number
below this minimum.

2. We count how many distinct commits are in the 'to' array, and
decrement this count when we discover a 'to' commit during the
walk. If this number reaches zero, then we can terminate the
walk.

Tests will be added using the 'test-tool reach' helper in a
subsequent commit.

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

send-email: avoid empty transfer encoding headerAaron Lindsay Fri, 2 Nov 2018 09:52:38 +0000 (05:52 -0400)

send-email: avoid empty transfer encoding header

Fix a small bug introduced by "7a36987ff (send-email: add an auto option
for transfer encoding, 2018-07-14)".

I saw the following message when setting --transfer-encoding for a file
with the same encoding:

$ git send-email --transfer-encoding=8bit example.patch
Use of uninitialized value $xfer_encoding in concatenation (.) or string
at /usr/lib/git-core/git-send-email line 1744.

The new tests are by brian m. carlson.

Signed-off-by: Aaron Lindsay <aaron@aclindsay.com>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pathspec: handle non-terminated strings with :(attr)Jeff King Fri, 2 Nov 2018 05:23:22 +0000 (01:23 -0400)

pathspec: handle non-terminated strings with :(attr)

The pathspec code always takes names to be matched as a
name/namelen pair, but match_attrs() never looks at namelen,
and just treats "name" like a NUL-terminated string, passing
it to git_check_attr().

This usually works anyway. Every caller passes a
NUL-terminated string, and in all but one the passed-in
length is the same as the length of the string (the
exception is dir_path_match(), which may pass a smaller
length to drop a trailing slash). So we won't currently ever
read random memory, and the one case I found actually
happens to work correctly because the attr code can handle
the trailing slash itself.

But it's still worth addressing, as the function interface
implies that the name does not have to be NUL-terminated,
making this an accident waiting to happen.

Since teaching git_check_attr() to take a ptr/len pair would
be a big refactor, we'll just allocate a new string. We can
do this only when necessary, which avoids paying the cost
for most callers.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

approxidate: handle pending number for "specials"Jeff King Fri, 2 Nov 2018 05:23:09 +0000 (01:23 -0400)

approxidate: handle pending number for "specials"

The approxidate parser has a table of special keywords like
"yesterday", "noon", "pm", etc. Some of these, like "pm", do
the right thing if we've recently seen a number: "3pm" is
what you'd think.

However, most of them do not look at or modify the
pending-number flag at all, which means a number may "jump"
across a significant keyword and be used unexpectedly. For
example, when parsing:

January 5th noon pm

we'd connect the "5" to "pm", and ignore it as a
day-of-month. This is obviously a bit silly, as "noon"
already implies "pm". And other mis-parsed things are
generally as silly ("January 5th noon, years ago" would
connect the 5 to "years", but probably nobody would type
that).

However, the fix is simple: when we see a keyword like
"noon", we should flush the pending number (as we would if
we hit another number, or the end of the string). In a few
of the specials that actually modify the day, we can simply
throw away the number (saying "Jan 5 yesterday" should not
respect the number at all).

Note that we have to either move or forward-declare the
static pending_number() to make it accessible to these
functions; this patch moves it.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rev-list: handle flags for --indexed-objectsJeff King Fri, 2 Nov 2018 05:22:59 +0000 (01:22 -0400)

rev-list: handle flags for --indexed-objects

When a traversal sees the --indexed-objects option, it adds
all blobs and valid cache-trees from the index to the
traversal using add_index_objects_to_pending(). But that
function totally ignores its flags parameter!

That means that doing:

git rev-list --objects --indexed-objects

and

git rev-list --objects --not --indexed-objects

produce the same output, because we ignore the UNINTERESTING
flag when walking the index in the second example.

Nobody noticed because this feature was added as a way for
tools like repack to increase their coverage of reachable
objects, meaning it would only be used like the first
example above.

But since it's user facing (and because the documentation
describes it "as if the objects are listed on the command
line"), we should make sure the negative case behaves
sensibly.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

xdiff-interface: provide a separate consume callback... Jeff King Fri, 2 Nov 2018 06:35:45 +0000 (02:35 -0400)

xdiff-interface: provide a separate consume callback for hunks

The previous commit taught xdiff to optionally provide the hunk header
data to a specialized callback. But most users of xdiff actually use our
more convenient xdi_diff_outf() helper, which ensures that our callbacks
are always fed whole lines.

Let's plumb the special hunk-callback through this interface, too. It
will follow the same rule as xdiff when the hunk callback is NULL (i.e.,
continue to pass a stringified hunk header to the line callback). Since
we add NULL to each caller, there should be no behavior change yet.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

xdiff: provide a separate emit callback for hunksJeff King Fri, 2 Nov 2018 06:35:01 +0000 (02:35 -0400)

xdiff: provide a separate emit callback for hunks

The xdiff library always emits hunk header lines to our callbacks as
formatted strings like "@@ -a,b +c,d @@\n". This is convenient if we're
going to output a diff, but less so if we actually need to compute using
those numbers, which requires re-parsing the line.

In preparation for moving away from this, let's teach xdiff a new
callback function which gets the broken-out hunk information. To help
callers that don't want to use this new callback, if it's NULL we'll
continue to format the hunk header into a string.

Note that this function renames the "outf" callback to "out_line", as
well. This isn't strictly necessary, but helps in two ways:

1. Now that there are two callbacks, it's nice to use more descriptive
names.

2. Many callers did not zero the emit_callback_data struct, and needed
to be modified to set ecb.out_hunk to NULL. By changing the name of
the existing struct member, that guarantees that any new callers
from in-flight topics will break the build and be examined
manually.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

travis-ci: install packages in 'ci/install-dependencies.sh'SZEDER Gábor Thu, 1 Nov 2018 11:47:14 +0000 (12:47 +0100)

travis-ci: install packages in 'ci/install-dependencies.sh'

Ever since we started using Travis CI, we specified the list of
packages to install in '.travis.yml' via the APT addon. While running
our builds on Travis CI's container-based infrastructure we didn't
have another choice, because that environment didn't support 'sudo',
and thus we didn't have permission to install packages ourselves. With
the switch to the VM-based infrastructure in the previous patch we do
get a working 'sudo', so we can install packages by running 'sudo
apt-get -y install ...' as well.

Let's make use of this and install necessary packages in
'ci/install-dependencies.sh', so all the dependencies (i.e. both
packages and "non-packages" (P4 and Git-LFS)) are handled in the same
file. Install gcc-8 only in the 'linux-gcc' build job; so far it has
been unnecessarily installed in the 'linux-clang' build job as well.
Print the versions of P4 and Git-LFS conditionally, i.e. only when
they have been installed; with this change even the static analysis
and documentation build jobs start using 'ci/install-dependencies.sh'
to install packages, and neither of these two build jobs depend on and
thus install those.

This change will presumably be beneficial for the upcoming Azure
Pipelines integration [1]: preliminary versions of that patch series
run a couple of 'apt-get' commands to install the necessary packages
before running 'ci/install-dependencies.sh', but with this patch it
will be sufficient to run only 'ci/install-dependencies.sh'.

[1] https://public-inbox.org/git/1a22efe849d6da79f2c639c62a1483361a130238.1539598316.git.gitgitgadget@gmail.com/

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

tests: optionally skip `git rebase -p` testsJohannes Schindelin Wed, 31 Oct 2018 20:02:02 +0000 (13:02 -0700)

tests: optionally skip `git rebase -p` tests

The `--preserve-merges` mode of the `rebase` command is slated to be
deprecated soon, as the more powerful `--rebase-merges` mode is
available now, and the latter was designed with the express intent to
address the shortcomings of `--preserve-merges`' design (e.g. the
inability to reorder commits in an interactive rebase).

As such, we will eventually even remove the `--preserve-merges` support,
and along with it, its tests.

In preparation for this, and also to allow the Windows phase of our
automated tests to save some well-needed time when running the test
suite, this commit introduces a new prerequisite REBASE_P, which can be
forced to being unmet by setting the environment variable
`GIT_TEST_SKIP_REBASE_P` to any non-empty string.

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

t3418: decouple test cases from a previous `rebase... Johannes Schindelin Wed, 31 Oct 2018 20:02:00 +0000 (13:02 -0700)

t3418: decouple test cases from a previous `rebase -p` test case

It is in general a good idea for regression test cases to be as
independent of each other as possible (with the one exception of an
initial `setup` test case, which is only a test case in Git's test suite
because it does not have a notion of a fixture or setup).

This patch addresses one particular instance of this principle being
violated: a few test cases in t3418-rebase-continue.sh depend on a side
effect of a test case that verifies a specific `rebase -p` behavior. The
later test cases should, however, still succeed even if the `rebase -p`
test case is skipped.

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

t3404: decouple some test cases from outcomes of previo... Johannes Schindelin Wed, 31 Oct 2018 20:01:59 +0000 (13:01 -0700)

t3404: decouple some test cases from outcomes of previous test cases

Originally, the `--preserve-merges` option of the `git rebase` command
piggy-backed on top of the `--interactive` feature. For that reason, the
early test cases were added to the very same test script that contains
the `git rebase -i` tests: `t3404-rebase-interactive.sh`.

However, since c42abfe7857 (rebase: introduce a dedicated backend for
--preserve-merges, 2018-05-28), the `--preserve-merges` feature got its
own backend, in preparation for converting the rest of the
`--interactive` code to built-in code, written in C rather than shell.

The reason why the `--preserve-merges` feature was not converted at the
same time is that we have something much better now: `--rebase-merges`.
That option intends to supersede `--preserve-merges`, and we will
probably deprecate the latter soon.

Once `--preserve-merges` has been deprecated for a good amount of time,
it will be time to remove it, and along with it, its tests.

In preparation for that, let's make the rest of the test cases in
`t3404-rebase-interactive.sh` independent of the test cases dedicated to
`--preserve-merges`.

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

Eighth batch for 2.20Junio C Hamano Thu, 1 Nov 2018 12:26:34 +0000 (21:26 +0900)

Eighth batch for 2.20

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

rebase: apply cocci patchJunio C Hamano Thu, 1 Nov 2018 12:44:41 +0000 (21:44 +0900)

rebase: apply cocci patch

Favor oideq() over !oidcmp() when checking for equality.

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

Merge branch 'js/rebase-i-shortopt'Junio C Hamano Fri, 2 Nov 2018 02:04:59 +0000 (11:04 +0900)

Merge branch 'js/rebase-i-shortopt'

"git rebase -i" learned to take 'b' as the short form of 'break'
option in the todo list.

* js/rebase-i-shortopt:
rebase -i: recognize short commands without arguments

Merge branch 'js/rebase-i-break'Junio C Hamano Fri, 2 Nov 2018 02:04:58 +0000 (11:04 +0900)

Merge branch 'js/rebase-i-break'

"git rebase -i" learned a new insn, 'break', that the user can
insert in the to-do list. Upon hitting it, the command returns
control back to the user.

* js/rebase-i-break:
rebase -i: introduce the 'break' command
rebase -i: clarify what happens on a failed `exec`

Merge branch 'js/rebase-autostash-fix'Junio C Hamano Fri, 2 Nov 2018 02:04:58 +0000 (11:04 +0900)

Merge branch 'js/rebase-autostash-fix'

"git rebase" that has recently been rewritten in C had a few issues
in its "--autstash" feature, which have been corrected.

* js/rebase-autostash-fix:
rebase --autostash: fix issue with dirty submodules
rebase --autostash: demonstrate a problem with dirty submodules
rebase (autostash): use an explicit OID to apply the stash
rebase (autostash): store the full OID in <state-dir>/autostash
rebase (autostash): avoid duplicate call to state_dir_path()

Merge branch 'cb/printf-empty-format'Junio C Hamano Fri, 2 Nov 2018 02:04:57 +0000 (11:04 +0900)

Merge branch 'cb/printf-empty-format'

Build fix for a topic in flight.

* cb/printf-empty-format:
sequencer: cleanup for gcc warning in non developer mode

Merge branch 'jc/rebase-in-c-5-test-typofix'Junio C Hamano Fri, 2 Nov 2018 02:04:57 +0000 (11:04 +0900)

Merge branch 'jc/rebase-in-c-5-test-typofix'

Typofix.

* jc/rebase-in-c-5-test-typofix:
rebase: fix typoes in error messages

Merge branch 'pk/rebase-in-c-6-final'Junio C Hamano Fri, 2 Nov 2018 02:04:56 +0000 (11:04 +0900)

Merge branch 'pk/rebase-in-c-6-final'

The final step of rewriting "rebase -i" in C.

* pk/rebase-in-c-6-final:
rebase: default to using the builtin rebase

Merge branch 'js/rebase-in-c-5.5-work-with-rebase-i... Junio C Hamano Fri, 2 Nov 2018 02:04:56 +0000 (11:04 +0900)

Merge branch 'js/rebase-in-c-5.5-work-with-rebase-i-in-c'

"rebase" that has been rewritten learns the new calling convention
used by "rebase -i" that was rewritten in C, tying the loose end
between two GSoC topics that stomped on each other's toes.

* js/rebase-in-c-5.5-work-with-rebase-i-in-c:
builtin rebase: prepare for builtin rebase -i

Merge branch 'pk/rebase-in-c-5-test'Junio C Hamano Fri, 2 Nov 2018 02:04:55 +0000 (11:04 +0900)

Merge branch 'pk/rebase-in-c-5-test'

Rewrite "git rebase" in C.

* pk/rebase-in-c-5-test:
builtin rebase: error out on incompatible option/mode combinations
builtin rebase: use no-op editor when interactive is "implied"
builtin rebase: show progress when connected to a terminal
builtin rebase: fast-forward to onto if it is a proper descendant
builtin rebase: optionally pass custom reflogs to reset_head()
builtin rebase: optionally auto-detect the upstream

Merge branch 'pk/rebase-in-c-4-opts'Junio C Hamano Fri, 2 Nov 2018 02:04:55 +0000 (11:04 +0900)

Merge branch 'pk/rebase-in-c-4-opts'

Rewrite "git rebase" in C.

* pk/rebase-in-c-4-opts:
builtin rebase: support --root
builtin rebase: add support for custom merge strategies
builtin rebase: support `fork-point` option
merge-base --fork-point: extract libified function
builtin rebase: support --rebase-merges[=[no-]rebase-cousins]
builtin rebase: support `--allow-empty-message` option
builtin rebase: support `--exec`
builtin rebase: support `--autostash` option
builtin rebase: support `-C` and `--whitespace=<type>`
builtin rebase: support `--gpg-sign` option
builtin rebase: support `--autosquash`
builtin rebase: support `keep-empty` option
builtin rebase: support `ignore-date` option
builtin rebase: support `ignore-whitespace` option
builtin rebase: support --committer-date-is-author-date
builtin rebase: support --rerere-autoupdate
builtin rebase: support --signoff
builtin rebase: allow selecting the rebase "backend"

Merge branch 'pk/rebase-in-c-3-acts'Junio C Hamano Fri, 2 Nov 2018 02:04:54 +0000 (11:04 +0900)

Merge branch 'pk/rebase-in-c-3-acts'

Rewrite "git rebase" in C.

* pk/rebase-in-c-3-acts:
builtin rebase: stop if `git am` is in progress
builtin rebase: actions require a rebase in progress
builtin rebase: support --edit-todo and --show-current-patch
builtin rebase: support --quit
builtin rebase: support --abort
builtin rebase: support --skip
builtin rebase: support --continue

Merge branch 'pk/rebase-in-c-2-basic'Junio C Hamano Fri, 2 Nov 2018 02:04:53 +0000 (11:04 +0900)

Merge branch 'pk/rebase-in-c-2-basic'

Rewrite "git rebase" in C.

* pk/rebase-in-c-2-basic:
builtin rebase: support `git rebase <upstream> <switch-to>`
builtin rebase: only store fully-qualified refs in `options.head_name`
builtin rebase: start a new rebase only if none is in progress
builtin rebase: support --force-rebase
builtin rebase: try to fast forward when possible
builtin rebase: require a clean worktree
builtin rebase: support the `verbose` and `diffstat` options
builtin rebase: support --quiet
builtin rebase: handle the pre-rebase hook and --no-verify
builtin rebase: support `git rebase --onto A...B`
builtin rebase: support --onto

Merge branch 'ag/rebase-i-in-c'Junio C Hamano Fri, 2 Nov 2018 02:04:53 +0000 (11:04 +0900)

Merge branch 'ag/rebase-i-in-c'

Rewrite of the remaining "rebase -i" machinery in C.

* ag/rebase-i-in-c:
rebase -i: move rebase--helper modes to rebase--interactive
rebase -i: remove git-rebase--interactive.sh
rebase--interactive2: rewrite the submodes of interactive rebase in C
rebase -i: implement the main part of interactive rebase as a builtin
rebase -i: rewrite init_basic_state() in C
rebase -i: rewrite write_basic_state() in C
rebase -i: rewrite the rest of init_revisions_and_shortrevisions() in C
rebase -i: implement the logic to initialize $revisions in C
rebase -i: remove unused modes and functions
rebase -i: rewrite complete_action() in C
t3404: todo list with commented-out commands only aborts
sequencer: change the way skip_unnecessary_picks() returns its result
sequencer: refactor append_todo_help() to write its message to a buffer
rebase -i: rewrite checkout_onto() in C
rebase -i: rewrite setup_reflog_action() in C
sequencer: add a new function to silence a command, except if it fails
rebase -i: rewrite the edit-todo functionality in C
editor: add a function to launch the sequence editor
rebase -i: rewrite append_todo_help() in C
sequencer: make three functions and an enum from sequencer.c public

Merge branch 'pk/rebase-in-c'Junio C Hamano Fri, 2 Nov 2018 02:04:52 +0000 (11:04 +0900)

Merge branch 'pk/rebase-in-c'

Rewrite of the "rebase" machinery in C.

* pk/rebase-in-c:
builtin/rebase: support running "git rebase <upstream>"
rebase: refactor common shell functions into their own file
rebase: start implementing it as a builtin

fetch: replace string-list used as a look-up table... Junio C Hamano Tue, 25 Sep 2018 20:25:04 +0000 (13:25 -0700)

fetch: replace string-list used as a look-up table with a hashmap

In find_non_local_tags() helper function (used to implement the
"follow tags"), we use string_list_has_string() on two string lists
as a way to see if a refname has already been processed, etc.

All this code predates more modern in-core lookup API like hashmap;
replace them with two hashmaps and one string list---the hashmaps
are used for look-ups and the string list is to keep the order of
items in the returned result stable (which is the only single thing
hashmap does worse than lookups on string-list).

Similarly, get_ref_map() uses another string-list as a look-up table
for existing refs. Replace it with a hashmap.

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

rev-parse: clear --exclude list after 'git rev-parse... Andreas Gruenbacher Tue, 23 Oct 2018 19:17:58 +0000 (21:17 +0200)

rev-parse: clear --exclude list after 'git rev-parse --all'

Commit [1] added the --exclude option to revision.c. The --all,
--branches, --tags, --remotes, and --glob options clear the exclude
list. Shortly therafter, commit [2] added the same to 'git rev-parse',
but without clearing the exclude list for the --all option.

[1] e7b432c52 ("revision: introduce --exclude=<glob> to tame wildcards", 2013-08-30)
[2] 9dc01bf06 ("rev-parse: introduce --exclude=<glob> to tame wildcards", 2013-11-01)

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

fetch-pack: be more precise in parsing v2 responseJonathan Tan Fri, 19 Oct 2018 22:54:04 +0000 (15:54 -0700)

fetch-pack: be more precise in parsing v2 response

Each section in a protocol v2 response is followed by either a DELIM
packet (indicating more sections to follow) or a FLUSH packet
(indicating none to follow). But when parsing the "acknowledgments"
section, do_fetch_pack_v2() is liberal in accepting both, but determines
whether to continue reading or not based solely on the contents of the
"acknowledgments" section, not on whether DELIM or FLUSH was read.

There is no issue with a protocol-compliant server, but can result in
confusing error messages when communicating with a server that
serves unexpected additional sections. Consider a server that sends
"new-section" after "acknowledgments":

- client writes request
- client reads the "acknowledgments" section which contains no "ready",
then DELIM
- since there was no "ready", client needs to continue negotiation, and
writes request
- client reads "new-section", and reports to the end user "expected
'acknowledgments', received 'new-section'"

For the person debugging the involved Git implementation(s), the error
message is confusing in that "new-section" was not received in response
to the latest request, but to the first one.

One solution is to always continue reading after DELIM, but in this
case, we can do better. We know from the protocol that "ready" means at
least the packfile section is coming (hence, DELIM) and that no "ready"
means that no sections are to follow (hence, FLUSH). So teach
process_acks() to enforce this.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>