git/git.git
2 years agoMerge 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()

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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()

2 years agoMerge 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

2 years agoMerge 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'

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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()

2 years agoMerge 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()

2 years agoMerge 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

2 years agoMerge 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()

2 years agoMerge 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

2 years agoMerge 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()

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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
  ...

2 years agoNinth batch for 2.20
Junio 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>
2 years agoMerge 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'

2 years agoMerge 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)

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agorefresh_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>
2 years agopoll: use GetTickCount64() to avoid wrap-around issues
Steve 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>
2 years agosequencer.c: remove a stray semicolon
Nguyễ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>
2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoremote: make add_missing_tags() linear
Derrick 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>
2 years agotest-reach: test get_reachable_subset
Derrick 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>
2 years agocommit-reach: implement get_reachable_subset
Derrick 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>
2 years agosend-email: avoid empty transfer encoding header
Aaron 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>
2 years agotests: optionally skip `git rebase -p` tests
Johannes 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>
2 years agot3418: decouple test cases from a previous `rebase -p` test case
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>
2 years agot3404: decouple some test cases from outcomes of previous test cases
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>
2 years agoEighth batch for 2.20
Junio 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>
2 years agorebase: apply cocci patch
Junio 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>
2 years agoMerge 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

2 years agoMerge 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`

2 years agoMerge 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()

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge branch 'js/rebase-in-c-5.5-work-with-rebase-i-in-c'
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

2 years agoMerge 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

2 years agoMerge 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"

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agoMerge 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

2 years agofetch: replace string-list used as a look-up table with a hashmap
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>
2 years agorev-parse: clear --exclude list after 'git rev-parse --all'
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>
2 years agofetch-pack: be more precise in parsing v2 response
Jonathan 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>
2 years agosequencer: use read_author_script()
Phillip Wood [Wed, 31 Oct 2018 10:15:56 +0000 (10:15 +0000)]
sequencer: use read_author_script()

Use the new function added in the last commit to read the author
script, updating read_env_script() and read_author_ident(). We now
have a single code path that reads the author script for am and all
flavors of rebase. This changes the behavior of read_env_script() as
previously it would set any environment variables that were in the
author-script file. Now it is an error if the file contains other
variables or any of GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL and
GIT_AUTHOR_DATE are missing. This is what am and the non interactive
version of rebase have been doing for several years so hopefully it
will not cause a problem for interactive rebase users. The advantage
is that we are reusing existing code from am which uses sq_dequote()
to properly dequote variables. This fixes potential problems with user
edited scripts as read_env_script() which did not track quotes
properly.

This commit also removes the fallback code for checking for a broken
author script after git is upgraded when a rebase is stopped. Now that
the parsing uses sq_dequote() it will reliably return an error if the
quoting is broken and the user will have to abort the rebase and
restart. This isn't ideal but it's a corner case and the detection of
the broken quoting could be confused by user edited author scripts.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoadd read_author_script() to libgit
Phillip Wood [Wed, 31 Oct 2018 10:15:55 +0000 (10:15 +0000)]
add read_author_script() to libgit

Add read_author_script() to sequencer.c based on the implementation in
builtin/am.c and update read_am_author_script() to use
read_author_script(). The sequencer code that reads the author script
will be updated in the next commit.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoam: rename read_author_script()
Phillip Wood [Wed, 31 Oct 2018 10:15:54 +0000 (10:15 +0000)]
am: rename read_author_script()

Rename read_author_script() in preparation for adding a shared
read_author_script() function to libgit.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoam: improve author-script error reporting
Phillip Wood [Wed, 31 Oct 2018 10:15:53 +0000 (10:15 +0000)]
am: improve author-script error reporting

If there are errors in a user edited author-script there was no
indication of what was wrong. This commit adds some specific error messages
depending on the problem. It also relaxes the requirement that the
variables appear in a specific order in the file to match the behavior
of 'rebase --interactive'.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoam: don't die in read_author_script()
Phillip Wood [Wed, 31 Oct 2018 10:15:52 +0000 (10:15 +0000)]
am: don't die in read_author_script()

The caller is already prepared to handle errors returned from this
function so there is no need for it to die if it cannot read the file.

Suggested-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agot/helper: add test-submodule-nested-repo-config
Antonio Ospite [Thu, 25 Oct 2018 16:18:13 +0000 (18:18 +0200)]
t/helper: add test-submodule-nested-repo-config

Add a test tool to exercise config_from_gitmodules(), in particular for
the case of nested submodules.

Add also a test to document that reading the submoudles config of nested
submodules does not work yet when the .gitmodules file is not in the
working tree but it still in the index.

This is because the git API does not always make it possible access the
object store  of an arbitrary repository (see get_oid() usage in
config_from_gitmodules()).

When this git limitation gets fixed the aforementioned use case will be
supported too.

Signed-off-by: Antonio Ospite <ao2@ao2.it>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agosubmodule: support reading .gitmodules when it's not in the working tree
Antonio Ospite [Thu, 25 Oct 2018 16:18:12 +0000 (18:18 +0200)]
submodule: support reading .gitmodules when it's not in the working tree

When the .gitmodules file is not available in the working tree, try
using the content from the index and from the current branch. This
covers the case when the file is part of the repository but for some
reason it is not checked out, for example because of a sparse checkout.

This makes it possible to use at least the 'git submodule' commands
which *read* the gitmodules configuration file without fully populating
the working tree.

Writing to .gitmodules will still require that the file is checked out,
so check for that before calling config_set_in_gitmodules_file_gently.

Add a similar check also in git-submodule.sh::cmd_add() to anticipate
the eventual failure of the "git submodule add" command when .gitmodules
is not safely writeable; this prevents the command from leaving the
repository in a spurious state (e.g. the submodule repository was cloned
but .gitmodules was not updated because
config_set_in_gitmodules_file_gently failed).

Moreover, since config_from_gitmodules() now accesses the global object
store, it is necessary to protect all code paths which call the function
against concurrent access to the global object store. Currently this
only happens in builtin/grep.c::grep_submodules(), so call
grep_read_lock() before invoking code involving
config_from_gitmodules().

Finally, add t7418-submodule-sparse-gitmodules.sh to verify that reading
from .gitmodules succeeds and that writing to it fails when the file is
not checked out.

NOTE: there is one rare case where this new feature does not work
properly yet: nested submodules without .gitmodules in their working
tree.  This has been documented with a warning and a test_expect_failure
item in t7814, and in this case the current behavior is not altered: no
config is read.

Signed-off-by: Antonio Ospite <ao2@ao2.it>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoread_istream_pack_non_delta(): document input handling
Jeff King [Wed, 31 Oct 2018 05:13:16 +0000 (01:13 -0400)]
read_istream_pack_non_delta(): document input handling

Twice now we have scratched our heads about why the loose streaming code
needs the protection added by 692f0bc7ae (avoid infinite loop in
read_istream_loose, 2013-03-25), but the similar code in its pack
counterpart does not.

The short answer is that use_pack() will die before it lets us run out
of bytes. Note that this could mean reading garbage (including the
trailing hash) from the packfile in some cases of corruption, but that's
OK. zlib will notice and complain (and if not, certainly the end result
will not match the object hash we expect).

Let's leave a comment this time to document our findings.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agols-remote: pass heads/tags prefixes to transport
Jeff King [Wed, 31 Oct 2018 04:24:42 +0000 (00:24 -0400)]
ls-remote: pass heads/tags prefixes to transport

Unlike its arbitrary text patterns, the --heads and --tags
options to ls-remote are true prefixes. We can pass this
information to the transport code. If the v2 protocol is in
use, that will reduce the size of the ref advertisement.

Note that the test added here succeeds both before and after
the patch. This is an optimization, not a bug-fix; it's just
making sure we didn't break anything.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agols-remote: do not send ref prefixes for patterns
Jeff King [Wed, 31 Oct 2018 04:24:05 +0000 (00:24 -0400)]
ls-remote: do not send ref prefixes for patterns

Since b4be74105f (ls-remote: pass ref prefixes when requesting a
remote's refs, 2018-03-15), "ls-remote foo" will pass "refs/heads/foo",
"refs/tags/foo", etc to the transport code in an attempt to let the
other side reduce the size of its advertisement.

Unfortunately this is not correct, as ls-remote patterns do not follow
the usual ref lookup rules, and are in fact tail-matched. So we could
find "refs/heads/foo" or "refs/heads/a/much/deeper/foo" or even
"refs/another/hierarchy/foo".

Since we can't pass a prefix and there's not yet a v2 extension for
matching wildcards, we must disable this feature to keep the same
behavior as v1.

Reported-by: Jon Simons <jon@jonsimons.org>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoAdjust for 2.19.x series
Junio C Hamano [Wed, 31 Oct 2018 04:12:12 +0000 (13:12 +0900)]
Adjust for 2.19.x series

* 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

2 years agocat-file: handle streaming failures consistently
Jeff King [Tue, 30 Oct 2018 23:23:38 +0000 (19:23 -0400)]
cat-file: handle streaming failures consistently

There are three ways to convince cat-file to stream a blob:

  - cat-file -p $blob

  - cat-file blob $blob

  - echo $batch | cat-file --batch

In the first two, we simply exit with the error code of
streaw_blob_to_fd(). That means that an error will cause us
to exit with "-1" (which we try to avoid) without printing
any kind of error message (which is confusing to the user).

Instead, let's match the third case, which calls die() on an
error. Unfortunately we cannot be more specific, as
stream_blob_to_fd() does not tell us whether the problem was
on reading (e.g., a corrupt object) or on writing (e.g.,
ENOSPC). That might be an opportunity for future work, but
for now we will at least exit with a sane message and exit
code.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocheck_stream_sha1(): handle input underflow
Jeff King [Tue, 30 Oct 2018 23:23:12 +0000 (19:23 -0400)]
check_stream_sha1(): handle input underflow

This commit fixes an infinite loop when fscking large
truncated loose objects.

The check_stream_sha1() function takes an mmap'd loose
object buffer and streams 4k of output at a time, checking
its sha1. The loop quits when we've output enough bytes (we
know the size from the object header), or when zlib tells us
anything except Z_OK or Z_BUF_ERROR.

The latter is expected because zlib may run out of room in
our 4k buffer, and that is how it tells us to process the
output and loop again.

But Z_BUF_ERROR also covers another case: one in which zlib
cannot make forward progress because it needs more _input_.
This should never happen in this loop, because though we're
streaming the output, we have the entire deflated input
available in the mmap'd buffer. But since we don't check
this case, we'll just loop infinitely if we do see a
truncated object, thinking that zlib is asking for more
output space.

It's tempting to fix this by checking stream->avail_in as
part of the loop condition (and quitting if all of our bytes
have been consumed). But that assumes that once zlib has
consumed the input, there is nothing left to do.  That's not
necessarily the case: it may have read our input into its
internal state, but still have bytes to output.

Instead, let's continue on Z_BUF_ERROR only when we see the
case we're expecting: the previous round filled our output
buffer completely. If it didn't (and we still saw
Z_BUF_ERROR), we know something is wrong and should break
out of the loop.

The bug comes from commit f6371f9210 (sha1_file: add
read_loose_object() function, 2017-01-13), which
reimplemented some of the existing loose object functions.
So it's worth checking if this bug was inherited from any of
those. The answers seems to be no. The two obvious
candidates are both OK:

  1. unpack_sha1_rest(); this doesn't need to loop on
     Z_BUF_ERROR at all, since it allocates the expected
     output buffer in advance (which we can't do since we're
     explicitly streaming here)

  2. check_object_signature(); the streaming path relies on
     the istream interface, which uses read_istream_loose()
     for this case. That function uses a similar "is our
     output buffer full" check with Z_BUF_ERROR (which is
     where I stole it from for this patch!)

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agot1450: check large blob in trailing-garbage test
Jeff King [Tue, 30 Oct 2018 23:18:51 +0000 (19:18 -0400)]
t1450: check large blob in trailing-garbage test

Commit cce044df7f (fsck: detect trailing garbage in all
object types, 2017-01-13) added two tests of trailing
garbage in a loose object file: one with a commit and one
with a blob. The point of having two is that blobs would
follow a different code path that streamed the contents,
instead of loading it into a buffer as usual.

At the time, merely being a blob was enough to trigger the
streaming code path. But since 7ac4f3a007 (fsck: actually
fsck blob data, 2018-05-02), we now only stream blobs that
are actually large. So since then, the streaming code path
is not tested at all for this case.

We can restore the original intent of the test by tweaking
core.bigFileThreshold to make our small blob seem large.
There's no easy way to externally verify that we followed
the streaming code path, but I did check before/after using
a temporary debug statement.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agomingw: fix isatty() after dup2()
Johannes Schindelin [Tue, 30 Oct 2018 18:44:40 +0000 (11:44 -0700)]
mingw: fix isatty() after dup2()

Since a9b8a09c3c30 (mingw: replace isatty() hack, 2016-12-22), we handle
isatty() by special-casing the stdin/stdout/stderr file descriptors,
caching the return value. However, we missed the case where dup2()
overrides the respective file descriptor.

That poses a problem e.g. where the `show` builtin asks for a pager very
early, the `setup_pager()` function sets the pager depending on the
return value of `isatty()` and then redirects stdout. Subsequently,
`cmd_log_init_finish()` calls `setup_pager()` *again*. What should
happen now is that `isatty()` reports that stdout is *not* a TTY and
consequently stdout should be left alone.

Let's override dup2() to handle this appropriately.

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

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agomingw: unset PERL5LIB by default
Johannes Schindelin [Tue, 30 Oct 2018 18:40:07 +0000 (11:40 -0700)]
mingw: unset PERL5LIB by default

Git for Windows ships with its own Perl interpreter, and insists on
using it, so it will most likely wreak havoc if PERL5LIB is set before
launching Git.

Let's just unset that environment variables when spawning processes.

To make this feature extensible (and overrideable), there is a new
config setting `core.unsetenvvars` that allows specifying a
comma-separated list of names to unset before spawning processes.

Reported by Gabriel Fuhrmann.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoconfig: move Windows-specific config settings into compat/mingw.c
Johannes Schindelin [Tue, 30 Oct 2018 18:40:06 +0000 (11:40 -0700)]
config: move Windows-specific config settings into compat/mingw.c

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoconfig: allow for platform-specific core.* config settings
Johannes Schindelin [Tue, 30 Oct 2018 18:40:04 +0000 (11:40 -0700)]
config: allow for platform-specific core.* config settings

In the Git for Windows project, we have ample precendent for config
settings that apply to Windows, and to Windows only.

Let's formalize this concept by introducing a platform_core_config()
function that can be #define'd in a platform-specific manner.

This will allow us to contain platform-specific code better, as the
corresponding variables no longer need to be exported so that they can
be defined in environment.c and be set in config.c

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoconfig: rename `dummy` parameter to `cb` in git_default_config()
Johannes Schindelin [Tue, 30 Oct 2018 18:40:03 +0000 (11:40 -0700)]
config: rename `dummy` parameter to `cb` in git_default_config()

This is the convention elsewhere (and prepares for the case where we may
need to pass callback data).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agomingw: reencode environment variables on the fly (UTF-16 <-> UTF-8)
Johannes Schindelin [Tue, 30 Oct 2018 09:22:30 +0000 (02:22 -0700)]
mingw: reencode environment variables on the fly (UTF-16 <-> UTF-8)

On Windows, the authoritative environment is encoded in UTF-16. In Git
for Windows, we convert that to UTF-8 (because UTF-16 is *such* a
foreign idea to Git that its source code is unprepared for it).

Previously, out of performance concerns, we converted the entire
environment to UTF-8 in one fell swoop at the beginning, and upon
putenv() and run_command() converted it back.

Having a private copy of the environment comes with its own perils: when
a library used by Git's source code tries to modify the environment, it
does not really work (in Git for Windows' case, libcurl, see
https://github.com/git-for-windows/git/compare/bcad1e6d58^...bcad1e6d58^2
for a glimpse of the issues).

Hence, it makes our environment handling substantially more robust if we
switch to on-the-fly-conversion in `getenv()`/`putenv()` calls. Based
on an initial version in the MSVC context by Jeff Hostetler, this patch
makes it so.

Surprisingly, this has a *positive* effect on speed: at the time when
the current code was written, we tested the performance, and there were
*so many* `getenv()` calls that it seemed better to convert everything
in one go. In the meantime, though, Git has obviously been cleaned up a
bit with regards to `getenv()` calls so that the Git processes spawned
by the test suite use an average of only 40 `getenv()`/`putenv()` calls
over the process lifetime.

Speaking of the entire test suite: the total time spent in the
re-encoding in the current code takes about 32.4 seconds (out of 113
minutes runtime), whereas the code introduced in this patch takes only
about 8.2 seconds in total. Not much, but it proves that we need not be
concerned about the performance impact introduced by this patch.

Helped-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agot7800: fix quoting
Johannes Schindelin [Tue, 30 Oct 2018 09:22:29 +0000 (02:22 -0700)]
t7800: fix quoting

When passing a command-line to call an external diff command to the
difftool, we must be prepared for paths containing special characters,
e.g. backslashes in the temporary directory's path on Windows.

This patch is needed in preparation for the next commit, which will
make the MinGW version of Git *not* rewrite TMP to use forward slashes
instead of backslashes.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoworktree: rename is_worktree_locked to worktree_lock_reason
Nickolai Belakovski [Tue, 30 Oct 2018 06:24:09 +0000 (23:24 -0700)]
worktree: rename is_worktree_locked to worktree_lock_reason

A function prefixed with 'is_' would be expected to return a boolean,
however this function returns a string.

Signed-off-by: Nickolai Belakovski <nbelakovski@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoworktree: update documentation for lock_reason and lock_reason_valid
Nickolai Belakovski [Tue, 30 Oct 2018 06:24:08 +0000 (23:24 -0700)]
worktree: update documentation for lock_reason and lock_reason_valid

Clarify that these fields are to be considered implementation details
and direct the reader to use the is_worktree_locked function to retrieve
said information.

Signed-off-by: Nickolai Belakovski <nbelakovski@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoindex-pack tests: don't leave test repo dirty at end
Ævar Arnfjörð Bjarmason [Tue, 30 Oct 2018 18:43:31 +0000 (18:43 +0000)]
index-pack tests: don't leave test repo dirty at end

Change a test added in 51054177b3 ("index-pack: detect local
corruption in collision check", 2017-04-01) so that the repository
isn't left dirty at the end.

Due to the caveats explained in 720dae5a19 ("config doc: elaborate on
fetch.fsckObjects security", 2018-07-27) even a "fetch" that fails
will write to the local object store, so let's copy the bit-error test
directory before running this test.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agopack-objects tests: don't leave test .git corrupt at end
Ævar Arnfjörð Bjarmason [Tue, 30 Oct 2018 18:43:30 +0000 (18:43 +0000)]
pack-objects tests: don't leave test .git corrupt at end

Change the pack-objects tests to not leave their .git directory
corrupt and the end.

In 2fca19fbb5 ("fix multiple issues with t5300", 2010-02-03) a comment
was added warning against adding any subsequent tests, but since
4614043c8f ("index-pack: use streaming interface for collision test on
large blobs", 2012-05-24) the comment has drifted away from the code,
mentioning two test, when we actually have three.

Instead of having this warning let's just create a new .git directory
specifically for these tests.

As an aside, it would be interesting to instrument the test suite to
run a "git fsck" at the very end (in "test_done"). That would have
errored before this change, and may find other issues #leftoverbits.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agopack-objects test: modernize style
Ævar Arnfjörð Bjarmason [Tue, 30 Oct 2018 18:43:29 +0000 (18:43 +0000)]
pack-objects test: modernize style

Modernize the quoting and indentation style of two tests added in
8685da4256 ("don't ever allow SHA1 collisions to exist by fetching a
pack", 2007-03-20), and of a subsequent one added in
4614043c8f ("index-pack: use streaming interface for collision test on
large blobs", 2012-05-24) which had copied the style of the first two.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agosequencer: break out of loop explicitly
Martin Ågren [Tue, 30 Oct 2018 08:09:37 +0000 (09:09 +0100)]
sequencer: break out of loop explicitly

It came up in review [1, 2] that this non-idiomatic loop is a bit tricky.
When we find a space, we set `len = i`, which gives us the answer we are
looking for, but which also breaks out of the loop.

It turns out that this loop can confuse compilers as well. My copy of
gcc 7.3.0 realizes that we are essentially evaluating `(len + 1) < len`
and warns that the behavior is undefined if `len` is `INT_MAX`. (Because
the assignment `len = i` is guaranteed to decrease `len`, such undefined
behavior is not actually possible.)

Rewrite the loop to a more idiomatic variant which doesn't muck with
`len` in the loop body. That should help compilers and human readers
figure out what is going on here. But do note that we need to update
`len` since it is not only used just after this loop (where we could
have used `i` directly), but also later in this function.

While at it, reduce the scope of `i`.

[1] https://public-inbox.org/git/CAPig+cQbG2s-LrAo9+7C7=dXifbWFJ3SzuNa-QePHDk7egK=jg@mail.gmail.com/

[2] https://public-inbox.org/git/CAPig+cRjU6niXpT2FrDWZ0x1HmGf1ojVZj3uk2qXEGe-S7i_HQ@mail.gmail.com/

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