git/git.git
4 years agoMerge branch 'jh/add-index-entry-optim'
Junio C Hamano [Wed, 26 Apr 2017 06:39:07 +0000 (15:39 +0900)]
Merge branch 'jh/add-index-entry-optim'

"git checkout" that handles a lot of paths has been optimized by
reducing the number of unnecessary checks of paths in the
has_dir_name() function.

* jh/add-index-entry-optim:
  read-cache: speed up has_dir_name (part 2)
  read-cache: speed up has_dir_name (part 1)
  read-cache: speed up add_index_entry during checkout
  p0006-read-tree-checkout: perf test to time read-tree
  read-cache: add strcmp_offset function

4 years agoMerge branch 'ss/submodule-shallow-doc'
Junio C Hamano [Wed, 26 Apr 2017 06:39:07 +0000 (15:39 +0900)]
Merge branch 'ss/submodule-shallow-doc'

Doc update.

* ss/submodule-shallow-doc:
  gitmodules: clarify what history depth a shallow clone has

4 years agoMerge branch 'ss/gitmodules-ignore-doc'
Junio C Hamano [Wed, 26 Apr 2017 06:39:06 +0000 (15:39 +0900)]
Merge branch 'ss/gitmodules-ignore-doc'

Doc update.

* ss/gitmodules-ignore-doc:
  gitmodules: clarify the ignore option values

4 years agoMerge branch 'nd/conditional-config-in-early-config'
Junio C Hamano [Wed, 26 Apr 2017 06:39:05 +0000 (15:39 +0900)]
Merge branch 'nd/conditional-config-in-early-config'

The recently introduced conditional inclusion of configuration did
not work well when early-config mechanism was involved.

* nd/conditional-config-in-early-config:
  config: correct file reading order in read_early_config()
  config: handle conditional include when $GIT_DIR is not set up
  config: prepare to pass more info in git_config_with_options()

4 years agoMerge branch 'ab/push-cas-doc-n-test'
Junio C Hamano [Wed, 26 Apr 2017 06:39:05 +0000 (15:39 +0900)]
Merge branch 'ab/push-cas-doc-n-test'

Doc update.

* ab/push-cas-doc-n-test:
  push: document & test --force-with-lease with multiple remotes

4 years agoMerge branch 'ls/travis-coccicheck'
Junio C Hamano [Wed, 26 Apr 2017 06:39:04 +0000 (15:39 +0900)]
Merge branch 'ls/travis-coccicheck'

Travis CI learns to run coccicheck.

* ls/travis-coccicheck:
  travis-ci: add static analysis build job to run coccicheck

4 years agoMerge branch 'ps/pathspec-empty-prefix-origin'
Junio C Hamano [Wed, 26 Apr 2017 06:39:03 +0000 (15:39 +0900)]
Merge branch 'ps/pathspec-empty-prefix-origin'

A recent update broke "git add -p ../foo" from a subdirectory.

* ps/pathspec-empty-prefix-origin:
  pathspec: honor `PATHSPEC_PREFIX_ORIGIN` with empty prefix

4 years agoMerge branch 'pc/t2027-git-to-pipe-cleanup'
Junio C Hamano [Wed, 26 Apr 2017 06:39:02 +0000 (15:39 +0900)]
Merge branch 'pc/t2027-git-to-pipe-cleanup'

Having a git command on the upstream side of a pipe in a test
script will hide the exit status from the command, which may cause
us to fail to notice a breakage; rewrite tests in a script to avoid
this issue.

* pc/t2027-git-to-pipe-cleanup:
  t2027: avoid using pipes

4 years agoMerge branch 'gb/rebase-signoff'
Junio C Hamano [Wed, 26 Apr 2017 06:39:01 +0000 (15:39 +0900)]
Merge branch 'gb/rebase-signoff'

"git rebase" learns "--signoff" option.

* gb/rebase-signoff:
  rebase: pass --[no-]signoff option to git am
  builtin/am: fold am_signoff() into am_append_signoff()
  builtin/am: honor --signoff also when --rebasing

4 years agoGetting ready for -rc1
Junio C Hamano [Mon, 24 Apr 2017 05:08:33 +0000 (22:08 -0700)]
Getting ready for -rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'dt/xgethostname-nul-termination'
Junio C Hamano [Mon, 24 Apr 2017 05:07:57 +0000 (22:07 -0700)]
Merge branch 'dt/xgethostname-nul-termination'

gethostname(2) may not NUL terminate the buffer if hostname does
not fit; unfortunately there is no easy way to see if our buffer
was too small, but at least this will make sure we will not end up
using garbage past the end of the buffer.

* dt/xgethostname-nul-termination:
  xgethostname: handle long hostnames
  use HOST_NAME_MAX to size buffers for gethostname(2)

4 years agoMerge branch 'jk/ls-files-recurse-submodules-fix'
Junio C Hamano [Mon, 24 Apr 2017 05:07:57 +0000 (22:07 -0700)]
Merge branch 'jk/ls-files-recurse-submodules-fix'

"ls-files --recurse-submodules" did not quite work well in a
project with nested submodules.

* jk/ls-files-recurse-submodules-fix:
  ls-files: fix path used when recursing into submodules
  ls-files: fix recurse-submodules with nested submodules

4 years agoMerge branch 'rs/misc-cppcheck-fixes'
Junio C Hamano [Mon, 24 Apr 2017 05:07:56 +0000 (22:07 -0700)]
Merge branch 'rs/misc-cppcheck-fixes'

Various small fixes.

* rs/misc-cppcheck-fixes:
  server-info: avoid calling fclose(3) twice in update_info_file()
  files_for_each_reflog_ent_reverse(): close stream and free strbuf on error
  am: close stream on error, but not stdin

4 years agoMerge branch 'jk/snprintf-cleanups'
Junio C Hamano [Mon, 24 Apr 2017 05:07:56 +0000 (22:07 -0700)]
Merge branch 'jk/snprintf-cleanups'

Hotfix for a topic that is already in 'master'.

* jk/snprintf-cleanups:
  replace: plug a memory leak

4 years agoMerge branch 'xy/format-patch-base'
Junio C Hamano [Mon, 24 Apr 2017 05:07:55 +0000 (22:07 -0700)]
Merge branch 'xy/format-patch-base'

Doc cleanup.

* xy/format-patch-base:
  doc: trivial typo in git-format-patch.txt

4 years agoMerge branch 'sb/checkout-recurse-submodules'
Junio C Hamano [Mon, 24 Apr 2017 05:07:54 +0000 (22:07 -0700)]
Merge branch 'sb/checkout-recurse-submodules'

Code cleanup.

* sb/checkout-recurse-submodules:
  submodule: remove a superfluous second check for the "new" variable

4 years agoMerge branch 'jt/fetch-pack-error-reporting'
Junio C Hamano [Mon, 24 Apr 2017 05:07:53 +0000 (22:07 -0700)]
Merge branch 'jt/fetch-pack-error-reporting'

"git fetch-pack" was not prepared to accept ERR packet that the
upload-pack can send with a human-readable error message.  It
showed the packet contents with ERR prefix, so there was no data
loss, but it was redundant to say "ERR" in an error message.

* jt/fetch-pack-error-reporting:
  fetch-pack: show clearer error message upon ERR

4 years agoMerge branch 'km/t1400-modernization'
Junio C Hamano [Mon, 24 Apr 2017 05:07:52 +0000 (22:07 -0700)]
Merge branch 'km/t1400-modernization'

Code cleanup.

* km/t1400-modernization:
  t1400: use consistent style for test_expect_success calls

4 years agoMerge branch 'jk/quarantine-received-objects'
Junio C Hamano [Mon, 24 Apr 2017 05:07:51 +0000 (22:07 -0700)]
Merge branch 'jk/quarantine-received-objects'

Add finishing touches to a recent topic.

* jk/quarantine-received-objects:
  refs: reject ref updates while GIT_QUARANTINE_PATH is set
  receive-pack: document user-visible quarantine effects
  receive-pack: drop tmp_objdir_env from run_update_hook

4 years agoMerge branch 'jk/loose-object-fsck'
Junio C Hamano [Mon, 24 Apr 2017 05:07:50 +0000 (22:07 -0700)]
Merge branch 'jk/loose-object-fsck'

Code cleanup.

* jk/loose-object-fsck:
  sha1_file: remove an used fd variable

4 years agoMerge branch 'bw/submodule-with-bs-path'
Junio C Hamano [Mon, 24 Apr 2017 05:07:50 +0000 (22:07 -0700)]
Merge branch 'bw/submodule-with-bs-path'

"git submodule" script does not work well with strange pathnames.
Protect it from a path with slashes in them, at least.

* bw/submodule-with-bs-path:
  submodule: prevent backslash expantion in submodule names

4 years agoMerge branch 'jh/verify-index-checksum-only-in-fsck'
Junio C Hamano [Mon, 24 Apr 2017 05:07:49 +0000 (22:07 -0700)]
Merge branch 'jh/verify-index-checksum-only-in-fsck'

The index file has a trailing SHA-1 checksum to detect file
corruption, and historically we checked it every time the index
file is used.  Omit the validation during normal use, and instead
verify only in "git fsck".

* jh/verify-index-checksum-only-in-fsck:
  read-cache: force_verify_index_checksum

4 years agoMerge branch 'jh/unpack-trees-micro-optim'
Junio C Hamano [Mon, 24 Apr 2017 05:07:48 +0000 (22:07 -0700)]
Merge branch 'jh/unpack-trees-micro-optim'

In a 2- and 3-way merge of trees, more than one source trees often
end up sharing an identical subtree; optimize by not reading the
same tree multiple times in such a case.

* jh/unpack-trees-micro-optim:
  unpack-trees: avoid duplicate ODB lookups during checkout

4 years agoMerge branch 'jh/string-list-micro-optim'
Junio C Hamano [Mon, 24 Apr 2017 05:07:47 +0000 (22:07 -0700)]
Merge branch 'jh/string-list-micro-optim'

The string-list API used a custom reallocation strategy that was
very inefficient, instead of using the usual ALLOC_GROW() macro,
which has been fixed.

* jh/string-list-micro-optim:
  string-list: use ALLOC_GROW macro when reallocing string_list

4 years agoMerge branch 'nd/conditional-config-include'
Junio C Hamano [Mon, 24 Apr 2017 05:07:46 +0000 (22:07 -0700)]
Merge branch 'nd/conditional-config-include'

$GIT_DIR may in some cases be normalized with all symlinks resolved
while "gitdir" path expansion in the pattern does not receive the
same treatment, leading to incorrect mismatch.  This has been fixed.

* nd/conditional-config-include:
  config: resolve symlinks in conditional include's patterns
  path.c: and an option to call real_path() in expand_user_path()

4 years agoMerge branch 'dt/http-postbuffer-can-be-large'
Junio C Hamano [Mon, 24 Apr 2017 05:07:45 +0000 (22:07 -0700)]
Merge branch 'dt/http-postbuffer-can-be-large'

Allow the http.postbuffer configuration variable to be set to a
size that can be expressed in size_t, which can be larger than
ulong on some platforms.

* dt/http-postbuffer-can-be-large:
  http.postbuffer: allow full range of ssize_t values

4 years agoMerge branch 'tb/doc-eol-normalization'
Junio C Hamano [Mon, 24 Apr 2017 05:07:44 +0000 (22:07 -0700)]
Merge branch 'tb/doc-eol-normalization'

Doc update.

* tb/doc-eol-normalization:
  gitattributes.txt: document how to normalize the line endings

4 years agoMerge branch 'sr/http-proxy-configuration-fix'
Junio C Hamano [Mon, 24 Apr 2017 05:07:44 +0000 (22:07 -0700)]
Merge branch 'sr/http-proxy-configuration-fix'

"http.proxy" set to an empty string is used to disable the usage of
proxy.  We broke this early last year.

* sr/http-proxy-configuration-fix:
  http: fix the silent ignoring of proxy misconfiguraion
  http: honor empty http.proxy option to bypass proxy

4 years agoGit 2.13-rc0 v2.13.0-rc0
Junio C Hamano [Thu, 20 Apr 2017 04:42:08 +0000 (21:42 -0700)]
Git 2.13-rc0

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'jh/memihash-opt'
Junio C Hamano [Thu, 20 Apr 2017 04:37:25 +0000 (21:37 -0700)]
Merge branch 'jh/memihash-opt'

Hotfix for a topic that is already in 'master'.

* jh/memihash-opt:
  p0004: make perf test executable
  t3008: skip lazy-init test on a single-core box
  test-online-cpus: helper to return cpu count
  name-hash: fix buffer overrun

4 years agoMerge branch 'vn/revision-shorthand-for-side-branch-log'
Junio C Hamano [Thu, 20 Apr 2017 04:37:25 +0000 (21:37 -0700)]
Merge branch 'vn/revision-shorthand-for-side-branch-log'

Doc cleanup.

* vn/revision-shorthand-for-side-branch-log:
  doc/revisions: remove brackets from rev^-n shorthand

4 years agoMerge branch 'sf/putty-w-args'
Junio C Hamano [Thu, 20 Apr 2017 04:37:24 +0000 (21:37 -0700)]
Merge branch 'sf/putty-w-args'

* sf/putty-w-args:
  connect.c: handle errors from split_cmdline

4 years agoMerge branch 'ld/p4-current-branch-fix'
Junio C Hamano [Thu, 20 Apr 2017 04:37:23 +0000 (21:37 -0700)]
Merge branch 'ld/p4-current-branch-fix'

"git p4" used "name-rev HEAD" when it wants to learn what branch is
checked out; it should use "symbolic-ref HEAD".

* ld/p4-current-branch-fix:
  git-p4: don't use name-rev to get current branch
  git-p4: add read_pipe_text() internal function
  git-p4: add failing test for name-rev rather than symbolic-ref

4 years agoMerge branch 'dt/gc-ignore-old-gc-logs'
Junio C Hamano [Thu, 20 Apr 2017 04:37:22 +0000 (21:37 -0700)]
Merge branch 'dt/gc-ignore-old-gc-logs'

* dt/gc-ignore-old-gc-logs:
  t6500: wait for detached auto gc at the end of the test script

4 years agoMerge branch 'bw/attr-pathspec'
Junio C Hamano [Thu, 20 Apr 2017 04:37:21 +0000 (21:37 -0700)]
Merge branch 'bw/attr-pathspec'

* bw/attr-pathspec:
  pathspec: fix segfault in clear_pathspec

4 years agoMerge branch 'ab/grep-plug-pathspec-leak'
Junio C Hamano [Thu, 20 Apr 2017 04:37:21 +0000 (21:37 -0700)]
Merge branch 'ab/grep-plug-pathspec-leak'

Call clear_pathspec() to release resources immediately before the
cmd_grep() function returns.

* ab/grep-plug-pathspec-leak:
  grep: plug a trivial memory leak

4 years agoMerge branch 'jk/no-looking-at-dotgit-outside-repo'
Junio C Hamano [Thu, 20 Apr 2017 04:37:20 +0000 (21:37 -0700)]
Merge branch 'jk/no-looking-at-dotgit-outside-repo'

Clean up fallouts from recent tightening of the set-up sequence,
where Git barfs when repository information is accessed without
first ensuring that it was started in a repository.

* jk/no-looking-at-dotgit-outside-repo:
  test-read-cache: setup git dir
  has_sha1_file: don't bother if we are not in a repository

4 years agoMerge branch 'nd/files-backend-git-dir'
Junio C Hamano [Thu, 20 Apr 2017 04:37:19 +0000 (21:37 -0700)]
Merge branch 'nd/files-backend-git-dir'

The "submodule" specific field in the ref_store structure is
replaced with a more generic "gitdir" that can later be used also
when dealing with ref_store that represents the set of refs visible
from the other worktrees.

* nd/files-backend-git-dir: (28 commits)
  refs.h: add a note about sorting order of for_each_ref_*
  t1406: new tests for submodule ref store
  t1405: some basic tests on main ref store
  t/helper: add test-ref-store to test ref-store functions
  refs: delete pack_refs() in favor of refs_pack_refs()
  files-backend: avoid ref api targeting main ref store
  refs: new transaction related ref-store api
  refs: add new ref-store api
  refs: rename get_ref_store() to get_submodule_ref_store() and make it public
  files-backend: replace submodule_allowed check in files_downcast()
  refs: move submodule code out of files-backend.c
  path.c: move some code out of strbuf_git_path_submodule()
  refs.c: make get_main_ref_store() public and use it
  refs.c: kill register_ref_store(), add register_submodule_ref_store()
  refs.c: flatten get_ref_store() a bit
  refs: rename lookup_ref_store() to lookup_submodule_ref_store()
  refs.c: introduce get_main_ref_store()
  files-backend: remove the use of git_path()
  files-backend: add and use files_ref_path()
  files-backend: add and use files_reflog_path()
  ...

4 years agoMerge branch 'bw/submodule-is-active'
Junio C Hamano [Thu, 20 Apr 2017 04:37:18 +0000 (21:37 -0700)]
Merge branch 'bw/submodule-is-active'

Error message fix.

* bw/submodule-is-active:
  submodule--helper: fix typo in is_active error message

4 years agoMerge branch 'va/i18n-perl-scripts'
Junio C Hamano [Thu, 20 Apr 2017 04:37:17 +0000 (21:37 -0700)]
Merge branch 'va/i18n-perl-scripts'

Message fix.

* va/i18n-perl-scripts:
  git-add--interactive.perl: add missing dot in a message

4 years agoMerge branch 'sb/submodule-rm-absorb'
Junio C Hamano [Thu, 20 Apr 2017 04:37:17 +0000 (21:37 -0700)]
Merge branch 'sb/submodule-rm-absorb'

Error message fix.

* sb/submodule-rm-absorb:
  submodule.c: add missing ' in error messages

4 years agoMerge branch 'ah/diff-files-ours-theirs-doc'
Junio C Hamano [Thu, 20 Apr 2017 04:37:16 +0000 (21:37 -0700)]
Merge branch 'ah/diff-files-ours-theirs-doc'

The diff options "--ours", "--theirs" exist for quite some time.
But so far they were not documented. Now they are.

* ah/diff-files-ours-theirs-doc:
  diff-files: document --ours etc.

4 years agoMerge branch 'lt/mailinfo-in-body-header-continuation'
Junio C Hamano [Thu, 20 Apr 2017 04:37:15 +0000 (21:37 -0700)]
Merge branch 'lt/mailinfo-in-body-header-continuation'

If a patch e-mail had its first paragraph after an in-body header
indented (even after a blank line after the in-body header line),
the indented line was mistook as a continuation of the in-body
header.  This has been fixed.

* lt/mailinfo-in-body-header-continuation:
  mailinfo: fix in-body header continuations

4 years agoMerge branch 'bw/push-options-recursively-to-submodules'
Junio C Hamano [Thu, 20 Apr 2017 04:37:14 +0000 (21:37 -0700)]
Merge branch 'bw/push-options-recursively-to-submodules'

"git push --recurse-submodules --push-option=<string>" learned to
propagate the push option recursively down to pushes in submodules.

* bw/push-options-recursively-to-submodules:
  push: propagate remote and refspec with --recurse-submodules
  submodule--helper: add push-check subcommand
  remote: expose parse_push_refspec function
  push: propagate push-options with --recurse-submodules
  push: unmark a local variable as static

4 years agoMerge branch 'bc/object-id'
Junio C Hamano [Thu, 20 Apr 2017 04:37:13 +0000 (21:37 -0700)]
Merge branch 'bc/object-id'

Conversion from unsigned char [40] to struct object_id continues.

* bc/object-id:
  Documentation: update and rename api-sha1-array.txt
  Rename sha1_array to oid_array
  Convert sha1_array_for_each_unique and for_each_abbrev to object_id
  Convert sha1_array_lookup to take struct object_id
  Convert remaining callers of sha1_array_lookup to object_id
  Make sha1_array_append take a struct object_id *
  sha1-array: convert internal storage for struct sha1_array to object_id
  builtin/pull: convert to struct object_id
  submodule: convert check_for_new_submodule_commits to object_id
  sha1_name: convert disambiguate_hint_fn to take object_id
  sha1_name: convert struct disambiguate_state to object_id
  test-sha1-array: convert most code to struct object_id
  parse-options-cb: convert sha1_array_append caller to struct object_id
  fsck: convert init_skiplist to struct object_id
  builtin/receive-pack: convert portions to struct object_id
  builtin/pull: convert portions to struct object_id
  builtin/diff: convert to struct object_id
  Convert GIT_SHA1_RAWSZ used for allocation to GIT_MAX_RAWSZ
  Convert GIT_SHA1_HEXSZ used for allocation to GIT_MAX_HEXSZ
  Define new hash-size constants for allocating memory

4 years agoMerge branch 'sb/submodule-short-status'
Junio C Hamano [Thu, 20 Apr 2017 04:37:12 +0000 (21:37 -0700)]
Merge branch 'sb/submodule-short-status'

The output from "git status --short" has been extended to show
various kinds of dirtyness in submodules differently; instead of to
"M" for modified, 'm' and '?' can be shown to signal changes only
to the working tree of the submodule but not the commit that is
checked out.

* sb/submodule-short-status:
  submodule.c: correctly handle nested submodules in is_submodule_modified
  short status: improve reporting for submodule changes
  submodule.c: stricter checking for submodules in is_submodule_modified
  submodule.c: port is_submodule_modified to use porcelain 2
  submodule.c: convert is_submodule_modified to use strbuf_getwholeline
  submodule.c: factor out early loop termination in is_submodule_modified
  submodule.c: use argv_array in is_submodule_modified

4 years agoread-cache: speed up has_dir_name (part 2)
Jeff Hostetler [Wed, 19 Apr 2017 17:06:18 +0000 (17:06 +0000)]
read-cache: speed up has_dir_name (part 2)

Teach has_dir_name() to see if the path of the new item
is greater than the last path in the index array before
attempting to search for it.

has_dir_name() is looking for file/directory collisions
in the index and has to consider each sub-directory
prefix in turn.  This can cause multiple binary searches
for each path.

During operations like checkout, merge_working_tree()
populates the new index in sorted order, so we expect
to be able to append in many cases.

This commit is part 2 of 2.  This commit handles the
additional possible short-cuts as we look at each
sub-directory prefix.

The net-net gains for add_index_entry_with_check() and
both had_dir_name() commits are best seen for very
large repos.

Here are results for an INFLATED version of linux.git
with 1M files.

$ GIT_PERF_REPO=/mnt/test/linux_inflated.git/ ./run upstream/base HEAD ./p0006-read-tree-checkout.sh
Test                                                            upstream/base      HEAD
0006.2: read-tree br_base br_ballast (1043893)                  3.79(3.63+0.15)    2.68(2.52+0.15) -29.3%
0006.3: switch between br_base br_ballast (1043893)             7.55(6.58+0.44)    6.03(4.60+0.43) -20.1%
0006.4: switch between br_ballast br_ballast_plus_1 (1043893)   10.84(9.26+0.59)   8.44(7.06+0.65) -22.1%
0006.5: switch between aliases (1043893)                        10.93(9.39+0.58)   10.24(7.04+0.63) -6.3%

Here are results for a synthetic repo with 4.2M files.

$ GIT_PERF_REPO=~/work/gfw/t/perf/repos/gen-many-files-10.4.3.git/ ./run HEAD~3 HEAD ./p0006-read-tree-checkout.sh
Test                                                            HEAD~3               HEAD
0006.2: read-tree br_base br_ballast (4194305)                  29.96(19.26+10.50)   23.76(13.42+10.12) -20.7%
0006.3: switch between br_base br_ballast (4194305)             56.95(36.08+16.83)   45.54(25.94+15.68) -20.0%
0006.4: switch between br_ballast br_ballast_plus_1 (4194305)   90.94(51.50+31.52)   78.22(39.39+30.70) -14.0%
0006.5: switch between aliases (4194305)                        93.72(51.63+34.09)   77.94(39.00+30.88) -16.8%

Results for medium repos (like linux.git) are mixed and have
more variance (probably do to disk IO unrelated to this test.

$ GIT_PERF_REPO=/mnt/test/linux.git/ ./run HEAD~3 HEAD ./p0006-read-tree-checkout.sh
Test                                                          HEAD~3             HEAD
0006.2: read-tree br_base br_ballast (57994)                  0.25(0.21+0.03)    0.20(0.17+0.02) -20.0%
0006.3: switch between br_base br_ballast (57994)             10.67(6.06+2.92)   10.51(5.94+2.91) -1.5%
0006.4: switch between br_ballast br_ballast_plus_1 (57994)   0.59(0.47+0.16)    0.52(0.40+0.13) -11.9%
0006.5: switch between aliases (57994)                        0.59(0.44+0.17)    0.51(0.38+0.14) -13.6%

$ GIT_PERF_REPO=/mnt/test/linux.git/ ./run HEAD~3 HEAD ./p0006-read-tree-checkout.sh
Test                                                          HEAD~3             HEAD
0006.2: read-tree br_base br_ballast (57994)                  0.24(0.21+0.02)    0.21(0.18+0.02) -12.5%
0006.3: switch between br_base br_ballast (57994)             10.42(5.98+2.91)   10.66(5.86+3.09) +2.3%
0006.4: switch between br_ballast br_ballast_plus_1 (57994)   0.59(0.49+0.13)    0.53(0.37+0.16) -10.2%
0006.5: switch between aliases (57994)                        0.59(0.43+0.17)    0.50(0.37+0.14) -15.3%

Results for smaller repos (like git.git) are not significant.
$ ./run HEAD~3 HEAD ./p0006-read-tree-checkout.sh
Test                                                         HEAD~3            HEAD
0006.2: read-tree br_base br_ballast (3043)                  0.01(0.00+0.00)   0.01(0.00+0.00) +0.0%
0006.3: switch between br_base br_ballast (3043)             0.31(0.17+0.11)   0.29(0.19+0.08) -6.5%
0006.4: switch between br_ballast br_ballast_plus_1 (3043)   0.03(0.02+0.00)   0.03(0.02+0.00) +0.0%
0006.5: switch between aliases (3043)                        0.03(0.02+0.00)   0.03(0.02+0.00) +0.0%

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoread-cache: speed up has_dir_name (part 1)
Jeff Hostetler [Wed, 19 Apr 2017 17:06:17 +0000 (17:06 +0000)]
read-cache: speed up has_dir_name (part 1)

Teach has_dir_name() to see if the path of the new item
is greater than the last path in the index array before
attempting to search for it.

has_dir_name() is looking for file/directory collisions
in the index and has to consider each sub-directory
prefix in turn.  This can cause multiple binary searches
for each path.

During operations like checkout, merge_working_tree()
populates the new index in sorted order, so we expect
to be able to append in many cases.

This commit is part 1 of 2.  This commit handles the top
of has_dir_name() and the trivial optimization.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoread-cache: speed up add_index_entry during checkout
Jeff Hostetler [Wed, 19 Apr 2017 17:06:16 +0000 (17:06 +0000)]
read-cache: speed up add_index_entry during checkout

Teach add_index_entry_with_check() to see if the path
of the new item is greater than the last path in the
index array before attempting to search for it.

During checkout, merge_working_tree() populates the new
index in sorted order, so this change will save a binary
lookups per file.  This preserves the original behavior
but simply checks the last element before starting the
search.

This helps performance on very large repositories.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agop0006-read-tree-checkout: perf test to time read-tree
Jeff Hostetler [Wed, 19 Apr 2017 17:06:15 +0000 (17:06 +0000)]
p0006-read-tree-checkout: perf test to time read-tree

Created t/perf/repos/many-files.sh to generate large, but
artificial repositories.

Created t/perf/inflate-repo.sh to alter an EXISTING repo
to have a set of large commits.  This can be used to create
a branch with 1M+ files in repositories like git.git or
linux.git, but with more realistic content.  It does this
by making multiple copies of the entire worktree in a series
of sub-directories.

The branch name and ballast structure created by both scripts
match, so either script can be used to generate very large
test repositories for the following perf test.

Created t/perf/p0006-read-tree-checkout.sh to measure
performance on various read-tree, checkout, and update-index
operations.  This test can run using either normal repos or
ones from the above scripts.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogitmodules: clarify the ignore option values
Sebastian Schuberth [Wed, 19 Apr 2017 09:15:15 +0000 (09:15 +0000)]
gitmodules: clarify the ignore option values

Add more structure and describe each possible option in a self-contained
way, not referring to any of the previously described options.

Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogitmodules: clarify what history depth a shallow clone has
Sebastian Schuberth [Wed, 19 Apr 2017 07:56:33 +0000 (07:56 +0000)]
gitmodules: clarify what history depth a shallow clone has

Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopush: document & test --force-with-lease with multiple remotes
Ævar Arnfjörð Bjarmason [Wed, 19 Apr 2017 09:22:03 +0000 (09:22 +0000)]
push: document & test --force-with-lease with multiple remotes

Document & test for cases where there are two remotes pointing to the
same URL, and a background fetch & subsequent `git push
--force-with-lease` shouldn't clobber un-updated references we haven't
fetched.

Some editors like Microsoft's VSC have a feature to auto-fetch in the
background, this bypasses the protections offered by
--force-with-lease & --force-with-lease=<refname>, as noted in the
documentation being added here.

See the 'Tools that do an automatic fetch defeat "git push
--force-with-lease"' (<1491617750.2149.10.camel@mattmccutchen.net>)
git mailing list thread for more details. Jakub Narębski suggested
this method of adding another remote to bypass this edge case,
document that & add a test for it.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconfig: correct file reading order in read_early_config()
Nguyễn Thái Ngọc Duy [Mon, 17 Apr 2017 10:10:02 +0000 (17:10 +0700)]
config: correct file reading order in read_early_config()

Config file reading order is important because each file can override
values in the previous files and this is expected behavior. Normally
we read in this order, all in do_git_config_sequence():

1. $HOME/.gitconfig
2. $GIT_DIR/config
3. config from command line

However in read_early_config() the order may be swapped a bit if
setup_git_directory() has not been called:

1. $HOME/.gitconfig
2. $GIT_DIR/config is NOT read because .git dir is not found _yet_
3. config from command line
4. $GIT_DIR/config is now READ (after discover_git_directory() call)

The reading at step 4 could override config at step 3, which is not
the expectation.

Now that we could pass the .git dir around, we could feed
discover_git_directory() back to step 2, so that it works again, and
remove step 4.

Noticed-by: Jeff King <peff@peff.net>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorebase: pass --[no-]signoff option to git am
Giuseppe Bilotta [Tue, 18 Apr 2017 09:29:05 +0000 (11:29 +0200)]
rebase: pass --[no-]signoff option to git am

This makes it easy to sign off a whole patchset before submission.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoxgethostname: handle long hostnames
David Turner [Tue, 18 Apr 2017 21:57:43 +0000 (17:57 -0400)]
xgethostname: handle long hostnames

If the full hostname doesn't fit in the buffer supplied to
gethostname, POSIX does not specify whether the buffer will be
null-terminated, so to be safe, we should do it ourselves.  Introduce
new function, xgethostname, which ensures that there is always a \0
at the end of the buffer.

Signed-off-by: David Turner <dturner@twosigma.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouse HOST_NAME_MAX to size buffers for gethostname(2)
René Scharfe [Tue, 18 Apr 2017 21:57:42 +0000 (17:57 -0400)]
use HOST_NAME_MAX to size buffers for gethostname(2)

POSIX limits the length of host names to HOST_NAME_MAX.  Export the
fallback definition from daemon.c and use this constant to make all
buffers used with gethostname(2) big enough for any possible result
and a terminating NUL.

Inspired-by: David Turner <dturner@twosigma.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: David Turner <dturner@twosigma.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agop0004: make perf test executable
Christian Couder [Tue, 18 Apr 2017 14:24:07 +0000 (16:24 +0200)]
p0004: make perf test executable

It looks like in 89c3b0ad43 (name-hash: add perf test for lazy_init_name_hash,
2017-03-23) p0004 was not created with the execute unix rights.
Let's fix that.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Acked-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agols-files: fix path used when recursing into submodules
Jacob Keller [Thu, 13 Apr 2017 17:12:24 +0000 (10:12 -0700)]
ls-files: fix path used when recursing into submodules

Don't assume that the current working directory is the root of the
repository. Correctly generate the path for the recursing child
processes by building it from the work_tree() root instead. Otherwise if
we run ls-files using --git-dir or --work-tree it will not work
correctly as it attempts to change directory into a potentially invalid
location. Best case, it doesn't exist and we produce an error. Worst
case we cd into the wrong location and unknown behavior occurs.

Add a new test which highlights this possibility.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreplace: plug a memory leak
Junio C Hamano [Tue, 18 Apr 2017 04:56:54 +0000 (21:56 -0700)]
replace: plug a memory leak

Recent update to for_each_replace_name() to make it use a strbuf in
place of a fixed buffer forgot to release the memory held by the
strbuf before leaving the function.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodoc: trivial typo in git-format-patch.txt
Giuseppe Bilotta [Mon, 17 Apr 2017 22:32:53 +0000 (00:32 +0200)]
doc: trivial typo in git-format-patch.txt

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconfig: handle conditional include when $GIT_DIR is not set up
Nguyễn Thái Ngọc Duy [Mon, 17 Apr 2017 10:10:01 +0000 (17:10 +0700)]
config: handle conditional include when $GIT_DIR is not set up

If setup_git_directory() and friends have not been called,
get_git_dir() (because of includeIf.gitdir:XXX) would lead to

    die("BUG: setup_git_env called without repository");

There are two cases when a config file could be read before $GIT_DIR
is located.

The first one is check_repository_format(), where we read just the one
file $GIT_DIR/config to check if we could understand this
repository. This case should be safe. We do not parse include
directives, which can only be triggered from git_config_with_options,
but setup code uses a lower-level function. The concerned variables
should never be hidden away behind includes anyway.

The second one is triggered in check_pager_config() when we're about
to run an external git command. We might be able to find $GIT_DIR in
this case, which is exactly what read_early_config() does (and also is
what check_pager_config() uses). Conditional includes and
get_git_dir() could be triggered by the first
git_config_with_options() call there, before discover_git_directory()
is used as a fallback $GIT_DIR detection.

Detect this special "early reading" case, pass down the $GIT_DIR,
either from previous setup or detected by discover_git_directory(),
and make conditional include use it.

Noticed-by: Bert Wesarg <bert.wesarg@googlemail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconfig: prepare to pass more info in git_config_with_options()
Nguyễn Thái Ngọc Duy [Mon, 17 Apr 2017 10:10:00 +0000 (17:10 +0700)]
config: prepare to pass more info in git_config_with_options()

So far we can only pass one flag, respect_includes, to thie function. We
need to pass some more (non-flag even), so let's make it accept a struct
instead of an integer.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agols-files: fix recurse-submodules with nested submodules
Jacob Keller [Thu, 13 Apr 2017 17:12:23 +0000 (10:12 -0700)]
ls-files: fix recurse-submodules with nested submodules

Since commit e77aa336f116 ("ls-files: optionally recurse into
submodules", 2016-10-07) ls-files has known how to recurse into
submodules when displaying files.

Unfortunately this fails for certain cases, including when nesting more
than one submodule, called from within a submodule that itself has
submodules, or when the GIT_DIR environemnt variable is set.

Prior to commit b58a68c1c187 ("setup: allow for prefix to be passed to
git commands", 2017-03-17) this resulted in an error indicating that
--prefix and --super-prefix were incompatible.

After this commit, instead, the process loops forever with a GIT_DIR set
to the parent and continuously reads the parent submodule files and
recursing forever.

Fix this by preparing the environment properly for submodules when
setting up the child process. This is similar to how other commands such
as grep behave.

This was not caught by the original tests because the scenario is
avoided if the submodules are created separately and not stored as the
standard method of putting the submodule git directory under
.git/modules/<name>. We can update the test to show the failure by the
addition of "git submodule absorbgitdirs" to the test case. However,
note that this new test would run forever without the necessary fix in
this patch.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofetch-pack: show clearer error message upon ERR
Jonathan Tan [Wed, 12 Apr 2017 18:06:02 +0000 (11:06 -0700)]
fetch-pack: show clearer error message upon ERR

Currently, fetch-pack prints a confusing error message ("expected
ACK/NAK") when the server it's communicating with sends a pkt-line
starting with "ERR".  Replace it with a less confusing error message.

Also update the documentation describing the fetch-pack/upload-pack
protocol (pack-protocol.txt) to indicate that "ERR" can be sent in the
place of "ACK" or "NAK". In practice, this has been done for quite some
time by other Git implementations (e.g. JGit sends "want $id not valid")
and by Git itself (since commit bdb31ea: "upload-pack: report "not our
ref" to client", 2017-02-23) whenever a "want" line references an object
that it does not have. (This is uncommon, but can happen if a repository
is garbage-collected during a negotiation.)

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: remove a superfluous second check for the "new" variable
Sebastian Schuberth [Mon, 17 Apr 2017 07:59:47 +0000 (07:59 +0000)]
submodule: remove a superfluous second check for the "new" variable

Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoserver-info: avoid calling fclose(3) twice in update_info_file()
René Scharfe [Sun, 16 Apr 2017 16:55:58 +0000 (18:55 +0200)]
server-info: avoid calling fclose(3) twice in update_info_file()

If an error occurs when or after closing the stream we call fclose(3)
again in the error handler.  The second call can exhibit undefined
behavior, so make sure to call fclose(3) at most once.  Also avoid
calling close(2) after fd has been successfully associated with the
stream, as fclose(3) has become responsible for doing that beyond
this point.

Found with Cppcheck.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofiles_for_each_reflog_ent_reverse(): close stream and free strbuf on error
René Scharfe [Sun, 16 Apr 2017 16:55:46 +0000 (18:55 +0200)]
files_for_each_reflog_ent_reverse(): close stream and free strbuf on error

Exit the loop orderly through the cleanup code, instead of dashing out
with logfp still open and sb leaking.

Found with Cppcheck.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Reviewed-by: Jeff King <peff@peff.net>
Reviewed-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot1400: use consistent style for test_expect_success calls
Kyle Meyer [Sun, 16 Apr 2017 02:31:02 +0000 (22:31 -0400)]
t1400: use consistent style for test_expect_success calls

Structure calls as

    test_expect_success 'description' '
     body
    '

Use double quotes for the description if it requires parameter
expansion or contains a single quote.

Signed-off-by: Kyle Meyer <kyle@kyleam.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodoc/revisions: remove brackets from rev^-n shorthand
Kyle Meyer [Sun, 16 Apr 2017 04:07:57 +0000 (00:07 -0400)]
doc/revisions: remove brackets from rev^-n shorthand

Given that other instances of "{...}" in the revision documentation
represent literal characters of revision specifications, describing
the rev^-n shorthand as "<rev>^-{<n>}" incorrectly suggests that
something like "master^-{1}" is an acceptable form.

Signed-off-by: Kyle Meyer <kyle@kyleam.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoTwelfth batch for 2.13
Junio C Hamano [Mon, 17 Apr 2017 06:30:49 +0000 (23:30 -0700)]
Twelfth batch for 2.13

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'js/difftool-builtin'
Junio C Hamano [Mon, 17 Apr 2017 06:29:34 +0000 (23:29 -0700)]
Merge branch 'js/difftool-builtin'

Code cleanup.

* js/difftool-builtin:
  difftool: fix use-after-free
  difftool: avoid strcpy

4 years agoMerge branch 'sb/unpack-trees-would-lose-submodule-message-update'
Junio C Hamano [Mon, 17 Apr 2017 06:29:34 +0000 (23:29 -0700)]
Merge branch 'sb/unpack-trees-would-lose-submodule-message-update'

Update an error message.

* sb/unpack-trees-would-lose-submodule-message-update:
  unpack-trees.c: align submodule error message to the other error messages

4 years agoMerge branch 'ab/regen-perl-mak-with-different-perl'
Junio C Hamano [Mon, 17 Apr 2017 06:29:33 +0000 (23:29 -0700)]
Merge branch 'ab/regen-perl-mak-with-different-perl'

Update the build dependency so that an update to /usr/bin/perl
etc. result in recomputation of perl.mak file.

* ab/regen-perl-mak-with-different-perl:
  perl: regenerate perl.mak if perl -V changes

4 years agoMerge branch 'sb/show-diff-for-submodule-in-diff-fix'
Junio C Hamano [Mon, 17 Apr 2017 06:29:32 +0000 (23:29 -0700)]
Merge branch 'sb/show-diff-for-submodule-in-diff-fix'

"git diff --submodule=diff" learned to work better in a project
with a submodule that in turn has its own submodules.

* sb/show-diff-for-submodule-in-diff-fix:
  diff: submodule inline diff to initialize env array.

4 years agoMerge branch 'qp/bisect-docfix'
Junio C Hamano [Mon, 17 Apr 2017 06:29:31 +0000 (23:29 -0700)]
Merge branch 'qp/bisect-docfix'

Doc update.

* qp/bisect-docfix:
  git-bisect.txt: add missing word

4 years agoMerge branch 'mm/ls-files-s-doc'
Junio C Hamano [Mon, 17 Apr 2017 06:29:30 +0000 (23:29 -0700)]
Merge branch 'mm/ls-files-s-doc'

Doc update.

* mm/ls-files-s-doc:
  Documentation: document elements in "ls-files -s" output in order

4 years agoMerge branch 'jk/loose-object-info-report-error'
Junio C Hamano [Mon, 17 Apr 2017 06:29:30 +0000 (23:29 -0700)]
Merge branch 'jk/loose-object-info-report-error'

Update error handling for codepath that deals with corrupt loose
objects.

* jk/loose-object-info-report-error:
  index-pack: detect local corruption in collision check
  sha1_loose_object_info: return error for corrupted objects

4 years agoMerge branch 'jc/bs-t-is-not-a-tab-for-sed'
Junio C Hamano [Mon, 17 Apr 2017 06:29:28 +0000 (23:29 -0700)]
Merge branch 'jc/bs-t-is-not-a-tab-for-sed'

Code cleanup.

* jc/bs-t-is-not-a-tab-for-sed:
  contrib/git-resurrect.sh: do not write \t for HT in sed scripts

4 years agoMerge branch 'jc/unused-symbols'
Junio C Hamano [Mon, 17 Apr 2017 06:29:27 +0000 (23:29 -0700)]
Merge branch 'jc/unused-symbols'

Code cleanup.

* jc/unused-symbols:
  remote.[ch]: parse_push_cas_option() can be static

4 years agoMerge branch 'jk/snprintf-cleanups'
Junio C Hamano [Mon, 17 Apr 2017 06:29:26 +0000 (23:29 -0700)]
Merge branch 'jk/snprintf-cleanups'

Code clean-up.

* jk/snprintf-cleanups:
  daemon: use an argv_array to exec children
  gc: replace local buffer with git_path
  transport-helper: replace checked snprintf with xsnprintf
  convert unchecked snprintf into xsnprintf
  combine-diff: replace malloc/snprintf with xstrfmt
  replace unchecked snprintf calls with heap buffers
  receive-pack: print --pack-header directly into argv array
  name-rev: replace static buffer with strbuf
  create_branch: use xstrfmt for reflog message
  create_branch: move msg setup closer to point of use
  avoid using mksnpath for refs
  avoid using fixed PATH_MAX buffers for refs
  fetch: use heap buffer to format reflog
  tag: use strbuf to format tag header
  diff: avoid fixed-size buffer for patch-ids
  odb_mkstemp: use git_path_buf
  odb_mkstemp: write filename into strbuf
  do not check odb_mkstemp return value for errors

4 years agosha1_file: remove an used fd variable
Sebastian Schuberth [Sun, 16 Apr 2017 19:04:01 +0000 (19:04 +0000)]
sha1_file: remove an used fd variable

Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoam: close stream on error, but not stdin
René Scharfe [Sun, 16 Apr 2017 16:55:30 +0000 (18:55 +0200)]
am: close stream on error, but not stdin

Avoid closing stdin, but do close an actual input file on error exit.

Found with Cppcheck.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/am: fold am_signoff() into am_append_signoff()
Giuseppe Bilotta [Sat, 15 Apr 2017 14:41:02 +0000 (16:41 +0200)]
builtin/am: fold am_signoff() into am_append_signoff()

There are no more direct calls to am_signoff(), so we can fold its
logic  in am_append_signoff().

(This is done in a separate commit rather than in the previous one, to
make it easier to revert this specific change if additional calls are
ever introduced.)

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/am: honor --signoff also when --rebasing
Giuseppe Bilotta [Sat, 15 Apr 2017 14:41:01 +0000 (16:41 +0200)]
builtin/am: honor --signoff also when --rebasing

Signoff is handled in parse_mail(), but not in parse_mail_rebasing(),
since the latter is only used when git-rebase calls git-am with the
--rebasing option, and --signoff is never passed in this case.

In order to introduce (in the upcoming commits) support for
`git-rebase --signoff`, we must make git-am pay attention to it also
in the rebase case. This can be done by moving the conditional
addition of the signoff from parse_mail() to the caller am_run(),
after either of the parse_mail*() functions were called.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogit-p4: don't use name-rev to get current branch
Luke Diamand [Sat, 15 Apr 2017 10:36:09 +0000 (11:36 +0100)]
git-p4: don't use name-rev to get current branch

git-p4 was using "git name-rev" to find out the current branch.

That is not safe, since if multiple branches or tags point at
the same revision, the result obtained might not be what is
expected.

Instead use "git symbolic-ref".

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogit-p4: add read_pipe_text() internal function
Luke Diamand [Sat, 15 Apr 2017 10:36:08 +0000 (11:36 +0100)]
git-p4: add read_pipe_text() internal function

The existing read_pipe() function returns an empty string on
error, but also returns an empty string if the command returns
an empty string.

This leads to ugly constructions trying to detect error cases.

Add read_pipe_text() which just returns None on error.

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogit-p4: add failing test for name-rev rather than symbolic-ref
Luke Diamand [Sat, 15 Apr 2017 10:36:07 +0000 (11:36 +0100)]
git-p4: add failing test for name-rev rather than symbolic-ref

Using name-rev to find the current git branch means that git-p4
does not correctly get the current branch name if there are
multiple branches pointing at HEAD, or a tag.

This change adds a test case which demonstrates the problem.
Configuring which branches are allowed to be submitted from goes
wrong, as git-p4 gets confused about which branch is in use.

This appears to be the only place that git-p4 actually cares
about the current branch.

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: prevent backslash expantion in submodule names
Brandon Williams [Fri, 7 Apr 2017 17:23:06 +0000 (10:23 -0700)]
submodule: prevent backslash expantion in submodule names

When attempting to add a submodule with backslashes in its name 'git
submodule' fails in a funny way.  We can see that some of the
backslashes are expanded resulting in a bogus path:

git -C main submodule add ../sub\\with\\backslash
fatal: repository '/tmp/test/sub\witackslash' does not exist
fatal: clone of '/tmp/test/sub\witackslash' into submodule path

To solve this, convert calls to 'read' to 'read -r' in git-submodule.sh
in order to prevent backslash expantion in submodule names.

Reported-by: Joachim Durchholz <jo@durchholz.org>
Signed-off-by: Brandon Williams <bmwill@google.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotest-read-cache: setup git dir
René Scharfe [Thu, 6 Apr 2017 20:41:41 +0000 (22:41 +0200)]
test-read-cache: setup git dir

b1ef400e (setup_git_env: avoid blind fall-back to ".git") made programs
that tried to access a repository without initializing properly die with
a diagnostic message.  One offender is test-read-cache, which is used in
p0002.  Fix it by calling setup_git_directory() before accessing the
index.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: reject ref updates while GIT_QUARANTINE_PATH is set
Jeff King [Mon, 10 Apr 2017 22:14:12 +0000 (18:14 -0400)]
refs: reject ref updates while GIT_QUARANTINE_PATH is set

As documented in git-receive-pack(1), updating a ref from
within the pre-receive hook is dangerous and can corrupt
your repo. This patch forbids ref updates entirely during
the hook to make it harder for adventurous hook writers to
shoot themselves in the foot.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreceive-pack: document user-visible quarantine effects
Jeff King [Mon, 10 Apr 2017 22:13:39 +0000 (18:13 -0400)]
receive-pack: document user-visible quarantine effects

Commit 722ff7f87 (receive-pack: quarantine objects until
pre-receive accepts, 2016-10-03) changed the underlying
details of how we take in objects. This is mostly
transparent to the user, but there are a few things they
might notice. Let's document them.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreceive-pack: drop tmp_objdir_env from run_update_hook
Jeff King [Mon, 10 Apr 2017 22:13:22 +0000 (18:13 -0400)]
receive-pack: drop tmp_objdir_env from run_update_hook

Since 722ff7f87 (receive-pack: quarantine objects until
pre-receive accepts, 2016-10-03), we have to feed the
pre-receive hook the tmp_objdir environment, so that git
programs run from the hook know where to find the objects.

That commit modified run_update_hook() to do the same, but
there it is a noop. By the time we get to the update hooks,
we have already migrated the objects from quarantine, and so
tmp_objdir_env() will always return NULL. We can drop this
useless call.

Note that the ordering here and the lack of support for the
update hook is intentional. The update hook calls are
interspersed with actual ref updates, and we must migrate
the objects before any refs are updated (since otherwise
those refs would appear broken to outside processes). So the
only other options are:

  - remain in quarantine for the _first_ ref, but not the
    others. This is sufficiently confusing that it can be
    rejected outright.

  - run all the individual update hooks first, then migrate,
    then update all the refs. But this changes the repository
    state that the update hooks see (i.e., whether or not
    refs from the same push are updated yet or not).

So the functionality is fine and remains unchanged with this
patch; we're just cleaning up a useless and confusing line
of code.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot6500: wait for detached auto gc at the end of the test script
SZEDER Gábor [Thu, 13 Apr 2017 10:31:38 +0000 (12:31 +0200)]
t6500: wait for detached auto gc at the end of the test script

The last test in 't6500-gc', 'background auto gc does not run if
gc.log is present and recent but does if it is old', added in
a831c06a2 (gc: ignore old gc.log files, 2017-02-10), may sporadically
trigger an error message from the test harness:

  rm: cannot remove 'trash directory.t6500-gc/.git/objects': Directory not empty

The test in question ends with executing an auto gc in the backround,
which occasionally takes so long that it's still running when
'test_done' is about to remove the trash directory.  This 'rm -rf
$trash' in the foreground might race with the detached auto gc to
create and delete files and directories, and gc might (re-)create a
path that 'rm' already visited and removed, triggering the above error
message when 'rm' attempts to remove its parent directory.

Commit bb05510e5 (t5510: run auto-gc in the foreground, 2016-05-01)
fixed the same problem in a different test script by simply
disallowing background gc.  Unfortunately, what worked there is not
applicable here, because the purpose of this test is to check the
behavior of a detached auto gc.

Make sure that the test doesn't continue before the gc is finished in
the background with a clever bit of shell trickery:

  - Open fd 9 in the shell, to be inherited by the background gc
    process, because our daemonize() only closes the standard fds 0,
    1 and 2.
  - Duplicate this fd 9 to stdout.
  - Read 'git gc's stdout, and thus fd 9, through a command
    substitution.  We don't actually care about gc's output, but this
    construct has two useful properties:
  - This read blocks until stdout or fd 9 are open.  While stdout is
    closed after the main gc process creates the background process
    and exits, fd 9 remains open until the backround process exits.
  - The variable assignment from the command substitution gets its
    exit status from the command executed within the command
    substitution, i.e. a failing main gc process will cause the test
    to fail.

Note, that this fd trickery doesn't work on Windows, because due to
MSYS limitations the git process only inherits the standard fds 0, 1
and 2 from the shell.  Luckily, it doesn't matter in this case,
because on Windows daemonize() is basically a noop, thus 'git gc
--auto' always runs in the foreground.

And since we can now continue the test reliably after the detached gc
finished, check that there is only a single packfile left at the end,
i.e. that the detached gc actually did what it was supposed to do.
Also add a comment at the end of the test script to warn developers of
future tests about this issue of long running detached gc processes.

Helped-by: Jeff King <peff@peff.net>
Helped-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopathspec: fix segfault in clear_pathspec
Brandon Williams [Fri, 7 Apr 2017 19:29:19 +0000 (12:29 -0700)]
pathspec: fix segfault in clear_pathspec

In 'clear_pathspec()' the incorrect index parameter is used to bound an
inner-loop which is used to free a 'struct attr_match' value field.
Using the incorrect index parameter (in addition to being incorrect)
occasionally causes segmentation faults when attempting to free an
invalid pointer.  Fix this by using the correct index parameter 'i'.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogrep: plug a trivial memory leak
Ævar Arnfjörð Bjarmason [Sun, 9 Apr 2017 19:59:00 +0000 (19:59 +0000)]
grep: plug a trivial memory leak

Change the cleanup phase for the grep command to free the pathspec
struct that's allocated earlier in the same block, and used just a few
lines earlier.

With "grep hi README.md" valgrind reports a loss of 239 bytes now,
down from 351.

The relevant --num-callers=40 --leak-check=full --show-leak-kinds=all
backtrace is:

    [...] 187 (112 direct, 75 indirect) bytes in 1 blocks are definitely lost in loss record 70 of 110
    [...]    at 0x4C2BBAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    [...]    by 0x60B339: do_xmalloc (wrapper.c:59)
    [...]    by 0x60B2F6: xmalloc (wrapper.c:86)
    [...]    by 0x576B37: parse_pathspec (pathspec.c:652)
    [...]    by 0x4519F0: cmd_grep (grep.c:1215)
    [...]    by 0x4062EF: run_builtin (git.c:371)
    [...]    by 0x40544D: handle_builtin (git.c:572)
    [...]    by 0x4060A2: run_argv (git.c:624)
    [...]    by 0x4051C6: cmd_main (git.c:701)
    [...]    by 0x4C5901: main (common-main.c:43)

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Acked-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect.c: handle errors from split_cmdline
Jeff King [Tue, 11 Apr 2017 00:30:23 +0000 (20:30 -0400)]
connect.c: handle errors from split_cmdline

Commit e9d9a8a4d (connect: handle putty/plink also in
GIT_SSH_COMMAND, 2017-01-02) added a call to
split_cmdline(), but checks only for a non-zero return to
see if we got any output. Since the function returns
negative values (and a NULL argv) on error, we end up
dereferencing NULL and segfaulting.

Arguably we could report on the parsing error here, but it's
probably not worth it. This is a best-effort attempt to see
if we are using plink. So we can simply return here with
"no, it wasn't plink" and let the shell actually complain
about the bogus quoting.

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotravis-ci: add static analysis build job to run coccicheck
Lars Schneider [Tue, 11 Apr 2017 07:26:37 +0000 (09:26 +0200)]
travis-ci: add static analysis build job to run coccicheck

Add a dedicated build job for static analysis. As a starter we only run
coccicheck but in the future we could run Clang Static Analyzer or
similar tools, too.

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agounpack-trees: avoid duplicate ODB lookups during checkout
Jeff Hostetler [Fri, 14 Apr 2017 19:25:54 +0000 (19:25 +0000)]
unpack-trees: avoid duplicate ODB lookups during checkout

Teach traverse_trees_recursive() to not do redundant ODB
lookups when both directories refer to the same OID.

In operations such as read-tree and checkout, there will
likely be many peer directories that have the same OID when
the differences between the commits are relatively small.
In these cases we can avoid hitting the ODB multiple times
for the same OID.

This patch handles n=2 and n=3 cases and simply copies the
data rather than repeating the fill_tree_descriptor().

================
On the Windows repo (500K trees, 3.1M files, 450MB index),
this reduced the overall time by 0.75 seconds when cycling
between 2 commits with a single file difference.

(avg) before: 22.699
(avg) after:  21.955
===============

================
On Linux using p0006-read-tree-checkout.sh with linux.git:

Test                                                          HEAD^              HEAD
-------------------------------------------------------------------------------------------------------
0006.2: read-tree br_base br_ballast (57994)                  0.24(0.20+0.03)    0.24(0.22+0.01) +0.0%
0006.3: switch between br_base br_ballast (57994)             10.58(6.23+2.86)   10.67(5.94+2.87) +0.9%
0006.4: switch between br_ballast br_ballast_plus_1 (57994)   0.60(0.44+0.17)    0.57(0.44+0.14) -5.0%
0006.5: switch between aliases (57994)                        0.59(0.48+0.13)    0.57(0.44+0.15) -3.4%
================

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoread-cache: add strcmp_offset function
Jeff Hostetler [Fri, 14 Apr 2017 19:12:28 +0000 (19:12 +0000)]
read-cache: add strcmp_offset function

Add strcmp_offset() function to also return the offset of the
first change.

Add unit test and helper to verify.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>