git
4 years agoMerge branch 'rs/name-rev-memsave'
Junio C Hamano [Mon, 17 Feb 2020 21:22:16 +0000 (13:22 -0800)] 
Merge branch 'rs/name-rev-memsave'

Memory footprint and performance of "git name-rev" has been
improved.

* rs/name-rev-memsave:
  name-rev: sort tip names before applying
  name-rev: release unused name strings
  name-rev: generate name strings only if they are better
  name-rev: pre-size buffer in get_parent_name()
  name-rev: factor out get_parent_name()
  name-rev: put struct rev_name into commit slab
  name-rev: don't _peek() in create_or_update_name()
  name-rev: don't leak path copy in name_ref()
  name-rev: respect const qualifier
  name-rev: remove unused typedef
  name-rev: rewrite create_or_update_name()

4 years agoSync with 2.25.1
Junio C Hamano [Mon, 17 Feb 2020 04:41:40 +0000 (20:41 -0800)] 
Sync with 2.25.1

4 years agoGit 2.25.1 v2.25.1
Junio C Hamano [Mon, 17 Feb 2020 04:37:38 +0000 (20:37 -0800)] 
Git 2.25.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoSync with maint
Junio C Hamano [Fri, 14 Feb 2020 20:54:31 +0000 (12:54 -0800)] 
Sync with maint

4 years agoThe fifth batch for 2.26
Junio C Hamano [Fri, 14 Feb 2020 20:54:07 +0000 (12:54 -0800)] 
The fifth batch for 2.26

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'tb/commit-graph-object-dir'
Junio C Hamano [Fri, 14 Feb 2020 20:54:24 +0000 (12:54 -0800)] 
Merge branch 'tb/commit-graph-object-dir'

The code to compute the commit-graph has been taught to use a more
robust way to tell if two object directories refer to the same
thing.

* tb/commit-graph-object-dir:
  commit-graph.h: use odb in 'load_commit_graph_one_fd_st'
  commit-graph.c: remove path normalization, comparison
  commit-graph.h: store object directory in 'struct commit_graph'
  commit-graph.h: store an odb in 'struct write_commit_graph_context'
  t5318: don't pass non-object directory to '--object-dir'

4 years agoMerge branch 'jk/index-pack-dupfix'
Junio C Hamano [Fri, 14 Feb 2020 20:54:24 +0000 (12:54 -0800)] 
Merge branch 'jk/index-pack-dupfix'

The index-pack code now diagnoses a bad input packstream that
records the same object twice when it is used as delta base; the
code used to declare a software bug when encountering such an
input, but it is an input error.

* jk/index-pack-dupfix:
  index-pack: downgrade twice-resolved REF_DELTA to die()

4 years agoMerge branch 'jk/alloc-cleanups'
Junio C Hamano [Fri, 14 Feb 2020 20:54:23 +0000 (12:54 -0800)] 
Merge branch 'jk/alloc-cleanups'

Misc code clean-ups.

* jk/alloc-cleanups:
  tree-walk.c: break circular dependency with unpack-trees
  traverse_trees(): use stack array for name entries
  walker_fetch(): avoid raw array length computation
  normalize_path_copy(): document "dst" size expectations

4 years agoMerge branch 'jh/notes-fanout-fix'
Junio C Hamano [Fri, 14 Feb 2020 20:54:23 +0000 (12:54 -0800)] 
Merge branch 'jh/notes-fanout-fix'

The code to automatically shrink the fan-out in the notes tree had
an off-by-one bug, which has been killed.

* jh/notes-fanout-fix:
  notes.c: fix off-by-one error when decreasing notes fanout
  t3305: check notes fanout more carefully and robustly

4 years agoMerge branch 'pk/status-of-uncloned-submodule'
Junio C Hamano [Fri, 14 Feb 2020 20:54:23 +0000 (12:54 -0800)] 
Merge branch 'pk/status-of-uncloned-submodule'

The way "git submodule status" reports an initialized but not yet
populated submodule has not been reimplemented correctly when a
part of the "git submodule" command was rewritten in C, which has
been corrected.

* pk/status-of-uncloned-submodule:
  t7400: testcase for submodule status on unregistered inner git repos
  submodule: fix status of initialized but not cloned submodules
  t7400: add a testcase for submodule status on empty dirs

4 years agoMerge branch 'mt/use-passed-repo-more-in-funcs'
Junio C Hamano [Fri, 14 Feb 2020 20:54:22 +0000 (12:54 -0800)] 
Merge branch 'mt/use-passed-repo-more-in-funcs'

Some codepaths were given a repository instance as a parameter to
work in the repository, but passed the_repository instance to its
callees, which has been cleaned up (somewhat).

* mt/use-passed-repo-more-in-funcs:
  sha1-file: allow check_object_signature() to handle any repo
  sha1-file: pass git_hash_algo to hash_object_file()
  sha1-file: pass git_hash_algo to write_object_file_prepare()
  streaming: allow open_istream() to handle any repo
  pack-check: use given repo's hash_algo at verify_packfile()
  cache-tree: use given repo's hash_algo at verify_one()
  diff: make diff_populate_filespec() honor its repo argument

4 years agoMerge branch 'jk/diff-honor-wserrhighlight-in-plumbing'
Junio C Hamano [Fri, 14 Feb 2020 20:54:22 +0000 (12:54 -0800)] 
Merge branch 'jk/diff-honor-wserrhighlight-in-plumbing'

The diff-* plumbing family of subcommands now pay attention to the
diff.wsErrorHighlight configuration, which has been ignored before;
this allows "git add -p" to also show the whitespace problems to
the end user.

* jk/diff-honor-wserrhighlight-in-plumbing:
  diff: move diff.wsErrorHighlight to "basic" config

4 years agoMerge branch 'ds/sparse-checkout-harden'
Junio C Hamano [Fri, 14 Feb 2020 20:54:22 +0000 (12:54 -0800)] 
Merge branch 'ds/sparse-checkout-harden'

Some rough edges in the sparse-checkout feature, especially around
the cone mode, have been cleaned up.

* ds/sparse-checkout-harden:
  sparse-checkout: fix cone mode behavior mismatch
  sparse-checkout: improve docs around 'set' in cone mode
  sparse-checkout: escape all glob characters on write
  sparse-checkout: use C-style quotes in 'list' subcommand
  sparse-checkout: unquote C-style strings over --stdin
  sparse-checkout: write escaped patterns in cone mode
  sparse-checkout: properly match escaped characters
  sparse-checkout: warn on globs in cone patterns
  sparse-checkout: detect short patterns
  sparse-checkout: cone mode does not recognize "**"
  sparse-checkout: fix documentation typo for core.sparseCheckoutCone
  clone: fix --sparse option with URLs
  sparse-checkout: create leading directories
  t1091: improve here-docs
  t1091: use check_files to reduce boilerplate

4 years agoMerge branch 'ld/p4-cleanup-processes'
Junio C Hamano [Fri, 14 Feb 2020 20:54:22 +0000 (12:54 -0800)] 
Merge branch 'ld/p4-cleanup-processes'

p4 updates.

* ld/p4-cleanup-processes:
  git-p4: avoid leak of file handle when cloning
  git-p4: check for access to remote host earlier
  git-p4: cleanup better on error exit
  git-p4: create helper function importRevisions()
  git-p4: disable some pylint warnings, to get pylint output to something manageable
  git-p4: add P4CommandException to report errors talking to Perforce
  git-p4: make closeStreams() idempotent

4 years agoMerge branch 'jt/connectivity-check-optim-in-partial-clone'
Junio C Hamano [Fri, 14 Feb 2020 20:54:21 +0000 (12:54 -0800)] 
Merge branch 'jt/connectivity-check-optim-in-partial-clone'

Unneeded connectivity check is now disabled in a partial clone when
fetching into it.

* jt/connectivity-check-optim-in-partial-clone:
  fetch: forgo full connectivity check if --filter
  connected: verify promisor-ness of partial clone

4 years agoMerge branch 'jk/get-oid-error-message-i18n'
Junio C Hamano [Fri, 14 Feb 2020 20:54:21 +0000 (12:54 -0800)] 
Merge branch 'jk/get-oid-error-message-i18n'

A low-level API function get_oid(), that accepts various ways to
name an object, used to issue end-user facing error messages
without l10n, which has been updated to be translatable.

* jk/get-oid-error-message-i18n:
  sha1-name: mark get_oid() error messages for translation
  t1506: drop space after redirection operator
  t1400: avoid "test" string comparisons

4 years agoMerge branch 'ag/edit-todo-drop-check'
Junio C Hamano [Fri, 14 Feb 2020 20:54:21 +0000 (12:54 -0800)] 
Merge branch 'ag/edit-todo-drop-check'

Allow the rebase.missingCommitsCheck configuration to kick in when
"rebase --edit-todo" and "rebase --continue" restarts the procedure.

* ag/edit-todo-drop-check:
  rebase-interactive: warn if commit is dropped with `rebase --edit-todo'
  sequencer: move check_todo_list_from_file() to rebase-interactive.c

4 years agoMerge branch 'dl/test-must-fail-fixes-2'
Junio C Hamano [Fri, 14 Feb 2020 20:54:21 +0000 (12:54 -0800)] 
Merge branch 'dl/test-must-fail-fixes-2'

Test updates.

* dl/test-must-fail-fixes-2:
  t4124: only mark git command with test_must_fail
  t3507: use test_path_is_missing()
  t3507: fix indentation
  t3504: do check for conflict marker after failed cherry-pick
  t3419: stop losing return code of git command
  t3415: increase granularity of test_auto_{fixup,squash}()
  t3415: stop losing return codes of git commands
  t3310: extract common notes_merge_files_gone()
  t3030: use test_path_is_missing()
  t2018: replace "sha" with "oid"
  t2018: don't lose return code of git commands
  t2018: teach do_checkout() to accept `!` arg
  t2018: be more discerning when checking for expected exit codes
  t2018: improve style of if-statement
  t2018: add space between function name and ()
  t2018: remove trailing space from test description

4 years agoMerge branch 'ag/rebase-avoid-unneeded-checkout'
Junio C Hamano [Fri, 14 Feb 2020 20:54:20 +0000 (12:54 -0800)] 
Merge branch 'ag/rebase-avoid-unneeded-checkout'

"git rebase -i" (and friends) used to unnecessarily check out the
tip of the branch to be rebased, which has been corrected.

* ag/rebase-avoid-unneeded-checkout:
  rebase -i: stop checking out the tip of the branch to rebase

4 years agoMerge branch 'js/rebase-i-with-colliding-hash'
Junio C Hamano [Fri, 14 Feb 2020 20:54:20 +0000 (12:54 -0800)] 
Merge branch 'js/rebase-i-with-colliding-hash'

"git rebase -i" identifies existing commits in its todo file with
their abbreviated object name, which could become ambigous as it
goes to create new commits, and has a mechanism to avoid ambiguity
in the main part of its execution.  A few other cases however were
not covered by the protection against ambiguity, which has been
corrected.

* js/rebase-i-with-colliding-hash:
  rebase -i: also avoid SHA-1 collisions with missingCommitsCheck
  rebase -i: re-fix short SHA-1 collision
  parse_insn_line(): improve error message when parsing failed

4 years agoMerge branch 'kw/fsmonitor-watchman-racefix'
Junio C Hamano [Fri, 14 Feb 2020 20:54:20 +0000 (12:54 -0800)] 
Merge branch 'kw/fsmonitor-watchman-racefix'

A new version of fsmonitor-watchman hook has been introduced, to
avoid races.

* kw/fsmonitor-watchman-racefix:
  fsmonitor: update documentation for hook version and watchman hooks
  fsmonitor: add fsmonitor hook scripts for version 2
  fsmonitor: handle version 2 of the hooks that will use opaque token
  fsmonitor: change last update timestamp on the index_state to opaque token

4 years agoMerge branch 'mt/threaded-grep-in-object-store'
Junio C Hamano [Fri, 14 Feb 2020 20:54:20 +0000 (12:54 -0800)] 
Merge branch 'mt/threaded-grep-in-object-store'

Traditionally, we avoided threaded grep while searching in objects
(as opposed to files in the working tree) as accesses to the object
layer is not thread-safe.  This limitation is getting lifted.

* mt/threaded-grep-in-object-store:
  grep: use no. of cores as the default no. of threads
  grep: move driver pre-load out of critical section
  grep: re-enable threads in non-worktree case
  grep: protect packed_git [re-]initialization
  grep: allow submodule functions to run in parallel
  submodule-config: add skip_if_read option to repo_read_gitmodules()
  grep: replace grep_read_mutex by internal obj read lock
  object-store: allow threaded access to object reading
  replace-object: make replace operations thread-safe
  grep: fix racy calls in grep_objects()
  grep: fix race conditions at grep_submodule()
  grep: fix race conditions on userdiff calls

4 years agoMerge branch 'jn/promote-proto2-to-default'
Junio C Hamano [Fri, 14 Feb 2020 20:54:19 +0000 (12:54 -0800)] 
Merge branch 'jn/promote-proto2-to-default'

The transport protocol version 2 becomes the default one.

* jn/promote-proto2-to-default:
  fetch: default to protocol version 2
  protocol test: let protocol.version override GIT_TEST_PROTOCOL_VERSION
  test: request GIT_TEST_PROTOCOL_VERSION=0 when appropriate
  config doc: protocol.version is not experimental
  fetch test: use more robust test for filtered objects

4 years agoMerge branch 'jk/packfile-reuse-cleanup'
Junio C Hamano [Fri, 14 Feb 2020 20:54:19 +0000 (12:54 -0800)] 
Merge branch 'jk/packfile-reuse-cleanup'

The way "git pack-objects" reuses objects stored in existing pack
to generate its result has been improved.

* jk/packfile-reuse-cleanup:
  pack-bitmap: don't rely on bitmap_git->reuse_objects
  pack-objects: add checks for duplicate objects
  pack-objects: improve partial packfile reuse
  builtin/pack-objects: introduce obj_is_packed()
  pack-objects: introduce pack.allowPackReuse
  csum-file: introduce hashfile_total()
  pack-bitmap: simplify bitmap_has_oid_in_uninteresting()
  pack-bitmap: uninteresting oid can be outside bitmapped packfile
  pack-bitmap: introduce bitmap_walk_contains()
  ewah/bitmap: introduce bitmap_word_alloc()
  packfile: expose get_delta_base()
  builtin/pack-objects: report reused packfile objects

4 years agoMerge branch 'hw/advice-add-nothing'
Junio C Hamano [Fri, 14 Feb 2020 20:54:19 +0000 (12:54 -0800)] 
Merge branch 'hw/advice-add-nothing'

Two help messages given when "git add" notices the user gave it
nothing to add have been updated to use advise() API.

* hw/advice-add-nothing:
  add: change advice config variables used by the add API
  add: use advise function to display hints

4 years agoMerge branch 'js/convert-typofix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:34 +0000 (12:42 -0800)] 
Merge branch 'js/convert-typofix' into maint

Typofix.

* js/convert-typofix:
  convert: fix typo

4 years agoMerge branch 'js/ci-squelch-doc-warning' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:33 +0000 (12:42 -0800)] 
Merge branch 'js/ci-squelch-doc-warning' into maint

Squelch unhelpful warning message during documentation build.

* js/ci-squelch-doc-warning:
  ci: ignore rubygems warning in the "Documentation" job

4 years agoMerge branch 'jb/multi-pack-index-docfix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:33 +0000 (12:42 -0800)] 
Merge branch 'jb/multi-pack-index-docfix' into maint

Doc fix.

* jb/multi-pack-index-docfix:
  pack-format: correct multi-pack-index description

4 years agoMerge branch 'ma/diff-doc-clarify-regexp-example' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:33 +0000 (12:42 -0800)] 
Merge branch 'ma/diff-doc-clarify-regexp-example' into maint

Doc clarification.

* ma/diff-doc-clarify-regexp-example:
  diff-options.txt: avoid "regex" overload in example

4 years agoMerge branch 'ms/doc-bundle-format' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:32 +0000 (12:42 -0800)] 
Merge branch 'ms/doc-bundle-format' into maint

Technical details of the bundle format has been documented.
I think this is in a good enough shape.

* ms/doc-bundle-format:
  doc: describe Git bundle format

4 years agoMerge branch 'es/submodule-fetch-message-fix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:32 +0000 (12:42 -0800)] 
Merge branch 'es/submodule-fetch-message-fix' into maint

Error message fix.

* es/submodule-fetch-message-fix:
  submodule: add newline on invalid submodule error

4 years agoMerge branch 'jb/parse-options-message-fix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:32 +0000 (12:42 -0800)] 
Merge branch 'jb/parse-options-message-fix' into maint

Error message fix.

* jb/parse-options-message-fix:
  parse-options: lose an unnecessary space in an error message

4 years agoMerge branch 'ma/filter-branch-doc-caret' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:32 +0000 (12:42 -0800)] 
Merge branch 'ma/filter-branch-doc-caret' into maint

Doc mark-up updates.

* ma/filter-branch-doc-caret:
  git-filter-branch.txt: wrap "maths" notation in backticks

4 years agoMerge branch 'km/submodule-doc-use-sm-path' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:32 +0000 (12:42 -0800)] 
Merge branch 'km/submodule-doc-use-sm-path' into maint

Docfix.

* km/submodule-doc-use-sm-path:
  submodule foreach: replace $path with $sm_path in example

4 years agoMerge branch 'pb/do-not-recurse-grep-no-index' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:31 +0000 (12:42 -0800)] 
Merge branch 'pb/do-not-recurse-grep-no-index' into maint

"git grep --no-index" should not get affected by the contents of
the .gitmodules file but when "--recurse-submodules" is given or
the "submodule.recurse" variable is set, it did.  Now these
settings are ignored in the "--no-index" mode.

* pb/do-not-recurse-grep-no-index:
  grep: ignore --recurse-submodules if --no-index is given

4 years agoMerge branch 'jt/t5616-robustify' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:31 +0000 (12:42 -0800)] 
Merge branch 'jt/t5616-robustify' into maint

Futureproofing a test not to depend on the current implementation
detail.

* jt/t5616-robustify:
  t5616: make robust to delta base change

4 years agoMerge branch 'en/fill-directory-fixes-more' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:31 +0000 (12:42 -0800)] 
Merge branch 'en/fill-directory-fixes-more' into maint

Corner case bugs in "git clean" that stems from a (necessarily for
performance reasons) awkward calling convention in the directory
enumeration API has been corrected.

* en/fill-directory-fixes-more:
  dir: point treat_leading_path() warning to the right place
  dir: restructure in a way to avoid passing around a struct dirent
  dir: treat_leading_path() and read_directory_recursive(), round 2
  clean: demonstrate a bug with pathspecs

4 years agoMerge branch 'bc/misconception-doc' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:31 +0000 (12:42 -0800)] 
Merge branch 'bc/misconception-doc' into maint

Doc updates.

* bc/misconception-doc:
  docs: mention when increasing http.postBuffer is valuable
  doc: dissuade users from trying to ignore tracked files

4 years agoMerge branch 'bc/author-committer-doc' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:31 +0000 (12:42 -0800)] 
Merge branch 'bc/author-committer-doc' into maint

Clarify documentation on committer/author identities.

* bc/author-committer-doc:
  doc: provide guidance on user.name format
  docs: expand on possible and recommended user config options
  doc: move author and committer information to git-commit(1)

4 years agoMerge branch 'ds/refmap-doc' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:30 +0000 (12:42 -0800)] 
Merge branch 'ds/refmap-doc' into maint

"git fetch --refmap=" option has got a better documentation.

* ds/refmap-doc:
  fetch: document and test --refmap=""

4 years agoMerge branch 'bc/actualmente' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:30 +0000 (12:42 -0800)] 
Merge branch 'bc/actualmente' into maint

Doc grammo fix.

* bc/actualmente:
  docs: use "currently" for the present time

4 years agoMerge branch 'rt/submodule-i18n' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:30 +0000 (12:42 -0800)] 
Merge branch 'rt/submodule-i18n' into maint

Comments update.

* rt/submodule-i18n:
  submodule.c: mark more strings for translation

4 years agoMerge branch 'jk/test-fixes' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:29 +0000 (12:42 -0800)] 
Merge branch 'jk/test-fixes' into maint

Test fixes.

* jk/test-fixes:
  t7800: don't rely on reuse_worktree_file()
  t4018: drop "debugging" cat from hunk-header tests

4 years agoMerge branch 'jk/asan-build-fix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:29 +0000 (12:42 -0800)] 
Merge branch 'jk/asan-build-fix' into maint

Work around test breakages caused by custom regex engine used in
libasan, when address sanitizer is used with more recent versions
of gcc and clang.

* jk/asan-build-fix:
  Makefile: use compat regex with SANITIZE=address

4 years agoMerge branch 'ds/sparse-cone' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:29 +0000 (12:42 -0800)] 
Merge branch 'ds/sparse-cone' into maint

The code recently added in this release to move to the entry beyond
the ones in the same directory in the index in the sparse-cone mode
did not count the number of entries to skip over incorrectly, which
has been corrected.

* ds/sparse-cone:
  .mailmap: fix GGG authoship screwup
  unpack-trees: correctly compute result count

4 years agoMerge branch 'nd/switch-and-restore' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:29 +0000 (12:42 -0800)] 
Merge branch 'nd/switch-and-restore' into maint

"git restore --staged" did not correctly update the cache-tree
structure, resulting in bogus trees to be written afterwards, which
has been corrected.

* nd/switch-and-restore:
  restore: invalidate cache-tree when removing entries with --staged

4 years agoMerge branch 'jk/no-flush-upon-disconnecting-slrpc-transport' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:28 +0000 (12:42 -0800)] 
Merge branch 'jk/no-flush-upon-disconnecting-slrpc-transport' into maint

Reduce unnecessary round-trip when running "ls-remote" over the
stateless RPC mechanism.

* jk/no-flush-upon-disconnecting-slrpc-transport:
  transport: don't flush when disconnecting stateless-rpc helper

4 years agoMerge branch 'hw/tutorial-favor-switch-over-checkout' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:28 +0000 (12:42 -0800)] 
Merge branch 'hw/tutorial-favor-switch-over-checkout' into maint

Complete an update to tutorial that encourages "git switch" over
"git checkout" that was done only half-way.

* hw/tutorial-favor-switch-over-checkout:
  doc/gitcore-tutorial: fix prose to match example command

4 years agoMerge branch 'es/unpack-trees-oob-fix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:27 +0000 (12:42 -0800)] 
Merge branch 'es/unpack-trees-oob-fix' into maint

The code that tries to skip over the entries for the paths in a
single directory using the cache-tree was not careful enough
against corrupt index file.

* es/unpack-trees-oob-fix:
  unpack-trees: watch for out-of-range index position

4 years agoMerge branch 'bc/run-command-nullness-after-free-fix' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:27 +0000 (12:42 -0800)] 
Merge branch 'bc/run-command-nullness-after-free-fix' into maint

C pedantry ;-) fix.

* bc/run-command-nullness-after-free-fix:
  run-command: avoid undefined behavior in exists_in_PATH

4 years agoMerge branch 'en/string-list-can-be-custom-sorted' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:27 +0000 (12:42 -0800)] 
Merge branch 'en/string-list-can-be-custom-sorted' into maint

API-doc update.

* en/string-list-can-be-custom-sorted:
  string-list: note in docs that callers can specify sorting function

4 years agoMerge branch 'jt/sha1-file-remove-oi-skip-cached' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:27 +0000 (12:42 -0800)] 
Merge branch 'jt/sha1-file-remove-oi-skip-cached' into maint

has_object_file() said "no" given an object registered to the
system via pretend_object_file(), making it inconsistent with
read_object_file(), causing lazy fetch to attempt fetching an
empty tree from promisor remotes.

* jt/sha1-file-remove-oi-skip-cached:
  sha1-file: remove OBJECT_INFO_SKIP_CACHED

4 years agoMerge branch 'hw/commit-advise-while-rejecting' into maint
Junio C Hamano [Fri, 14 Feb 2020 20:42:27 +0000 (12:42 -0800)] 
Merge branch 'hw/commit-advise-while-rejecting' into maint

"git commit" gives output similar to "git status" when there is
nothing to commit, but without honoring the advise.statusHints
configuration variable, which has been corrected.

* hw/commit-advise-while-rejecting:
  commit: honor advice.statusHints when rejecting an empty commit

4 years agoThe fourth batch for 2.26
Junio C Hamano [Wed, 12 Feb 2020 20:12:08 +0000 (12:12 -0800)] 
The fourth batch for 2.26

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'js/convert-typofix'
Junio C Hamano [Wed, 12 Feb 2020 20:41:39 +0000 (12:41 -0800)] 
Merge branch 'js/convert-typofix'

Typofix.

* js/convert-typofix:
  convert: fix typo

4 years agoMerge branch 'js/ci-squelch-doc-warning'
Junio C Hamano [Wed, 12 Feb 2020 20:41:39 +0000 (12:41 -0800)] 
Merge branch 'js/ci-squelch-doc-warning'

Squelch unhelpful warning message during documentation build.

* js/ci-squelch-doc-warning:
  ci: ignore rubygems warning in the "Documentation" job

4 years agoMerge branch 'jb/multi-pack-index-docfix'
Junio C Hamano [Wed, 12 Feb 2020 20:41:39 +0000 (12:41 -0800)] 
Merge branch 'jb/multi-pack-index-docfix'

Doc fix.

* jb/multi-pack-index-docfix:
  pack-format: correct multi-pack-index description

4 years agoMerge branch 'ma/diff-doc-clarify-regexp-example'
Junio C Hamano [Wed, 12 Feb 2020 20:41:38 +0000 (12:41 -0800)] 
Merge branch 'ma/diff-doc-clarify-regexp-example'

Doc clarification.

* ma/diff-doc-clarify-regexp-example:
  diff-options.txt: avoid "regex" overload in example

4 years agoMerge branch 'ms/doc-bundle-format'
Junio C Hamano [Wed, 12 Feb 2020 20:41:38 +0000 (12:41 -0800)] 
Merge branch 'ms/doc-bundle-format'

Technical details of the bundle format has been documented.

* ms/doc-bundle-format:
  doc: describe Git bundle format

4 years agoMerge branch 'es/submodule-fetch-message-fix'
Junio C Hamano [Wed, 12 Feb 2020 20:41:38 +0000 (12:41 -0800)] 
Merge branch 'es/submodule-fetch-message-fix'

Error message fix.

* es/submodule-fetch-message-fix:
  submodule: add newline on invalid submodule error

4 years agoMerge branch 'jb/parse-options-message-fix'
Junio C Hamano [Wed, 12 Feb 2020 20:41:37 +0000 (12:41 -0800)] 
Merge branch 'jb/parse-options-message-fix'

Error message fix.

* jb/parse-options-message-fix:
  parse-options: lose an unnecessary space in an error message

4 years agoMerge branch 'ma/filter-branch-doc-caret'
Junio C Hamano [Wed, 12 Feb 2020 20:41:37 +0000 (12:41 -0800)] 
Merge branch 'ma/filter-branch-doc-caret'

Doc mark-up updates.

* ma/filter-branch-doc-caret:
  git-filter-branch.txt: wrap "maths" notation in backticks

4 years agoMerge branch 'km/submodule-doc-use-sm-path'
Junio C Hamano [Wed, 12 Feb 2020 20:41:37 +0000 (12:41 -0800)] 
Merge branch 'km/submodule-doc-use-sm-path'

Docfix.

* km/submodule-doc-use-sm-path:
  submodule foreach: replace $path with $sm_path in example

4 years agoMerge branch 'jc/skip-prefix'
Junio C Hamano [Wed, 12 Feb 2020 20:41:37 +0000 (12:41 -0800)] 
Merge branch 'jc/skip-prefix'

Code simplification.

* jc/skip-prefix:
  C: use skip_prefix() to avoid hardcoded string length

4 years agoMerge branch 'pb/do-not-recurse-grep-no-index'
Junio C Hamano [Wed, 12 Feb 2020 20:41:36 +0000 (12:41 -0800)] 
Merge branch 'pb/do-not-recurse-grep-no-index'

"git grep --no-index" should not get affected by the contents of
the .gitmodules file but when "--recurse-submodules" is given or
the "submodule.recurse" variable is set, it did.  Now these
settings are ignored in the "--no-index" mode.

* pb/do-not-recurse-grep-no-index:
  grep: ignore --recurse-submodules if --no-index is given

4 years agoMerge branch 'hw/doc-git-dir'
Junio C Hamano [Wed, 12 Feb 2020 20:41:36 +0000 (12:41 -0800)] 
Merge branch 'hw/doc-git-dir'

One effect of specifying where the GIT_DIR is (either with the
environment variable, or with the "git --git-dir=<where> cmd"
option) is to disable the repository discovery.  This has been
placed a bit more stress in the documentation, as new users often
get confused.

* hw/doc-git-dir:
  git: update documentation for --git-dir

4 years agoMerge branch 'jk/push-default-doc'
Junio C Hamano [Wed, 12 Feb 2020 20:41:36 +0000 (12:41 -0800)] 
Merge branch 'jk/push-default-doc'

Doc update.

* jk/push-default-doc:
  doc: drop "explicitly given" from push.default description

4 years agoMerge branch 'jk/clang-sanitizer-fixes'
Junio C Hamano [Wed, 12 Feb 2020 20:41:36 +0000 (12:41 -0800)] 
Merge branch 'jk/clang-sanitizer-fixes'

C pedantry ;-) fix.

* jk/clang-sanitizer-fixes:
  obstack: avoid computing offsets from NULL pointer
  xdiff: avoid computing non-zero offset from NULL pointer
  avoid computing zero offsets from NULL pointer
  merge-recursive: use subtraction to flip stage
  merge-recursive: silence -Wxor-used-as-pow warning

4 years agoMerge branch 'dt/submodule-rm-with-stale-cache'
Junio C Hamano [Wed, 12 Feb 2020 20:41:35 +0000 (12:41 -0800)] 
Merge branch 'dt/submodule-rm-with-stale-cache'

Running "git rm" on a submodule failed unnecessarily when
.gitmodules is only cache-dirty, which has been corrected.

* dt/submodule-rm-with-stale-cache:
  git rm submodule: succeed if .gitmodules index stat info is zero

4 years agoMerge branch 'jt/t5616-robustify'
Junio C Hamano [Wed, 12 Feb 2020 20:41:35 +0000 (12:41 -0800)] 
Merge branch 'jt/t5616-robustify'

Futureproofing a test not to depend on the current implementation
detail.

* jt/t5616-robustify:
  t5616: make robust to delta base change

4 years agoMerge branch 'jk/escaped-wildcard-dwim'
Junio C Hamano [Wed, 12 Feb 2020 20:41:35 +0000 (12:41 -0800)] 
Merge branch 'jk/escaped-wildcard-dwim'

Disambiguation logic to tell revisions and pathspec apart has been
tweaked so that backslash-escaped glob special characters do not
count in the "wildcards are pathspec" rule.

* jk/escaped-wildcard-dwim:
  verify_filename(): handle backslashes in "wildcards are pathspecs" rule

4 years agoMerge branch 'jn/pretend-object-doc'
Junio C Hamano [Wed, 12 Feb 2020 20:41:35 +0000 (12:41 -0800)] 
Merge branch 'jn/pretend-object-doc'

Warn programmers about pretend_object_file() that allows the code
to tentatively use in-core objects.

* jn/pretend-object-doc:
  sha1-file: document how to use pretend_object_file

4 years agoconvert: fix typo
Johannes Schindelin [Tue, 11 Feb 2020 18:56:18 +0000 (18:56 +0000)] 
convert: fix typo

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoci: ignore rubygems warning in the "Documentation" job
Johannes Schindelin [Sun, 9 Feb 2020 22:36:16 +0000 (22:36 +0000)] 
ci: ignore rubygems warning in the "Documentation" job

A recent update in the Linux VM images used by Azure Pipelines surfaced
a new problem in the "Documentation" job. Apparently, this warning
appears 396 times on `stderr` when running `make doc`:

/usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb:10: warning: constant Gem::ConfigMap is deprecated

This problem was already reported to the `rubygems` project via
https://github.com/rubygems/rubygems/issues/3068.

As there is nothing Git can do about this warning, and as the
"Documentation" job reports this warning as a failure, let's just
silence it and move on.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopack-format: correct multi-pack-index description
Johannes Berg [Fri, 7 Feb 2020 22:16:40 +0000 (23:16 +0100)] 
pack-format: correct multi-pack-index description

The description of the multi-pack-index contains a small bug,
if all offsets are < 2^32 then there will be no LOFF chunk,
not only if they're all < 2^31 (since the highest bit is only
needed as the "LOFF-escape" when that's actually needed.)

Correct this, and clarify that in that case only offsets up
to 2^31-1 can be stored in the OOFF chunk.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodiff-options.txt: avoid "regex" overload in example
Martin Ågren [Thu, 6 Feb 2020 20:53:01 +0000 (21:53 +0100)] 
diff-options.txt: avoid "regex" overload in example

When we exemplify the difference between `-G` and `-S` (using
`--pickaxe-regex`), we do so using an example diff and git-diff
invocation involving "regexec", "regexp", "regmatch", ...

The example is correct, but we can make it easier to untangle by
avoiding writing "regex.*" unless it's really needed to make our point.

Use some made-up, non-regexy words instead.

Reported-by: Adam Dinwoodie <adam@dinwoodie.org>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodoc: describe Git bundle format
Masaya Suzuki [Fri, 7 Feb 2020 20:42:25 +0000 (12:42 -0800)] 
doc: describe Git bundle format

The bundle format was not documented. Describe the format with ABNF and
explain the meaning of each part.

Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: add newline on invalid submodule error
Emily Shaffer [Fri, 7 Feb 2020 00:48:33 +0000 (16:48 -0800)] 
submodule: add newline on invalid submodule error

Since 'err' contains output for multiple submodules and is printed all
at once by fetch_populated_submodules(), errors for each submodule
should be newline separated for readability. The same strbuf is added to
with a newline in the other half of the conditional where this error is
detected, so make the two consistent.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoadd: change advice config variables used by the add API
Heba Waly [Thu, 6 Feb 2020 10:57:30 +0000 (23:57 +1300)] 
add: change advice config variables used by the add API

advice.addNothing config variable is used to control the visibility of
two advice messages in the add library. This config variable is
replaced by two new variables, whose names are more clear and relevant
to the two cases.

Also add the two new variables to the documentation.

Signed-off-by: Heba Waly <heba.waly@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe third batch for 2.26
Junio C Hamano [Wed, 5 Feb 2020 21:26:03 +0000 (13:26 -0800)] 
The third batch for 2.26

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'mt/sparse-checkout-doc-update'
Junio C Hamano [Wed, 5 Feb 2020 22:35:00 +0000 (14:35 -0800)] 
Merge branch 'mt/sparse-checkout-doc-update'

Doc update.

* mt/sparse-checkout-doc-update:
  completion: add support for sparse-checkout
  doc: sparse-checkout: mention --cone option

4 years agoMerge branch 'pb/recurse-submodule-in-worktree-fix'
Junio C Hamano [Wed, 5 Feb 2020 22:35:00 +0000 (14:35 -0800)] 
Merge branch 'pb/recurse-submodule-in-worktree-fix'

The "--recurse-submodules" option of various subcommands did not
work well when run in an alternate worktree, which has been
corrected.

* pb/recurse-submodule-in-worktree-fix:
  submodule.c: use get_git_dir() instead of get_git_common_dir()
  t2405: clarify test descriptions and simplify test
  t2405: use git -C and test_commit -C instead of subshells
  t7410: rename to t2405-worktree-submodule.sh

4 years agoMerge branch 'es/fetch-show-failed-submodules-atend'
Junio C Hamano [Wed, 5 Feb 2020 22:34:59 +0000 (14:34 -0800)] 
Merge branch 'es/fetch-show-failed-submodules-atend'

A fetch that is told to recursively fetch updates in submodules
inevitably produces reams of output, and it becomes hard to spot
error messages.  The command has been taught to enumerate
submodules that had errors at the end of the operation.

* es/fetch-show-failed-submodules-atend:
  fetch: emphasize failure during submodule fetch

4 years agoMerge branch 'en/fill-directory-fixes-more'
Junio C Hamano [Wed, 5 Feb 2020 22:34:59 +0000 (14:34 -0800)] 
Merge branch 'en/fill-directory-fixes-more'

Corner case bugs in "git clean" that stems from a (necessarily for
performance reasons) awkward calling convention in the directory
enumeration API has been corrected.

* en/fill-directory-fixes-more:
  dir: point treat_leading_path() warning to the right place
  dir: restructure in a way to avoid passing around a struct dirent
  dir: treat_leading_path() and read_directory_recursive(), round 2
  clean: demonstrate a bug with pathspecs

4 years agoMerge branch 'bc/hash-independent-tests-part-7'
Junio C Hamano [Wed, 5 Feb 2020 22:34:59 +0000 (14:34 -0800)] 
Merge branch 'bc/hash-independent-tests-part-7'

Preparation of test scripts for the day when the object names will
use SHA-256 continues.

* bc/hash-independent-tests-part-7:
  t5604: make hash independent
  t5601: switch into repository to hash object
  t5562: use $ZERO_OID
  t5540: make hash size independent
  t5537: make hash size independent
  t5530: compute results based on object length
  t5512: abstract away SHA-1-specific constants
  t5510: make hash size independent
  t5504: make hash algorithm independent
  t5324: make hash size independent
  t5319: make test work with SHA-256
  t5319: change invalid offset for SHA-256 compatibility
  t5318: update for SHA-256
  t4300: abstract away SHA-1-specific constants
  t4204: make hash size independent
  t4202: abstract away SHA-1-specific constants
  t4200: make hash size independent
  t4134: compute appropriate length constant
  t4066: compute index line in diffs
  t4054: make hash-size independent

4 years agoMerge branch 'km/submodule-add-errmsg'
Junio C Hamano [Wed, 5 Feb 2020 22:34:58 +0000 (14:34 -0800)] 
Merge branch 'km/submodule-add-errmsg'

Improve error message generation for "git submodule add".

* km/submodule-add-errmsg:
  submodule add: show 'add --dry-run' stderr when aborting

4 years agoMerge branch 'am/checkout-file-and-ref-ref-ambiguity'
Junio C Hamano [Wed, 5 Feb 2020 22:34:58 +0000 (14:34 -0800)] 
Merge branch 'am/checkout-file-and-ref-ref-ambiguity'

"git checkout X" did not correctly fail when X is not a local
branch but could name more than one remote-tracking branches
(i.e. to be dwimmed as the starting point to create a corresponding
local branch), which has been corrected.

* am/checkout-file-and-ref-ref-ambiguity:
  checkout: don't revert file on ambiguous tracking branches
  parse_branchname_arg(): extract part as new function

4 years agoMerge branch 'js/add-p-leftover-bits'
Junio C Hamano [Wed, 5 Feb 2020 22:34:58 +0000 (14:34 -0800)] 
Merge branch 'js/add-p-leftover-bits'

The final leg of rewriting "add -i/-p" in C.

* js/add-p-leftover-bits:
  ci: include the built-in `git add -i` in the `linux-gcc` job
  built-in add -p: handle Escape sequences more efficiently
  built-in add -p: handle Escape sequences in interactive.singlekey mode
  built-in add -p: respect the `interactive.singlekey` config setting
  terminal: add a new function to read a single keystroke
  terminal: accommodate Git for Windows' default terminal
  terminal: make the code of disable_echo() reusable
  built-in add -p: handle diff.algorithm
  built-in add -p: support interactive.diffFilter
  t3701: adjust difffilter test

4 years agoMerge branch 'js/patch-mode-in-others-in-c'
Junio C Hamano [Wed, 5 Feb 2020 22:34:58 +0000 (14:34 -0800)] 
Merge branch 'js/patch-mode-in-others-in-c'

The effort to move "git-add--interactive" to C continues.

* js/patch-mode-in-others-in-c:
  commit --interactive: make it work with the built-in `add -i`
  built-in add -p: implement the "worktree" patch modes
  built-in add -p: implement the "checkout" patch modes
  built-in stash: use the built-in `git add -p` if so configured
  legacy stash -p: respect the add.interactive.usebuiltin setting
  built-in add -p: implement the "stash" and "reset" patch modes
  built-in add -p: prepare for patch modes other than "stage"

4 years agoMerge branch 'dl/test-must-fail-fixes'
Junio C Hamano [Wed, 5 Feb 2020 22:34:57 +0000 (14:34 -0800)] 
Merge branch 'dl/test-must-fail-fixes'

Test clean-up.

* dl/test-must-fail-fixes:
  t1507: inline full_name()
  t1507: run commands within test_expect_success
  t1507: stop losing return codes of git commands
  t1501: remove use of `test_might_fail cp`
  t1409: use test_path_is_missing()
  t1409: let sed open its own input file
  t1307: reorder `nongit test_must_fail`
  t1306: convert `test_might_fail rm` to `rm -f`
  t0020: use ! check_packed_refs_marked
  t0020: don't use `test_must_fail has_cr`
  t0003: don't use `test_must_fail attr_check`
  t0003: use test_must_be_empty()
  t0003: use named parameters in attr_check()
  t0000: replace test_must_fail with run_sub_test_lib_test_err()
  t/lib-git-p4: use test_path_is_missing()

4 years agoparse-options: lose an unnecessary space in an error message
Jacques Bodin-Hullin [Wed, 5 Feb 2020 13:07:23 +0000 (13:07 +0000)] 
parse-options: lose an unnecessary space in an error message

Signed-off-by: Jacques Bodin-Hullin <j.bodinhullin@monsieurbiz.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: sort tip names before applying
René Scharfe [Wed, 5 Feb 2020 17:50:23 +0000 (18:50 +0100)] 
name-rev: sort tip names before applying

name_ref() is called for each ref and checks if its a better name for
the referenced commit.  If that's the case it remembers it and checks if
a name based on it is better for its ancestors as well.  This in done in
the the order for_each_ref() imposes on us.

That might not be optimal.  If bad names happen to be encountered first
(as defined by is_better_name()), names derived from them may spread to
a lot of commits, only to be replaced by better names later.  Setting
better names first can avoid that.

is_better_name() prefers tags, short distances and old references.  The
distance is a measure that we need to calculate for each candidate
commit, but the other two properties are not dependent on the
relationships of commits.  Sorting the refs by them should yield better
performance than the essentially random order we currently use.

And applying older references first should also help to reduce rework
due to the fact that older commits have less ancestors than newer ones.

So add all details of names to the tip table first, then sort them
to prefer tags and older references and then apply them in this order.
Here's the performance as measures by hyperfine for the Linux repo
before:

Benchmark #1: ./git -C ../linux/ name-rev --all
  Time (mean ± σ):     851.1 ms ±   4.5 ms    [User: 806.7 ms, System: 44.4 ms]
  Range (min … max):   845.9 ms … 859.5 ms    10 runs

... and with this patch:

Benchmark #1: ./git -C ../linux/ name-rev --all
  Time (mean ± σ):     736.2 ms ±   8.7 ms    [User: 688.4 ms, System: 47.5 ms]
  Range (min … max):   726.0 ms … 755.2 ms    10 runs

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: release unused name strings
René Scharfe [Tue, 4 Feb 2020 21:26:18 +0000 (22:26 +0100)] 
name-rev: release unused name strings

name_rev() assigns a name to a commit and its parents and grandparents
and so on.  Commits share their name string with their first parent,
which in turn does the same, recursively to the root.  That saves a lot
of allocations.  When a better name is found, the old name is replaced,
but its memory is not released.  That leakage can become significant.

Can we release these old strings exactly once even though they are
referenced multiple times?  Yes, indeed -- we can make use of the fact
that name_rev() visits the ancestors of a commit after it set a new name
for it and tries to update their names as well.

Members of the first ancestral line have the same taggerdate and
from_tag values, but a higher distance value than their child commit at
generation 0.  These are the only criteria used by is_better_name().
Lower distance values are considered better, so a name that is better
for a child will also be better for its parent and grandparent etc.

That means we can free(3) an inferior name at generation 0 and rely on
name_rev() to replace all references in ancestors as well.

If we do that then we need to stop using the string pointer alone to
distinguish new empty rev_name slots from initialized ones, though, as
it technically becomes invalid after the free(3) call -- even though its
value is still different from NULL.

We can check the generation value first, as empty slots will have it
initialized to 0, and for the actual generation 0 we'll set a new valid
name right after the create_or_update_name() call that releases the
string.

For the Chromium repo, releasing superceded names reduces the memory
footprint of name-rev --all significantly.  Here's the output of GNU
time before:

0.98user 0.48system 0:01.46elapsed 99%CPU (0avgtext+0avgdata 2601812maxresident)k
0inputs+0outputs (0major+571470minor)pagefaults 0swaps

... and with this patch:

1.01user 0.26system 0:01.28elapsed 100%CPU (0avgtext+0avgdata 1559196maxresident)k
0inputs+0outputs (0major+314370minor)pagefaults 0swaps

It also gets faster; hyperfine before:

Benchmark #1: ./git -C ../chromium/src name-rev --all
  Time (mean ± σ):      1.534 s ±  0.006 s    [User: 1.039 s, System: 0.494 s]
  Range (min … max):    1.522 s …  1.542 s    10 runs

... and with this patch:

Benchmark #1: ./git -C ../chromium/src name-rev --all
  Time (mean ± σ):      1.338 s ±  0.006 s    [User: 1.047 s, System: 0.291 s]
  Range (min … max):    1.327 s …  1.346 s    10 runs

For the Linux repo it doesn't pay off; memory usage only gets down from:

0.76user 0.03system 0:00.80elapsed 99%CPU (0avgtext+0avgdata 292848maxresident)k
0inputs+0outputs (0major+44579minor)pagefaults 0swaps

... to:

0.78user 0.03system 0:00.81elapsed 100%CPU (0avgtext+0avgdata 284696maxresident)k
0inputs+0outputs (0major+44892minor)pagefaults 0swaps

The runtime actually increases slightly from:

Benchmark #1: ./git -C ../linux/ name-rev --all
  Time (mean ± σ):     828.8 ms ±   5.0 ms    [User: 797.2 ms, System: 31.6 ms]
  Range (min … max):   824.1 ms … 838.9 ms    10 runs

... to:

Benchmark #1: ./git -C ../linux/ name-rev --all
  Time (mean ± σ):     847.6 ms ±   3.4 ms    [User: 807.9 ms, System: 39.6 ms]
  Range (min … max):   843.4 ms … 854.3 ms    10 runs

Why is that?  In the Chromium repo, ca. 44000 free(3) calls in
create_or_update_name() release almost 1GB, while in the Linux repo
240000+ calls release a bit more than 5MB, so the average discarded
name is ca.  1000x longer in the latter.

Overall I think it's the right tradeoff to make, as it helps curb the
memory usage in repositories with big discarded names, and the added
overhead is small.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: generate name strings only if they are better
René Scharfe [Tue, 4 Feb 2020 21:25:34 +0000 (22:25 +0100)] 
name-rev: generate name strings only if they are better

Leave setting the tip_name member of struct rev_name to callers of
create_or_update_name().  This avoids allocations for names that are
rejected by that function.  Here's how this affects the runtime when
working with a fresh clone of Git's own repository; performance numbers
by hyperfine before:

Benchmark #1: ./git -C ../git-pristine/ name-rev --all
  Time (mean ± σ):     437.8 ms ±   4.0 ms    [User: 422.5 ms, System: 15.2 ms]
  Range (min … max):   432.8 ms … 446.3 ms    10 runs

... and with this patch:

Benchmark #1: ./git -C ../git-pristine/ name-rev --all
  Time (mean ± σ):     408.5 ms ±   1.4 ms    [User: 387.2 ms, System: 21.2 ms]
  Range (min … max):   407.1 ms … 411.7 ms    10 runs

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: pre-size buffer in get_parent_name()
René Scharfe [Tue, 4 Feb 2020 21:24:24 +0000 (22:24 +0100)] 
name-rev: pre-size buffer in get_parent_name()

We can calculate the size of new name easily and precisely. Open-code
the xstrfmt() calls and grow the buffers as needed before filling them.
This provides a surprisingly large benefit when working with the
Chromium repository; here are the numbers measured using hyperfine
before:

Benchmark #1: ./git -C ../chromium/src name-rev --all
  Time (mean ± σ):      5.822 s ±  0.013 s    [User: 5.304 s, System: 0.516 s]
  Range (min … max):    5.803 s …  5.837 s    10 runs

... and with this patch:

Benchmark #1: ./git -C ../chromium/src name-rev --all
  Time (mean ± σ):      1.527 s ±  0.003 s    [User: 1.015 s, System: 0.511 s]
  Range (min … max):    1.524 s …  1.535 s    10 runs

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: factor out get_parent_name()
René Scharfe [Tue, 4 Feb 2020 21:23:29 +0000 (22:23 +0100)] 
name-rev: factor out get_parent_name()

Reduce nesting by moving code to come up with a name for the parent into
its own function.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: put struct rev_name into commit slab
René Scharfe [Tue, 4 Feb 2020 21:22:36 +0000 (22:22 +0100)] 
name-rev: put struct rev_name into commit slab

The commit slab commit_rev_name contains a pointer to a struct rev_name,
and the actual struct is allocated separatly.  Avoid that allocation and
pointer indirection by storing the full struct in the commit slab.  Use
the tip_name member pointer to determine if the returned struct is
initialized.

Performance in the Linux repository measured with hyperfine before:

Benchmark #1: ./git -C ../linux/ name-rev --all
  Time (mean ± σ):     953.5 ms ±   6.3 ms    [User: 901.2 ms, System: 52.1 ms]
  Range (min … max):   945.2 ms … 968.5 ms    10 runs

... and with this patch:

Benchmark #1: ./git -C ../linux/ name-rev --all
  Time (mean ± σ):     851.0 ms ±   3.1 ms    [User: 807.4 ms, System: 43.6 ms]
  Range (min … max):   846.7 ms … 857.0 ms    10 runs

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: don't _peek() in create_or_update_name()
René Scharfe [Tue, 4 Feb 2020 21:20:42 +0000 (22:20 +0100)] 
name-rev: don't _peek() in create_or_update_name()

Look up the commit slab slot for the commit once using
commit_rev_name_at() and populate it in case it is empty, instead of
checking for emptiness in a separate step using commit_rev_name_peek()
via get_commit_rev_name().

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: don't leak path copy in name_ref()
René Scharfe [Tue, 4 Feb 2020 21:17:02 +0000 (22:17 +0100)] 
name-rev: don't leak path copy in name_ref()

name_ref() duplicates the path string and passes it to name_rev(), which
either puts it into a commit slab or ignores it if there is already a
better name, leaking it.  Move the duplication to name_rev() and release
the copy in the latter case.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoname-rev: respect const qualifier
René Scharfe [Tue, 4 Feb 2020 21:16:10 +0000 (22:16 +0100)] 
name-rev: respect const qualifier

Keep the const qualifier of the first parameter of get_rev_name() even
when casting the object pointer to a commit pointer, and further for the
parameter of get_commit_rev_name(), as all these uses are read-only.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>