]> granicus.if.org Git - git/log
git
5 years agoMerge branch 'js/git-path-head-dot-lock-fix' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:23 +0000 (12:30 +0900)]
Merge branch 'js/git-path-head-dot-lock-fix' into next

"git rev-parse --git-path HEAD.lock" did not give the right path
when run in a secondary worktree.

* js/git-path-head-dot-lock-fix:
  git_path(): handle `.lock` files correctly
  t1400: wrap setup code in test case

5 years agoMerge branch 'jc/log-graph-simplify' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:22 +0000 (12:30 +0900)]
Merge branch 'jc/log-graph-simplify' into next

The implementation of "git log --graph" got refactored and then its
output got simplified.

* jc/log-graph-simplify:
  graph: fix coloring of octopus dashes
  graph: flatten edges that fuse with their right neighbor
  graph: smooth appearance of collapsing edges on commit lines
  graph: rename `new_mapping` to `old_mapping`
  graph: commit and post-merge lines for left-skewed merges
  graph: tidy up display of left-skewed merges
  graph: example of graph output that can be simplified
  graph: extract logic for moving to GRAPH_PRE_COMMIT state
  graph: remove `mapping_idx` and `graph_update_width()`
  graph: reduce duplication in `graph_insert_into_new_columns()`
  graph: reuse `find_new_column_by_commit()`
  graph: handle line padding in `graph_next_line()`
  graph: automatically track display width of graph lines

5 years agoMerge branch 'en/merge-recursive-directory-rename-fixes' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:22 +0000 (12:30 +0900)]
Merge branch 'en/merge-recursive-directory-rename-fixes' into next

When all files from some subdirectory were renamed to the root
directory, the directory rename heuristics would fail to detect that
as a rename/merge of the subdirectory to the root directory, which has
been corrected.

* en/merge-recursive-directory-rename-fixes:
  t604[236]: do not run setup in separate tests
  merge-recursive: fix merging a subdirectory into the root directory
  merge-recursive: clean up get_renamed_dir_portion()

5 years agoMerge branch 'js/rebase-deprecate-preserve-merges' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:22 +0000 (12:30 +0900)]
Merge branch 'js/rebase-deprecate-preserve-merges' into next

"git rebase --preserve-merges" has been marked as deprecated; this
release stops advertising it in the "git rebase -h" output.

* js/rebase-deprecate-preserve-merges:
  rebase: hide --preserve-merges option

5 years agoMerge branch 'hv/bitshift-constants-in-blame' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:22 +0000 (12:30 +0900)]
Merge branch 'hv/bitshift-constants-in-blame' into next

Move the definition of a set of bitmask constants from 0ctal
literal to (1U<<count) notation.

* hv/bitshift-constants-in-blame:
  builtin/blame.c: constants into bit shift format

5 years agoMerge branch 'sg/ci-osx-gcc8-fix' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:21 +0000 (12:30 +0900)]
Merge branch 'sg/ci-osx-gcc8-fix' into next

CI build fix.

* sg/ci-osx-gcc8-fix:
  ci: fix GCC install in the Travis CI GCC OSX job

5 years agoMerge branch 'ds/feature-macros' into next
Junio C Hamano [Thu, 24 Oct 2019 03:30:21 +0000 (12:30 +0900)]
Merge branch 'ds/feature-macros' into next

The codepath that reads the index.version configuration was broken
with a recent update, which has been corrected.

* ds/feature-macros:
  repo-settings: read an int for index.version

5 years agogit_path(): handle `.lock` files correctly
Johannes Schindelin [Mon, 21 Oct 2019 21:54:42 +0000 (21:54 +0000)]
git_path(): handle `.lock` files correctly

Ever since worktrees were introduced, the `git_path()` function _really_
needed to be called e.g. to get at the path to `logs/HEAD` (`HEAD` is
specific to the worktree, and therefore so is its reflog). However, the
wrong path is returned for `logs/HEAD.lock`.

This does not matter as long as the Git executable is doing the asking,
as the path for that `logs/HEAD.lock` file is constructed from
`git_path("logs/HEAD")` by appending the `.lock` suffix.

However, Git GUI just learned to use `--git-path` instead of appending
relative paths to what `git rev-parse --git-dir` returns (and as a
consequence not only using the correct hooks directory, but also using
the correct paths in worktrees other than the main one). While it does
not seem as if Git GUI in particular is asking for `logs/HEAD.lock`,
let's be safe rather than sorry.

Side note: Git GUI _does_ ask for `index.lock`, but that is already
resolved correctly, due to `update_common_dir()` preferring to leave
unknown paths in the (worktree-specific) git directory.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agorepo-settings: read an int for index.version
Derrick Stolee [Wed, 23 Oct 2019 20:38:57 +0000 (20:38 +0000)]
repo-settings: read an int for index.version

Several config options were combined into a repo_settings struct in
ds/feature-macros, including a move of the "index.version" config
setting in 7211b9e (repo-settings: consolidate some config settings,
2019-08-13).

Unfortunately, that file looked like a lot of boilerplate and what is
clearly a factor of copy-paste overload, the config setting is parsed
with repo_config_ge_bool() instead of repo_config_get_int(). This means
that a setting "index.version=4" would not register correctly and would
revert to the default version of 3.

I caught this while incorporating v2.24.0-rc0 into the VFS for Git
codebase, where we really care that the index is in version 4.

This was not caught by the codebase because the version checks placed
in t1600-index.sh did not test the "basic" scenario enough. Here, we
modify the test to include these normal settings to not be overridden by
features.manyFiles or GIT_INDEX_VERSION. While the "default" version is
3, this is demoted to version 2 in do_write_index() when not necessary.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoci: fix GCC install in the Travis CI GCC OSX job
SZEDER Gábor [Thu, 24 Oct 2019 00:20:40 +0000 (02:20 +0200)]
ci: fix GCC install in the Travis CI GCC OSX job

A few days ago Travis CI updated their existing OSX images, including
the Homebrew database in the xcode10.1 OSX image that we use.  Since
then installing dependencies in the 'osx-gcc' job fails when it tries
to link gcc@8:

  + brew link gcc@8
  Error: No such keg: /usr/local/Cellar/gcc@8

GCC8 is still installed but not linked to '/usr/local' in the updated
image, as it was before this update, but now we have to link it by
running 'brew link gcc'.  So let's do that then, and fall back to
linking gcc@8 if it doesn't, just to be sure.

Our builds on Azure Pipelines are unaffected by this issue.  The OSX
image over there doesn't contain the gcc@8 package, so we have to
'brew install' it, which already takes care of linking it to
'/usr/local'.  After that the 'brew link gcc' command added by this
patch fails, but the ||-chained fallback 'brew link gcc@8' command
succeeds with an "already linked" warning.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoSync with master
Junio C Hamano [Wed, 23 Oct 2019 07:47:16 +0000 (16:47 +0900)]
Sync with master

* master:
  Eleventh batch

5 years agoMerge branch 'bw/format-patch-o-create-leading-dirs' into next
Junio C Hamano [Wed, 23 Oct 2019 07:47:10 +0000 (16:47 +0900)]
Merge branch 'bw/format-patch-o-create-leading-dirs' into next

Test update.

* bw/format-patch-o-create-leading-dirs:
  t4014: make output-directory tests self-contained

5 years agoMerge branch 'dl/submodule-set-branch' into next
Junio C Hamano [Wed, 23 Oct 2019 07:47:09 +0000 (16:47 +0900)]
Merge branch 'dl/submodule-set-branch' into next

Test update.

* dl/submodule-set-branch:
  t7419: change test_must_fail to ! for grep

5 years agoEleventh batch
Junio C Hamano [Wed, 23 Oct 2019 05:42:27 +0000 (14:42 +0900)]
Eleventh batch

The tenth was at -rc0 ;-)

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoMerge branch 'cb/pcre2-chartables-leakfix'
Junio C Hamano [Wed, 23 Oct 2019 05:43:11 +0000 (14:43 +0900)]
Merge branch 'cb/pcre2-chartables-leakfix'

Leakfix.

* cb/pcre2-chartables-leakfix:
  grep: avoid leak of chartables in PCRE2
  grep: make PCRE2 aware of custom allocator
  grep: make PCRE1 aware of custom allocator

5 years agoMerge branch 'bc/smart-http-atomic-push'
Junio C Hamano [Wed, 23 Oct 2019 05:43:11 +0000 (14:43 +0900)]
Merge branch 'bc/smart-http-atomic-push'

The atomic push over smart HTTP transport did not work, which has
been corrected.

* bc/smart-http-atomic-push:
  remote-curl: pass on atomic capability to remote side

5 years agoMerge branch 'wb/fsmonitor-bitmap-fix'
Junio C Hamano [Wed, 23 Oct 2019 05:43:10 +0000 (14:43 +0900)]
Merge branch 'wb/fsmonitor-bitmap-fix'

A segfault fix.

* wb/fsmonitor-bitmap-fix:
  fsmonitor: don't fill bitmap with entries to be removed

5 years agoMerge branch 'sb/userdiff-dts'
Junio C Hamano [Wed, 23 Oct 2019 05:43:10 +0000 (14:43 +0900)]
Merge branch 'sb/userdiff-dts'

Tweak userdiff patterns for dts.

* sb/userdiff-dts:
  userdiff: fix some corner cases in dts regex

5 years agoMerge branch 'sg/progress-fix'
Junio C Hamano [Wed, 23 Oct 2019 05:43:09 +0000 (14:43 +0900)]
Merge branch 'sg/progress-fix'

Byte-order fix the recent update to progress display code.

* sg/progress-fix:
  test-progress: fix test failures on big-endian systems

5 years agoMerge branch 'nr/diff-highlight-indent-fix'
Junio C Hamano [Wed, 23 Oct 2019 05:43:09 +0000 (14:43 +0900)]
Merge branch 'nr/diff-highlight-indent-fix'

Code cleanup.

* nr/diff-highlight-indent-fix:
  diff-highlight: fix a whitespace nit

5 years agoMerge branch 'mb/clarify-zsh-completion-doc'
Junio C Hamano [Wed, 23 Oct 2019 05:43:09 +0000 (14:43 +0900)]
Merge branch 'mb/clarify-zsh-completion-doc'

The installation instruction for zsh completion script (in
contrib/) has been a bit improved.

* mb/clarify-zsh-completion-doc:
  completion: clarify installation instruction for zsh

5 years agoSync with master
Junio C Hamano [Wed, 23 Oct 2019 05:05:18 +0000 (14:05 +0900)]
Sync with master

* master:

5 years agoMerge branch 'js/azure-ci-osx-fix' into next
Junio C Hamano [Wed, 23 Oct 2019 05:04:53 +0000 (14:04 +0900)]
Merge branch 'js/azure-ci-osx-fix' into next

* js/azure-ci-osx-fix:
  ci(osx): use new location of the `perforce` cask

5 years agoRevert "Merge branch 'jk/packfile-reuse-cleanup' into next"
Junio C Hamano [Wed, 23 Oct 2019 04:58:22 +0000 (13:58 +0900)]
Revert "Merge branch 'jk/packfile-reuse-cleanup' into next"

This reverts commit dc60b31833b45e3dd027531a7d21c774dad948ec, reversing
changes made to 1bb1c0846ff9a7ac2334df39cc4232a6ae8a419c.

5 years agot1400: wrap setup code in test case
Johannes Schindelin [Mon, 21 Oct 2019 21:54:41 +0000 (21:54 +0000)]
t1400: wrap setup code in test case

Without this, you cannot use `--run=<...>` to skip that part, and a run
with `--run=0` (which is a common way to determine the test case number
corresponding to a given test case title).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoci(osx): use new location of the `perforce` cask
Johannes Schindelin [Wed, 23 Oct 2019 00:19:38 +0000 (00:19 +0000)]
ci(osx): use new location of the `perforce` cask

The Azure Pipelines builds are failing for macOS due to a change in the
location of the perforce cask. The command outputs the following error:

    + brew install caskroom/cask/perforce
    Error: caskroom/cask was moved. Tap homebrew/cask-cask instead.

So let's try to call `brew cask install perforce` first (which is what
that error message suggests, in a most round-about way).

Prior to 672f51cb we used to install the 'perforce' package with 'brew
install perforce' (note: no 'cask' in there). The justification for
672f51cb was that the command 'brew install perforce' simply stopped
working, after Homebrew folks decided that it's better to move the
'perforce' package to a "cask". Their justification for this move was
that 'brew install perforce' "can fail due to a checksum mismatch ...",
and casks can be installed without checksum verification. And indeed,
both 'brew cask install perforce' and 'brew install
caskroom/cask/perforce' printed something along the lines of:

  ==> No checksum defined for Cask perforce, skipping verification

It is unclear why 672f51cb used 'brew install caskroom/cask/perforce'
instead of 'brew cask install perforce'. It appears (by running both
commands on old Travis CI macOS images) that both commands worked all
the same already back then.

In any case, as the error message at the top of this commit message
shows, 'brew install caskroom/cask/perforce' has stopped working
recently, but 'brew cask install perforce' still does, so let's use
that.

CI servers are typically fresh virtual machines, but not always. To
accommodate for that, let's try harder if `brew cask install perforce`
fails, by specifically pulling the latest `master` of the
`homebrew-cask` repository.

This will still fail, of course, when `homebrew-cask` falls behind
Perforce's release schedule. But once it is updated, we can now simply
re-run the failed jobs and they will pick up that update.

As for updating `homebrew-cask`: the beginnings of automating this in
https://dev.azure.com/gitgitgadget/git/_build?definitionId=11&_a=summary
will be finished once the next Perforce upgrade comes around.

Helped-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoRevert "Merge branch 'js/azure-ci-osx-fix' into next"
Junio C Hamano [Wed, 23 Oct 2019 02:46:16 +0000 (11:46 +0900)]
Revert "Merge branch 'js/azure-ci-osx-fix' into next"

This reverts commit bc6a502f6e9eab12452de514e22b5616e5f6903f, reversing
changes made to 40e992b6f587bfc8a8764586367527b828972beb.

5 years agot604[236]: do not run setup in separate tests
Elijah Newren [Tue, 22 Oct 2019 21:22:51 +0000 (21:22 +0000)]
t604[236]: do not run setup in separate tests

Transform the setup "tests" to setup functions, and have the actual
tests call the setup functions.  Advantages:

  * Should make life easier for people working with webby CI/PR builds
    who have to abuse mice (and their own index finger as well) in
    order to switch from viewing one testcase to another.  Sounds
    awful; hopefully this will improve things for them.

  * Improves re-runnability: any failed test in any of these three
    files can now be re-run in isolation, e.g.
       ./t6042* --ver --imm -x --run=21
    whereas before it would require two tests to be specified to the
    --run argument, the other needing to be picked out as the relevant
    setup test from one or two tests before.

  * Importantly, this still keeps the "setup" and "test" sections
    somewhat separate to make it easier for readers to discern what is
    just ancillary setup and what the intent of the test is.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agomerge-recursive: fix merging a subdirectory into the root directory
Elijah Newren [Tue, 22 Oct 2019 21:22:50 +0000 (21:22 +0000)]
merge-recursive: fix merging a subdirectory into the root directory

We allow renaming all entries in e.g. a directory named z/ into a
directory named y/ to be detected as a z/ -> y/ rename, so that if the
other side of history adds any files to the directory z/ in the mean
time, we can provide the hint that they should be moved to y/.

There is no reason to not allow 'y/' to be the root directory, but the
code did not handle that case correctly.  Add a testcase and the
necessary special checks to support this case.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agomerge-recursive: clean up get_renamed_dir_portion()
Elijah Newren [Tue, 22 Oct 2019 21:22:49 +0000 (21:22 +0000)]
merge-recursive: clean up get_renamed_dir_portion()

Dscho noted a few things making this function hard to follow.
Restructure it a bit and add comments to make it easier to follow.  The
restructurings include:

  * There was a special case if-check at the end of the function
    checking whether someone just renamed a file within its original
    directory, meaning that there could be no directory rename involved.
    That check was slightly convoluted; it could be done in a more
    straightforward fashion earlier in the function, and can be done
    more cheaply too (no call to strncmp).

  * The conditions for advancing end_of_old and end_of_new before
    calling strchr were both confusing and unnecessary.  If either
    points at a '/', then they need to be advanced in order to find the
    next '/'.  If either doesn't point at a '/', then advancing them one
    char before calling strchr() doesn't hurt.  So, just rip out the
    if conditions and advance both before calling strchr().

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agot7419: change test_must_fail to ! for grep
Denton Liu [Tue, 22 Oct 2019 09:57:01 +0000 (02:57 -0700)]
t7419: change test_must_fail to ! for grep

According to t/README, test_must_fail() should only be used to test for
failure in Git commands. Replace the invocations of
`test_must_fail grep` with `! grep`.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agot4014: make output-directory tests self-contained
Bert Wesarg [Mon, 21 Oct 2019 13:23:42 +0000 (15:23 +0200)]
t4014: make output-directory tests self-contained

As noted by Gábor in [1], the new tests in edefc31873 ("format-patch:
create leading components of output directory", 2019-10-11) cannot be
run independently. Fix this.

[1] https://public-inbox.org/git/20191011144650.GM29845@szeder.dev/

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoMerge branch 'js/azure-pipelines-msvc'
Junio C Hamano [Wed, 23 Oct 2019 02:06:46 +0000 (11:06 +0900)]
Merge branch 'js/azure-pipelines-msvc'

* js/azure-pipelines-msvc:
  ci(visual-studio): actually run the tests in parallel
  ci(visual-studio): use strict compile flags, and optimization

5 years agoMerge branch 'js/azure-pipelines-msvc' into next
Junio C Hamano [Wed, 23 Oct 2019 02:06:34 +0000 (11:06 +0900)]
Merge branch 'js/azure-pipelines-msvc' into next

* js/azure-pipelines-msvc:
  ci(visual-studio): actually run the tests in parallel
  ci(visual-studio): use strict compile flags, and optimization

5 years agoci(visual-studio): actually run the tests in parallel
Johannes Schindelin [Mon, 21 Oct 2019 19:59:58 +0000 (19:59 +0000)]
ci(visual-studio): actually run the tests in parallel

Originally, the CI/PR builds that build and test using Visual Studio
were implemented imitating `linux-clang`, i.e. still using the
`Makefile`-based build infrastructure.

Later (but still before the patches made their way into git.git's
`master`), however, this was changed to generate Visual Studio project
files and build the binaries using `MSBuild`, as this reflects more
accurately how Visual Studio users would want to build Git (internally,
Visual Studio uses `MSBuild`, or at least something very similar).

During that transition, we needed to implement a new way to run the test
suite in parallel, as Visual Studio users typically will only have a Git
Bash available (which does not ship with `make` nor with support for
`prove`): we simply implemented a new test helper to run the test suite.

This helper even knows how to run the tests in parallel, but due to a
mistake on this developer's part, it was never turned on in the CI/PR
builds. This results in 2x-3x longer run times of the test phase.

Let's use the `--jobs=10` option to fix this.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoci(visual-studio): use strict compile flags, and optimization
Johannes Schindelin [Mon, 21 Oct 2019 19:59:57 +0000 (19:59 +0000)]
ci(visual-studio): use strict compile flags, and optimization

To make full use of the work that went into the Visual Studio build &
test jobs in our CI/PR builds, let's turn on strict compiler flags. This
will give us the benefit of Visual C's compiler warnings (which, at
times, seem to catch things that GCC does not catch, and vice versa).

While at it, also turn on optimization; It does not make sense to
produce binaries with debug information, and we can use any ounce of
speed that we get (because the test suite is particularly slow on
Windows, thanks to the need to run inside a Unix shell, which
requires us to use the POSIX emulation layer provided by MSYS2).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoMerge branch 'sb/userdiff-dts' into next
Junio C Hamano [Mon, 21 Oct 2019 14:56:45 +0000 (23:56 +0900)]
Merge branch 'sb/userdiff-dts' into next

Tweak userdiff patterns for dts.

* sb/userdiff-dts:
  userdiff: fix some corner cases in dts regex

5 years agoMerge branch 'sg/progress-fix' into next
Junio C Hamano [Mon, 21 Oct 2019 14:56:45 +0000 (23:56 +0900)]
Merge branch 'sg/progress-fix' into next

Byte-order fix the recent update to progress display code.

* sg/progress-fix:
  test-progress: fix test failures on big-endian systems

5 years agoMerge branch 'nr/diff-highlight-indent-fix' into next
Junio C Hamano [Mon, 21 Oct 2019 14:56:44 +0000 (23:56 +0900)]
Merge branch 'nr/diff-highlight-indent-fix' into next

Code cleanup.

* nr/diff-highlight-indent-fix:
  diff-highlight: fix a whitespace nit

5 years agoMerge branch 'mb/clarify-zsh-completion-doc' into next
Junio C Hamano [Mon, 21 Oct 2019 14:56:44 +0000 (23:56 +0900)]
Merge branch 'mb/clarify-zsh-completion-doc' into next

The installation instruction for zsh completion script (in
contrib/) has been a bit improved.

* mb/clarify-zsh-completion-doc:
  completion: clarify installation instruction for zsh

5 years agouserdiff: fix some corner cases in dts regex
Stephen Boyd [Sun, 20 Oct 2019 18:52:30 +0000 (11:52 -0700)]
userdiff: fix some corner cases in dts regex

While reviewing some dts diffs recently I noticed that the hunk header
logic was failing to find the containing node. This is because the regex
doesn't consider properties that may span multiple lines, i.e.

property = <something>,
   <something_else>;

and it got hung up on comments inside nodes that look like the root node
because they start with '/*'. Add tests for these cases and update the
regex to find them. Maybe detecting the root node is too complicated but
forcing it to be a backslash with any amount of whitespace up to an open
bracket seemed OK. I tried to detect that a comment is in-between the
two parts but I wasn't happy so I just dropped it.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Reviewed-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agobuiltin/blame.c: constants into bit shift format
Hariom Verma [Thu, 17 Oct 2019 17:46:51 +0000 (17:46 +0000)]
builtin/blame.c: constants into bit shift format

We are looking at bitfield constants, and elsewhere in the Git source
code, such cases are handled via bit shift operators rather than octal
numbers, which also makes it easier to spot holes in the range
(if, say, 1<<5 was missing, it is easier to spot it between 1<<4
and 1<<6 than it is to spot a missing 040 between a 020 and a 0100).

Signed-off-by: Hariom Verma <hariom18599@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agorebase: hide --preserve-merges option
Denton Liu [Fri, 18 Oct 2019 23:55:56 +0000 (16:55 -0700)]
rebase: hide --preserve-merges option

Since --preserve-merges has been deprecated in favour of
--rebase-merges, mark this option as hidden so it no longer shows up in
the usage and completions.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agotest-progress: fix test failures on big-endian systems
SZEDER Gábor [Sat, 19 Oct 2019 23:37:06 +0000 (01:37 +0200)]
test-progress: fix test failures on big-endian systems

In 't0500-progress-display.sh' all tests running 'test-tool progress
--total=<N>' fail on big-endian systems, e.g. like this:

  + test-tool progress --total=3 Working hard
  [...]
  + test_i18ncmp expect out
  --- expect 2019-10-18 23:07:54.765523916 +0000
  +++ out 2019-10-18 23:07:54.773523916 +0000
  @@ -1,4 +1,2 @@
  -Working hard:  33% (1/3)<CR>
  -Working hard:  66% (2/3)<CR>
  -Working hard: 100% (3/3)<CR>
  -Working hard: 100% (3/3), done.
  +Working hard:   0% (1/12884901888)<CR>
  +Working hard:   0% (3/12884901888), done.

The reason for that bogus value is that '--total's parameter is parsed
via parse-options's OPT_INTEGER into a uint64_t variable [1], so the
two bits of 3 end up in the "wrong" bytes on big-endian systems
(12884901888 = 0x300000000).

Change the type of that variable from uint64_t to int, to match what
parse-options expects; in the tests of the progress output we won't
use values that don't fit into an int anyway.

[1] start_progress() expects the total number as an uint64_t, that's
    why I chose the same type when declaring the variable holding the
    value given on the command line.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
[jpag: Debian unstable/ppc64 (big-endian)]
Tested-By: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
[tz: Fedora s390x (big-endian)]
Tested-By: Todd Zullinger <tmz@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agocompletion: clarify installation instruction for zsh
Maxim Belsky [Fri, 11 Oct 2019 17:54:28 +0000 (10:54 -0700)]
completion: clarify installation instruction for zsh

The original comment does not describe type of ~/.zsh/_git explicitly
and zsh does not warn or fail if a user create it as a dictionary.
So unexperienced users could be misled by the original comment.

There is a small update to clarify it.

Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Maxim Belsky <public.belsky@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoSync with 2.24-rc0
Junio C Hamano [Fri, 18 Oct 2019 02:43:18 +0000 (11:43 +0900)]
Sync with 2.24-rc0

* master:
  Git 2.24-rc0

5 years agoMerge branch 'dd/notes-copy-default-dst-to-head' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:57 +0000 (11:42 +0900)]
Merge branch 'dd/notes-copy-default-dst-to-head' into next

"git notes copy $original" ought to copy the notes attached to the
original object to HEAD, but a mistaken tightening to command line
parameter validation made earlier disabled that feature by mistake.

* dd/notes-copy-default-dst-to-head:
  notes: fix minimum number of parameters to "copy" subcommand
  t3301: test diagnose messages for too few/many paramters

5 years agoMerge branch 'pw/post-commit-from-sequencer' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:57 +0000 (11:42 +0900)]
Merge branch 'pw/post-commit-from-sequencer' into next

"rebase -i" ceased to run post-commit hook by mistake in an earlier
update, which has been corrected.

* pw/post-commit-from-sequencer:
  sequencer: run post-commit hook
  move run_commit_hook() to libgit and use it there
  sequencer.h fix placement of #endif
  t3404: remove uneeded calls to set_fake_editor
  t3404: set $EDITOR in subshell
  t3404: remove unnecessary subshell

5 years agoMerge branch 'js/azure-ci-osx-fix' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:57 +0000 (11:42 +0900)]
Merge branch 'js/azure-ci-osx-fix' into next

Update installation procedure for Perforce on MacOS in the CI jobs
running on Azure pipelines, which was failing.

* js/azure-ci-osx-fix:
  ci(osx): use new location of the `perforce` cask

5 years agoMerge branch 'dl/format-patch-cover-from-desc' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:57 +0000 (11:42 +0900)]
Merge branch 'dl/format-patch-cover-from-desc' into next

The branch description ("git branch --edit-description") has been
used to fill the body of the cover letters by the format-patch
command; this has been enhanced so that the subject can also be
filled.

* dl/format-patch-cover-from-desc:
  format-patch: teach --cover-from-description option
  format-patch: use enum variables
  format-patch: replace erroneous and condition

5 years agoMerge branch 'cb/pcre2-chartables-leakfix' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:56 +0000 (11:42 +0900)]
Merge branch 'cb/pcre2-chartables-leakfix' into next

Leakfix.

* cb/pcre2-chartables-leakfix:
  grep: avoid leak of chartables in PCRE2
  grep: make PCRE2 aware of custom allocator
  grep: make PCRE1 aware of custom allocator

5 years agoMerge branch 'es/walken-tutorial' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:56 +0000 (11:42 +0900)]
Merge branch 'es/walken-tutorial' into next

A tutorial on object enumeration.

* es/walken-tutorial:
  documentation: add tutorial for object walking

5 years agoMerge branch 'ag/sequencer-todo-updates' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:56 +0000 (11:42 +0900)]
Merge branch 'ag/sequencer-todo-updates' into next

Reduce unnecessary reading of state variables back from the disk
during sequener operation.

* ag/sequencer-todo-updates:
  sequencer: directly call pick_commits() from complete_action()
  rebase: fill `squash_onto' in get_replay_opts()
  sequencer: move the code writing total_nr on the disk to a new function
  sequencer: update `done_nr' when skipping commands in a todo list
  sequencer: update `total_nr' when adding an item to a todo list

5 years agoMerge branch 'jt/fetch-pack-record-refs-in-the-dot-promisor' into next
Junio C Hamano [Fri, 18 Oct 2019 02:42:56 +0000 (11:42 +0900)]
Merge branch 'jt/fetch-pack-record-refs-in-the-dot-promisor' into next

Debugging support for lazy cloning has been a bit improved.

* jt/fetch-pack-record-refs-in-the-dot-promisor:
  fetch-pack: write fetched refs to .promisor

5 years agoGit 2.24-rc0 v2.24.0-rc0
Junio C Hamano [Fri, 18 Oct 2019 02:31:00 +0000 (11:31 +0900)]
Git 2.24-rc0

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoMerge branch 'rs/remote-curl-use-argv-array'
Junio C Hamano [Fri, 18 Oct 2019 02:40:50 +0000 (11:40 +0900)]
Merge branch 'rs/remote-curl-use-argv-array'

Code cleanup.

* rs/remote-curl-use-argv-array:
  remote-curl: use argv_array in parse_push()

5 years agoMerge branch 'rs/column-use-utf8-strnwidth'
Junio C Hamano [Fri, 18 Oct 2019 02:40:49 +0000 (11:40 +0900)]
Merge branch 'rs/column-use-utf8-strnwidth'

Code cleanup.

* rs/column-use-utf8-strnwidth:
  column: use utf8_strnwidth() to strip out ANSI color escapes

5 years agoMerge branch 'rs/http-push-simplify'
Junio C Hamano [Fri, 18 Oct 2019 02:40:49 +0000 (11:40 +0900)]
Merge branch 'rs/http-push-simplify'

Code cleanup.

* rs/http-push-simplify:
  http-push: simplify deleting a list item

5 years agoMerge branch 'jj/stash-reset-only-toplevel'
Junio C Hamano [Fri, 18 Oct 2019 02:40:49 +0000 (11:40 +0900)]
Merge branch 'jj/stash-reset-only-toplevel'

"git stash save" lost local changes to submodules, which has been
corrected.

* jj/stash-reset-only-toplevel:
  stash: avoid recursive hard reset on submodules

5 years agoMerge branch 'bw/format-patch-o-create-leading-dirs'
Junio C Hamano [Fri, 18 Oct 2019 02:40:48 +0000 (11:40 +0900)]
Merge branch 'bw/format-patch-o-create-leading-dirs'

"git format-patch -o <outdir>" did an equivalent of "mkdir <outdir>"
not "mkdir -p <outdir>", which is being corrected.

* bw/format-patch-o-create-leading-dirs:
  format-patch: create leading components of output directory

5 years agoMerge branch 'bb/compat-util-comment-fix'
Junio C Hamano [Fri, 18 Oct 2019 02:40:48 +0000 (11:40 +0900)]
Merge branch 'bb/compat-util-comment-fix'

Code cleanup.

* bb/compat-util-comment-fix:
  git-compat-util: fix documentation syntax

5 years agoMerge branch 'bb/utf8-wcwidth-cleanup'
Junio C Hamano [Fri, 18 Oct 2019 02:40:48 +0000 (11:40 +0900)]
Merge branch 'bb/utf8-wcwidth-cleanup'

Code cleanup.

* bb/utf8-wcwidth-cleanup:
  utf8: use ARRAY_SIZE() in git_wcwidth()

5 years agoMerge branch 'dl/allow-running-cocci-verbosely'
Junio C Hamano [Fri, 18 Oct 2019 02:40:48 +0000 (11:40 +0900)]
Merge branch 'dl/allow-running-cocci-verbosely'

Dev support update.

* dl/allow-running-cocci-verbosely:
  Makefile: respect $(V) in %.cocci.patch target

5 years agoMerge branch 'dl/compat-cleanup'
Junio C Hamano [Fri, 18 Oct 2019 02:40:47 +0000 (11:40 +0900)]
Merge branch 'dl/compat-cleanup'

Code formatting micronit fix.

* dl/compat-cleanup:
  pthread.h: manually align parameter lists

5 years agoMerge branch 'ta/t1308-typofix'
Junio C Hamano [Fri, 18 Oct 2019 02:40:47 +0000 (11:40 +0900)]
Merge branch 'ta/t1308-typofix'

Test fix.

* ta/t1308-typofix:
  t1308-config-set: fix a test that has a typo

5 years agoMerge branch 'js/doc-stash-save'
Junio C Hamano [Fri, 18 Oct 2019 02:40:47 +0000 (11:40 +0900)]
Merge branch 'js/doc-stash-save'

Doc clarification.

* js/doc-stash-save:
  doc(stash): clarify the description of `save`

5 years agoMerge branch 'bc/smart-http-atomic-push' into next
Junio C Hamano [Fri, 18 Oct 2019 01:51:25 +0000 (10:51 +0900)]
Merge branch 'bc/smart-http-atomic-push' into next

The atomic push over smart HTTP transport did not work, which has
been corrected.

* bc/smart-http-atomic-push:
  remote-curl: pass on atomic capability to remote side

5 years agogrep: avoid leak of chartables in PCRE2
Carlo Marcelo Arenas Belón [Wed, 16 Oct 2019 12:10:24 +0000 (12:10 +0000)]
grep: avoid leak of chartables in PCRE2

94da9193a6 ("grep: add support for PCRE v2", 2017-06-01) introduced
a small memory leak visible with valgrind in t7813.

Complete the creation of a PCRE2 specific variable that was missing from
the original change and free the generated table just like it is done
for PCRE1.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agogrep: make PCRE2 aware of custom allocator
Carlo Marcelo Arenas Belón [Wed, 16 Oct 2019 12:10:23 +0000 (12:10 +0000)]
grep: make PCRE2 aware of custom allocator

94da9193a6 (grep: add support for PCRE v2, 2017-06-01) didn't include
a way to override the system allocator, and so it is incompatible with
custom allocators (e.g. nedmalloc). This problem became obvious when we
tried to plug a memory leak by `free()`ing a data structure allocated by
PCRE2, triggering a segfault in Windows (where we use nedmalloc by
default).

PCRE2 requires the use of a general context to override the allocator
and therefore, there is a lot more code needed than in PCRE1, including
a couple of wrapper functions.

Extend the grep API with a "destructor" that could be called to cleanup
any objects that were created and used globally.

Update `builtin/grep.c` to use that new API, but any other future users
should make sure to have matching `grep_init()`/`grep_destroy()` calls
if they are using the pattern matching functionality.

Move some of the logic that was before done per thread (in the workers)
into an earlier phase to avoid degrading performance, but as the use of
PCRE2 with custom allocators is better understood it is expected more of
its functions will be instructed to use the custom allocator as well as
was done in the original code[1] this work was based on.

[1] https://public-inbox.org/git/3397e6797f872aedd18c6d795f4976e1c579514b.1565005867.git.gitgitgadget@gmail.com/

Reported-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agogrep: make PCRE1 aware of custom allocator
Carlo Marcelo Arenas Belón [Wed, 16 Oct 2019 12:10:22 +0000 (12:10 +0000)]
grep: make PCRE1 aware of custom allocator

63e7e9d8b6 ("git-grep: Learn PCRE", 2011-05-09) didn't include a way
to override the system alocator, and so it is incompatible with
USE_NED_ALLOCATOR as reported by Dscho[1] (in similar code from PCRE2)

Note that nedmalloc, as well as other custom allocators like jemalloc
and mi-malloc, can be configured at runtime (via `LD_PRELOAD`),
therefore we cannot know at compile time whether a custom allocator is
used or not.

Make the minimum change possible to ensure this combination is supported
by extending `grep_init()` to set the PCRE1 specific functions to Git's
idea of `malloc()` and `free()` and therefore making sure all
allocations are done inside PCRE1 with the same allocator than the rest
of Git.

This change has negligible performance impact: PCRE needs to allocate
memory once per program run for the character table and for each pattern
compilation. These are both rare events compared to matching patterns
against lines. Actual measurements[2] show that the impact is lost in
the noise.

[1] https://public-inbox.org/git/pull.306.git.gitgitgadget@gmail.com
[2] https://public-inbox.org/git/7f42007f-911b-c570-17f6-1c6af0429586@web.de

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoci(osx): use new location of the `perforce` cask
Johannes Schindelin [Thu, 17 Oct 2019 12:47:33 +0000 (12:47 +0000)]
ci(osx): use new location of the `perforce` cask

The CI builds are failing for Mac OS X due to a change in the
location of the perforce cask. The command outputs the following
error:

    + brew install caskroom/cask/perforce
    Error: caskroom/cask was moved. Tap homebrew/cask-cask instead.

So let's try to call `brew cask install perforce` first (which is what
that error message suggests, in a most round-about way).

The "caskroom" way was added in 672f51cb (travis-ci:
fix Perforce install on macOS, 2017-01-22) and the justification
is that the call "brew cask install perforce" can fail due to a checksum
mismatch: the recipe simply downloads the official Perforce distro, and
whenever that is updated, the recipe needs to be updated, too.

CI servers are typically fresh virtual machines, but not always. To
accommodate for that, let's try harder if `brew cask install perforce`
fails, by specifically pulling the latest `master` of the
`homebrew-cask` repository.

This will still fail, of course, when `homebrew-cask` falls behind
Perforce's release schedule. But once it is updated, we can now simply
re-run the failed jobs and they will pick up that update.

As for updating `homebrew-cask`: the beginnings of automating this in
https://dev.azure.com/gitgitgadget/git/_build?definitionId=11&_a=summary
will be finished once the next Perforce upgrade comes around.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agonotes: fix minimum number of parameters to "copy" subcommand
Doan Tran Cong Danh [Wed, 16 Oct 2019 05:18:41 +0000 (12:18 +0700)]
notes: fix minimum number of parameters to "copy" subcommand

The builtin/notes.c::copy() function is prepared to handle either
one or two arguments given from the command line; when one argument
is given, to-obj defaults to HEAD.

bbb1b8a3 ("notes: check number of parameters to "git notes copy"",
2010-06-28) tried to make sure "git notes copy" (with *no* other
argument) does not dereference NULL by checking the number of
parameters, but it incorrectly insisted that we need two arguments,
instead of either one or two.  This disabled the defaulting to-obj
to HEAD.

Correct it.

Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agot3301: test diagnose messages for too few/many paramters
Doan Tran Cong Danh [Wed, 16 Oct 2019 05:18:40 +0000 (12:18 +0700)]
t3301: test diagnose messages for too few/many paramters

Commit bbb1b8a35a ("notes: check number of parameters to "git notes
copy"", 2010-06-28) added a test for too many or too few of
parameters provided to `git notes copy'.

However, the test only ensures that the command will fail but it
doesn't really check if it fails because of number of parameters.

If we accidentally lifted the check inside our code base, the test
may still have failed because the provided parameter is not a valid
ref.

Correct it.

Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoremote-curl: pass on atomic capability to remote side
brian m. carlson [Wed, 16 Oct 2019 23:45:34 +0000 (23:45 +0000)]
remote-curl: pass on atomic capability to remote side

When pushing more than one reference with the --atomic option, the
server is supposed to perform a single atomic transaction to update the
references, leaving them either all to succeed or all to fail.  This
works fine when pushing locally or over SSH, but when pushing over HTTP,
we fail to pass the atomic capability to the remote side.  In fact, we
have not reported this capability to any remote helpers during the life
of the feature.

Now normally, things happen to work nevertheless, since we actually
check for most types of failures, such as non-fast-forward updates, on
the client side, and just abort the entire attempt.  However, if the
server side reports a problem, such as the inability to lock a ref, the
transaction isn't atomic, because we haven't passed the appropriate
capability over and the remote side has no way of knowing that we wanted
atomic behavior.

Fix this by passing the option from the transport code through to remote
helpers, and from the HTTP remote helper down to send-pack.  With this
change, we can detect if the server side rejects the push and report
back appropriately.  Note the difference in the messages: the remote
side reports "atomic transaction failed", while our own checking rejects
pushes with the message "atomic push failed".

Document the atomic option in the remote helper documentation, so other
implementers can implement it if they like.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoRevert "Merge branch 'bc/smart-http-atomic-push' into next"
Junio C Hamano [Thu, 17 Oct 2019 07:06:31 +0000 (16:06 +0900)]
Revert "Merge branch 'bc/smart-http-atomic-push' into next"

This reverts commit effe020c20d5502d5fb0f335efc6c5f8aa8c4ffa, reversing
changes made to 8d0375a8747121b3fe91fa982d8571013374122a to give the
topic a clean restart.

5 years agoRevert "Merge branch 'en/merge-recursive-directory-rename-fixes' into next"
Junio C Hamano [Wed, 16 Oct 2019 04:02:24 +0000 (13:02 +0900)]
Revert "Merge branch 'en/merge-recursive-directory-rename-fixes' into next"

This reverts commit ebfdc3ff7b20064fc7fab04f761f5095ba5c3a05, reversing
changes made to 93c9949b6a31deba4af5187bf802a751869b687a, to give
the topic a chance to a clean restart.

5 years agograph: fix coloring of octopus dashes
James Coglan [Tue, 15 Oct 2019 23:47:59 +0000 (23:47 +0000)]
graph: fix coloring of octopus dashes

In 04005834ed ("log: fix coloring of certain octopus merge shapes",
2018-09-01) there is a fix for the coloring of dashes following an
octopus merge. It makes a distinction between the case where all parents
introduce a new column, versus the case where the first parent collapses
into an existing column:

        | *-.           | *-.
        | |\ \          | |\ \
        | | | |         |/ / /

The latter case means that the columns for the merge parents begin one
place to the left in the `new_columns` array compared to the former
case.

However, the implementation only works if the commit's parents are kept
in order as they map onto the visual columns, as we get the colors by
iterating over `new_columns` as we print the dashes. In general, the
commit's parents can arbitrarily merge with existing columns, and change
their ordering in the process.

For example, in the following diagram, the number of each column
indicates which commit parent appears in each column.

        | | *---.
        | | |\ \ \
        | | |/ / /
        | |/| | /
        | |_|_|/
        |/| | |
        3 1 0 2

If the columns are colored (red, green, yellow, blue), then the dashes
will currently be colored yellow and blue, whereas they should be blue
and red.

To fix this, we need to look up each column in the `mapping` array,
which before the `GRAPH_COLLAPSING` state indicates which logical column
is displayed in each visual column. This implementation is simpler as it
doesn't have any edge cases, and it also handles how left-skewed first
parents are now displayed:

        | *-.
        |/|\ \
        | | | |
        0 1 2 3

The color of the first dashes is always the color found in `mapping` two
columns to the right of the commit symbol. Because commits are displayed
after all edges have been collapsed together and the visual columns
match the logical ones, we can find the visual offset of the commit
symbol using `commit_index`.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: flatten edges that fuse with their right neighbor
James Coglan [Tue, 15 Oct 2019 23:47:58 +0000 (23:47 +0000)]
graph: flatten edges that fuse with their right neighbor

When a merge commit is printed and its final parent is the same commit
that occupies the column to the right of the merge, this results in a
kink in the displayed edges:

        * |
        |\ \
        | |/
        | *

Graphs containing these shapes can be hard to read, as the expansion to
the right followed immediately by collapsing back to the left creates a
lot of zig-zagging edges, especially when many columns are present.

We can improve this by eliminating the zig-zag and having the merge's
final parent edge fuse immediately with its neighbor:

        * |
        |\|
        | *

This reduces the horizontal width for the current commit by 2, and
requires one less row, making the graph display more compact. Taken in
combination with other graph-smoothing enhancements, it greatly
compresses the space needed to display certain histories:

        *
        |\
        | *                       *
        | |\                      |\
        | | *                     | *
        | | |                     | |\
        | |  \                    | | *
        | *-. \                   | * |
        | |\ \ \        =>        |/|\|
        |/ / / /                  | | *
        | | | /                   | * |
        | | |/                    | |/
        | | *                     * /
        | * |                     |/
        | |/                      *
        * |
        |/
        *

One of the test cases here cannot be correctly rendered in Git v2.23.0;
it produces this output following commit E:

        | | *-. \   5_E
        | | |\ \ \
        | |/ / / /
        | | | / _
        | |_|/
        |/| |

The new implementation makes sure that the rightmost edge in this
history is not left dangling as above.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: smooth appearance of collapsing edges on commit lines
James Coglan [Tue, 15 Oct 2019 23:47:57 +0000 (23:47 +0000)]
graph: smooth appearance of collapsing edges on commit lines

When a graph contains edges that are in the process of collapsing to the
left, but those edges cross a commit line, the effect is that the edges
have a jagged appearance:

        *
        |\
        | *
        |  \
        *-. \
        |\ \ \
        | | * |
        | * | |
        | |/ /
        * | |
        |/ /
        * |
        |/
        *

We already takes steps to smooth edges like this when they're expanding;
when an edge appears to the right of a merge commit marker on a
GRAPH_COMMIT line immediately following a GRAPH_POST_MERGE line, we
render it as a `\`:

        * \
        |\ \
        | * \
        | |\ \

We can make a similar improvement to collapsing edges, making them
easier to follow and giving the overall graph a feeling of increased
symmetry:

        *
        |\
        | *
        |  \
        *-. \
        |\ \ \
        | | * |
        | * | |
        | |/ /
        * / /
        |/ /
        * /
        |/
        *

To do this, we introduce a new special case for edges on GRAPH_COMMIT
lines that immediately follow a GRAPH_COLLAPSING line. By retaining a
copy of the `mapping` array used to render the GRAPH_COLLAPSING line in
the `old_mapping` array, we can determine that an edge is collapsing
through the GRAPH_COMMIT line and should be smoothed.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: rename `new_mapping` to `old_mapping`
James Coglan [Tue, 15 Oct 2019 23:47:56 +0000 (23:47 +0000)]
graph: rename `new_mapping` to `old_mapping`

The change I'm about to make requires being able to inspect the mapping
array that was used to render the last GRAPH_COLLAPSING line while
rendering a GRAPH_COMMIT line. The `new_mapping` array currently exists
as a pre-allocated space for computing the next `mapping` array during
`graph_output_collapsing_line()`, but we can repurpose it to let us see
the previous `mapping` state.

To support this use it will make more sense if this array is named
`old_mapping`, as it will contain the mapping data for the previous line
we rendered, at the point we're rendering a commit line.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: commit and post-merge lines for left-skewed merges
James Coglan [Tue, 15 Oct 2019 23:47:55 +0000 (23:47 +0000)]
graph: commit and post-merge lines for left-skewed merges

Following the introduction of "left-skewed" merges, which are merges
whose first parent fuses with another edge to its left, we have some
more edge cases to deal with in the display of commit and post-merge
lines.

The current graph code handles the following cases for edges appearing
to the right of the commit (*) on commit lines. A 2-way merge is usually
followed by vertical lines:

        | | |
        | * |
        | |\ \

An octopus merge (more than two parents) is always followed by edges
sloping to the right:

        | |  \          | |    \
        | *-. \         | *---. \
        | |\ \ \        | |\ \ \ \

A 2-way merge is followed by a right-sloping edge if the commit line
immediately follows a post-merge line for a commit that appears in the
same column as the current commit, or any column to the left of that:

        | *             | * |
        | |\            | |\ \
        | * \           | | * \
        | |\ \          | | |\ \

This commit introduces the following new cases for commit lines. If a
2-way merge skews to the left, then the edges to its right are always
vertical lines, even if the commit follows a post-merge line:

        | | |           | |\
        | * |           | * |
        |/| |           |/| |

A commit with 3 parents that skews left is followed by vertical edges:

        | | |
        | * |
        |/|\ \

If a 3-way left-skewed merge commit appears immediately after a
post-merge line, then it may be followed the right-sloping edges, just
like a 2-way merge that is not skewed.

        | |\
        | * \
        |/|\ \

Octopus merges with 4 or more parents that skew to the left will always
be followed by right-sloping edges, because the existing columns need to
expand around the merge.

        | |  \
        | *-. \
        |/|\ \ \

On post-merge lines, usually all edges following the current commit
slope to the right:

        | * | |
        | |\ \ \

However, if the commit is a left-skewed 2-way merge, the edges to its
right remain vertical. We also need to display a space after the
vertical line descending from the commit marker, whereas this line would
normally be followed by a backslash.

        | * | |
        |/| | |

If a left-skewed merge has more than 2 parents, then the edges to its
right are still sloped as they bend around the edges introduced by the
merge.

        | * | |
        |/|\ \ \

To handle these new cases, we need to know not just how many parents
each commit has, but how many new columns it adds to the display; this
quantity is recorded in the `edges_added` field for the current commit,
and `prev_edges_added` field for the previous commit.

Here, "column" refers to visual columns, not the logical columns of the
`columns` array. This is because even if all the commit's parents end up
fusing with existing edges, they initially introduce distinct edges in
the commit and post-merge lines before those edges collapse. For
example, a 3-way merge whose 2nd and 3rd parents fuse with existing
edges still introduces 2 visual columns that affect the display of edges
to their right.

        | | |  \
        | | *-. \
        | | |\ \ \
        | |_|/ / /
        |/| | / /
        | | |/ /
        | |/| |
        | | | |

This merge does not introduce any *logical* columns; there are 4 edges
before and after this commit once all edges have collapsed. But it does
initially introduce 2 new edges that need to be accommodated by the
edges to their right.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: tidy up display of left-skewed merges
James Coglan [Tue, 15 Oct 2019 23:47:54 +0000 (23:47 +0000)]
graph: tidy up display of left-skewed merges

Currently, when we display a merge whose first parent is already present
in a column to the left of the merge commit, we display the first parent
as a vertical pipe `|` in the GRAPH_POST_MERGE line and then immediately
enter the GRAPH_COLLAPSING state. The first-parent line tracks to the
left and all the other parent lines follow it; this creates a "kink" in
those lines:

        | *---.
        | |\ \ \
        |/ / / /
        | | | *

This change tidies the display of such commits such that if the first
parent appears to the left of the merge, we render it as a `/` and the
second parent as a `|`. This reduces the horizontal and vertical space
needed to render the merge, and makes the resulting lines easier to
read.

        | *-.
        |/|\ \
        | | | *

If the first parent is separated from the merge by several columns, a
horizontal line is drawn in a similar manner to how the GRAPH_COLLAPSING
state displays the line.

        | | | *-.
        | |_|/|\ \
        |/| | | | *

This effect is applied to both "normal" two-parent merges, and to
octopus merges. It also reduces the vertical space needed for pre-commit
lines, as the merge occupies one less column than usual.

        Before:         After:

        | *             | *
        | |\            | |\
        | | \           | * \
        | |  \          |/|\ \
        | *-. \
        | |\ \ \

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: example of graph output that can be simplified
James Coglan [Tue, 15 Oct 2019 23:47:53 +0000 (23:47 +0000)]
graph: example of graph output that can be simplified

The commits following this one introduce a series of improvements to the
layout of graphs, tidying up a few edge cases, namely:

- merge whose first parent fuses with an existing column to the left
- merge whose last parent fuses with its immediate neighbor on the right
- edges that collapse to the left above and below a commit line

This test case exemplifies these cases and provides a motivating example
of the kind of history I'm aiming to clear up.

The first parent of merge E is the same as the parent of H, so those
edges fuse together.

        * H
        |
        | *-.   E
        | |\ \
        |/ / /
        |
        * B

We can "skew" the display of this merge so that it doesn't introduce
additional columns that immediately collapse:

        * H
        |
        | *   E
        |/|\
        |
        * B

The last parent of E is D, the same as the parent of F which is the edge
to the right of the merge.

            * F
            |
             \
          *-. \   E
          |\ \ \
         / / / /
            | /
            |/
            * D

The two edges leading to D could be fused sooner: rather than expanding
the F edge around the merge and then letting the edges collapse, the F
edge could fuse with the E edge in the post-merge line:

            * F
            |
             \
          *-. | E
          |\ \|
         / / /
            |
            * D

If this is combined with the "skew" effect above, we get a much cleaner
graph display for these edges:

            * F
            |
          * | E
         /|\|
            |
            * D

Finally, the edge leading from C to A appears jagged as it passes
through the commit line for B:

        | * | C
        | |/
        * | B
        |/
        * A

This can be smoothed out so that such edges are easier to read:

        | * | C
        | |/
        * / B
        |/
        * A

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: extract logic for moving to GRAPH_PRE_COMMIT state
James Coglan [Tue, 15 Oct 2019 23:47:52 +0000 (23:47 +0000)]
graph: extract logic for moving to GRAPH_PRE_COMMIT state

This computation is repeated in a couple of places and I need to add
another condition to it to implement a further improvement to the graph
rendering, so I'm extracting this into a function.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: remove `mapping_idx` and `graph_update_width()`
James Coglan [Tue, 15 Oct 2019 23:47:51 +0000 (23:47 +0000)]
graph: remove `mapping_idx` and `graph_update_width()`

There's a duplication of logic between `graph_insert_into_new_columns()`
and `graph_update_width()`. `graph_insert_into_new_columns()` is called
repeatedly by `graph_update_columns()` with an `int *` that tracks the
offset into the `mapping` array where we should write the next value.
Each call to `graph_insert_into_new_columns()` effectively pushes one
column index and one "null" value (-1) onto the `mapping` array and
therefore increments `mapping_idx` by 2.

`graph_update_width()` duplicates this process: the `width` of the graph
is essentially the initial width of the `mapping` array before edges
begin collapsing. The `graph_update_width()` function's logic
effectively works out how many times `graph_insert_into_new_columns()`
was called based on the relationship of the current commit to the rest
of the graph.

I'm about to make some changes that make the assignment of values into
the `mapping` array more complicated. Rather than make
`graph_update_width()` more complicated at the same time, we can simply
remove this function and use `graph->width` to track the offset into the
`mapping` array as we're building it. This removes the duplication and
makes sure that `graph->width` is the same as the visual width of the
`mapping` array once `graph_update_columns()` is complete.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: reduce duplication in `graph_insert_into_new_columns()`
James Coglan [Tue, 15 Oct 2019 23:47:50 +0000 (23:47 +0000)]
graph: reduce duplication in `graph_insert_into_new_columns()`

I will shortly be making some changes to this function and so am trying
to simplify it. It currently contains some duplicated logic; both
branches the function can take assign the commit's column index into
the `mapping` array and increment `mapping_index`.

Here I change the function so that the only conditional behaviour is
that it appends the commit to `new_columns` if it's not present. All
manipulation of `mapping` now happens on a single code path.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: reuse `find_new_column_by_commit()`
James Coglan [Tue, 15 Oct 2019 23:47:49 +0000 (23:47 +0000)]
graph: reuse `find_new_column_by_commit()`

I will shortly be making some changes to
`graph_insert_into_new_columns()` and so am trying to simplify it. One
possible simplification is that we can extract the loop for finding the
element in `new_columns` containing the given commit.

`find_new_column_by_commit()` contains a very similar loop but it
returns a `struct column *` rather than an `int` offset into the array.
Here I'm introducing a version that returns `int` and using that in
`graph_insert_into_new_columns()` and `graph_output_post_merge_line()`.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: handle line padding in `graph_next_line()`
James Coglan [Tue, 15 Oct 2019 23:47:48 +0000 (23:47 +0000)]
graph: handle line padding in `graph_next_line()`

Now that the display width of graph lines is implicitly tracked via the
`graph_line` interface, the calls to `graph_pad_horizontally()` no
longer need to be located inside the individual output functions, where
the character counting was previously being done.

All the functions called by `graph_next_line()` generate a line of
output, then call `graph_pad_horizontally()`, and finally change the
graph state if necessary. As padding is the final change to the output
done by all these functions, it can be removed from all of them and done
in `graph_next_line()` instead.

I've also moved the guard in `graph_output_padding_line()` that checks
the graph has a commit; this function is only called by
`graph_next_line()` and we must not pad the `graph_line` if no commit is
set.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agograph: automatically track display width of graph lines
James Coglan [Tue, 15 Oct 2019 23:47:47 +0000 (23:47 +0000)]
graph: automatically track display width of graph lines

All the output functions called by `graph_next_line()` currently keep
track of how many printable chars they've written to the buffer, before
calling `graph_pad_horizontally()` to pad the line with spaces. Some
functions do this by incrementing a counter whenever they write to the
buffer, and others do it by encoding an assumption about how many chars
are written, as in:

    graph_pad_horizontally(graph, sb, graph->num_columns * 2);

This adds a fair amount of noise to the functions' logic and is easily
broken if one forgets to increment the right counter or update the
calculations used for padding.

To make this easier to use, I'm introducing a new struct called
`graph_line` that wraps a `strbuf` and keeps count of its display width
implicitly. `graph_next_line()` wraps this around the `struct strbuf *`
it's given and passes a `struct graph_line *` to the output functions,
which use its interface.

The `graph_line` interface wraps the `strbuf_addch()`,
`strbuf_addchars()` and `strbuf_addstr()` functions, and adds the
`graph_line_write_column()` function for adding a single character with
color formatting. The `graph_pad_horizontally()` function can then use
the `width` field from the struct rather than taking a character count
as a parameter.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agofetch-pack: write fetched refs to .promisor
Jonathan Tan [Tue, 15 Oct 2019 00:12:31 +0000 (17:12 -0700)]
fetch-pack: write fetched refs to .promisor

The specification of promisor packfiles (in partial-clone.txt) states
that the .promisor files that accompany packfiles do not matter (just
like .keep files), so whenever a packfile is fetched from the promisor
remote, Git has been writing empty .promisor files. But these files
could contain more useful information.

So instead of writing empty files, write the refs fetched to these
files. This makes it easier to debug issues with partial clones, as we
can identify what refs (and their associated hashes) were fetched at the
time the packfile was downloaded, and if necessary, compare those hashes
against what the promisor remote reports now.

This is implemented by teaching fetch-pack to write its own non-empty
.promisor file whenever it knows the name of the pack's lockfile. This
covers the case wherein the user runs "git fetch" with an internal
protocol or HTTP protocol v2 (fetch_refs_via_pack() in transport.c sets
lock_pack) and with HTTP protocol v0/v1 (fetch_git() in remote-curl.c
passes "--lock-pack" to "fetch-pack").

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Acked-by: Josh Steadmon <steadmon@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agosequencer: run post-commit hook
Phillip Wood [Tue, 15 Oct 2019 10:25:32 +0000 (10:25 +0000)]
sequencer: run post-commit hook

Prior to commit 356ee4659b ("sequencer: try to commit without forking
'git commit'", 2017-11-24) the sequencer would always run the
post-commit hook after each pick or revert as it forked `git commit` to
create the commit. The conversion to committing without forking `git
commit` omitted to call the post-commit hook after creating the commit.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agomove run_commit_hook() to libgit and use it there
Phillip Wood [Tue, 15 Oct 2019 10:25:31 +0000 (10:25 +0000)]
move run_commit_hook() to libgit and use it there

This function was declared in commit.h but was implemented in
builtin/commit.c so was not part of libgit. Move it to libgit so we can
use it in the sequencer. This simplifies the implementation of
run_prepare_commit_msg_hook() and will be used in the next commit.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agosequencer.h fix placement of #endif
Phillip Wood [Tue, 15 Oct 2019 10:25:30 +0000 (10:25 +0000)]
sequencer.h fix placement of #endif

Commit 65850686cf ("rebase -i: rewrite write_basic_state() in C",
2018-08-28) accidentially added new function declarations after
the #endif at the end of the include guard.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agot3404: remove uneeded calls to set_fake_editor
Phillip Wood [Tue, 15 Oct 2019 10:25:29 +0000 (10:25 +0000)]
t3404: remove uneeded calls to set_fake_editor

Some tests were calling set_fake_editor to ensure they had a sane no-op
editor set. Now that all the editor setting is done in subshells these
tests can rely on EDITOR=: and so do not need to call set_fake_editor.

Also add a test at the end to detect any future additions messing with
the exported value of $EDITOR.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agot3404: set $EDITOR in subshell
Phillip Wood [Tue, 15 Oct 2019 10:25:28 +0000 (10:25 +0000)]
t3404: set $EDITOR in subshell

As $EDITOR is exported setting it in one test affects all subsequent
tests. Avoid this by always setting it in a subshell. This commit leaves
20 calls to set_fake_editor that are not in subshells as they can
safely be removed in the next commit once all the other editor setting
is done inside subshells.

I have moved the call to set_fake_editor in some tests so it comes
immediately before the call to 'git rebase' to avoid moving unrelated
commands into the subshell. In one case ('rebase -ix with
--autosquash') the call to set_fake_editor is moved past an invocation
of 'git rebase'. This is safe as that invocation of 'git rebase'
requires EDITOR=: or EDITOR=fake-editor.sh without FAKE_LINES being
set which will be the case as the preceding tests either set their
editor in a subshell or call set_fake_editor without setting FAKE_LINES.

In a one test ('auto-amend only edited commits after "edit"') a call
to test_tick are now in a subshell. I think this is OK as it is there
to set the date for the next commit which is executed in the same
subshell rather than updating GIT_COMMITTER_DATE for later tests (the
next test calls test_tick before doing anything else).

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agot3404: remove unnecessary subshell
Phillip Wood [Tue, 15 Oct 2019 10:25:27 +0000 (10:25 +0000)]
t3404: remove unnecessary subshell

Neither of the commands executed in the subshell change any shell
variables or the current directory so there is no need for them to be
executed in a subshell.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoformat-patch: teach --cover-from-description option
Denton Liu [Tue, 15 Oct 2019 09:06:40 +0000 (02:06 -0700)]
format-patch: teach --cover-from-description option

Before, when format-patch generated a cover letter, only the body would
be populated with a branch's description while the subject would be
populated with placeholder text. However, users may want to have the
subject of their cover letter automatically populated in the same way.

Teach format-patch to accept the `--cover-from-description` option and
corresponding `format.coverFromDescription` config, allowing users to
populate different parts of the cover letter (including the subject
now).

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoformat-patch: use enum variables
Denton Liu [Tue, 15 Oct 2019 09:06:37 +0000 (02:06 -0700)]
format-patch: use enum variables

Before, `thread` and `config_cover_letter` were defined as ints even
though they behaved as enums. Define actual enums and change these
variables to use these new definitions.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agoformat-patch: replace erroneous and condition
Denton Liu [Tue, 15 Oct 2019 09:06:35 +0000 (02:06 -0700)]
format-patch: replace erroneous and condition

Commit 30984ed2e9 (format-patch: support deep threading, 2009-02-19),
introduced the following lines:

#define THREAD_SHALLOW 1

[...]

thread = git_config_bool(var, value) && THREAD_SHALLOW;

Since git_config_bool() returns a bool, the trailing `&& THREAD_SHALLOW`
is a no-op. Replace this errorneous and condition with a ternary
statement so that it is clear what the configured value is when a
boolean is given.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 years agodiff-highlight: fix a whitespace nit
Norman Rasmussen [Tue, 15 Oct 2019 03:31:26 +0000 (03:31 +0000)]
diff-highlight: fix a whitespace nit

This changes the indent from
  "<tab><sp><sp><sp><sp><sp><sp><sp><sp>"
to
  "<tab><tab>"
so that the statement lines up with the rest of the block.

Signed-off-by: Norman Rasmussen <norman@rasmussen.co.za>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>