git/git.git
4 years agobuiltin/blame: convert static function to struct object_id
brian m. carlson [Mon, 1 May 2017 02:29:01 +0000 (02:29 +0000)]
builtin/blame: convert static function to struct object_id

This function is a caller of lookup_commit_reference_gently, which we
will convert later.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobranch: convert to struct object_id
brian m. carlson [Mon, 1 May 2017 02:29:00 +0000 (02:29 +0000)]
branch: convert to struct object_id

This change is required to convert lookup_commit_reference later.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobundle: convert to struct object_id
brian m. carlson [Mon, 1 May 2017 02:28:59 +0000 (02:28 +0000)]
bundle: convert to struct object_id

Convert the bundle code, plus the sole external user of struct
ref_list_entry, to use struct object_id.  Include cache.h from within
bundle.h to provide the definition.  Convert some of the hash parsing
code to use parse_oid_hex to avoid needing to hard-code constant values.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/prune: convert to struct object_id
brian m. carlson [Mon, 1 May 2017 02:28:58 +0000 (02:28 +0000)]
builtin/prune: convert to struct object_id

Convert the sole instance of unsigned char [20] to struct object_id.
cmd_prune is a caller of parse_object, which we will convert later.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobuiltin/name-rev: convert to struct object_id
brian m. carlson [Mon, 1 May 2017 02:28:57 +0000 (02:28 +0000)]
builtin/name-rev: convert to struct object_id

Convert all the uses of unsigned char [20] to struct object_id.  Also,
convert some hard-coded integers into constants.

name_rev_line accepts a wide variety of free-form input and only
interprets 40-character hex values, passing through everything else.
Consequently, it is not a good candidate for parse_oid_hex, which is
much stricter.

This change is a prerequisite for converting parse_object.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoConvert struct cache_tree to use struct object_id
brian m. carlson [Mon, 1 May 2017 02:28:56 +0000 (02:28 +0000)]
Convert struct cache_tree to use struct object_id

Convert the sha1 member of struct cache_tree to struct object_id by
changing the definition and applying the following semantic patch, plus
the standard object_id transforms:

@@
struct cache_tree E1;
@@
- E1.sha1
+ E1.oid.hash

@@
struct cache_tree *E1;
@@
- E1->sha1
+ E1->oid.hash

Fix up one reference to active_cache_tree which was not automatically
caught by Coccinelle.  These changes are prerequisites for converting
parse_object.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoClean up outstanding object_id transforms.
brian m. carlson [Mon, 1 May 2017 02:28:55 +0000 (02:28 +0000)]
Clean up outstanding object_id transforms.

The semantic patch for standard object_id transforms found two
outstanding places where we could make a transformation automatically.
Apply these changes.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofetch-pack: convert to struct object_id
brian m. carlson [Mon, 1 May 2017 02:28:54 +0000 (02:28 +0000)]
fetch-pack: convert to struct object_id

Convert all uses of unsigned char [20] to struct object_id.  Switch one
use of get_sha1_hex to parse_oid_hex to avoid the need for a constant.
This change is necessary in order to convert parse_object.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerging a handful of topics before -rc2
Junio C Hamano [Mon, 1 May 2017 05:16:18 +0000 (22:16 -0700)]
Merging a handful of topics before -rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'sh/rebase-i-reread-todo-after-exec'
Junio C Hamano [Mon, 1 May 2017 05:14:44 +0000 (14:14 +0900)]
Merge branch 'sh/rebase-i-reread-todo-after-exec'

"git rebase -i" failed to re-read the todo list file when the
command specified with the `exec` instruction updated it.

* sh/rebase-i-reread-todo-after-exec:
  rebase -i: reread the todo list if `exec` touched it

4 years agoMerge branch 'ls/travis-stricter-linux32-builds'
Junio C Hamano [Mon, 1 May 2017 05:14:44 +0000 (14:14 +0900)]
Merge branch 'ls/travis-stricter-linux32-builds'

32-bit Linux build on Travis CI uses stricter compilation options.

* ls/travis-stricter-linux32-builds:
  travis-ci: set DEVELOPER knob for Linux32 build

4 years agoMerge branch 'ls/travis-win-fix-status'
Junio C Hamano [Mon, 1 May 2017 05:14:44 +0000 (14:14 +0900)]
Merge branch 'ls/travis-win-fix-status'

Relaying status from Windows build by Travis CI was done with an
unsafe invocation of printf.

* ls/travis-win-fix-status:
  travis-ci: printf $STATUS as string

4 years agoMerge branch 'jk/submodule-init-segv-fix'
Junio C Hamano [Mon, 1 May 2017 05:14:43 +0000 (14:14 +0900)]
Merge branch 'jk/submodule-init-segv-fix'

Fix a segv in 'submodule init' when url is not given for a submodule.

* jk/submodule-init-segv-fix:
  submodule_init: die cleanly on submodules without url defined

4 years agoMerge branch 'jk/prio-queue-avoid-swap-with-self'
Junio C Hamano [Mon, 1 May 2017 05:14:43 +0000 (14:14 +0900)]
Merge branch 'jk/prio-queue-avoid-swap-with-self'

Code clean-up.

* jk/prio-queue-avoid-swap-with-self:
  prio_queue_reverse: don't swap elements with themselves

4 years agoMerge branch 'ab/align-perf-descriptions'
Junio C Hamano [Mon, 1 May 2017 05:14:42 +0000 (14:14 +0900)]
Merge branch 'ab/align-perf-descriptions'

Output from perf tests have been updated to align their titles.

* ab/align-perf-descriptions:
  t/perf: correctly align non-ASCII descriptions in output

4 years agoMerge branch 'jk/complete-checkout-sans-dwim-remote'
Junio C Hamano [Mon, 1 May 2017 05:14:41 +0000 (14:14 +0900)]
Merge branch 'jk/complete-checkout-sans-dwim-remote'

Completion for "git checkout <branch>" that auto-creates the branch
out of a remote tracking branch can now be disabled, as this
completion often gets in the way when completing to checkout an
existing local branch that happens to share the same prefix with
bunch of remote tracking branches.

* jk/complete-checkout-sans-dwim-remote:
  completion: optionally disable checkout DWIM

4 years agorebase -i: reread the todo list if `exec` touched it
Stephen Hicks [Wed, 26 Apr 2017 19:17:40 +0000 (21:17 +0200)]
rebase -i: reread the todo list if `exec` touched it

In the scripted version of the interactive rebase, there was no internal
representation of the todo list; it was re-read before every command.
That allowed the hack that an `exec` command could append (or even
completely rewrite) the todo list.

This hack was broken by the partial conversion of the interactive rebase
to C, and this patch reinstates it.

We also add a small test to verify that this fix does not regress in the
future.

Signed-off-by: Stephen Hicks <sdh@google.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotravis-ci: set DEVELOPER knob for Linux32 build
Lars Schneider [Wed, 26 Apr 2017 19:18:57 +0000 (21:18 +0200)]
travis-ci: set DEVELOPER knob for Linux32 build

The Linux32 build was not build with our strict compiler settings (e.g.
warnings as errors). Fix this by passing the DEVELOPER environment
variable to the docker container.

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotravis-ci: printf $STATUS as string
Lars Schneider [Wed, 26 Apr 2017 19:39:33 +0000 (21:39 +0200)]
travis-ci: printf $STATUS as string

If the $STATUS variable contains a "%" character then printf will
interpret that as invalid format string. Fix this by formatting $STATUS
as string.

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Acked-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoGit 2.13-rc1 v2.13.0-rc1
Junio C Hamano [Wed, 26 Apr 2017 06:44:07 +0000 (15:44 +0900)]
Git 2.13-rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'mh/separate-ref-cache'
Junio C Hamano [Wed, 26 Apr 2017 06:39:13 +0000 (15:39 +0900)]
Merge branch 'mh/separate-ref-cache'

The internals of the refs API around the cached refs has been
streamlined.

* mh/separate-ref-cache:
  do_for_each_entry_in_dir(): delete function
  files_pack_refs(): use reference iteration
  commit_packed_refs(): use reference iteration
  cache_ref_iterator_begin(): make function smarter
  get_loose_ref_cache(): new function
  get_loose_ref_dir(): function renamed from get_loose_refs()
  do_for_each_entry_in_dir(): eliminate `offset` argument
  refs: handle "refs/bisect/" in `loose_fill_ref_dir()`
  ref-cache: use a callback function to fill the cache
  refs: record the ref_store in ref_cache, not ref_dir
  ref-cache: introduce a new type, ref_cache
  refs: split `ref_cache` code into separate files
  ref-cache: rename `remove_entry()` to `remove_entry_from_dir()`
  ref-cache: rename `find_ref()` to `find_ref_entry()`
  ref-cache: rename `add_ref()` to `add_ref_entry()`
  refs_verify_refname_available(): use function in more places
  refs_verify_refname_available(): implement once for all backends
  refs_ref_iterator_begin(): new function
  refs_read_raw_ref(): new function
  get_ref_dir(): don't call read_loose_refs() for "refs/bisect"

4 years agoMerge branch 'nd/worktree-add-lock'
Junio C Hamano [Wed, 26 Apr 2017 06:39:12 +0000 (15:39 +0900)]
Merge branch 'nd/worktree-add-lock'

Allow to lock a worktree immediately after it's created. This helps
prevent a race between "git worktree add; git worktree lock" and
"git worktree prune".

* nd/worktree-add-lock:
  worktree add: add --lock option

4 years agoMerge branch 'jk/update-links-in-docs'
Junio C Hamano [Wed, 26 Apr 2017 06:39:11 +0000 (15:39 +0900)]
Merge branch 'jk/update-links-in-docs'

Many stale HTTP(s) links have been updated in our documentation.

* jk/update-links-in-docs:
  docs/bisect-lk2009: update java code conventions link
  docs/bisect-lk2009: update nist report link
  docs/archimport: quote sourcecontrol.net reference
  gitcore-tutorial: update broken link
  doc: replace or.cz gitwiki link with git.wiki.kernel.org
  doc: use https links to avoid http redirect

4 years agoMerge branch 'sf/putty-w-args'
Junio C Hamano [Wed, 26 Apr 2017 06:39:10 +0000 (15:39 +0900)]
Merge branch 'sf/putty-w-args'

Plug a memleak.

* sf/putty-w-args:
  connect.c: fix leak in handle_ssh_variant

4 years agoMerge branch 'ab/completion-push-delete-ref'
Junio C Hamano [Wed, 26 Apr 2017 06:39:09 +0000 (15:39 +0900)]
Merge branch 'ab/completion-push-delete-ref'

The completion script (in contrib/) learned to complete "git push
--delete b<TAB>" to complete branch name to be deleted.

* ab/completion-push-delete-ref:
  completion: expand "push --delete <remote> <ref>" for refs on that <remote>

4 years agoMerge branch 'cc/split-index-config'
Junio C Hamano [Wed, 26 Apr 2017 06:39:09 +0000 (15:39 +0900)]
Merge branch 'cc/split-index-config'

The split-index code configuration code used an unsafe git_path()
function without copying its result out.

* cc/split-index-config:
  read-cache: avoid using git_path() in freshen_shared_index()

4 years agoMerge branch 'jk/war-on-git-path'
Junio C Hamano [Wed, 26 Apr 2017 06:39:08 +0000 (15:39 +0900)]
Merge branch 'jk/war-on-git-path'

While handy, "git_path()" is a dangerous function to use as a
callsite that uses it safely one day can be broken by changes
to other code that calls it.  Reduction of its use continues.

* jk/war-on-git-path:
  am: drop "dir" parameter from am_state_init
  replace strbuf_addstr(git_path()) with git_path_buf()
  replace xstrdup(git_path(...)) with git_pathdup(...)
  use git_path_* helper functions
  branch: add edit_description() helper
  bisect: add git_path_bisect_terms helper

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 agoprio_queue_reverse: don't swap elements with themselves
Jeff King [Mon, 24 Apr 2017 11:49:20 +0000 (07:49 -0400)]
prio_queue_reverse: don't swap elements with themselves

Our array-reverse algorithm does the usual "walk from both
ends, swapping elements". We can quit when the two indices
are equal, since:

  1. Swapping an element with itself is a noop.

  2. If i and j are equal, then in the next iteration i is
     guaranteed to be bigge than j, and we will exit the
     loop.

So exiting the loop on equality is slightly more efficient.
And more importantly, the new SWAP() macro does not expect
to handle noop swaps; it will call memcpy() with the same src
and dst pointers in this case. It's unclear whether that
causes a problem on any platforms by violating the
"overlapping memory" constraint of memcpy, but it does cause
valgrind to complain.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule_init: die cleanly on submodules without url defined
Jeff King [Tue, 25 Apr 2017 00:57:47 +0000 (20:57 -0400)]
submodule_init: die cleanly on submodules without url defined

When we init a submodule, we try to die when it has no URL
defined:

  url = xstrdup(sub->url);
  if (!url)
  die(...);

But that's clearly nonsense. xstrdup() will never return
NULL, and if sub->url is NULL, we'll segfault.

These two bits of code need to be flipped, so we check
sub->url before looking at it.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
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 agot/perf: correctly align non-ASCII descriptions in output
Ævar Arnfjörð Bjarmason [Fri, 21 Apr 2017 19:44:28 +0000 (19:44 +0000)]
t/perf: correctly align non-ASCII descriptions in output

Change the test descriptions from being treated as binary blobs by
perl to being treated as UTF-8. This ensures that e.g. a test
description like "æ" is counted as 1 character, not 2.

I have WIP performance tests for non-ASCII grep patterns on another
topic that are affected by this.

Now instead of:

    $ ./run p0000-perf-lib-sanity.sh
    [...]
    0000.4: export a weird var                                    0.00(0.00+0.00)
    0000.5: éḿíẗ ńöń-ÁŚĆÍÍ ćḧáŕáćẗéŕś   0.00(0.00+0.00)
    0000.7: important variables available in subshells            0.00(0.00+0.00)
    [...]

We emit:

    [...]
    0000.4: export a weird var                                 0.00(0.00+0.00)
    0000.5: éḿíẗ ńöń-ÁŚĆÍÍ ćḧáŕáćẗéŕś                          0.00(0.00+0.00)
    0000.7: important variables available in subshells         0.00(0.00+0.00)
    [...]

Fixes code originally added in 342e9ef2d9 ("Introduce a performance
testing framework", 2012-02-17).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocompletion: optionally disable checkout DWIM
Jeff King [Fri, 21 Apr 2017 20:27:06 +0000 (16:27 -0400)]
completion: optionally disable checkout DWIM

When we complete branch names for "git checkout", we also
complete remote branch names that could trigger the DWIM
behavior. Depending on your workflow and project, this can
be either convenient or annoying.

For instance, my clone of gitster.git contains 74 local
"jk/*" branches, but origin contains another 147. When I
want to checkout a local branch but can't quite remember the
name, tab completion shows me 251 entries. And worse, for a
topic that has been picked up for pu, the upstream branch
name is likely to be similar to mine, leading to a high
probability that I pick the wrong one and accidentally
create a new branch.

This patch adds a way for the user to tell the completion
code not to include DWIM suggestions for checkout. This can
already be done by typing:

  git checkout --no-guess jk/<TAB>

but that's rather cumbersome. The downside, of course, is
that you no longer get completion support when you _do_ want
to invoke the DWIM behavior. But depending on your workflow,
that may not be a big loss (for instance, in git.git I am
much more likely to want to detach, so I'd type "git
checkout origin/jk/<TAB>" anyway).

Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocompletion: expand "push --delete <remote> <ref>" for refs on that <remote>
Ævar Arnfjörð Bjarmason [Sat, 22 Apr 2017 17:55:04 +0000 (17:55 +0000)]
completion: expand "push --delete <remote> <ref>" for refs on that <remote>

Change the completion of "push --delete <remote> <ref>" to complete
refs on that <remote>, not all refs.

Before this cloning git.git and doing "git push --delete origin
p<TAB>" will complete nothing, since a fresh clone of git.git will
have no "pu" branch, whereas origin/p<TAB> will uselessly complete
origin/pu, but fully qualified references aren't accepted by
"--delete".

Now p<TAB> will complete as "pu". The completion of giving --delete
later, e.g. "git push origin --delete p<TAB>" remains unchanged, this
is a bug, but is a general existing limitation of the bash completion,
and not how git-push is documented, so I'm not fixing that case, but
adding a failing TODO test for it.

The testing code was supplied by SZEDER Gábor in
<20170421122832.24617-1-szeder.dev@gmail.com> with minor setup
modifications on my part.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Test-code-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodocs/bisect-lk2009: update java code conventions link
Jeff King [Thu, 20 Apr 2017 20:35:36 +0000 (16:35 -0400)]
docs/bisect-lk2009: update java code conventions link

The old link just redirects to a big index page. I was able
to find a new link for the original document via Google.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodocs/bisect-lk2009: update nist report link
Jeff King [Thu, 20 Apr 2017 20:35:28 +0000 (16:35 -0400)]
docs/bisect-lk2009: update nist report link

The original NIST press release linked here is no longer
available. But it was just a one-page summary of a larger
planning report; we can link to the report and point people
to the executive summary, which contains the same
information.

Ideally we'd cite it with a DOI, but I couldn't dig one up
for this particular document. I found many URLs pointing to
this report, but they all end up redirecting to this one
(and it looks somewhat official).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodocs/archimport: quote sourcecontrol.net reference
Jeff King [Thu, 20 Apr 2017 20:34:41 +0000 (16:34 -0400)]
docs/archimport: quote sourcecontrol.net reference

git-archimport has an option to register archives at
mirrors.sourcecontrol.net. The sourcecontrol.net domain
still exists, but that hostname no longer exists.

That means this feature is presumably broken. I'll leave the
examination and modification of that to people who might
actually use archimport. But in the meantime, let's wrap the
reference in the documentation in backticks, which will
avoid turning it into a broken link (and thus polluting
linkchecker results).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogitcore-tutorial: update broken link
Jeff King [Thu, 20 Apr 2017 20:33:49 +0000 (16:33 -0400)]
gitcore-tutorial: update broken link

The slides for the Linux-mentoring presentation are no
longer available. Let's point to the wayback version of the
page, which works.

Note that the referenced diagram is also available on page
15 of [1]. We could link to that instead, but it's not clear
from the URL scheme ("uploads") whether it's going to stick
around forever.

[1] https://www.linuxfoundation.jp/jp_uploads/seminar20070313/Randy.pdf

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodoc: replace or.cz gitwiki link with git.wiki.kernel.org
Jeff King [Thu, 20 Apr 2017 20:32:39 +0000 (16:32 -0400)]
doc: replace or.cz gitwiki link with git.wiki.

The or.cz version of the Git wiki went away long ago, and
now just redirects to kernel.org.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodoc: use https links to avoid http redirect
Jeff King [Thu, 20 Apr 2017 20:32:33 +0000 (16:32 -0400)]
doc: use https links to avoid http redirect

Many sites these days unconditionally redirect http requests
to their https equivalents. Let's make our links https in
the first place to save the client a redirect.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoconnect.c: fix leak in handle_ssh_variant
Jeff King [Thu, 20 Apr 2017 20:21:58 +0000 (16:21 -0400)]
connect.c: fix leak in handle_ssh_variant

When we see an error from split_cmdline(), we exit the
function without freeing the copy of the command string we
made.

This was sort-of introduced by 22e5ae5c8 (connect.c: handle
errors from split_cmdline, 2017-04-10). The leak existed
before that, but before that commit fixed the bug, we could
never trigger this else clause in the first place.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoam: drop "dir" parameter from am_state_init
Jeff King [Thu, 20 Apr 2017 21:09:35 +0000 (17:09 -0400)]
am: drop "dir" parameter from am_state_init

The only caller of this function passes in a static buffer
returned from git_path(). This looks dangerous at first
glance, but turns out to be OK because the first thing we do
is xstrdup() the result.

Let's turn this into a git_pathdup(). That's slightly more
efficient (no extra copy), and makes it easier to audit for
dangerous git_path() invocations.

Since there's only a single caller, let's just set this
default path inside the init function. That makes the memory
ownership clear.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreplace strbuf_addstr(git_path()) with git_path_buf()
Jeff King [Thu, 20 Apr 2017 21:09:30 +0000 (17:09 -0400)]
replace strbuf_addstr(git_path()) with git_path_buf()

Writing directly into the strbuf avoids a useless copy of
the data, and dropping calls to git_path() makes it easier
to audit for dangerous calls.

Note that git_path() does an implicit strbuf_reset(), but in
each of these cases we were either already doing that reset,
or writing into a fresh strbuf anyway.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreplace xstrdup(git_path(...)) with git_pathdup(...)
Jeff King [Thu, 20 Apr 2017 21:09:09 +0000 (17:09 -0400)]
replace xstrdup(git_path(...)) with git_pathdup(...)

It's more efficient to use git_pathdup(), as it skips an
extra copy of the path. And by removing some calls to
git_path(), it makes it easier to audit for dangerous uses.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouse git_path_* helper functions
Jeff King [Thu, 20 Apr 2017 21:08:54 +0000 (17:08 -0400)]
use git_path_* helper functions

Long ago we added functions like git_path_merge_msg() to
replace the more dangerous git_path("MERGE_MSG"). Over time
some new calls to the latter have crept it. Let's convert
them to use the safer form.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobranch: add edit_description() helper
Jeff King [Thu, 20 Apr 2017 21:08:41 +0000 (17:08 -0400)]
branch: add edit_description() helper

Rather than have a variable with a short name that is fed to
git_path(), let's add a helper function that returns the
full path. This avoids the dangerous git_path() function.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agobisect: add git_path_bisect_terms helper
Jeff King [Thu, 20 Apr 2017 21:08:25 +0000 (17:08 -0400)]
bisect: add git_path_bisect_terms helper

This avoids using the dangerous git_path(). Right now
there's only one call site (because the writing half is
still part of the shell script), but it may come in handy in
the future as more of bisect is written in C. It also
matches how we access the other BISECT_* files.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoread-cache: avoid using git_path() in freshen_shared_index()
Christian Couder [Thu, 30 Mar 2017 21:03:54 +0000 (23:03 +0200)]
read-cache: avoid using git_path() in freshen_shared_index()

When performing an interactive rebase in split-index mode,
the commit message that one should rework when squashing commits
can contain some garbage instead of the usual concatenation of
both of the commit messages.

The code uses git_path() to compute the shared index filename, and
passes it to check_and_freshen_file() as its argument; there is no
guarantee that the rotating pathname buffer passed as argument will
stay valid during the life of this call.  Make our own copy before
calling the function and pass the copy as its argument to avoid this
risky pattern.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoworktree add: add --lock option
Nguyễn Thái Ngọc Duy [Wed, 12 Apr 2017 13:58:05 +0000 (20:58 +0700)]
worktree add: add --lock option

As explained in the document. This option has an advantage over the
command sequence "git worktree add && git worktree lock": there will be
no gap that somebody can accidentally "prune" the new worktree (or soon,
explicitly "worktree remove" it).

"worktree add" does keep a lock on while it's preparing the worktree.
If --lock is specified, this lock remains after the worktree is created.

Suggested-by: David Taylor <David.Taylor@dell.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
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>