git
3 years agocmake: fall back to using `vcpkg`'s `msgfmt.exe` on Windows
Johannes Schindelin [Wed, 30 Sep 2020 15:26:18 +0000 (15:26 +0000)] 
cmake: fall back to using `vcpkg`'s `msgfmt.exe` on Windows

We are already relying on `vcpkg` to manage our dependencies, including
`libiconv`. Let's also use the `msgfmt.exe` from there.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agocmake: ensure that the `vcpkg` packages are found on Windows
Johannes Schindelin [Mon, 28 Sep 2020 21:09:08 +0000 (21:09 +0000)] 
cmake: ensure that the `vcpkg` packages are found on Windows

On Windows, we use the `vcpkg` project to manage the dependencies, via
`compat/vcbuild/`. Let's make sure that these dependencies are found by
default.

This is needed because we are about to recommend loading the Git
worktree as a folder into Visual Studio, relying on the automatic CMake
support (which would make it relatively cumbersome to adjust the search
path used by CMake manually).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agocmake: do find Git for Windows' shell interpreter
Johannes Schindelin [Mon, 28 Sep 2020 21:09:07 +0000 (21:09 +0000)] 
cmake: do find Git for Windows' shell interpreter

By default, Git for Windows does not install its `sh.exe` into the
`PATH`. However, our current `CMakeLists.txt` expects to find a shell
interpreter in the `PATH`.

So let's fall back to looking in the default location where Git for
Windows _does_ install a relatively convenient `sh.exe`:
`C:\Program Files\Git\bin\sh.exe`

Helped-by: Øystein Walle <oystwa@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agocmake: ignore files generated by CMake as run in Visual Studio
Johannes Schindelin [Fri, 25 Sep 2020 14:28:29 +0000 (14:28 +0000)] 
cmake: ignore files generated by CMake as run in Visual Studio

As of recent Visual Studio versions, CMake support is built-in:
https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=vs-2019

All that needs to be done is to open the worktree as a folder, and
Visual Studio will find the `CMakeLists.txt` file and automatically
generate the project files.

Let's ignore the entirety of those generated files.

Helped-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoSixteenth batch
Junio C Hamano [Tue, 22 Sep 2020 19:25:27 +0000 (12:25 -0700)] 
Sixteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoMerge branch 'ar/fetch-ipversion-in-all'
Junio C Hamano [Tue, 22 Sep 2020 19:36:34 +0000 (12:36 -0700)] 
Merge branch 'ar/fetch-ipversion-in-all'

"git fetch --all --ipv4/--ipv6" forgot to pass the protocol options
to instances of the "git fetch" that talk to individual remotes,
which has been corrected.

* ar/fetch-ipversion-in-all:
  fetch: pass --ipv4 and --ipv6 options to sub-fetches

3 years agoMerge branch 'dl/complete-format-patch-recent-features'
Junio C Hamano [Tue, 22 Sep 2020 19:36:33 +0000 (12:36 -0700)] 
Merge branch 'dl/complete-format-patch-recent-features'

Update to command line completion (in contrib/)

* dl/complete-format-patch-recent-features:
  contrib/completion: complete options that take refs for format-patch

3 years agoMerge branch 'cs/don-t-pretend-a-failed-remote-set-head-succeeded'
Junio C Hamano [Tue, 22 Sep 2020 19:36:32 +0000 (12:36 -0700)] 
Merge branch 'cs/don-t-pretend-a-failed-remote-set-head-succeeded'

"git remote set-head" that failed still said something that hints
the operation went through, which was misleading.

* cs/don-t-pretend-a-failed-remote-set-head-succeeded:
  remote: don't show success message when set-head fails

3 years agoMerge branch 'jk/dont-count-existing-objects-twice'
Junio C Hamano [Tue, 22 Sep 2020 19:36:31 +0000 (12:36 -0700)] 
Merge branch 'jk/dont-count-existing-objects-twice'

There is a logic to estimate how many objects are in the
repository, which is mean to run once per process invocation, but
it ran every time the estimated value was requested.

* jk/dont-count-existing-objects-twice:
  packfile: actually set approximate_object_count_valid

3 years agoMerge branch 'al/ref-filter-merged-and-no-merged'
Junio C Hamano [Tue, 22 Sep 2020 19:36:31 +0000 (12:36 -0700)] 
Merge branch 'al/ref-filter-merged-and-no-merged'

"git for-each-ref" and friends that list refs used to allow only
one --merged or --no-merged to filter them; they learned to take
combination of both kind of filtering.

* al/ref-filter-merged-and-no-merged:
  Doc: prefer more specific file name
  ref-filter: make internal reachable-filter API more precise
  ref-filter: allow merged and no-merged filters
  Doc: cover multiple contains/no-contains filters
  t3201: test multiple branch filter combinations

3 years agoMerge branch 'cd/commit-graph-doc'
Junio C Hamano [Tue, 22 Sep 2020 19:36:30 +0000 (12:36 -0700)] 
Merge branch 'cd/commit-graph-doc'

Doc update.

* cd/commit-graph-doc:
  commit-graph-format.txt: fix no-parent value

3 years agoMerge branch 'kk/build-portability-fix'
Junio C Hamano [Tue, 22 Sep 2020 19:36:29 +0000 (12:36 -0700)] 
Merge branch 'kk/build-portability-fix'

Portability tweak for some shell scripts used while building.

* kk/build-portability-fix:
  Fit to Plan 9's ANSI/POSIX compatibility layer

3 years agoMerge branch 'ls/mergetool-meld-auto-merge'
Junio C Hamano [Tue, 22 Sep 2020 19:36:29 +0000 (12:36 -0700)] 
Merge branch 'ls/mergetool-meld-auto-merge'

The 'meld' backend of the "git mergetool" learned to give the
underlying 'meld' the '--auto-merge' option, which would help
reduce the amount of text that requires manual merging.

* ls/mergetool-meld-auto-merge:
  mergetool: allow auto-merge for meld to follow the vim-diff behavior

3 years agoMerge branch 'pw/add-p-edit-ita-path'
Junio C Hamano [Tue, 22 Sep 2020 19:36:28 +0000 (12:36 -0700)] 
Merge branch 'pw/add-p-edit-ita-path'

"add -p" now allows editing paths that were only added in intent.

* pw/add-p-edit-ita-path:
  add -p: fix editing of intent-to-add paths

3 years agoMerge branch 'hn/refs-trace-backend'
Junio C Hamano [Tue, 22 Sep 2020 19:36:28 +0000 (12:36 -0700)] 
Merge branch 'hn/refs-trace-backend'

Developer support.

* hn/refs-trace-backend:
  refs: add GIT_TRACE_REFS debugging mechanism

3 years agoMerge branch 'jt/threaded-index-pack'
Junio C Hamano [Tue, 22 Sep 2020 19:36:28 +0000 (12:36 -0700)] 
Merge branch 'jt/threaded-index-pack'

"git index-pack" learned to resolve deltified objects with greater
parallelism.

* jt/threaded-index-pack:
  index-pack: make quantum of work smaller
  index-pack: make resolve_delta() assume base data
  index-pack: calculate {ref,ofs}_{first,last} early
  index-pack: remove redundant child field
  index-pack: unify threaded and unthreaded code
  index-pack: remove redundant parameter
  Documentation: deltaBaseCacheLimit is per-thread

3 years agoMerge branch 'es/format-patch-interdiff-cleanup'
Junio C Hamano [Tue, 22 Sep 2020 19:36:28 +0000 (12:36 -0700)] 
Merge branch 'es/format-patch-interdiff-cleanup'

"format-patch --range-diff=<prev> <origin>..HEAD" has been taught
not to ignore <origin> when <prev> is a single version.

* es/format-patch-interdiff-cleanup:
  format-patch: use 'origin' as start of current-series-range when known
  diff-lib: tighten show_interdiff()'s interface
  diff: move show_interdiff() from its own file to diff-lib

3 years agoMerge branch 'os/fetch-submodule-optim'
Junio C Hamano [Tue, 22 Sep 2020 19:36:28 +0000 (12:36 -0700)] 
Merge branch 'os/fetch-submodule-optim'

Optimization around submodule handling.

* os/fetch-submodule-optim:
  fetch: do not look for submodule changes in unchanged refs

3 years agoFifteenth batch
Junio C Hamano [Sat, 19 Sep 2020 00:56:18 +0000 (17:56 -0700)] 
Fifteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoMerge branch 'mt/config-fail-nongit-early'
Junio C Hamano [Sat, 19 Sep 2020 00:58:06 +0000 (17:58 -0700)] 
Merge branch 'mt/config-fail-nongit-early'

Unlike "git config --local", "git config --worktree" did not fail
early and cleanly when started outside a git repository.

* mt/config-fail-nongit-early:
  config: complain about --worktree outside of a git repo

3 years agoMerge branch 'jc/dist-tarball-tweak'
Junio C Hamano [Sat, 19 Sep 2020 00:58:05 +0000 (17:58 -0700)] 
Merge branch 'jc/dist-tarball-tweak'

Allow maintainers to tweak $(TAR) invocations done while making
distribution tarballs.

* jc/dist-tarball-tweak:
  Makefile: allow extra tweaking of distribution tarball

3 years agoMerge branch 'mf/submodule-summary-with-correct-repository'
Junio C Hamano [Sat, 19 Sep 2020 00:58:05 +0000 (17:58 -0700)] 
Merge branch 'mf/submodule-summary-with-correct-repository'

"git diff/show" on a change that involves a submodule used to read
the information on commits in the submodule from a wrong repository
and gave a wrong information when the commit-graph is involved.

* mf/submodule-summary-with-correct-repository:
  submodule: use submodule repository when preparing summary
  revision: use repository from rev_info when parsing commits

3 years agoMerge branch 'jc/quote-path-cleanup'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'jc/quote-path-cleanup'

"git status --short" quoted a path with SP in it when tracked, but
not those that are untracked, ignored or unmerged.  They are all
shown quoted consistently.

* jc/quote-path-cleanup:
  quote: turn 'nodq' parameter into a set of flags
  quote: rename misnamed sq_lookup[] to cq_lookup[]
  wt-status: consistently quote paths in "status --short" output
  quote_path: code clarification
  quote_path: optionally allow quoting a path with SP in it
  quote_path: give flags parameter to quote_path()
  quote_path: rename quote_path_relative() to quote_path()

3 years agoMerge branch 'os/collect-changed-submodules-optim'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'os/collect-changed-submodules-optim'

Optimization around submodule handling.

* os/collect-changed-submodules-optim:
  submodule: suppress checking for file name and ref ambiguity for object ids

3 years agoMerge branch 'es/wt-add-detach'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'es/wt-add-detach'

"git worktree add" learns that the "-d" is a synonym to "--detach"
option to create a new worktree without being on a branch.

* es/wt-add-detach:
  git-worktree.txt: discuss branch-based vs. throwaway worktrees
  worktree: teach `add` to recognize -d as shorthand for --detach
  git-checkout.txt: document -d short option for --detach

3 years agoMerge branch 'jk/add-i-fixes'
Junio C Hamano [Sat, 19 Sep 2020 00:58:04 +0000 (17:58 -0700)] 
Merge branch 'jk/add-i-fixes'

"add -i/-p" fixes.

* jk/add-i-fixes:
  add--interactive.perl: specify --no-color explicitly
  add-patch: fix inverted return code of repo_read_index()

3 years agoMerge branch 'pw/add-p-leakfix'
Junio C Hamano [Sat, 19 Sep 2020 00:58:03 +0000 (17:58 -0700)] 
Merge branch 'pw/add-p-leakfix'

Leakfix.

* pw/add-p-leakfix:
  add -p: fix memory leak

3 years agoMerge branch 'jc/add-i-use-builtin-experimental'
Junio C Hamano [Sat, 19 Sep 2020 00:58:02 +0000 (17:58 -0700)] 
Merge branch 'jc/add-i-use-builtin-experimental'

The "add -i/-p" machinery has been written in C but it is not used
by default yet.  It is made default to those who are participating
in feature.experimental experiment.

* jc/add-i-use-builtin-experimental:
  add -i: use the built-in version when feature.experimental is set

3 years agoMerge branch 'al/t3200-back-on-a-branch'
Junio C Hamano [Sat, 19 Sep 2020 00:58:02 +0000 (17:58 -0700)] 
Merge branch 'al/t3200-back-on-a-branch'

Test fix.

* al/t3200-back-on-a-branch:
  t3200: clean side effect of git checkout --orphan

3 years agoMerge branch 'hn/refs-ref-log-only-bit'
Junio C Hamano [Sat, 19 Sep 2020 00:58:01 +0000 (17:58 -0700)] 
Merge branch 'hn/refs-ref-log-only-bit'

A bit of API reshuffling to make sure stuff common to all backends
are not defined only in files backend.

* hn/refs-ref-log-only-bit:
  refs: move REF_LOG_ONLY to refs-internal.h

3 years agoMerge branch 'ea/blame-use-oideq'
Junio C Hamano [Sat, 19 Sep 2020 00:58:01 +0000 (17:58 -0700)] 
Merge branch 'ea/blame-use-oideq'

Code cleanup.

* ea/blame-use-oideq:
  blame.c: replace instance of !oidcmp for oideq

3 years agoMerge branch 'pb/clang-json-compilation-database'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'pb/clang-json-compilation-database'

Developer support.

* pb/clang-json-compilation-database:
  Makefile: add support for generating JSON compilation database

3 years agoMerge branch 'so/log-tree-diff-cleanup'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'so/log-tree-diff-cleanup'

Code cleanup.

* so/log-tree-diff-cleanup:
  log_tree_diff: get rid of extra check for NULL
  log_tree_diff: get rid of code duplication for first_parent_only

3 years agoMerge branch 'rs/parallel-read-cache-fix'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'rs/parallel-read-cache-fix'

A follow-up fix to a topic already in 'master'.

* rs/parallel-read-cache-fix:
  read-cache: fix mem-pool allocation for multi-threaded index loading

3 years agoMerge branch 'rs/refspec-leakfix'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'rs/refspec-leakfix'

Leakfix.

* rs/refspec-leakfix:
  refspec: add and use refspec_appendf()
  push: release strbufs used for refspec formatting

3 years agoMerge branch 'rs/misc-cleanups'
Junio C Hamano [Sat, 19 Sep 2020 00:58:00 +0000 (17:58 -0700)] 
Merge branch 'rs/misc-cleanups'

Misc cleanups.

* rs/misc-cleanups:
  pack-bitmap-write: use hashwrite_be32() in write_hash_cache()
  midx: use hashwrite_u8() in write_midx_header()
  fast-import: use write_pack_header()

3 years agoDoc: prefer more specific file name
Aaron Lipman [Fri, 18 Sep 2020 21:58:42 +0000 (17:58 -0400)] 
Doc: prefer more specific file name

Change filters.txt to ref-reachability-filters.txt in order to avoid
squatting on a file name that might be useful for another purpose.

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoref-filter: make internal reachable-filter API more precise
Aaron Lipman [Fri, 18 Sep 2020 21:58:41 +0000 (17:58 -0400)] 
ref-filter: make internal reachable-filter API more precise

The internal reachable-filter API is a bit loose and imprecise; it
also bleeds unnecessarily into the public header. Tighten the API
by:

* renaming do_merge_filter() to reach_filter()

* separating parameters to explicitly identify what data is used
  by the function instead of passing an entire ref_filter_cbdata
  struct

* renaming and moving internal constants from header to source
  file

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agocontrib/completion: complete options that take refs for format-patch
Denton Liu [Thu, 17 Sep 2020 08:04:36 +0000 (01:04 -0700)] 
contrib/completion: complete options that take refs for format-patch

The completion for format-patch currently suggests --base=, --interdiff=
and --range-diff= as options. However, with these `=` forms of the
options, there is no space and we'd enter the `--*` case which means we
don't call the __git_complete_revlist() at the end.

Teach _git_format_patch() to complete refs in the case of --base=,
--interdiff= and --range-diff=.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoremote: don't show success message when set-head fails
Christian Schlack [Thu, 17 Sep 2020 15:27:38 +0000 (15:27 +0000)] 
remote: don't show success message when set-head fails

Suppress the message 'origin/HEAD set to master' in case of an error.

  $ git remote set-head origin -a
  error: Not a valid ref: refs/remotes/origin/master
  origin/HEAD set to master

Signed-off-by: Christian Schlack <christian@backhub.co>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agopackfile: actually set approximate_object_count_valid
Jeff King [Thu, 17 Sep 2020 16:47:43 +0000 (12:47 -0400)] 
packfile: actually set approximate_object_count_valid

The approximate_object_count() function tries to compute the count only
once per process. But ever since it was introduced in 8e3f52d778
(find_unique_abbrev: move logic out of get_short_sha1(), 2016-10-03), we
failed to actually set the "valid" flag, meaning we'd compute it fresh
on every call.

This turns out not to be _too_ bad, because we're only iterating through
the packed_git list, and not making any system calls. But since it may
get called for every abbreviated hash we output, even this can add up if
you have many packs.

Here are before-and-after timings for a new perf test which just asks
rev-list to abbreviate each commit hash (the test repo is linux.git,
with commit-graphs):

  Test                            origin              HEAD
  ----------------------------------------------------------------------------
  5303.3: rev-list (1)            28.91(28.46+0.44)   29.03(28.65+0.38) +0.4%
  5303.4: abbrev-commit (1)       1.18(1.06+0.11)     1.17(1.02+0.14) -0.8%
  5303.7: rev-list (50)           28.95(28.56+0.38)   29.50(29.17+0.32) +1.9%
  5303.8: abbrev-commit (50)      3.67(3.56+0.10)     3.57(3.42+0.15) -2.7%
  5303.11: rev-list (1000)        30.34(29.89+0.43)   30.82(30.35+0.46) +1.6%
  5303.12: abbrev-commit (1000)   86.82(86.52+0.29)   77.82(77.59+0.22) -10.4%
  5303.15: load 10,000 packs      0.08(0.02+0.05)     0.08(0.02+0.06) +0.0%

It doesn't help at all when we have 1 pack (5303.4), but we get a 10%
speedup when there are 1000 packs (5303.12). That's a modest speedup for
a case that's already slow and we'd hope to avoid in general (note how
slow it is even after, because we have to look in each of those packs
for abbreviations). But it's a one-line change that clearly matches the
original intent, so it seems worth doing.

The included perf test may also be useful for keeping an eye on any
regressions in the overall abbreviation code.

Reported-by: Rasmus Villemoes <rv@rasmusvillemoes.dk>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agomergetool: allow auto-merge for meld to follow the vim-diff behavior
Lin Sun [Wed, 6 May 2020 23:31:14 +0000 (07:31 +0800)] 
mergetool: allow auto-merge for meld to follow the vim-diff behavior

Make the mergetool used with "meld" backend behave similarly to "vimdiff" by
telling it to auto-merge non-conflicting parts and highlight the conflicting
parts when `mergetool.meld.useAutoMerge` is configured with `true`, or `auto`
for detecting the `--auto-merge` option automatically.

Helped-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Helped-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Lin Sun <lin.sun@zoom.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoref-filter: allow merged and no-merged filters
Aaron Lipman [Wed, 16 Sep 2020 02:08:40 +0000 (22:08 -0400)] 
ref-filter: allow merged and no-merged filters

Enable ref-filter to process multiple merged and no-merged filters, and
extend functionality to git branch, git tag and git for-each-ref. This
provides an easy way to check for branches that are "graduation
candidates:"

$ git branch --no-merged master --merged next

If passed more than one merged (or more than one no-merged) filter, refs
must be reachable from any one of the merged commits, and reachable from
none of the no-merged commits.

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoDoc: cover multiple contains/no-contains filters
Aaron Lipman [Wed, 16 Sep 2020 02:08:39 +0000 (22:08 -0400)] 
Doc: cover multiple contains/no-contains filters

Update documentation for "git branch", "git for-each-ref" and "git tag"
with notes explaining what happens when passed multiple --contains or
--no-contains filters.

This behavior is useful to document prior to enabling multiple
merged/no-merged filters, in order to demonstrate consistent behavior
between merged/no-merged and contains/no-contains filters.

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot3201: test multiple branch filter combinations
Aaron Lipman [Wed, 16 Sep 2020 02:08:38 +0000 (22:08 -0400)] 
t3201: test multiple branch filter combinations

Add tests covering the behavior of passing multiple contains/no-contains
filters to git branch, e.g.:

$ git branch --contains feature_a --contains feature_b
$ git branch --no-contains feature_a --no-contains feature_b

When passed more than one contains (or no-contains) filter, the tips of
the branches returned must be reachable from any of the contains commits
and from none of the the no-contains commits.

This logic is useful to describe prior to enabling multiple
merged/no-merged filters, so that future tests will demonstrate
consistent behavior between merged/no-merged and contains/no-contains
filters.

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agocommit-graph-format.txt: fix no-parent value
Conor Davis [Tue, 15 Sep 2020 04:03:53 +0000 (04:03 +0000)] 
commit-graph-format.txt: fix no-parent value

The correct value from commit-graph.c:

    #define GRAPH_PARENT_NONE 0x70000000

Signed-off-by: Conor Davis <git@conor.fastmail.fm>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agofetch: pass --ipv4 and --ipv6 options to sub-fetches
Alex Riesen [Tue, 15 Sep 2020 11:54:07 +0000 (13:54 +0200)] 
fetch: pass --ipv4 and --ipv6 options to sub-fetches

The options indicate user intent for the whole fetch operation, and
ignoring them in sub-fetches (i.e. "--all" and recursive fetching of
submodules) is quite unexpected when, for instance, it is intended
to limit all of the communication to a specific transport protocol
for some reason.

Signed-off-by: Alex Riesen <alexander.riesen@cetitec.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoquote: turn 'nodq' parameter into a set of flags
Junio C Hamano [Thu, 10 Sep 2020 17:01:59 +0000 (10:01 -0700)] 
quote: turn 'nodq' parameter into a set of flags

quote_c_style() and its friend quote_two_c_style() both take an
optional "please omit the double quotes around the quoted body"
parameter.  Turn it into a flag word, assign one bit out of it,
and call it CQUOTE_NODQ bit.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoquote: rename misnamed sq_lookup[] to cq_lookup[]
Junio C Hamano [Thu, 10 Sep 2020 17:01:58 +0000 (10:01 -0700)] 
quote: rename misnamed sq_lookup[] to cq_lookup[]

This table is used to see if each byte needs quoting when responding
to a request to C-quote the string, not quoting with single-quote in
the shell style.  Similarly, sq_must_quote() is fed each byte from
the string being C-quoted.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agowt-status: consistently quote paths in "status --short" output
Junio C Hamano [Thu, 10 Sep 2020 17:01:57 +0000 (10:01 -0700)] 
wt-status: consistently quote paths in "status --short" output

Tracked paths with SP in them were cquoted in "git status --short"
output, but untracked, ignored, and unmerged paths weren't.

The test was stolen from a patch to fix output for the 'untracked'
paths by brian m. carlson, with similar tests added for 'ignored'
ones.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoquote_path: code clarification
Junio C Hamano [Thu, 10 Sep 2020 17:01:56 +0000 (10:01 -0700)] 
quote_path: code clarification

The implementation we moved from wt-status to enclose a pathname
that has a SP in it inside a dq-pair is a bit convoluted.  It lets
quote_c_style_counted() do its escaping and then

 (1) if the input string got escaped, which is checked by seeing if
     the result begins with a double-quote, declare that we are
     done.  If there wasn't any SP in the input, that is OK, and if
     there was, the result is quoted already so it is OK, too.

 (2) if the input string did not get escaped, and the result has SP
     in it, enclose the whole thing in a dq-pair ourselves.

Instead we can scan the path upfront to see if the input has SP in
it.  If so, we tell quote_c_style_counted() not to enclose its
output in a dq-pair, and we add a dq-pair ourselves.  Whether the
input had bytes that quote_c_style_counted() uses backslash quoting,
this would give us a desired quoted string.  If the input does not
have SP in it, we just let quote_c_style_counted() do its thing as
usual, which would enclose the result in a dq-pair only when needed.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoquote_path: optionally allow quoting a path with SP in it
Junio C Hamano [Thu, 10 Sep 2020 17:01:55 +0000 (10:01 -0700)] 
quote_path: optionally allow quoting a path with SP in it

Some code in wt-status.c special case a path with SP in it, which
usually does not have to be c-quoted, and ensure that such a path
does get quoted.  Move the logic to quote_path() and give it a bit
in the flags word, QUOTE_PATH_QUOTE_SP.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoquote_path: give flags parameter to quote_path()
Junio C Hamano [Thu, 10 Sep 2020 17:01:54 +0000 (10:01 -0700)] 
quote_path: give flags parameter to quote_path()

The quote_path() function computes a path (relative to its base
directory) and c-quotes the result if necessary.  Teach it to take a
flags parameter to allow its behaviour to be enriched later.

No behaviour change intended.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoquote_path: rename quote_path_relative() to quote_path()
Junio C Hamano [Thu, 10 Sep 2020 17:01:53 +0000 (10:01 -0700)] 
quote_path: rename quote_path_relative() to quote_path()

There is no quote_path_absolute() or anything that causes confusion,
and one of the two large consumers already rename the long name
locally with a preprocessor macro.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoFit to Plan 9's ANSI/POSIX compatibility layer
Kyohei Kadota [Thu, 10 Sep 2020 02:17:41 +0000 (02:17 +0000)] 
Fit to Plan 9's ANSI/POSIX compatibility layer

tr(1) of ANSI/POSIX environment, aka APE, don't support \n literal.
It's handles only octal(\ooo) or hexadecimal(\xhhhh) numbers.

And its sed(1)'s label is limited to maximum seven characters.
Therefore I replaced some labels to drop a character.

* close -> cl
* continue -> cont (cnt is used for count)
* line -> ln
* hered -> hdoc
* shell -> sh
* string -> str

Signed-off-by: Kyohei Kadota <lufia@lufia.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoFourteenth batch
Junio C Hamano [Wed, 9 Sep 2020 20:52:54 +0000 (13:52 -0700)] 
Fourteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoMerge branch 'os/vcbuild'
Junio C Hamano [Wed, 9 Sep 2020 20:53:09 +0000 (13:53 -0700)] 
Merge branch 'os/vcbuild'

Fix build procedure for MSVC.

* os/vcbuild:
  contrib/buildsystems: fix expat library name for generated vcxproj
  vcbuild: fix batch file name in README
  vcbuild: fix library name for expat with make MSVC=1

3 years agoMerge branch 'jt/interpret-branch-name-fallback'
Junio C Hamano [Wed, 9 Sep 2020 20:53:08 +0000 (13:53 -0700)] 
Merge branch 'jt/interpret-branch-name-fallback'

"git status" has trouble showing where it came from by interpreting
reflog entries that recordcertain events, e.g. "checkout @{u}", and
gives a hard/fatal error.  Even though it inherently is impossible
to give a correct answer because the reflog entries lose some
information (e.g. "@{u}" does not record what branch the user was
on hence which branch 'the upstream' needs to be computed, and even
if the record were available, the relationship between branches may
have changed), at least hide the error to allow "status" show its
output.

* jt/interpret-branch-name-fallback:
  wt-status: tolerate dangling marks
  refs: move dwim_ref() to header file
  sha1-name: replace unsigned int with option struct

3 years agoMerge branch 'js/ci-squelch-false-failure'
Junio C Hamano [Wed, 9 Sep 2020 20:53:08 +0000 (13:53 -0700)] 
Merge branch 'js/ci-squelch-false-failure'

CI noise reduction.

* js/ci-squelch-false-failure:
  ci: avoid ugly "failure" in the `ci-config` job
  ci: fix indentation of the `ci-config` job

3 years agoMerge branch 'pb/imap-send-updates'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'pb/imap-send-updates'

"git imap-send" updates.

* pb/imap-send-updates:
  git-imap-send.txt: add note about localized Gmail folders
  git-imap-send.txt: do verify SSL certificate for gmail.com
  git-imap-send.txt: don't duplicate 'Examples' sections

3 years agoMerge branch 'hv/ref-filter-misc'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'hv/ref-filter-misc'

The "--format=" option to the "for-each-ref" command and friends
learned a few more tricks, e.g. the ":short" suffix that applies to
"objectname" now also can be used for "parent", "tree", etc.

* hv/ref-filter-misc:
  ref-filter: add `sanitize` option for 'subject' atom
  pretty: refactor `format_sanitized_subject()`
  ref-filter: add `short` modifier to 'parent' atom
  ref-filter: add `short` modifier to 'tree' atom
  ref-filter: rename `objectname` related functions and fields
  ref-filter: modify error messages in `grab_objectname()`
  ref-filter: refactor `grab_objectname()`
  ref-filter: support different email formats

3 years agoMerge branch 'ss/submodule-summary-in-c-fixes'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'ss/submodule-summary-in-c-fixes'

Fixups to a topic in 'next'.

* ss/submodule-summary-in-c-fixes:
  t7421: eliminate 'grep' check in t7421.4 for mingw compatibility
  submodule: fix style in function definition
  submodule: eliminate unused parameters from print_submodule_summary()

3 years agoMerge branch 'so/separate-field-for-m-and-diff-merges'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'so/separate-field-for-m-and-diff-merges'

Internal API clean-up to handle two options "diff-index" and "log"
have, which happen to share the same short form, more sensibly.

* so/separate-field-for-m-and-diff-merges:
  revision: add separate field for "-m" of "diff-index -m"

3 years agoMerge branch 'es/worktree-repair'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'es/worktree-repair'

"git worktree" gained a "repair" subcommand to help users recover
after moving the worktrees or repository manually without telling
Git.  Also, "git init --separate-git-dir" no longer corrupts
administrative data related to linked worktrees.

* es/worktree-repair:
  init: make --separate-git-dir work from within linked worktree
  init: teach --separate-git-dir to repair linked worktrees
  worktree: teach "repair" to fix outgoing links to worktrees
  worktree: teach "repair" to fix worktree back-links to main worktree
  worktree: add skeleton "repair" command

3 years agoMerge branch 'jk/worktree-check-clean-leakfix'
Junio C Hamano [Wed, 9 Sep 2020 20:53:07 +0000 (13:53 -0700)] 
Merge branch 'jk/worktree-check-clean-leakfix'

Leakfix.

* jk/worktree-check-clean-leakfix:
  worktree: fix leak in check_clean_worktree()

3 years agoMerge branch 'tb/repack-clearing-midx'
Junio C Hamano [Wed, 9 Sep 2020 20:53:06 +0000 (13:53 -0700)] 
Merge branch 'tb/repack-clearing-midx'

When a packfile is removed by "git repack", multi-pack-index gets
cleared; the code was taught to do so less aggressively by first
checking if the midx actually refers to a pack that no longer
exists.

* tb/repack-clearing-midx:
  midx: traverse the local MIDX first
  builtin/repack.c: invalidate MIDX only when necessary

3 years agoMerge branch 'ss/submodule-summary-in-c'
Junio C Hamano [Wed, 9 Sep 2020 20:53:05 +0000 (13:53 -0700)] 
Merge branch 'ss/submodule-summary-in-c'

Yet another subcommand of "git submodule" is getting rewritten in C.

* ss/submodule-summary-in-c:
  submodule: port submodule subcommand 'summary' from shell to C
  t7421: introduce a test script for verifying 'summary' output
  submodule: rename helper functions to avoid ambiguity
  submodule: remove extra line feeds between callback struct and macro

3 years agorefs: add GIT_TRACE_REFS debugging mechanism
Han-Wen Nienhuys [Wed, 9 Sep 2020 10:15:08 +0000 (10:15 +0000)] 
refs: add GIT_TRACE_REFS debugging mechanism

When set in the environment, GIT_TRACE_REFS makes git print operations and
results as they flow through the ref storage backend. This helps debug
discrepancies between different ref backends.

Example:

    $ GIT_TRACE_REFS="1" ./git branch
    15:42:09.769631 refs/debug.c:26         ref_store for .git
    15:42:09.769681 refs/debug.c:249        read_raw_ref: HEAD: 0000000000000000000000000000000000000000 (=> refs/heads/ref-debug) type 1: 0
    15:42:09.769695 refs/debug.c:249        read_raw_ref: refs/heads/ref-debug: 3a238e539bcdfe3f9eb5010fd218640c1b499f7a (=> refs/heads/ref-debug) type 0: 0
    15:42:09.770282 refs/debug.c:233        ref_iterator_begin: refs/heads/ (0x1)
    15:42:09.770290 refs/debug.c:189        iterator_advance: refs/heads/b4 (0)
    15:42:09.770295 refs/debug.c:189        iterator_advance: refs/heads/branch3 (0)

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoadd -p: fix editing of intent-to-add paths
Phillip Wood [Wed, 9 Sep 2020 13:58:52 +0000 (13:58 +0000)] 
add -p: fix editing of intent-to-add paths

A popular way of partially staging a new file is to run `git add -N
<path>` and then use the hunk editing of `git add -p` to select the
part of the file that the user wishes to stage. Since
85953a3187 ("diff-files --raw: show correct post-image of
intent-to-add files", 2020-07-01) this has stopped working as
intent-to-add paths are now show as new files rather than changes to
an empty blob and `git apply` refused to apply a creation patch for a
path that was marked as intent-to-add. 7cfde3fa0f ("apply: allow "new
file" patches on i-t-a entries", 2020-08-06) fixed the problem with
apply but it still wasn't possible to edit the added hunk properly.

2c8bd8471a ("checkout -p: handle new files correctly", 2020-05-27)
had previously changed `add -p` to handle new files but it did not
implement patch editing correctly. The perl version simply forbade
editing and the C version opened the editor with the full diff rather
that just the hunk which meant that the user had to edit the hunk
header manually to get it to work.

The root cause of the problem is that added files store the diff header
with the hunk data rather than separating the two as we do for other
changes. Changing added files to store the diff header separately
fixes the editing problem at the expense of having to special case
empty additions as they no longer have any hunks associated with them,
only the diff header.

The changes move some existing code into a conditional changing the
indentation, they are best viewed with
--color-moved-ws=allow-indentation-change (or --ignore-space-change
works well to get an overview of the changes)

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Reported-by: Thomas Sullivan <tom@msbit.com.au>
Reported-by: Yuchen Ying <ych@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoconfig: complain about --worktree outside of a git repo
Matheus Tavares [Wed, 9 Sep 2020 13:16:08 +0000 (10:16 -0300)] 
config: complain about --worktree outside of a git repo

Running `git config --worktree` outside of a git repository hits a BUG()
when trying to enumerate the worktrees. Let's catch this error earlier
and die() with a friendlier message.

Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoMakefile: allow extra tweaking of distribution tarball
Junio C Hamano [Wed, 9 Sep 2020 18:53:04 +0000 (11:53 -0700)] 
Makefile: allow extra tweaking of distribution tarball

The maintainer's dist rules are used to produce distribution
tarballs.  They use "$(TAR) cf" and "$(TAR) rf" to produce archives
out of a freshly created local installation area, which means that
the built product can be affected by maintainer's umask and other
local environment.

Implementations of "tar" have ways (implementation specific,
unfortunately) to force permission bits and other stuff to allow the
user to hide these effects coming from the local environment.  Teach
our Makefile to allow the maintainer to tweak the invocation of the
$(TAR) commands by setting TAR_DIST_EXTRA_OPTS.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoblame.c: replace instance of !oidcmp for oideq
Edmundo Carmona Antoranz [Tue, 8 Sep 2020 21:10:53 +0000 (15:10 -0600)] 
blame.c: replace instance of !oidcmp for oideq

0906ac2b (blame: use changed-path Bloom filters, 2020-04-16)
introduced a call to oidcmp() that should have been oideq(), which
was introduced in 14438c44 (introduce hasheq() and oideq(),
2018-08-28).

Signed-off-by: Edmundo Carmona Antoranz <eantoranz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoindex-pack: make quantum of work smaller
Jonathan Tan [Tue, 8 Sep 2020 19:48:35 +0000 (12:48 -0700)] 
index-pack: make quantum of work smaller

Currently, when index-pack resolves deltas, it does not split up delta
trees into threads: each delta base root (an object that is not a
REF_DELTA or OFS_DELTA) can go into its own thread, but all deltas on
that root (direct or indirect) are processed in the same thread.

This is a problem when a repository contains a large text file (thus,
delta-able) that is modified many times - delta resolution time during
fetching is dominated by processing the deltas corresponding to that
text file.

This patch contains a solution to that. When cloning using

  git -c core.deltabasecachelimit=1g clone \
    https://fuchsia.googlesource.com/third_party/vulkan-cts

on my laptop, clone time improved from 3m2s to 2m5s (using 3 threads,
which is the default).

The solution is to have a global work stack. This stack contains delta
bases (objects, whether appearing directly in the packfile or generated
by delta resolution, that themselves have delta children) that need to
be processed; whenever a thread needs work, it peeks at the top of the
stack and processes its next unprocessed child. If a thread finds the
stack empty, it will look for more delta base roots to push on the stack
instead.

The main weakness of having a global work stack is that more time is
spent in the mutex, but profiling has shown that most time is spent in
the resolution of the deltas themselves, so this shouldn't be an issue
in practice. In any case, experimentation (as described in the clone
command above) shows that this patch is a net improvement.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agorefs: move REF_LOG_ONLY to refs-internal.h
Han-Wen Nienhuys [Fri, 28 Aug 2020 15:25:33 +0000 (15:25 +0000)] 
refs: move REF_LOG_ONLY to refs-internal.h

REF_LOG_ONLY is used in the transaction preparation: if a symref is involved in
a transaction, the referent of the symref should be updated, and the symref
itself should only be updated in the reflog.

Other ref backends will need to duplicate this logic too, so move it to a
central place.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agot3200: clean side effect of git checkout --orphan
Aaron Lipman [Sun, 30 Aug 2020 22:42:00 +0000 (18:42 -0400)] 
t3200: clean side effect of git checkout --orphan

The "refuse --edit-description on unborn branch for now" test in t3200
switches to an orphan branch, causing subsequent git commands
referencing HEAD to fail. Avoid this side-effect by switching back to
master after the test finishes.

This has gone undetected, as the next affected test expects failure -
but it currently fails for the wrong reason.

Verbose output of the next test referencing HEAD,
"--merged is incompatible with --no-merged":

  fatal: malformed object name HEAD

Which this commit corrects to:

  error: option `no-merged' is incompatible with --merged

Signed-off-by: Aaron Lipman <alipman88@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoformat-patch: use 'origin' as start of current-series-range when known
Eric Sunshine [Tue, 8 Sep 2020 07:16:10 +0000 (03:16 -0400)] 
format-patch: use 'origin' as start of current-series-range when known

When formatting a patch series over `origin..HEAD`, one would expect
that range to be used as the current-series-range when computing a
range-diff between the previous and current versions of a patch series.
However, infer_range_diff_ranges() ignores `origin..HEAD` when
--range-diff=<prev> specifies a single revision rather than a range, and
instead unexpectedly computes the current-series-range based upon
<prev>. Address this anomaly by unconditionally using `origin..HEAD` as
the current-series-range regardless of <prev> as long as `origin` is
known, and only fall back to basing current-series-range on <prev> when
`origin` is not known.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agodiff-lib: tighten show_interdiff()'s interface
Eric Sunshine [Tue, 8 Sep 2020 07:16:09 +0000 (03:16 -0400)] 
diff-lib: tighten show_interdiff()'s interface

To compute and show an interdiff, show_interdiff() needs only the two
OID's to compare and a diffopts, yet it expects callers to supply an
entire rev_info. The demand for rev_info is not only overkill, but also
places unnecessary burden on potential future callers which might not
otherwise have a rev_info at hand. Address this by tightening its
signature to require only the items it needs instead of a full rev_info.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agodiff: move show_interdiff() from its own file to diff-lib
Eric Sunshine [Tue, 8 Sep 2020 07:16:08 +0000 (03:16 -0400)] 
diff: move show_interdiff() from its own file to diff-lib

show_interdiff() is a relatively small function and not likely to grow
larger or more complicated. Rather than dedicating an entire source file
to it, relocate it to diff-lib.c which houses other "take two things and
compare them" functions meant to be re-used but not so low-level as to
reside in the core diff implementation.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoadd -i: use the built-in version when feature.experimental is set
Junio C Hamano [Tue, 8 Sep 2020 21:53:36 +0000 (14:53 -0700)] 
add -i: use the built-in version when feature.experimental is set

We have had parallel implementations of "add -i/-p" since 2.25 and
have been using them from various codepaths since 2.26 days, but
never made the built-in version the default.

We have found and fixed a handful of corner case bugs in the
built-in version, and it may be a good time to start switching over
the user base from the scripted version to the built-in version.
Let's enable the built-in version for those who opt into the
feature.experimental guinea-pig program to give wider exposure.

Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoadd -p: fix memory leak
Phillip Wood [Mon, 7 Sep 2020 15:04:00 +0000 (15:04 +0000)] 
add -p: fix memory leak

asan reports that the C version of `add -p` is not freeing all the
memory it allocates. Fix this by introducing a function to clear
`struct add_p_state` and use it instead of freeing individual members.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agocontrib/buildsystems: fix expat library name for generated vcxproj
Orgad Shaneh [Mon, 7 Sep 2020 06:00:05 +0000 (06:00 +0000)] 
contrib/buildsystems: fix expat library name for generated vcxproj

expat.lib -> libexpat.lib (libexpatd.lib for debug build).

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoadd--interactive.perl: specify --no-color explicitly
Jeff King [Mon, 7 Sep 2020 08:17:39 +0000 (04:17 -0400)] 
add--interactive.perl: specify --no-color explicitly

Our color tests of "git add -p" do something a bit different from how a
normal user would behave: we pretend there's a pager in use, so that Git
thinks it's OK to write color to a non-tty stdout.  This comes from
8539b46534 (t3701: avoid depending on the TTY prerequisite, 2019-12-06),
which allows us to avoid a lot of complicated mock-tty code.

However, those environment variables also make their way down to
sub-processes of add--interactive, including the "diff-files" we run to
generate the patches. As a result, it thinks it should output color,
too. So in t3701.50, for example, the machine-readable version of the
diff we get unexpectedly has color in it. We fail to parse it as a diff
and think there are zero hunks.

The test does still pass, though, because even with zero hunks we'll
dump the diff header (and we consider those unparseable bits to be part
of the header!), and so the output still has the expected color codes in
it. We don't notice that the command was totally broken and failed to
apply anything.

And in fact we're not really testing what we think we are about the
color, either. While add--interactive does correctly show the version we
got from running "diff-files --color", we'd also pass the test if we had
accidentally shown the machine-readable version, too, since it
(erroneously) has color codes in it.

One could argue that the test isn't very realistic; it's setting up this
"pretend there's a pager" situation to get around the tty restrictions
of the test environment. So one option would be to move back towards
using a real tty. But the behavior of add--interactive really is
user-visible here. If a user, for whatever reason, did run "git
--paginate add --patch" (perhaps because their pager is really a filter
or something), the command would totally fail to do anything useful.

Since we know that we don't want color in this output, let's just make
add--interactive more defensive, and say "--no-color" explicitly. It
doesn't hurt anything in the common case, but it fixes this odd case and
lets our test function properly again.

Note that the C builtin run_add_p() already passes --no-color, so it
doesn't need a similar fix. That will eventually replace this perl code
anyway, but the test change here will be valuable for ensuring that.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoadd-patch: fix inverted return code of repo_read_index()
Jeff King [Mon, 7 Sep 2020 08:08:53 +0000 (04:08 -0400)] 
add-patch: fix inverted return code of repo_read_index()

After applying hunks to a file with "add -p", the C patch_update_file()
function tries to refresh the index (just like the perl version does).
We can only refresh the index if we're able to read it in, so we first
check the return value of repo_read_index(). But unlike many functions,
where "0" is success, that function is documented to return the number
of entries in the index.  Hence we should be checking for success with a
non-negative return value.

Neither the tests nor any users seem to have noticed this, probably due
to a combination of:

  - this affects only the C version, which is not yet the default

  - following it up with any porcelain command like "git diff" or "git
    commit" would refresh the index automatically.

But you can see the problem by running the plumbing "git diff-files"
immediately after "add -p" stages all hunks. Running the new test with
GIT_TEST_ADD_I_USE_BUILTIN=1 fails without the matching code change.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agogit-worktree.txt: discuss branch-based vs. throwaway worktrees
Eric Sunshine [Mon, 7 Sep 2020 00:02:22 +0000 (20:02 -0400)] 
git-worktree.txt: discuss branch-based vs. throwaway worktrees

By default, `git worktree add` creates a new worktree associated with a
particular branch (which may have been created automatically if not
specified explicitly on the command-line). It is also convenient to
create throwaway worktrees not associated with any branch, which can be
handy when making experimental changes or doing testing. However, the
latter use-case may not be obvious to newcomers since the high-level
description of worktrees talks only about checking out "more than one
branch at a time". Therefore, enhance the description to to discuss both
use-cases.

A secondary goal of highlighting the distinction between branch-based
and throwaway worktrees is to help newcomers understand that the
simplest form `git worktree add <path>` automatically creates a new
branch. Stating this early in the description, may help newcomers avoid
creating branches without realizing they are doing so, and later
wondering why `git branch --list` shows branches the user did not
intentionally create.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoworktree: teach `add` to recognize -d as shorthand for --detach
Eric Sunshine [Mon, 7 Sep 2020 00:02:21 +0000 (20:02 -0400)] 
worktree: teach `add` to recognize -d as shorthand for --detach

Like `git switch` and `git checkout`, `git worktree add` can check out a
branch or set up a detached HEAD. However, unlike those other commands,
`git worktree add` does not understand -d as shorthand for --detach,
which may confound users accustomed to using -d for this purpose.
Address this shortcoming by teaching `add` to recognize -d for --detach,
thus bringing it in line with the other commands.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agogit-checkout.txt: document -d short option for --detach
Eric Sunshine [Mon, 7 Sep 2020 00:02:20 +0000 (20:02 -0400)] 
git-checkout.txt: document -d short option for --detach

`git checkout` learned -d as short option for --detach in 163e3b2975
(switch: add short option for --detach, 2019-03-29) but the
documentation was never updated to reflect the change.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agosubmodule: suppress checking for file name and ref ambiguity for object ids
Orgad Shaneh [Sun, 6 Sep 2020 20:53:55 +0000 (20:53 +0000)] 
submodule: suppress checking for file name and ref ambiguity for object ids

The argv argument of collect_changed_submodules() contains only object ids
(the objects references of all the refs).

Notify setup_revisions() that the input is not filenames by passing
assume_dashdash, so it can avoid redundant stat for each ref.

Also suppress refname_ambiguity flag to avoid filesystem lookups for
each object. Similar logic can be found in cat-file, pack-objects and more.

This change reduces the time for git fetch in my repo from 25s to 6s.

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agopack-bitmap-write: use hashwrite_be32() in write_hash_cache()
René Scharfe [Sun, 6 Sep 2020 08:59:06 +0000 (10:59 +0200)] 
pack-bitmap-write: use hashwrite_be32() in write_hash_cache()

Call hashwrite_be32() instead of open-coding it.  This is shorter and
easier to read.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agomidx: use hashwrite_u8() in write_midx_header()
René Scharfe [Sun, 6 Sep 2020 08:59:02 +0000 (10:59 +0200)] 
midx: use hashwrite_u8() in write_midx_header()

Emit byte-sized values using hashwrite_u8() instead of buffering them
locally first.  The hashwrite functions already do their own buffering,
so this double-buffering does not reduce the number of system calls.
Getting rid of it shortens and simplifies the code a bit.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agofast-import: use write_pack_header()
René Scharfe [Sun, 6 Sep 2020 08:39:23 +0000 (10:39 +0200)] 
fast-import: use write_pack_header()

Call write_pack_header() to hash and write a pack header instead of
open-coding this function.  This gets rid of duplicate code and of the
magic version number 2 -- which has been used here since c90be46abd
(Changed fast-import's pack header creation to use pack.h, 2006-08-16)
and in pack.h (again) since 29f049a0c2 (Revert "move pack creation to
version 3", 2006-10-14).

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agorefspec: add and use refspec_appendf()
René Scharfe [Sat, 5 Sep 2020 14:49:30 +0000 (16:49 +0200)] 
refspec: add and use refspec_appendf()

Add a function for building a refspec using printf-style formatting.  It
frees callers from managing their own buffer.  Use it throughout the
tree to shorten and simplify its callers.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agopush: release strbufs used for refspec formatting
René Scharfe [Sat, 5 Sep 2020 14:47:47 +0000 (16:47 +0200)] 
push: release strbufs used for refspec formatting

map_refspec() either returns the passed in ref string or a detached
strbuf.  This makes it hard for callers to release the possibly
allocated memory, and set_refspecs() consequently leaks it.

Let map_refspec() append any refspecs directly and release its own
strbufs after use.  Rename it to refspec_append_mapped() and don't
return anything to reflect its increased responsibility.

set_refspecs() also leaks its strbufs.  Do the same here and directly
call refspec_append() in each if branch instead of holding onto a
detached strbuf, then dispose of the allocated memory after use.  We
need to add an else branch for the final call because all the other
conditional branches already add their formatted refspec now.

setup_push_upstream() and setup_push_current() forgot to release their
strbufs as well; plug these leaks, too, while at it.

None of these leaks were likely to impact users, because the number
and sizes of refspecs are usually small and the allocations are only
done once per program run.  Clean them up nevertheless, as another
step on the long road towards zero memory leaks.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoread-cache: fix mem-pool allocation for multi-threaded index loading
René Scharfe [Fri, 4 Sep 2020 17:33:55 +0000 (19:33 +0200)] 
read-cache: fix mem-pool allocation for multi-threaded index loading

44c7e1a7e0 (mem-pool: use more standard initialization and finalization,
2020-08-15) moved the allocation of the mem-pool structure to callers.
It also added an allocation to load_cache_entries_threaded(), but for an
unrelated mem-pool.  Fix that by allocating the correct one instead --
the one that is initialized two lines later.

Reported-by: Sandor Bodo-Merle <sbodomerle@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoMakefile: add support for generating JSON compilation database
Philippe Blain [Thu, 3 Sep 2020 22:13:38 +0000 (22:13 +0000)] 
Makefile: add support for generating JSON compilation database

Tools based on LibClang [1] can make use of a 'JSON Compilation
Database' [2] that keeps track of the exact options used to compile a set
of source files.

For example, clangd [3], which is a C language server protocol
implementation, can use a JSON compilation database to determine the
flags needed to compile a file so it can provide proper editor
integration.  As a result, editors supporting the language server
protocol (such as VS Code, Emacs, or Vim, with suitable plugins) can
provide better searching, integration, and refactoring tools.

The Clang compiler can generate JSON fragments when compiling [4],
using the `-MJ` flag. These JSON fragments (one per compiled source
file) can then be concatenated to create the compilation database,
commonly called 'compile_commands.json'.

Add support to the Makefile for generating these JSON fragments as well
as the compilation database itself, if the environment variable
'GENERATE_COMPILATION_DATABASE' is set.

If this variable is set, check that $(CC) indeed supports the `-MJ`
flag, following what is done for automatic dependencies.

All JSON fragments are placed in the 'compile_commands/' directory, and
the compilation database 'compile_commands.json' is generated as a
dependency of the 'all' target using a `sed` invocation.

[1] https://clang.llvm.org/docs/Tooling.html
[2] https://clang.llvm.org/docs/JSONCompilationDatabase.html
[3] https://clangd.llvm.org/
[4] https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mj-arg

Helped-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agolog_tree_diff: get rid of extra check for NULL
Sergey Organov [Fri, 28 Aug 2020 11:05:26 +0000 (14:05 +0300)] 
log_tree_diff: get rid of extra check for NULL

Get rid of needless check of 'parents' for NULL. The NULL case
is already handled right above, and 'parents' is dereferenced
without check below anyway.

Signed-off-by: Sergey Organov <sorganov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agolog_tree_diff: get rid of code duplication for first_parent_only
Sergey Organov [Fri, 28 Aug 2020 11:05:25 +0000 (14:05 +0300)] 
log_tree_diff: get rid of code duplication for first_parent_only

Handle first_parent_only by breaking from generic loop early
rather than by duplicating (part of) the loop body.

Signed-off-by: Sergey Organov <sorganov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agofetch: do not look for submodule changes in unchanged refs
Orgad Shaneh [Fri, 4 Sep 2020 13:50:49 +0000 (13:50 +0000)] 
fetch: do not look for submodule changes in unchanged refs

When fetching recursively with submodules, for each ref in the
superproject, we call check_for_new_submodule_commits() which collects all
the objects that have to be checked for submodule changes on
calculate_changed_submodule_paths(). On the first call, it also collects all
the existing refs for excluding them from the scan.

calculate_changed_submodule_paths() creates an argument array with all the
collected new objects, followed by --not and all the old objects. This argv
is passed to setup_revisions, which parses each argument, converts it back
to an oid and resolves the object. The parsing itself also does redundant
work, because it is treated like user input, while in fact it is a full
oid. So it needlessly attempts to look it up as ref (checks if it has ^, ~
etc.), checks if it is a file name etc.

For a repository with many refs, all of this is expensive. But if the fetch
in the superproject did not update the ref (i.e. the objects that are
required to exist in the submodule did not change), there is no need to
include it in the list.

Before commit be76c212 (fetch: ensure submodule objects fetched,
2018-12-06), submodule reference changes were only detected for refs that
were changed, but not for new refs. This commit covered also this case, but
what it did was to just include every ref.

This change should reduce the number of scanned refs by about half (except
the case of a no-op fetch, which will not scan any ref), because all the
existing refs will still be listed after --not.

The regression was reported here:
https://public-inbox.org/git/CAGHpTBKSUJzFSWc=uznSu2zB33qCSmKXM-
iAjxRCpqNK5bnhRg@mail.gmail.com/

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoThirteenth batch
Junio C Hamano [Thu, 3 Sep 2020 19:23:59 +0000 (12:23 -0700)] 
Thirteenth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
3 years agoMerge branch 'pb/doc-external-diff-env'
Junio C Hamano [Thu, 3 Sep 2020 19:37:09 +0000 (12:37 -0700)] 
Merge branch 'pb/doc-external-diff-env'

Doc update.

* pb/doc-external-diff-env:
  git.txt: correct stale 'GIT_EXTERNAL_DIFF' description

3 years agoMerge branch 'jk/xrealloc-avoid-use-after-free'
Junio C Hamano [Thu, 3 Sep 2020 19:37:08 +0000 (12:37 -0700)] 
Merge branch 'jk/xrealloc-avoid-use-after-free'

It was possible for xrealloc() to send a non-NULL pointer that has
been freed, which has been fixed.

* jk/xrealloc-avoid-use-after-free:
  xrealloc: do not reuse pointer freed by zero-length realloc()