git
4 years agocommit-graph: don't write commit-graph when disabled
Derrick Stolee [Fri, 9 Oct 2020 20:53:52 +0000 (20:53 +0000)] 
commit-graph: don't write commit-graph when disabled

The core.commitGraph config setting can be set to 'false' to prevent
parsing commits from the commit-graph file(s). This causes an issue when
trying to write with "--split" which needs to distinguish between
commits that are in the existing commit-graph layers and commits that
are not. The existing mechanism uses parse_commit() and follows by
checking if there is a 'graph_pos' that shows the commit was parsed from
the commit-graph file.

When core.commitGraph=false, we do not parse the commits from the
commit-graph and 'graph_pos' indicates that no commits are in the
existing file. The --split logic moves forward creating a new layer on
top that holds all reachable commits, then possibly merges down into
those layers, resulting in duplicate commits. The previous change makes
that merging process more robust to such a situation in case it happens
in the written commit-graph data.

The easy answer here is to avoid writing a commit-graph if reading the
commit-graph is disabled. Since the resulting commit-graph will would not
be read by subsequent Git processes. This is more natural than forcing
core.commitGraph to be true for the 'write' process.

Reported-by: Thomas Braun <thomas.braun@virtuell-zuhause.de>
Helped-by: Jeff King <peff@peff.net>
Helped-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit-graph: ignore duplicates when merging layers
Derrick Stolee [Fri, 9 Oct 2020 20:53:51 +0000 (20:53 +0000)] 
commit-graph: ignore duplicates when merging layers

Thomas reported [1] that a "git fetch" command was failing with an error
saying "unexpected duplicate commit id". The root cause is that they had
fetch.writeCommitGraph enabled which generates commit-graph chains, and
this instance was merging two layers that both contained the same commit
ID.

[1] https://lore.kernel.org/git/55f8f00c-a61c-67d4-889e-a9501c596c39@virtuell-zuhause.de/

The initial assumption is that Git would not write a commit ID into a
commit-graph layer if it already exists in a lower commit-graph layer.
Somehow, this specific case did get into that situation, leading to this
error.

While unexpected, this isn't actually invalid (as long as the two layers
agree on the metadata for the commit). When we parse a commit that does
not have a graph_pos in the commit_graph_data_slab, we use binary search
in the commit-graph layers to find the commit and set graph_pos. That
position is never used again in this case. However, when we parse a
commit from the commit-graph file, we load its parents from the
commit-graph and assign graph_pos at that point. If those parents were
already parsed from the commit-graph, then nothing needs to be done.
Otherwise, this graph_pos is a valid position in the commit-graph so we
can parse the parents, when necessary.

Thus, this die() is too aggressive. The easiest thing to do would be to
ignore the duplicates.

If we only ignore the duplicates, then we will produce a commit-graph
that has identical commit IDs listed in adjacent positions. This excess
data will never be removed from the commit-graph, which could cascade
into significantly bloated file sizes.

Thankfully, we can collapse the list to erase the duplicate commit
pointers. This allows us to get the end result we want without extra
memory costs and minimal CPU time.

The root cause is due to disabling core.commitGraph, which prevents
parsing commits from the lower layers during a 'git commit-graph write
--split' command. Since we use the 'graph_pos' value to determine
whether a commit is in a lower layer, we never discover that those
commits are already in the commit-graph chain and add them to the top
layer. This layer is then merged down, creating duplicates.

The test added in t5324-split-commit-graph.sh fails without this change.
However, we still have not completely removed the need for this
duplicate check. That will come in a follow-up change.

Reported-by: Thomas Braun <thomas.braun@virtuell-zuhause.de>
Helped-by: Taylor Blau <me@ttaylorr.com>
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoGit 2.28 v2.28.0
Junio C Hamano [Mon, 27 Jul 2020 01:01:43 +0000 (18:01 -0700)] 
Git 2.28

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge tag 'l10n-2.28.0-rnd1' of https://www.github.com/git-l10n/git-po into master
Junio C Hamano [Sun, 26 Jul 2020 16:48:11 +0000 (09:48 -0700)] 
Merge tag 'l10n-2.28.0-rnd1' of https://github.com/git-l10n/git-po into master

l10n-2.28.0-rnd1

* tag 'l10n-2.28.0-rnd1' of https://www.github.com/git-l10n/git-po:
  l10n: es: 2.28.0 round 1
  l10n: de.po: Update German translation for Git v2.28.0
  l10n: de.po: fix grammar
  l10n: zh_CN: for git v2.28.0 l10n round 1
  l10n: zh_TW.po: v2.28.0 round 1 (0 untranslated)
  l10n: vi.po: correct "ident line" translation
  l10n: vi.po(4931t): Updated translation for v2.28.0
  l10n: fr v2.28.0 round 1
  l10n: sv.po: Update Swedish translation (4931t0f0u)
  l10n: it.po: update the Italian translation for Git 2.28.0 round 1
  l10n: tr: v2.28.0 round 1
  l10n: git.pot: v2.28.0 round 1 (70 new, 14 removed)
  l10n: Update Catalan translation

4 years agoMerge branch 'master' of github.com:Softcatala/git-po
Jiang Xin [Sun, 26 Jul 2020 16:05:41 +0000 (00:05 +0800)] 
Merge branch 'master' of github.com:Softcatala/git-po

* 'master' of github.com:Softcatala/git-po:
  l10n: Update Catalan translation

4 years agol10n: es: 2.28.0 round 1
Christopher Diaz Riveros [Sun, 26 Jul 2020 15:12:01 +0000 (10:12 -0500)] 
l10n: es: 2.28.0 round 1

Signed-off-by: Christopher Diaz Riveros <christopher.diaz.riv@gmail.com>
4 years agoMerge branch 'ps/ref-transaction-hook' into master
Junio C Hamano [Fri, 24 Jul 2020 22:54:05 +0000 (15:54 -0700)] 
Merge branch 'ps/ref-transaction-hook' into master

A new hook.

* ps/ref-transaction-hook:
  githooks.txt: use correct "reference-transaction" hook name

4 years agogithooks.txt: use correct "reference-transaction" hook name
Bojun Chen [Fri, 24 Jul 2020 13:57:57 +0000 (13:57 +0000)] 
githooks.txt: use correct "reference-transaction" hook name

The "reference transaction" hook was introduced in commit 6754159767
(refs: implement reference transaction hook, 2020-06-19). The name of
the hook is declared as "reference-transaction" in "refs.c" and
testcases, but the name declared in "githooks.txt" is different.

Signed-off-by: Bojun Chen <bojun.cbj@alibaba-inc.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agol10n: de.po: Update German translation for Git v2.28.0
Matthias Rüster [Sun, 12 Jul 2020 11:18:30 +0000 (13:18 +0200)] 
l10n: de.po: Update German translation for Git v2.28.0

Reviewed-by: Ralf Thielow <ralf.thielow@gmail.com>
Signed-off-by: Matthias Rüster <matthias.ruester@gmail.com>
4 years agol10n: de.po: fix grammar
Ralf Thielow [Sun, 5 Jul 2020 15:35:21 +0000 (17:35 +0200)] 
l10n: de.po: fix grammar

Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Signed-off-by: Matthias Rüster <matthias.ruester@gmail.com>
4 years agoDocumentation/RelNotes: fix a typo in 2.28's relnotes
Taylor Blau [Wed, 22 Jul 2020 20:29:40 +0000 (16:29 -0400)] 
Documentation/RelNotes: fix a typo in 2.28's relnotes

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoGit 2.28-rc2 v2.28.0-rc2
Junio C Hamano [Wed, 22 Jul 2020 16:30:01 +0000 (09:30 -0700)] 
Git 2.28-rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'en/sparse-status' into master
Junio C Hamano [Tue, 21 Jul 2020 21:19:09 +0000 (14:19 -0700)] 
Merge branch 'en/sparse-status' into master

Fix to a "git prompt" regression during this development cycle.

* en/sparse-status:
  git-prompt: change == to = for zsh's sake

4 years agol10n: zh_CN: for git v2.28.0 l10n round 1
Jiang Xin [Fri, 10 Jul 2020 02:32:01 +0000 (10:32 +0800)] 
l10n: zh_CN: for git v2.28.0 l10n round 1

Translate 70 new messages (4931t0f0u) for git 2.28.0.

Reviewed-by: Fangyi Zhou <me@fangyi.io>
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
4 years agoMerge branch 'l10n/zh_TW/200716' of github.com:l10n-tw/git-po
Jiang Xin [Tue, 21 Jul 2020 08:00:54 +0000 (16:00 +0800)] 
Merge branch 'l10n/zh_TW/200716' of github.com:l10n-tw/git-po

* 'l10n/zh_TW/200716' of github.com:l10n-tw/git-po:
  l10n: zh_TW.po: v2.28.0 round 1 (0 untranslated)

4 years agogit-prompt: change == to = for zsh's sake
David J. Malan [Tue, 21 Jul 2020 00:15:31 +0000 (00:15 +0000)] 
git-prompt: change == to = for zsh's sake

When using git-prompt.sh with zsh, __git_ps1 currently errs
when inside a repo with:

__git_ps1:96: = not found

Avoid using non-portable "==" that is only understood by bash
and not zsh. Change to "=" so that the prompt script becomes
usable with zsh again.

Signed-off-by: David J. Malan <malan@harvard.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge https://github.com/prati0100/git-gui into master
Junio C Hamano [Mon, 20 Jul 2020 19:04:06 +0000 (12:04 -0700)] 
Merge https://github.com/prati0100/git-gui into master

* https://github.com/prati0100/git-gui:
  git-gui: allow opening work trees from the startup dialog

4 years agol10n: zh_TW.po: v2.28.0 round 1 (0 untranslated)
Yi-Jyun Pan [Thu, 16 Jul 2020 10:40:58 +0000 (18:40 +0800)] 
l10n: zh_TW.po: v2.28.0 round 1 (0 untranslated)

Signed-off-by: Yi-Jyun Pan <pan93412@gmail.com>
4 years agol10n: vi.po: correct "ident line" translation
Đoàn Trần Công Danh [Thu, 16 Jul 2020 13:32:51 +0000 (20:32 +0700)] 
l10n: vi.po: correct "ident line" translation

While we're at it, fix some minor misspelling
and improve translation for 3-way-merging.

Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Tran Ngoc Quan <vnwildman@gmail.com>
4 years agol10n: vi.po(4931t): Updated translation for v2.28.0
Tran Ngoc Quan [Wed, 15 Jul 2020 08:31:56 +0000 (15:31 +0700)] 
l10n: vi.po(4931t): Updated translation for v2.28.0

Signed-off-by: Tran Ngoc Quan <vnwildman@gmail.com>
4 years agoMerge branch 'dl/branch-cleanup' into master
Junio C Hamano [Sat, 18 Jul 2020 23:35:22 +0000 (16:35 -0700)] 
Merge branch 'dl/branch-cleanup' into master

Last minute fix-up to tests for portability.

* dl/branch-cleanup:
  t3200: don't grep for `strerror()` string

4 years agoMerge branch 'js/pu-to-seen' into master
Junio C Hamano [Sat, 18 Jul 2020 23:35:21 +0000 (16:35 -0700)] 
Merge branch 'js/pu-to-seen' into master

Last minute fix-up to documentation.

* js/pu-to-seen:
  gitworkflows.txt: fix broken subsection underline

4 years agoMerge branch 'jc/relnotes-v0-extension-update' into master
Junio C Hamano [Sat, 18 Jul 2020 23:35:20 +0000 (16:35 -0700)] 
Merge branch 'jc/relnotes-v0-extension-update' into master

Last minute fix-up to the release notes.

* jc/relnotes-v0-extension-update:
  RelNotes: update the v0 with extension situation

4 years agot3200: don't grep for `strerror()` string
Martin Ågren [Sat, 18 Jul 2020 09:48:40 +0000 (11:48 +0200)] 
t3200: don't grep for `strerror()` string

In 6b7093064a ("t3200: test for specific errors", 2020-06-15), we
learned to grep stderr to ensure that the failing `git branch`
invocations fail for the right reason. In two of these tests, we grep
for "File exists", expecting the string to show up there since config.c
calls `error_errno()`, which ends up including `strerror(errno)` in the
error message.

But as we saw in 4605a73073 ("t1091: don't grep for `strerror()`
string", 2020-03-08), there exists at least one implementation where
`strerror()` yields a slightly different string than the one we're
grepping for. In particular, these tests fail on the NonStop platform.

Similar to 4605a73073, grep for the beginning of the string instead to
avoid relying on `strerror()` behavior.

Reported-by: Randall S. Becker <rsbecker@nexbridge.com>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogitworkflows.txt: fix broken subsection underline
Martin Ågren [Sat, 18 Jul 2020 20:17:23 +0000 (22:17 +0200)] 
gitworkflows.txt: fix broken subsection underline

AsciiDoctor renders the "~~~~~~~~~" literally. That's not our intention:
it is supposed to indicate a level 2 subsection. In 828197de8f ("docs:
adjust for the recent rename of `pu` to `seen`", 2020-06-25), the length
of this section header grew by two characters but we didn't adjust the
number of ~ characters accordingly. AsciiDoc handles this discrepancy ok
and still picks this up as a subsection title, but Asciidoctor is not as
forgiving.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoRelNotes: update the v0 with extension situation
Junio C Hamano [Fri, 17 Jul 2020 20:33:04 +0000 (13:33 -0700)] 
RelNotes: update the v0 with extension situation

With the two-patch series for regression fix, to the users from 2.27
days, there is no visible behaviour change---we do not warn and fail
use of v0 repositories with newer extensions yet, so there is nothing
to note in the backward compatibility section.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoGit 2.28-rc1 v2.28.0-rc1
Junio C Hamano [Fri, 17 Jul 2020 01:02:52 +0000 (18:02 -0700)] 
Git 2.28-rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'jn/v0-with-extensions-fix' into master
Junio C Hamano [Fri, 17 Jul 2020 00:58:42 +0000 (17:58 -0700)] 
Merge branch 'jn/v0-with-extensions-fix' into master

In 2.28-rc0, we corrected a bug that some repository extensions are
honored by mistake even in a version 0 repositories (these
configuration variables in extensions.* namespace were supposed to
have special meaning in repositories whose version numbers are 1 or
higher), but this was a bit too big a change.

* jn/v0-with-extensions-fix:
  repository: allow repository format upgrade with extensions
  Revert "check_repository_format_gently(): refuse extensions for old repositories"

4 years agorepository: allow repository format upgrade with extensions
Jonathan Nieder [Thu, 16 Jul 2020 06:28:18 +0000 (23:28 -0700)] 
repository: allow repository format upgrade with extensions

Now that we officially permit repository extensions in repository
format v0, permit upgrading a repository with extensions from v0 to v1
as well.

For example, this means a repository where the user has set
"extensions.preciousObjects" can use "git fetch --filter=blob:none
origin" to upgrade the repository to use v1 and the partial clone
extension.

To avoid mistakes, continue to forbid repository format upgrades in v0
repositories with an unrecognized extension.  This way, a v0 user
using a misspelled extension field gets a chance to correct the
mistake before updating to the less forgiving v1 format.

While we're here, make the error message for failure to upgrade the
repository format a bit shorter, and present it as an error, not a
warning.

Reported-by: Huan Huan Chen <huanhuanchen@google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoRevert "check_repository_format_gently(): refuse extensions for old repositories"
Jonathan Nieder [Thu, 16 Jul 2020 06:24:29 +0000 (23:24 -0700)] 
Revert "check_repository_format_gently(): refuse extensions for old repositories"

This reverts commit 14c7fa269e42df4133edd9ae7763b678ed6594cd.

The core.repositoryFormatVersion field was introduced in ab9cb76f661
(Repository format version check., 2005-11-25), providing a welcome
bit of forward compatibility, thanks to some welcome analysis by
Martin Atukunda.  The semantics are simple: a repository with
core.repositoryFormatVersion set to 0 should be comprehensible by all
Git implementations in active use; and Git implementations should
error out early instead of trying to act on Git repositories with
higher core.repositoryFormatVersion values representing new formats
that they do not understand.

A new repository format did not need to be defined until 00a09d57eb8
(introduce "extensions" form of core.repositoryformatversion,
2015-06-23).  This provided a finer-grained extension mechanism for
Git repositories.  In a repository with core.repositoryFormatVersion
set to 1, Git implementations can act on "extensions.*" settings that
modify how a repository is interpreted.  In repository format version
1, unrecognized extensions settings cause Git to error out.

What happens if a user sets an extension setting but forgets to
increase the repository format version to 1?  The extension settings
were still recognized in that case; worse, unrecognized extensions
settings do *not* cause Git to error out.  So combining repository
format version 0 with extensions settings produces in some sense the
worst of both worlds.

To improve that situation, since 14c7fa269e4
(check_repository_format_gently(): refuse extensions for old
repositories, 2020-06-05) Git instead ignores extensions in v0 mode.
This way, v0 repositories get the historical (pre-2015) behavior and
maintain compatibility with Git implementations that do not know about
the v1 format.  Unfortunately, users had been using this sort of
configuration and this behavior change came to many as a surprise:

- users of "git config --worktree" that had followed its advice
  to enable extensions.worktreeConfig (without also increasing the
  repository format version) would find their worktree configuration
  no longer taking effect

- tools such as copybara[*] that had set extensions.partialClone in
  existing repositories (without also increasing the repository format
  version) would find that setting no longer taking effect

The behavior introduced in 14c7fa269e4 might be a good behavior if we
were traveling back in time to 2015, but we're far too late.  For some
reason I thought that it was what had been originally implemented and
that it had regressed.  Apologies for not doing my research when
14c7fa269e4 was under development.

Let's return to the behavior we've had since 2015: always act on
extensions.* settings, regardless of repository format version.  While
we're here, include some tests to describe the effect on the "upgrade
repository version" code path.

[*] https://github.com/google/copybara/commit/ca76c0b1e13c4e36448d12c2aba4a5d9d98fb6e7

Reported-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoHopefully the last batch before -rc1
Junio C Hamano [Wed, 15 Jul 2020 23:29:51 +0000 (16:29 -0700)] 
Hopefully the last batch before -rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'tb/commit-graph-no-check-oids' into master
Junio C Hamano [Wed, 15 Jul 2020 23:29:45 +0000 (16:29 -0700)] 
Merge branch 'tb/commit-graph-no-check-oids' into master

Fix to the code to produce progress bar, which is new in the
upcoming release.

* tb/commit-graph-no-check-oids:
  commit-graph: fix "Collecting commits from input" progress line

4 years agoMerge branch 'ct/diff-with-merge-base-clarification' into master
Junio C Hamano [Wed, 15 Jul 2020 23:29:44 +0000 (16:29 -0700)] 
Merge branch 'ct/diff-with-merge-base-clarification' into master

Doc update.

* ct/diff-with-merge-base-clarification:
  git-diff.txt: reorder possible usages
  git-diff.txt: don't mark required argument as optional

4 years agoMerge branch 'sg/commit-graph-progress-fix' into master
Junio C Hamano [Wed, 15 Jul 2020 23:29:43 +0000 (16:29 -0700)] 
Merge branch 'sg/commit-graph-progress-fix' into master

The code to produce progress output from "git commit-graph --write"
had a few breakages, which have been fixed.

* sg/commit-graph-progress-fix:
  commit-graph: fix "Writing out commit graph" progress counter
  commit-graph: fix progress of reachable commits

4 years agoMerge branch 'ta/wait-on-aliased-commands-upon-signal' into master
Junio C Hamano [Wed, 15 Jul 2020 23:29:43 +0000 (16:29 -0700)] 
Merge branch 'ta/wait-on-aliased-commands-upon-signal' into master

When an aliased command, whose output is piped to a pager by git,
gets killed by a signal, the pager got into a funny state, which
has been corrected (again).

* ta/wait-on-aliased-commands-upon-signal:
  Wait for child on signal death for aliases to externals
  Wait for child on signal death for aliases to builtins

4 years agocommit-graph: fix "Collecting commits from input" progress line
SZEDER Gábor [Fri, 10 Jul 2020 19:02:38 +0000 (21:02 +0200)] 
commit-graph: fix "Collecting commits from input" progress line

To display a progress line while reading commits from standard input
and looking them up, 5b6653e523 (builtin/commit-graph.c: dereference
tags in builtin, 2020-05-13) should have added a pair of
start_delayed_progress() and stop_progress() calls around the loop
reading stdin.  Alas, the stop_progress() call ended up at the wrong
place, after write_commit_graph(), which does all the commit-graph
computation and writing, and has several progress lines of its own.
Consequently, that new

  Collecting commits from input: 1234

progress line is overwritten by the first progress line shown by
write_commit_graph(), and its final "done" line is shown last, after
everything is finished:

  $ { sleep 3 ; git rev-list -3 HEAD ; sleep 1 ; } | ~/src/git/git commit-graph write --stdin-commits
  Expanding reachable commits in commit graph: 873402, done.
  Writing out commit graph in 4 passes: 100% (3493608/3493608), done.
  Collecting commits from input: 3, done.

Furthermore, that stop_progress() call was added after the 'cleanup'
label, where that loop reading stdin jumps in case of an error.  In
case of invalid input this then results in the "done" line shown after
the error message:

  $ { sleep 3 ; git rev-list -3 HEAD ; echo junk ; } | ~/src/git/git commit-graph write --stdin-commits
  error: unexpected non-hex object ID: junk
  Collecting commits from input: 3, done.

Move that stop_progress() call to the right place.

While at it, drop the unnecessary 'if (progress)' condition protecting
the stop_progress() call, because that function is prepared to handle
a NULL progress struct.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Reviewed-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogit-diff.txt: reorder possible usages
Martin Ågren [Mon, 13 Jul 2020 19:10:09 +0000 (21:10 +0200)] 
git-diff.txt: reorder possible usages

The description of `git diff` goes through several different invocations
(numbering added by me):

  1. git diff [<options>] [--] [<path>...]
  2. git diff [<options>] --no-index [--] <path> <path>
  3. git diff [<options>] --cached [<commit>] [--] [<path>...]
  4. git diff [<options>] <commit> [--] [<path>...]
  5. git diff [<options>] <commit> <commit> [--] [<path>...]
  6. git diff [<options>] <commit>..<commit> [--] [<path>...]
  7. git diff [<options>] <commit> <commit>... <commit> [--] [<path>...]
  8. git diff [<options>] <commit>...<commit> [--] [<path>...]

It then goes on to say that "all of the <commit> in the above
description, except in the last two forms that use '..' notations, can
be any <tree>". The "last two" actually refers to 6 and 8. This got out
of sync in commit b7e10b2ca2 ("Documentation: usage for diff combined
commits", 2020-06-12) which added item 7 to the mix.

As a further complication, after b7e10b2ca2 we also have some potential
confusion around "the '..' notation". The "..[.]" in items 6 and 8 are
part of the rev notation, whereas the "..." in item 7 is manpage
language for "one or more".

Move item 6 down, i.e., to between 7 and 8, to restore the ordering.
Because 6 refers to 5 ("synonymous to the previous form") we need to
tweak the language a bit.

An added bonus of this commit is that we're trying to steer users away
from `git diff <commit>..<commit>` and moving it further down probably
doesn't hurt.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agogit-diff.txt: don't mark required argument as optional
Martin Ågren [Mon, 13 Jul 2020 19:10:08 +0000 (21:10 +0200)] 
git-diff.txt: don't mark required argument as optional

Commit b7e10b2ca2 ("Documentation: usage for diff combined commits",
2020-06-12) modified the synopsis by adding an optional "[<commit>...]"
to

  'git diff' [<options>] <commit> <commit> [--] [<path>...]

to effectively add

  'git diff' [<options>] <commit> <commit>... <commit> [--] [<path>...]

as another valid invocation. Which makes sense.

Further down, in the description, it left the existing entry for

  'git diff' [<options>] <commit> <commit> [--] [<path>...]

intact and added a new entry on

  'git diff' [<options>] <commit> [<commit>...] <commit> [--] [<path>...]

where it says that "[t]his form is to view the results of a merge
commit" and details how "the first listed commit must be the merge
itself". But one possible instantiation of this form is `git diff
<commit> <commit>` for which the added text doesn't really apply.

Remove the brackets so that we lose this overlap between the two
descriptions. We can still use the more compact representation in the
synopsis.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'fr_v2.28.0_rnd1' of github.com:jnavila/git
Jiang Xin [Mon, 13 Jul 2020 00:39:23 +0000 (08:39 +0800)] 
Merge branch 'fr_v2.28.0_rnd1' of github.com:jnavila/git

* 'fr_v2.28.0_rnd1' of github.com:jnavila/git:
  l10n: fr v2.28.0 round 1

4 years agol10n: fr v2.28.0 round 1
Jean-Noël Avila [Sun, 12 Jul 2020 16:15:44 +0000 (18:15 +0200)] 
l10n: fr v2.28.0 round 1

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
4 years agoMerge branch 'master' of github.com:nafmo/git-l10n-sv
Jiang Xin [Sun, 12 Jul 2020 09:53:39 +0000 (17:53 +0800)] 
Merge branch 'master' of github.com:nafmo/git-l10n-sv

* 'master' of github.com:nafmo/git-l10n-sv:
  l10n: sv.po: Update Swedish translation (4931t0f0u)

4 years agol10n: sv.po: Update Swedish translation (4931t0f0u)
Peter Krefting [Sat, 11 Jul 2020 16:52:35 +0000 (17:52 +0100)] 
l10n: sv.po: Update Swedish translation (4931t0f0u)

Signed-off-by: Peter Krefting <peter@softwolves.pp.se>
4 years agol10n: it.po: update the Italian translation for Git 2.28.0 round 1
Alessandro Menti [Sat, 11 Jul 2020 13:35:23 +0000 (15:35 +0200)] 
l10n: it.po: update the Italian translation for Git 2.28.0 round 1

Signed-off-by: Alessandro Menti <alessandro.menti@alessandromenti.it>
4 years agol10n: tr: v2.28.0 round 1
Emir Sarı [Fri, 10 Jul 2020 10:07:30 +0000 (13:07 +0300)] 
l10n: tr: v2.28.0 round 1

Signed-off-by: Emir Sarı <bitigchi@me.com>
4 years agol10n: git.pot: v2.28.0 round 1 (70 new, 14 removed)
Jiang Xin [Fri, 10 Jul 2020 01:54:33 +0000 (09:54 +0800)] 
l10n: git.pot: v2.28.0 round 1 (70 new, 14 removed)

Generate po/git.pot from v2.28.0-rc0 for git v2.28.0 l10n round 1.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
4 years agoGit 2.28-rc0 v2.28.0-rc0
Junio C Hamano [Thu, 9 Jul 2020 20:45:21 +0000 (13:45 -0700)] 
Git 2.28-rc0

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'mt/entry-fstat-fallback-fix' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:45 +0000 (14:00 -0700)] 
Merge branch 'mt/entry-fstat-fallback-fix' into master

"git checkout" failed to catch an error from fstat() after updating
a path in the working tree.

* mt/entry-fstat-fallback-fix:
  entry: check for fstat() errors after checkout

4 years agoMerge branch 'ma/rebase-doc-typofix' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:44 +0000 (14:00 -0700)] 
Merge branch 'ma/rebase-doc-typofix' into master

Typofix.

* ma/rebase-doc-typofix:
  git-rebase.txt: fix description list separator

4 years agoMerge branch 'jn/eject-fetch-write-commit-graph-out-of-experimental' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:44 +0000 (14:00 -0700)] 
Merge branch 'jn/eject-fetch-write-commit-graph-out-of-experimental' into master

"fetch.writeCommitGraph" was enabled when "feature.experimental" is
asked for, but it was found to be a bit too risky even for bold
folks in its current shape.  The configuration has been ejected, at
least for now, from the "experimental" feature set.

* jn/eject-fetch-write-commit-graph-out-of-experimental:
  experimental: default to fetch.writeCommitGraph=false

4 years agoMerge branch 'tb/fix-persistent-shallow' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:44 +0000 (14:00 -0700)] 
Merge branch 'tb/fix-persistent-shallow' into master

When "fetch.writeCommitGraph" configuration is set in a shallow
repository and a fetch moves the shallow boundary, we wrote out
broken commit-graph files that do not match the reality, which has
been corrected.

* tb/fix-persistent-shallow:
  commit.c: don't persist substituted parents when unshallowing

4 years agoMerge branch 'ct/diff-with-merge-base-clarification' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:43 +0000 (14:00 -0700)] 
Merge branch 'ct/diff-with-merge-base-clarification' into master

Recent update to "git diff" meant as a code clean-up introduced a
bug in its error handling code, which has been corrected.

* ct/diff-with-merge-base-clarification:
  diff: check for merge bases before assigning sym->base

4 years agoMerge branch 'rs/line-log-until' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:42 +0000 (14:00 -0700)] 
Merge branch 'rs/line-log-until' into master

"git log -Lx,y:path --before=date" lost track of where the range
should be because it didn't take the changes made by the youngest
commits that are omitted from the output into account.

* rs/line-log-until:
  revision: disable min_age optimization with line-log

4 years agoMerge branch 'ra/send-email-in-reply-to-from-command-line-wins' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:42 +0000 (14:00 -0700)] 
Merge branch 'ra/send-email-in-reply-to-from-command-line-wins' into master

"git send-email --in-reply-to=<msg>" did not use the In-Reply-To:
header with the value given from the command line, and let it be
overridden by the value on In-Reply-To: header in the messages
being sent out (if exists).

* ra/send-email-in-reply-to-from-command-line-wins:
  send-email: restore --in-reply-to superseding behavior

4 years agoMerge branch 'vs/completion-with-set-u' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:41 +0000 (14:00 -0700)] 
Merge branch 'vs/completion-with-set-u' into master

The command line completion support (in contrib/) used to be
prepared to work with "set -u" but recent changes got a bit more
sloppy.  This has been corrected.

* vs/completion-with-set-u:
  completion: nounset mode fixes

4 years agoMerge branch 'cc/cat-file-usage-update' into master
Junio C Hamano [Thu, 9 Jul 2020 21:00:41 +0000 (14:00 -0700)] 
Merge branch 'cc/cat-file-usage-update' into master

Doc/usage update.

* cc/cat-file-usage-update:
  cat-file: add missing [=<format>] to usage/synopsis

4 years agogit-rebase.txt: fix description list separator
Martin Ågren [Thu, 9 Jul 2020 18:24:38 +0000 (20:24 +0200)] 
git-rebase.txt: fix description list separator

We don't give a "::" for the list separator, but just a single ":". This
ends up rendering literally, "--apply: Use applying strategies ...". As
a follow-on error, the list continuation, "+", also ends up rendering
literally (because we don't have a list).

This was introduced in 52eb738d6b ("rebase: add an --am option",
2020-02-15) and survived the rename in 10cdb9f38a ("rebase: rename the
two primary rebase backends", 2020-02-15).

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agol10n: Update Catalan translation
Jordi Mas [Thu, 9 Jul 2020 18:01:42 +0000 (20:01 +0200)] 
l10n: Update Catalan translation

Signed-off-by: Jordi Mas <jmas@softcatala.org>
4 years agocommit-graph: fix "Writing out commit graph" progress counter
SZEDER Gábor [Thu, 9 Jul 2020 17:00:03 +0000 (19:00 +0200)] 
commit-graph: fix "Writing out commit graph" progress counter

76ffbca71a (commit-graph: write Bloom filters to commit graph file,
2020-04-06) added two delayed progress lines to writing the Bloom
filter index and data chunk.  This is wrong, because a single common
progress is used while writing all chunks, which is not updated while
writing these two new chunks, resulting in incomplete-looking "done"
lines:

  Expanding reachable commits in commit graph: 888679, done.
  Computing commit changed paths Bloom filters: 100% (888678/888678), done.
  Writing out commit graph in 6 passes:  66% (3554712/5332068), done.

Use the common 'struct progress' instance while writing the Bloom
filter chunks as well.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit-graph: fix progress of reachable commits
SZEDER Gábor [Thu, 9 Jul 2020 16:54:32 +0000 (18:54 +0200)] 
commit-graph: fix progress of reachable commits

To display a progress line while iterating over all refs,
d335ce8f24 (commit-graph.c: show progress of finding reachable
commits, 2020-05-13) should have added a pair of
start_delayed_progress() and stop_progress() calls around a
for_each_ref() invocation.  Alas, the stop_progress() call ended up at
the wrong place, after write_commit_graph(), which does all the
commit-graph computation and writing, and has several progress lines
of its own.  Consequently, that new

  Collecting referenced commits: 123

progress line is overwritten by the first progress line shown by
write_commit_graph(), and its final "done" line is shown last, after
everything is finished:

  Expanding reachable commits in commit graph: 344786, done.
  Computing commit changed paths Bloom filters: 100% (344786/344786), done.
  Collecting referenced commits: 154, done.

Move that stop_progress() call to the right place.

While at it, drop the unnecessary 'if (data.progress)' condition
protecting the stop_progress() call, because that function is prepared
to handle a NULL progress struct.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoentry: check for fstat() errors after checkout
Matheus Tavares [Thu, 9 Jul 2020 02:10:39 +0000 (23:10 -0300)] 
entry: check for fstat() errors after checkout

In 11179eb311 ("entry.c: check if file exists after checkout",
2017-10-05) we started checking the result of the lstat() call done
after writing a file, to avoid writing garbage to the corresponding
cache entry. However, the code skips calling lstat() if it's possible
to use fstat() when it still has the file descriptor open. And when
calling fstat() we don't do the same error checking. To fix that, let
the callers of fstat_output() know when fstat() fails. In this case,
write_entry() will try to use lstat() and properly report an error if
that fails as well.

Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoexperimental: default to fetch.writeCommitGraph=false
Jonathan Nieder [Tue, 7 Jul 2020 06:20:39 +0000 (23:20 -0700)] 
experimental: default to fetch.writeCommitGraph=false

The fetch.writeCommitGraph feature makes fetches write out a commit
graph file for the newly downloaded pack on fetch.  This improves the
performance of various commands that would perform a revision walk and
eventually ought to be the default for everyone.  To prepare for that
future, it's enabled by default for users that set
feature.experimental=true to experience such future defaults.

Alas, for --unshallow fetches from a shallow clone it runs into a
snag: by the time Git has fetched the new objects and is writing a
commit graph, it has performed a revision walk and r->parsed_objects
contains information about the shallow boundary from *before* the
fetch.  The commit graph writing code is careful to avoid writing a
commit graph file in shallow repositories, but the new state is not
shallow, and the result is that from that point on, commands like "git
log" make use of a newly written commit graph file representing a
fictional history with the old shallow boundary.

We could fix this by making the commit graph writing code more careful
to avoid writing a commit graph that could have used any grafts or
shallow state, but it is possible that there are other pieces of
mutated state that fetch's commit graph writing code may be relying
on.  So disable it in the feature.experimental configuration.

Google developers have been running in this configuration (by setting
fetch.writeCommitGraph=false in the system config) to work around this
bug since it was discovered in April.  Once the fix lands, we'll
enable fetch.writeCommitGraph=true again to give it some early testing
before rolling out to a wider audience.

In other words:

- this patch only affects behavior with feature.experimental=true

- it makes feature.experimental match the configuration Google has
  been using for the last few months, meaning it would leave users in
  a better tested state than without it

- this should improve testing for other features guarded by
  feature.experimental, by making feature.experimental safer to use

Reported-by: Jay Conrod <jayconrod@google.com>
Helped-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit.c: don't persist substituted parents when unshallowing
Taylor Blau [Wed, 8 Jul 2020 21:10:53 +0000 (17:10 -0400)] 
commit.c: don't persist substituted parents when unshallowing

Since 37b9dcabfc (shallow.c: use '{commit,rollback}_shallow_file',
2020-04-22), Git knows how to reset stat-validity checks for the
$GIT_DIR/shallow file, allowing it to change between a shallow and
non-shallow state in the same process (e.g., in the case of 'git fetch
--unshallow').

However, when $GIT_DIR/shallow changes, Git does not alter or remove any
grafts (nor substituted parents) in memory.

This comes up in a "git fetch --unshallow" with fetch.writeCommitGraph
set to true. Ordinarily in a shallow repository (and before 37b9dcabfc,
even in this case), commit_graph_compatible() would return false,
indicating that the repository should not be used to write a
commit-graphs (since commit-graph files cannot represent a shallow
history). But since 37b9dcabfc, in an --unshallow operation that check
succeeds.

Thus even though the repository isn't shallow any longer (that is, we
have all of the objects), the in-core representation of those objects
still has munged parents at the shallow boundaries.  When the
commit-graph write proceeds, we use the incorrect parentage, producing
wrong results.

There are two ways for a user to work around this: either (1) set
'fetch.writeCommitGraph' to 'false', or (2) drop the commit-graph after
unshallowing.

One way to fix this would be to reset the parsed object pool entirely
(flushing the cache and thus preventing subsequent reads from modifying
their parents) after unshallowing. That would produce a problem when
callers have a now-stale reference to the old pool, and so this patch
implements a different approach. Instead, attach a new bit to the pool,
'substituted_parent', which indicates if the repository *ever* stored a
commit which had its parents modified (i.e., the shallow boundary
prior to unshallowing).

This bit needs to be sticky because all reads subsequent to modifying a
commit's parents are unreliable when unshallowing. Modify the check in
'commit_graph_compatible' to take this bit into account, and correctly
avoid generating commit-graphs in this case, thus solving the bug.

Helped-by: Derrick Stolee <dstolee@microsoft.com>
Helped-by: Jonathan Nieder <jrnieder@gmail.com>
Reported-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodiff: check for merge bases before assigning sym->base
Jeff King [Wed, 8 Jul 2020 04:38:19 +0000 (00:38 -0400)] 
diff: check for merge bases before assigning sym->base

In symdiff_prepare(), we iterate over the set of parsed objects to pick
out any symmetric differences, including the left, right, and base
elements. We assign the results into pointers in a "struct symdiff", and
then complain if we didn't find a base, like so:

    sym->left = rev->pending.objects[lpos].name;
    sym->right = rev->pending.objects[rpos].name;
    sym->base = rev->pending.objects[basepos].name;
    if (basecount == 0)
            die(_("%s...%s: no merge base"), sym->left, sym->right);

But the least lines are backwards. If basecount is 0, then basepos will
be -1, and we will access memory outside of the pending array. This
isn't usually that big a deal, since we don't do anything besides a
single pointer-sized read before exiting anyway, but it does violate the
C standard, and of course memory-checking tools like ASan complain.

Let's put the basecount check first. Note that we haveto split it from
the other assignments, since the die() relies on sym->left and
sym->right having been assigned (this isn't strictly necessary, but is
easier to read than dereferencing the pending array again).

Reported-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoWait for child on signal death for aliases to externals
Trygve Aaberge [Tue, 7 Jul 2020 12:17:15 +0000 (14:17 +0200)] 
Wait for child on signal death for aliases to externals

When we are running an alias to an external command, we want to wait for
that process to exit even after receiving ^C which normally kills the
git process. This is useful when the process is ignoring SIGINT (which
e.g. pagers often do), and then we don't want it to be killed.

Having an alias which invokes a pager is probably not common, but it can
be useful e.g. if you have an alias to a git command which uses a
subshell as one of the arguments (in which case you have to use an
external command, not an alias to a builtin).

This patch is similar to the previous commit, but the previous commit
fixed this only for aliases to builtins, while this commit does the same
for aliases to external commands. In addition to waiting after clean
like the previous commit, this also enables cleaning the child (that was
already enabled for aliases to builtins before the previous commit),
because wait_after_clean relies on it. Lastly, while the previous commit
fixed a regression, I don't think this has ever worked properly.

Signed-off-by: Trygve Aaberge <trygveaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoWait for child on signal death for aliases to builtins
Trygve Aaberge [Tue, 7 Jul 2020 12:17:14 +0000 (14:17 +0200)] 
Wait for child on signal death for aliases to builtins

When you hit ^C all the processes in the tree receives it. When a git
command uses a pager, git ignores this and waits until the pager quits.
However, when using an alias there is an additional process in the tree
which didn't ignore the signal. That caused it to exit which in turn
caused the pager to exit. This fixes that for aliases to builtins.

This was originally fixed in 46df6906 (execv_dashed_external: wait
for child on signal death, 2017-01-06), but was broken by ee4512ed
(trace2: create new combined trace facility, 2019-02-22) and then
b9140840 (git: avoid calling aliased builtins via their dashed form,
2019-07-29).

Signed-off-by: Trygve Aaberge <trygveaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe seventh batch
Junio C Hamano [Tue, 7 Jul 2020 05:13:31 +0000 (22:13 -0700)] 
The seventh batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'es/worktree-code-cleanup'
Junio C Hamano [Tue, 7 Jul 2020 05:09:19 +0000 (22:09 -0700)] 
Merge branch 'es/worktree-code-cleanup'

Code cleanup.

* es/worktree-code-cleanup:
  worktree: avoid dead-code in conditional

4 years agoMerge branch 'dl/test-must-fail-fixes-5'
Junio C Hamano [Tue, 7 Jul 2020 05:09:18 +0000 (22:09 -0700)] 
Merge branch 'dl/test-must-fail-fixes-5'

The effort to avoid using test_must_fail on non-git command continues.

* dl/test-must-fail-fixes-5:
  lib-submodule-update: pass 'test_must_fail' as an argument
  lib-submodule-update: prepend "git" to $command
  lib-submodule-update: consolidate --recurse-submodules
  lib-submodule-update: add space after function name

4 years agoMerge branch 'jk/fast-export-anonym-alt'
Junio C Hamano [Tue, 7 Jul 2020 05:09:17 +0000 (22:09 -0700)] 
Merge branch 'jk/fast-export-anonym-alt'

"git fast-export --anonymize" learned to take customized mapping to
allow its users to tweak its output more usable for debugging.

* jk/fast-export-anonym-alt:
  fast-export: use local array to store anonymized oid
  fast-export: anonymize "master" refname
  fast-export: allow seeding the anonymized mapping
  fast-export: add a "data" callback parameter to anonymize_str()
  fast-export: move global "idents" anonymize hashmap into function
  fast-export: use a flex array to store anonymized entries
  fast-export: stop storing lengths in anonymized hashmaps
  fast-export: tighten anonymize_mem() interface to handle only strings
  fast-export: store anonymized oids as hex strings
  fast-export: use xmemdupz() for anonymizing oids
  t9351: derive anonymized tree checks from original repo

4 years agoMerge branch 'js/diff-files-i-t-a-fix-for-difftool'
Junio C Hamano [Tue, 7 Jul 2020 05:09:17 +0000 (22:09 -0700)] 
Merge branch 'js/diff-files-i-t-a-fix-for-difftool'

"git difftool" has trouble dealing with paths added to the index
with the intent-to-add bit.

* js/diff-files-i-t-a-fix-for-difftool:
  difftool -d: ensure that intent-to-add files are handled correctly
  diff-files --raw: show correct post-image of intent-to-add files

4 years agoMerge branch 'js/default-branch-name'
Junio C Hamano [Tue, 7 Jul 2020 05:09:17 +0000 (22:09 -0700)] 
Merge branch 'js/default-branch-name'

The name of the primary branch in existing repositories, and the
default name used for the first branch in newly created
repositories, is made configurable, so that we can eventually wean
ourselves off of the hardcoded 'master'.

* js/default-branch-name:
  contrib: subtree: adjust test to change in fmt-merge-msg
  testsvn: respect `init.defaultBranch`
  remote: use the configured default branch name when appropriate
  clone: use configured default branch name when appropriate
  init: allow setting the default for the initial branch name via the config
  init: allow specifying the initial branch name for the new repository
  docs: add missing diamond brackets
  submodule: fall back to remote's HEAD for missing remote.<name>.branch
  send-pack/transport-helper: avoid mentioning a particular branch
  fmt-merge-msg: stop treating `master` specially

4 years agoMerge branch 'rs/pack-bits-in-object-better'
Junio C Hamano [Tue, 7 Jul 2020 05:09:17 +0000 (22:09 -0700)] 
Merge branch 'rs/pack-bits-in-object-better'

By renumbering object flag bits, "struct object" managed to lose
bloated inter-field padding.

* rs/pack-bits-in-object-better:
  revision: reallocate TOPO_WALK object flags

4 years agoMerge branch 'bc/http-push-flagsfix'
Junio C Hamano [Tue, 7 Jul 2020 05:09:17 +0000 (22:09 -0700)] 
Merge branch 'bc/http-push-flagsfix'

The code to push changes over "dumb" HTTP had a bad interaction
with the commit reachability code due to incorrect allocation of
object flag bits, which has been corrected.

* bc/http-push-flagsfix:
  http-push: ensure unforced pushes fail when data would be lost

4 years agoMerge branch 'js/pu-to-seen'
Junio C Hamano [Tue, 7 Jul 2020 05:09:16 +0000 (22:09 -0700)] 
Merge branch 'js/pu-to-seen'

The documentation and some tests have been adjusted for the recent
renaming of "pu" branch to "seen".

* js/pu-to-seen:
  tests: reference `seen` wherever `pu` was referenced
  docs: adjust the technical overview for the rename `pu` -> `seen`
  docs: adjust for the recent rename of `pu` to `seen`

4 years agoMerge branch 'cb/is-descendant-of'
Junio C Hamano [Tue, 7 Jul 2020 05:09:15 +0000 (22:09 -0700)] 
Merge branch 'cb/is-descendant-of'

Code clean-up.

* cb/is-descendant-of:
  commit-reach: avoid is_descendant_of() shim

4 years agoMerge branch 'mk/pb-pretty-email-without-domain-part-fix'
Junio C Hamano [Tue, 7 Jul 2020 05:09:15 +0000 (22:09 -0700)] 
Merge branch 'mk/pb-pretty-email-without-domain-part-fix'

Docfix.

* mk/pb-pretty-email-without-domain-part-fix:
  doc: fix author vs. committer copy/paste error

4 years agoMerge branch 'jl/complete-git-prune'
Junio C Hamano [Tue, 7 Jul 2020 05:09:15 +0000 (22:09 -0700)] 
Merge branch 'jl/complete-git-prune'

Add "git prune" to the completion (in contrib/), which could be
typed by end-users from the command line.

* jl/complete-git-prune:
  bash-completion: add git-prune into bash completion

4 years agoMerge branch 'es/get-worktrees-unsort'
Junio C Hamano [Tue, 7 Jul 2020 05:09:15 +0000 (22:09 -0700)] 
Merge branch 'es/get-worktrees-unsort'

API cleanup for get_worktrees()

* es/get-worktrees-unsort:
  worktree: drop get_worktrees() unused 'flags' argument
  worktree: drop get_worktrees() special-purpose sorting option

4 years agoMerge branch 'bc/sha-256-cvs-svn-updates'
Junio C Hamano [Tue, 7 Jul 2020 05:09:14 +0000 (22:09 -0700)] 
Merge branch 'bc/sha-256-cvs-svn-updates'

CVS/SVN interface have been prepared for SHA-256 transition

* bc/sha-256-cvs-svn-updates:
  git-cvsexportcommit: port to SHA-256
  git-cvsimport: port to SHA-256
  git-cvsserver: port to SHA-256
  git-svn: set the OID length based on hash algorithm
  perl: make SVN code hash independent
  perl: make Git::IndexInfo work with SHA-256
  perl: create and switch variables for hash constants
  t/lib-git-svn: make hash size independent
  t9101: make hash independent
  t9104: make hash size independent
  t9100: make test work with SHA-256
  t9108: make test hash independent
  t9168: make test hash independent
  t9109: make test hash independent

4 years agoMerge branch 'ak/commit-graph-to-slab'
Junio C Hamano [Tue, 7 Jul 2020 05:09:13 +0000 (22:09 -0700)] 
Merge branch 'ak/commit-graph-to-slab'

A few fields in "struct commit" that do not have to always be
present have been moved to commit slabs.

* ak/commit-graph-to-slab:
  commit-graph: minimize commit_graph_data_slab access
  commit: move members graph_pos, generation to a slab
  commit-graph: introduce commit_graph_data_slab
  object: drop parsed_object_pool->commit_count

4 years agoMerge branch 'en/sparse-status'
Junio C Hamano [Tue, 7 Jul 2020 05:09:13 +0000 (22:09 -0700)] 
Merge branch 'en/sparse-status'

"git status" learned to report the status of sparse checkout.

* en/sparse-status:
  git-prompt: include sparsity state as well
  git-prompt: document how in-progress operations affect the prompt
  wt-status: show sparse checkout status as well

4 years agoMerge branch 'ps/ref-transaction-hook'
Junio C Hamano [Tue, 7 Jul 2020 05:09:13 +0000 (22:09 -0700)] 
Merge branch 'ps/ref-transaction-hook'

A new hook.

* ps/ref-transaction-hook:
  refs: implement reference transaction hook

4 years agoMerge branch 'bc/sha-256-part-2'
Junio C Hamano [Tue, 7 Jul 2020 05:09:13 +0000 (22:09 -0700)] 
Merge branch 'bc/sha-256-part-2'

SHA-256 migration work continues.

* bc/sha-256-part-2: (44 commits)
  remote-testgit: adapt for object-format
  bundle: detect hash algorithm when reading refs
  t5300: pass --object-format to git index-pack
  t5704: send object-format capability with SHA-256
  t5703: use object-format serve option
  t5702: offer an object-format capability in the test
  t/helper: initialize the repository for test-sha1-array
  remote-curl: avoid truncating refs with ls-remote
  t1050: pass algorithm to index-pack when outside repo
  builtin/index-pack: add option to specify hash algorithm
  remote-curl: detect algorithm for dumb HTTP by size
  builtin/ls-remote: initialize repository based on fetch
  t5500: make hash independent
  serve: advertise object-format capability for protocol v2
  connect: parse v2 refs with correct hash algorithm
  connect: pass full packet reader when parsing v2 refs
  Documentation/technical: document object-format for protocol v2
  t1302: expect repo format version 1 for SHA-256
  builtin/show-index: provide options to determine hash algo
  t5302: modernize test formatting
  ...

4 years agorevision: disable min_age optimization with line-log
René Scharfe [Sat, 4 Jul 2020 12:56:32 +0000 (14:56 +0200)] 
revision: disable min_age optimization with line-log

If one of the options --before, --min-age or --until is given,
limit_list() filters out younger commits early on.  Line-log needs all
those commits to trace the movement of line ranges, though.  Skip this
optimization if both are used together.

Reported-by: Мария Долгополова <dolgopolovamariia@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodifftool -d: ensure that intent-to-add files are handled correctly
Johannes Schindelin [Wed, 1 Jul 2020 21:19:07 +0000 (21:19 +0000)] 
difftool -d: ensure that intent-to-add files are handled correctly

In https://github.com/git-for-windows/git/issues/2677, a `git difftool
-d` problem was reported. The underlying cause was a bug in `git
diff-files --raw` that we just fixed: it reported intent-to-add files
with the empty _tree_ as the post-image OID, when we need to show
an all-zero (or, "null") OID instead, to indicate to the caller that
they have to look at the worktree file.

The symptom of that problem shown by `git difftool` was this:

error: unable to read sha1 file of <path> (<empty-tree-OID>)
error: could not write '<filename>'

Make sure that the reported `difftool` problem stays fixed.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agodiff-files --raw: show correct post-image of intent-to-add files
Johannes Schindelin [Wed, 1 Jul 2020 21:19:06 +0000 (21:19 +0000)] 
diff-files --raw: show correct post-image of intent-to-add files

The documented behavior of `git diff-files --raw` is to display

[...] 0{40} if creation, unmerged or "look at work tree".

on the right hand (i.e. postimage) side. This happens for files that
have unstaged modifications, and for files that are unmodified but
stat-dirty.

For intent-to-add files, we used to show the empty blob's hash instead.
In c26022ea8f5 (diff: convert diff_addremove to struct object_id,
2017-05-30), we made that worse by inadvertently changing that to the
hash of the empty tree.

Let's make the behavior consistent with files that have unstaged
modifications (which applies to intent-to-add files, too) by showing
all-zero values also for intent-to-add files.

Accordingly, this patch adjusts the expectations set by the regression
test introduced in feea6946a5b (diff-files: treat "i-t-a" files as
"not-in-index", 2020-06-20).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosend-email: restore --in-reply-to superseding behavior
Rafael Aquini [Mon, 29 Jun 2020 14:11:04 +0000 (10:11 -0400)] 
send-email: restore --in-reply-to superseding behavior

git send-email --in-reply-to= fails to override In-Reply-To email headers,
if they're present in the output of format-patch, even when explicitly
told to do so by the option --no-thread, which breaks the contract of the
command line switch option, per its man page.

"
   --in-reply-to=<identifier>
       Make the first mail (or all the mails with --no-thread) appear as
       a reply to the given Message-Id, which avoids breaking threads to
       provide a new patch series.
"

This patch fixes the aformentioned issue, by bringing --in-reply-to's old
overriding behavior back.

The test was donated by Carlo Marcelo Arenas Belón.

Signed-off-by: Rafael Aquini <aquini@redhat.com>
Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocat-file: add missing [=<format>] to usage/synopsis
Christian Couder [Wed, 1 Jul 2020 10:16:18 +0000 (12:16 +0200)] 
cat-file: add missing [=<format>] to usage/synopsis

When displaying cat-file usage, the fact that a <format> can
be specified is only visible when lookling at the --batch and
--batch-check options which are shown like this:

    --batch[=<format>]    show info and content of objects fed from the standard input
    --batch-check[=<format>]
                          show info about objects fed from the standard input

It seems more coherent and improves discovery to also show it
on the usage line.

In the documentation the DESCRIPTION tells us that "The output
format can be overridden using the optional <format> argument",
but we can't see the <format> argument in the SYNOPSIS above
the description which is confusing.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocompletion: nounset mode fixes
Ville Skyttä [Mon, 29 Jun 2020 18:59:45 +0000 (21:59 +0300)] 
completion: nounset mode fixes

Accessing unset variables results an errors when the shell is in
nounset/-u mode. This fixes the cases I've come across while using git
completion in a shell running in that mode for a while. It's hard to
tell if this is the complete set, but at least it improves things.

Signed-off-by: Ville Skyttä <ville.skytta@iki.fi>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocontrib: subtree: adjust test to change in fmt-merge-msg
Đoàn Trần Công Danh [Mon, 29 Jun 2020 16:20:03 +0000 (23:20 +0700)] 
contrib: subtree: adjust test to change in fmt-merge-msg

We're starting to stop treating `master' specially in fmt-merge-msg.
Adjust the test to reflect that change.

Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoThe sixth batch
Junio C Hamano [Mon, 29 Jun 2020 20:58:58 +0000 (13:58 -0700)] 
The sixth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'sk/diff-files-show-i-t-a-as-new'
Junio C Hamano [Mon, 29 Jun 2020 21:17:27 +0000 (14:17 -0700)] 
Merge branch 'sk/diff-files-show-i-t-a-as-new'

"git diff-files" has been taught to say paths that are marked as
intent-to-add are new files, not modified from an empty blob.

* sk/diff-files-show-i-t-a-as-new:
  diff-files: treat "i-t-a" files as "not-in-index"

4 years agoMerge branch 'rs/commit-reach-leakfix'
Junio C Hamano [Mon, 29 Jun 2020 21:17:27 +0000 (14:17 -0700)] 
Merge branch 'rs/commit-reach-leakfix'

Leakfix.

* rs/commit-reach-leakfix:
  commit-reach: plug minor memory leak after using is_descendant_of()

4 years agoMerge branch 'rs/pull-leakfix'
Junio C Hamano [Mon, 29 Jun 2020 21:17:26 +0000 (14:17 -0700)] 
Merge branch 'rs/pull-leakfix'

Leakfix.

* rs/pull-leakfix:
  pull: plug minor memory leak after using is_descendant_of()

4 years agoMerge branch 'rs/retire-strbuf-write-fd'
Junio C Hamano [Mon, 29 Jun 2020 21:17:26 +0000 (14:17 -0700)] 
Merge branch 'rs/retire-strbuf-write-fd'

A misdesigned strbuf_write_fd() function has been retired.

* rs/retire-strbuf-write-fd:
  strbuf: remove unreferenced strbuf_write_fd method.
  bugreport.c: replace strbuf_write_fd with write_in_full

4 years agoMerge branch 'dl/diff-usage-comment-update'
Junio C Hamano [Mon, 29 Jun 2020 21:17:25 +0000 (14:17 -0700)] 
Merge branch 'dl/diff-usage-comment-update'

An in-code comment in "git diff" has been updated.

* dl/diff-usage-comment-update:
  builtin/diff: fix botched update of usage comment
  builtin/diff: update usage comment

4 years agoMerge branch 'xl/upgrade-repo-format'
Junio C Hamano [Mon, 29 Jun 2020 21:17:24 +0000 (14:17 -0700)] 
Merge branch 'xl/upgrade-repo-format'

Allow runtime upgrade of the repository format version, which needs
to be done carefully.

There is a rather unpleasant backward compatibility worry with the
last step of this series, but it is the right thing to do in the
longer term.

* xl/upgrade-repo-format:
  check_repository_format_gently(): refuse extensions for old repositories
  sparse-checkout: upgrade repository to version 1 when enabling extension
  fetch: allow adding a filter after initial clone
  repository: add a helper function to perform repository format upgrade

4 years agofast-export: use local array to store anonymized oid
Jeff King [Thu, 25 Jun 2020 19:48:37 +0000 (15:48 -0400)] 
fast-export: use local array to store anonymized oid

Some older versions of gcc complain about this line:

  builtin/fast-export.c:412:2: error: dereferencing type-punned pointer
       will break strict-aliasing rules [-Werror=strict-aliasing]
    put_be32(oid.hash + hashsz - 4, counter++);
    ^

This seems to be a false positive, as there's no type-punning at all
here. oid.hash is an array of unsigned char; when we pass it to a
function it decays to a pointer to unsigned char. We do take a void
pointer in put_be32(), but it's immediately aliased with another pointer
to unsigned char (and clearly the compiler is looking inside the inlined
put_be32(), since the warning doesn't happen with -O0).

This happens on gcc 4.8 and 4.9, but not later versions (I tested gcc 6,
7, 8, and 9).

We can work around it by using a local array instead of an object_id
struct. This is a little more intimate with the details of object_id,
but for whatever reason doesn't seem to trigger the compiler warning.
We can revert this patch once we decide that those gcc versions are too
old to care about for a warning like this (gcc 4.8 is the default
compiler for Ubuntu Trusty, which is out-of-support but not fully
end-of-life'd until April 2022).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofast-export: anonymize "master" refname
Jeff King [Thu, 25 Jun 2020 19:48:35 +0000 (15:48 -0400)] 
fast-export: anonymize "master" refname

Running "fast-export --anonymize" will leave "refs/heads/master"
untouched in the output, for two reasons:

  - it helped to have some known reference point between the original
    and anonymized repository

  - since it's historically the default branch name, it doesn't leak any
    information

Now that we can ask fast-export to retain particular tokens, we have a
much better tool for the first one (because it works for any ref, not
just master).

For the second, the notion of "default branch name" is likely to become
configurable soon, at which point the name _does_ leak information.
Let's drop this special case in preparation.

Note that we have to adjust the test a bit, since it relied on using the
name "master" in the anonymized repos. We could just use
--anonymize-map=master to keep the same output, but then we wouldn't
know if it works because of our hard-coded master or because of the
explicit map.

So let's flip the test a bit, and confirm that we anonymize "master",
but keep "other" in the output.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agofast-export: allow seeding the anonymized mapping
Jeff King [Thu, 25 Jun 2020 19:48:32 +0000 (15:48 -0400)] 
fast-export: allow seeding the anonymized mapping

After you anonymize a repository, it can be hard to find which commits
correspond between the original and the result, and thus hard to
reproduce commands that triggered bugs in the original.

Let's make it possible to seed the anonymization map. This lets users
either:

  - mark names to be retained as-is, if they don't consider them secret
    (in which case their original commands would just work)

  - map names to new values, which lets them adapt the reproduction
    recipe to the new names without revealing the originals

The implementation is fairly straight-forward. We already store each
anonymized token in a hashmap (so that the same token appearing twice is
converted to the same result). We can just introduce a new "seed"
hashmap which is consulted first.

This does make a few more promises to the user about how we'll anonymize
things (e.g., token-splitting pathnames). But it's unlikely that we'd
want to change those rules, even if the actual anonymization of a single
token changes. And it makes things much easier for the user, who can
unblind only a directory name without having to specify each path within
it.

One alternative to this approach would be to anonymize as we see fit,
and then dump the whole refname and pathname mappings to a file. This
does work, but it's a bit awkward to use (you have to manually dig the
items you care about out of the mapping).

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>