]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
2 years agovar: adjust memory allocation for strings
brian m. carlson [Tue, 27 Jun 2023 16:18:59 +0000 (16:18 +0000)] 
var: adjust memory allocation for strings

Right now, all of our values are constants whose allocation is managed
elsewhere.  However, in the future, we'll have some variables whose
memory we will need to free.  To keep things consistent, let's make each
of our functions allocate its own memory and make the caller responsible
for freeing it.

Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agovar: format variable structure with C99 initializers
brian m. carlson [Tue, 27 Jun 2023 16:18:58 +0000 (16:18 +0000)] 
var: format variable structure with C99 initializers

Right now, we have only two items in our variable struct.  However, in
the future, we're going to add two more items.  To help keep our diffs
nice and tidy and make this structure easier to read, switch to use
C99-style initializers for our data.

Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agovar: add support for listing the shell
brian m. carlson [Tue, 27 Jun 2023 16:18:57 +0000 (16:18 +0000)] 
var: add support for listing the shell

On most Unix systems, finding a suitable shell is easy: one simply uses
"sh" with an appropriate PATH value.  However, in many Windows
environments, the shell is shipped alongside Git, and it may or may not
be in PATH, even if Git is.

In such an environment, it can be very helpful to query Git for the
shell it's using, since other tools may want to use the same shell as
well.  To help them out, let's add a variable, GIT_SHELL_PATH, that
points to the location of the shell.

On Unix, we know our shell must be executable to be functional, so
assume that the distributor has correctly configured their environment,
and use that as a basic test.  On Git for Windows, we know that our
shell will be one of a few fixed values, all of which end in "sh" (such
as "bash").  This seems like it might be a nice test on Unix as well,
since it is customary for all shells to end in "sh", but there probably
exist such systems that don't have such a configuration, so be careful
here not to break them.

Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agot: add a function to check executable bit
brian m. carlson [Tue, 27 Jun 2023 16:18:56 +0000 (16:18 +0000)] 
t: add a function to check executable bit

In line with our other helper functions for paths, let's add a function
to check whether a path is executable, and if not, print a suitable
error message.  Document this function, and note that it must only be
used under the POSIXPERM prerequisite, since it doesn't otherwise work
on Windows.

Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agovar: mark unused parameters in git_var callbacks
Jeff King [Tue, 27 Jun 2023 16:18:55 +0000 (16:18 +0000)] 
var: mark unused parameters in git_var callbacks

We abstract the set of variables into a table, with a "read" callback to
provide the value of each. Each callback takes a "flag" argument, but
most callbacks don't make use of it.

This flag is a bit odd. It may be set to IDENT_STRICT, which make sense
for ident-based callbacks, but is just confusing for things like
GIT_EDITOR.

At first glance, it seems like this is just a hack to let us directly
stick the generic git_committer_info() and git_author_info() functions
into our table. And we'd be better off to wrap them with local functions
which pass IDENT_STRICT, and have our callbacks take no option at all.

But that doesn't quite work. We pass IDENT_STRICT when the caller asks
for a specific variable, but otherwise do not (so that "git var -l" does
not bail if the committer ident cannot be formed).

So we really do need to pass in the flag to each invocation, even if the
individual callback doesn't care about it. Let's mark the unused ones so
that -Wunused-parameter does not complain. And while we're here, let's
rename them so that it's clear that the flag values we get will be from
the IDENT_* set. That may prevent confusion for future readers of the
code.

Another option would be to define our own local "strict" flag for the
callbacks, and then have wrappers that translate that to IDENT_STRICT
where it matters. But that would be more boilerplate for little gain
(most functions would still ignore the "strict" flag anyway).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoconfig: don't BUG when both kvi and source are set
Glen Choo [Mon, 26 Jun 2023 17:41:37 +0000 (17:41 +0000)] 
config: don't BUG when both kvi and source are set

When iterating through config, we read config source metadata from
global values - either a "struct config_source + enum config_scope"
or a "struct key_value_info", using the current_config* functions. Prior
to the series starting from 0c60285147 (config.c: create config_reader
and the_reader, 2023-03-28), we weren't very picky about which values we
should read in which situation; we did note that both groups of values
generally shouldn't be set together, but if both were set,
current_config* preferentially reads key_value_info. When that series
added more structure, we enforced that either the former (when parsing a
config source) can be set, or the latter (when iterating a config set),
but *never* both at the same time. See 9828453ff0 (config.c: remove
current_config_kvi, 2023-03-28) and 5cdf18e7cd (config.c: remove
current_parsing_scope, 2023-03-28).

That was a good simplifying constraint that helped us reason about the
global state, but it turns out that there is at least one situation
where we need both to be set at the same time: in a blobless partial
clone where .gitmodules is missing. "git fetch" in such a repo will
start a config parse over .gitmodules (setting the config_source), and
Git will attempt to lazy-fetch it from the promisor remote. However,
when we try to read the promisor configuration, we start iterating a
config set (setting the key_value_info), and we BUG() out because that's
not allowed any more.

Teaching config_reader to gracefully handle this is somewhat
complicated, but fortunately, there are proposed changes to the config.c
machinery to get rid of this global state, and make the BUG() obsolete
[1]. We should rely on that as the eventual solution, and avoid doing
yet another refactor in the meantime.

Therefore, fix the bug by removing the BUG() check. We're reverting to
an older, less safe state, but that's generally okay since
key_value_info is always preferentially read, so we'd always read the
correct values when we iterate a config set in the middle of a config
parse (like we are here). The reverse would be wrong, but extremely
unlikely to happen since very few callers parse config without going
through a config set.

[1] https://lore.kernel.org/git/pull.1497.v3.git.git.1687290231.gitgitgadget@gmail.com

Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agodiff.c: mention completion above add_diff_options
Philippe Blain [Mon, 26 Jun 2023 16:24:48 +0000 (16:24 +0000)] 
diff.c: mention completion above add_diff_options

Add a comment on top of add_diff_options, where common diff options are
listed, mentioning __git_diff_common_options in the completion script,
in the hope that contributors update it when they add new diff flags.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --remerge-diff
Philippe Blain [Mon, 26 Jun 2023 16:24:47 +0000 (16:24 +0000)] 
completion: complete --remerge-diff

--remerge-diff only makes sense for 'git log' and 'git show', so add it
to __git_log_show_options which is referenced in the completion for
these two commands.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --diff-merges, its options and --no-diff-merges
Philippe Blain [Mon, 26 Jun 2023 16:24:46 +0000 (16:24 +0000)] 
completion: complete --diff-merges, its options and --no-diff-merges

The flags --[no-]diff-merges only make sense for 'git log' and 'git
show', so add a new variable __git_log_show_options for options only
relevant to these two commands, and add them there. Also add
__git_diff_merges_opts and list the accepted values for --diff-merges,
and use it in _git_log and _git_show.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: move --pickaxe-{all,regex} to __git_diff_common_options
Philippe Blain [Mon, 26 Jun 2023 16:24:45 +0000 (16:24 +0000)] 
completion: move --pickaxe-{all,regex} to __git_diff_common_options

The options --pickaxe-all and --pickaxe-regex are listed in
__git_diff_difftool_options and repeated in _git_log. Move them to
__git_diff_common_options instead, which makes them available
automatically in the completion of other commands referencing this
variable.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --ws-error-highlight
Philippe Blain [Mon, 26 Jun 2023 16:24:44 +0000 (16:24 +0000)] 
completion: complete --ws-error-highlight

Add --ws-error-highlight= to the list in __git_diff_common_options, and
add the accepted values in a new list __git_ws_error_highlight_opts.

Use __git_ws_error_highlight_opts in _git_diff, _git_log and _git_show
to offer the accepted values.

As noted in fd0bc17557 (completion: add diff --color-moved[-ws],
2020-02-21), there is no easy way to offer completion for several
comma-separated values, so this is limited to completing a single
value.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --unified
Philippe Blain [Mon, 26 Jun 2023 16:24:43 +0000 (16:24 +0000)] 
completion: complete --unified

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --output-indicator-{context,new,old}
Philippe Blain [Mon, 26 Jun 2023 16:24:42 +0000 (16:24 +0000)] 
completion: complete --output-indicator-{context,new,old}

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --output
Philippe Blain [Mon, 26 Jun 2023 16:24:41 +0000 (16:24 +0000)] 
completion: complete --output

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --no-stat
Philippe Blain [Mon, 26 Jun 2023 16:24:40 +0000 (16:24 +0000)] 
completion: complete --no-stat

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --no-relative
Philippe Blain [Mon, 26 Jun 2023 16:24:39 +0000 (16:24 +0000)] 
completion: complete --no-relative

Add --no-relative to __git_diff_common_options in the completion script,
and move --relative from __git_diff_difftool_options to
__git_diff_common_options since it applies to more than just diff and
difftool.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --line-prefix
Philippe Blain [Mon, 26 Jun 2023 16:24:38 +0000 (16:24 +0000)] 
completion: complete --line-prefix

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --ita-invisible-in-index and --ita-visible-in-index
Philippe Blain [Mon, 26 Jun 2023 16:24:37 +0000 (16:24 +0000)] 
completion: complete --ita-invisible-in-index and --ita-visible-in-index

The options --ita-invisible-in-index and --ita-visible-in-index are
listed in diff-options.txt and so are included in the documentation of
commands which include this file (diff, diff-*, log, show, format-patch)
but they only make sense for diffs relating to the index. As such, add
them to '__git_diff_difftool_options' instead of
'__git_diff_common_options' since it makes more sense to add them there.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --irreversible-delete
Philippe Blain [Mon, 26 Jun 2023 16:24:36 +0000 (16:24 +0000)] 
completion: complete --irreversible-delete

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --ignore-matching-lines
Philippe Blain [Mon, 26 Jun 2023 16:24:35 +0000 (16:24 +0000)] 
completion: complete --ignore-matching-lines

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --function-context
Philippe Blain [Mon, 26 Jun 2023 16:24:34 +0000 (16:24 +0000)] 
completion: complete --function-context

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --find-renames
Philippe Blain [Mon, 26 Jun 2023 16:24:33 +0000 (16:24 +0000)] 
completion: complete --find-renames

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --find-object
Philippe Blain [Mon, 26 Jun 2023 16:24:32 +0000 (16:24 +0000)] 
completion: complete --find-object

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --find-copies
Philippe Blain [Mon, 26 Jun 2023 16:24:31 +0000 (16:24 +0000)] 
completion: complete --find-copies

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --default-prefix
Philippe Blain [Mon, 26 Jun 2023 16:24:30 +0000 (16:24 +0000)] 
completion: complete --default-prefix

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --compact-summary
Philippe Blain [Mon, 26 Jun 2023 16:24:29 +0000 (16:24 +0000)] 
completion: complete --compact-summary

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --combined-all-paths
Philippe Blain [Mon, 26 Jun 2023 16:24:28 +0000 (16:24 +0000)] 
completion: complete --combined-all-paths

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --cc
Philippe Blain [Mon, 26 Jun 2023 16:24:27 +0000 (16:24 +0000)] 
completion: complete --cc

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: complete --break-rewrites
Philippe Blain [Mon, 26 Jun 2023 16:24:26 +0000 (16:24 +0000)] 
completion: complete --break-rewrites

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocompletion: add comments describing __git_diff_* globals
Philippe Blain [Mon, 26 Jun 2023 16:24:25 +0000 (16:24 +0000)] 
completion: add comments describing __git_diff_* globals

Add descriptive comments for '__git_diff_common_options' and
'__git_diff_difftool_options', so that it is clearer when looking at
these variables to know in which command's completion they are used.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoThe fifth batch
Junio C Hamano [Mon, 26 Jun 2023 16:29:17 +0000 (09:29 -0700)] 
The fifth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoMerge branch 'tb/collect-pack-filenames-fix'
Junio C Hamano [Mon, 26 Jun 2023 16:29:49 +0000 (09:29 -0700)] 
Merge branch 'tb/collect-pack-filenames-fix'

Avoid breakage of "git pack-objects --cruft" due to inconsistency
between the way the code enumerates packfiles in the repository.

* tb/collect-pack-filenames-fix:
  builtin/repack.c: only collect fully-formed packs

2 years agoMerge branch 'jk/commit-use-no-divider-with-interpret-trailers'
Junio C Hamano [Mon, 26 Jun 2023 16:29:49 +0000 (09:29 -0700)] 
Merge branch 'jk/commit-use-no-divider-with-interpret-trailers'

When "git commit --trailer=..." invokes the interpret-trailers
machinery, it knows what it feeds to interpret-trailers is a full
log message without any patch, but failed to express that by
passing the "--no-divider" option, which has been corrected.

* jk/commit-use-no-divider-with-interpret-trailers:
  commit: pass --no-divider to interpret-trailers

2 years agoapply: improve error messages when reading patch
Phillip Wood [Mon, 26 Jun 2023 09:37:33 +0000 (09:37 +0000)] 
apply: improve error messages when reading patch

Commit f1c0e3946e (apply: reject patches larger than ~1 GiB, 2022-10-25)
added a limit on the size of patch that apply will process to avoid
integer overflows. The implementation re-used the existing error message
for when we are unable to read the patch. This is unfortunate because (a) it
does not signal to the user that the patch is being rejected because it
is too large and (b) it uses error_errno() without setting errno.

This patch adds a specific error message for the case when a patch is
too large. It also updates the existing message to make it clearer that
it is the patch that cannot be read rather than any other file and marks
both messages for translation. The "git apply" prefix is also dropped to
match most of the rest of the error messages in apply.c (there are still
a few error messages that prefixed with "git apply" and are not marked
for translation after this patch). The test added in f1c0e3946e is
updated accordingly.

Reported-by: Premek Vysoky <Premek.Vysoky@microsoft.com>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agot7701: make annotated tag unreachable
Taylor Blau [Sat, 24 Jun 2023 14:33:47 +0000 (10:33 -0400)] 
t7701: make annotated tag unreachable

In 4dc16e2cb0 (gc: introduce `gc.recentObjectsHook`, 2023-06-07), we
added tests to ensure that prune-able (i.e. unreachable and with mtime
older than the cutoff) objects which are marked as recent via the new
`gc.recentObjectsHook` configuration are unpacked as loose with
`--unpack-unreachable`.

In that test, we also ensure that objects which are reachable from other
unreachable objects which were *not* pruned are kept as well, regardless
of their mtimes. For this, we use an annotated tag pointing at a blob
($obj2) which would otherwise be pruned.

But after pruning, that object is kept around for two reasons. One, the
tag object's mtime wasn't adjusted to be beyond the 1-hour cutoff, so it
would be kept as due to its recency regardless. The other reason is
because the tag itself is reachable.

Use mktag to write the tag object directly without pointing a reference
at it, and adjust the mtime of the tag object to be older than the
cutoff to ensure that our `gc.recentObjectsHook` configuration is
working as intended.

Noticed-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoMerge branch 'maint'
Junio C Hamano [Sat, 24 Jun 2023 22:05:06 +0000 (15:05 -0700)] 
Merge branch 'maint'

* maint:
  http: handle both "h2" and "h2h3" in curl info lines

2 years agoMerge branch 'jk/redact-h2h3-headers-fix' into maint-2.41
Junio C Hamano [Sat, 24 Jun 2023 22:04:48 +0000 (15:04 -0700)] 
Merge branch 'jk/redact-h2h3-headers-fix' into maint-2.41

* jk/redact-h2h3-headers-fix:
  http: handle both "h2" and "h2h3" in curl info lines

2 years agot6406: skip "external merge driver getting killed by a signal" test on Windows
Junio C Hamano [Fri, 23 Jun 2023 23:34:40 +0000 (16:34 -0700)] 
t6406: skip "external merge driver getting killed by a signal" test on Windows

The run_command() on the platform does not seem to report death by
signal as the caller expects.  For now, skip the test on Windows.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoThe fourth batch
Junio C Hamano [Fri, 23 Jun 2023 18:21:28 +0000 (11:21 -0700)] 
The fourth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoMerge branch 'js/defeat-ignore-submodules-config-with-explicit-addition'
Junio C Hamano [Fri, 23 Jun 2023 18:21:17 +0000 (11:21 -0700)] 
Merge branch 'js/defeat-ignore-submodules-config-with-explicit-addition'

Even when diff.ignoreSubmodules tells us to ignore submodule
changes, "git commit" with an index that already records changes to
submodules should include the submodule changes in the resulting
commit, but it did not.

* js/defeat-ignore-submodules-config-with-explicit-addition:
  diff-lib: honor override_submodule_config flag bit

2 years agoMerge branch 'rj/leakfixes'
Junio C Hamano [Fri, 23 Jun 2023 18:21:17 +0000 (11:21 -0700)] 
Merge branch 'rj/leakfixes'

Leakfixes

* rj/leakfixes:
  tests: mark as passing with SANITIZE=leak
  config: fix a leak in git_config_copy_or_rename_section_in_file
  branch: fix a leak in cmd_branch
  branch: fix a leak in setup_tracking
  rev-parse: fix a leak with --abbrev-ref
  branch: fix a leak in setup_tracking
  branch: fix a leak in check_tracking_branch
  branch: fix a leak in inherit_tracking
  branch: fix a leak in dwim_and_setup_tracking
  remote: fix a leak in query_matches_negative_refspec
  config: fix a leak in git_config_copy_or_rename_section_in_file

2 years agoMerge branch 'tb/open-midx-bitmap-fallback'
Junio C Hamano [Fri, 23 Jun 2023 18:21:17 +0000 (11:21 -0700)] 
Merge branch 'tb/open-midx-bitmap-fallback'

Gracefully deal with a stale MIDX file that lists a packfile that
no longer exists.

* tb/open-midx-bitmap-fallback:
  pack-bitmap.c: gracefully degrade on failure to load MIDX'd pack

2 years agoMerge branch 'tb/gc-recent-object-hook'
Junio C Hamano [Fri, 23 Jun 2023 18:21:17 +0000 (11:21 -0700)] 
Merge branch 'tb/gc-recent-object-hook'

"git pack-objects" learned to invoke a new hook program that
enumerates extra objects to be used as anchoring points to keep
otherwise unreachable objects in cruft packs.

* tb/gc-recent-object-hook:
  gc: introduce `gc.recentObjectsHook`
  reachable.c: extract `obj_is_recent()`

2 years agoMerge branch 'tz/lib-gpg-prereq-fix'
Junio C Hamano [Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)] 
Merge branch 'tz/lib-gpg-prereq-fix'

Test update.

* tz/lib-gpg-prereq-fix:
  t/lib-gpg: require GPGSSH for GPGSSH_VERIFYTIME prereq

2 years agoMerge branch 'sl/worktree-sparse'
Junio C Hamano [Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)] 
Merge branch 'sl/worktree-sparse'

"git worktree" learned to work better with sparse index feature.

* sl/worktree-sparse:
  worktree: integrate with sparse-index

2 years agoMerge branch 'rs/run-command-exec-error-on-noent'
Junio C Hamano [Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)] 
Merge branch 'rs/run-command-exec-error-on-noent'

Simplify error message when run-command fails to start a command.

* rs/run-command-exec-error-on-noent:
  run-command: report exec error even on ENOENT
  t1800: loosen matching of error message for bad shebang

2 years agoMerge branch 'mh/credential-erase-improvements'
Junio C Hamano [Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)] 
Merge branch 'mh/credential-erase-improvements'

* mh/credential-erase-improvements:
  credential: erase all matching credentials
  credential: avoid erasing distinct password

2 years agoMerge branch 'gc/discover-not-setup'
Junio C Hamano [Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)] 
Merge branch 'gc/discover-not-setup'

discover_git_directory() no longer touches the_repository.

* gc/discover-not-setup:
  setup.c: don't setup in discover_git_directory()

2 years agoll-merge: killing the external merge driver aborts the merge
Junio C Hamano [Fri, 23 Jun 2023 00:33:01 +0000 (17:33 -0700)] 
ll-merge: killing the external merge driver aborts the merge

When an external merge driver dies with a signal, we should not
expect that the result left on the filesystem is in any useful
state.  However, because the current code uses the return value from
run_command() and declares any positive value as a sign that the
driver successfully left conflicts in the result, and because the
return value from run_command() for a subprocess that died upon a
signal is positive, we end up treating whatever garbage left on the
filesystem as the result the merge driver wanted to leave us.

run_command() returns larger than 128 (WTERMSIG(status) + 128, to be
exact) when it notices that the subprocess died with a signal, so
detect such a case and return LL_MERGE_ERROR from ll_ext_merge().

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
2 years agoThe third batch
Junio C Hamano [Thu, 22 Jun 2023 23:28:50 +0000 (16:28 -0700)] 
The third batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoMerge branch 'jt/doc-use-octal-with-printf'
Junio C Hamano [Thu, 22 Jun 2023 23:29:07 +0000 (16:29 -0700)] 
Merge branch 'jt/doc-use-octal-with-printf'

Suggest to refrain from using hex literals that are non-portable
when writing printf(1) format strings.

* jt/doc-use-octal-with-printf:
  CodingGuidelines: use octal escapes, not hex

2 years agoMerge branch 'rs/doc-ls-tree-hex-literal'
Junio C Hamano [Thu, 22 Jun 2023 23:29:07 +0000 (16:29 -0700)] 
Merge branch 'rs/doc-ls-tree-hex-literal'

Doc update.

* rs/doc-ls-tree-hex-literal:
  ls-tree: fix documentation of %x format placeholder

2 years agoMerge branch 'la/docs-typofixes'
Junio C Hamano [Thu, 22 Jun 2023 23:29:06 +0000 (16:29 -0700)] 
Merge branch 'la/docs-typofixes'

Typofixes.

* la/docs-typofixes:
  docs: typofixes

2 years agoMerge branch 'as/dtype-compilation-fix'
Junio C Hamano [Thu, 22 Jun 2023 23:29:06 +0000 (16:29 -0700)] 
Merge branch 'as/dtype-compilation-fix'

Compilation fix for platforms without D_TYPE in struct dirent.

* as/dtype-compilation-fix:
  statinfo.h: move DTYPE defines from dir.h

2 years agoMerge branch 'ds/add-i-color-configuration-fix'
Junio C Hamano [Thu, 22 Jun 2023 23:29:06 +0000 (16:29 -0700)] 
Merge branch 'ds/add-i-color-configuration-fix'

The reimplemented "git add -i" did not honor color.ui configuration.

* ds/add-i-color-configuration-fix:
  add: test use of brackets when color is disabled
  add: check color.ui for interactive add

2 years agoMerge branch 'ps/cat-file-null-output'
Junio C Hamano [Thu, 22 Jun 2023 23:29:06 +0000 (16:29 -0700)] 
Merge branch 'ps/cat-file-null-output'

"git cat-file --batch" and friends learned "-Z" that uses NUL
delimiter for both input and output.

* ps/cat-file-null-output:
  cat-file: add option '-Z' that delimits input and output with NUL
  cat-file: simplify reading from standard input
  strbuf: provide CRLF-aware helper to read until a specified delimiter
  t1006: modernize test style to use `test_cmp`
  t1006: don't strip timestamps from expected results

2 years agoMerge branch 'ds/disable-replace-refs'
Junio C Hamano [Thu, 22 Jun 2023 23:29:05 +0000 (16:29 -0700)] 
Merge branch 'ds/disable-replace-refs'

Introduce a mechanism to disable replace refs globally and per
repository.

* ds/disable-replace-refs:
  repository: create read_replace_refs setting
  replace-objects: create wrapper around setting
  repository: create disable_replace_refs()

2 years agoMerge branch 'tb/pack-bitmap-traversal-with-boundary'
Junio C Hamano [Thu, 22 Jun 2023 23:29:05 +0000 (16:29 -0700)] 
Merge branch 'tb/pack-bitmap-traversal-with-boundary'

The object traversal using reachability bitmap done by
"pack-object" has been tweaked to take advantage of the fact that
using "boundary" commits as representative of all the uninteresting
ones can save quite a lot of object enumeration.

* tb/pack-bitmap-traversal-with-boundary:
  pack-bitmap.c: use commit boundary during bitmap traversal
  pack-bitmap.c: extract `fill_in_bitmap()`
  object: add object_array initializer helper function

2 years agoMerge branch 'ja/worktree-orphan'
Junio C Hamano [Thu, 22 Jun 2023 23:29:05 +0000 (16:29 -0700)] 
Merge branch 'ja/worktree-orphan'

'git worktree add' learned how to create a worktree based on an
orphaned branch with `--orphan`.

* ja/worktree-orphan:
  worktree add: emit warn when there is a bad HEAD
  worktree add: extend DWIM to infer --orphan
  worktree add: introduce "try --orphan" hint
  worktree add: add --orphan flag
  t2400: add tests to verify --quiet
  t2400: refactor "worktree add" opt exclusion tests
  t2400: cleanup created worktree in test
  worktree add: include -B in usage docs

2 years agofsmonitor-ll.h: split this header out of fsmonitor.h
Elijah Newren [Tue, 16 May 2023 06:34:08 +0000 (06:34 +0000)] 
fsmonitor-ll.h: split this header out of fsmonitor.h

This creates a new fsmonitor-ll.h with most of the functions from
fsmonitor.h, though it leaves three inline functions where they were.
Two-thirds of the files that previously included fsmonitor.h did not
need those three inline functions or the six extra includes those inline
functions required, so this allows them to only include the lower level
header.

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agohash-ll, hashmap: move oidhash() to hash-ll
Elijah Newren [Tue, 16 May 2023 06:34:07 +0000 (06:34 +0000)] 
hash-ll, hashmap: move oidhash() to hash-ll

oidhash() was used by both hashmap and khash, which makes sense.
However, the location of this function in hashmap.[ch] meant that
khash.h had to depend upon hashmap.h, making people unfamiliar with
khash think that it was built upon hashmap.  (Or at least, I personally
was confused for a while about this in the past.)

Move this function to hash-ll, so that khash.h can stop depending upon
hashmap.h.

This has another benefit as well: it allows us to remove hashmap.h's
dependency on hash-ll.h.  While some callers of hashmap.h were making
use of oidhash, most were not, so this change provides another way to
reduce the number of includes.

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoobject-store-ll.h: split this header out of object-store.h
Elijah Newren [Tue, 16 May 2023 06:34:06 +0000 (06:34 +0000)] 
object-store-ll.h: split this header out of object-store.h

The vast majority of files including object-store.h did not need dir.h
nor khash.h.  Split the header into two files, and let most just depend
upon object-store-ll.h, while letting the two callers that need it
depend on the full object-store.h.

After this patch:
    $ git grep -h include..object-store | sort | uniq -c
          2 #include "object-store.h"
        129 #include "object-store-ll.h"

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agokhash: name the structs that khash declares
Elijah Newren [Tue, 16 May 2023 06:34:05 +0000 (06:34 +0000)] 
khash: name the structs that khash declares

khash.h lets you instantiate custom hash types that map between two
types. These are defined as a struct, as you might expect, and khash
typedef's that to kh_foo_t. But it declares the struct anonymously,
which doesn't give a name to the struct type itself; there is no
"struct kh_foo". This has two small downsides:

  - when using khash, we declare "kh_foo_t *the_foo".  This is
    unlike our usual naming style, which is "struct kh_foo *the_foo".

  - you can't forward-declare a typedef of an unnamed struct type in
    C. So we might do something like this in a header file:

        struct kh_foo;
        struct bar {
                struct kh_foo *the_foo;
        };

    to avoid having to include the header that defines the real
    kh_foo. But that doesn't work with the typedef'd name. Without the
    "struct" keyword, the compiler doesn't know we mean that kh_foo is
    a type.

So let's always give khash structs the name that matches our
conventions ("struct kh_foo" to match "kh_foo_t"). We'll keep doing
the typedef to retain compatibility with existing callers.

Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agomerge-ll: rename from ll-merge
Elijah Newren [Tue, 16 May 2023 06:34:04 +0000 (06:34 +0000)] 
merge-ll: rename from ll-merge

A long term (but rather minor) pet-peeve of mine was the name
ll-merge.[ch].  I thought it made it harder to realize what stuff was
related to merging when I was working on the merge machinery and trying
to improve it.

Further, back in d1cbe1e6d8a ("hash-ll.h: split out of hash.h to remove
dependency on repository.h", 2023-04-22), we have split the portions of
hash.h that do not depend upon repository.h into a "hash-ll.h" (due to
the recommendation to use "ll" for "low-level" in its name[1], but which
I used as a suffix precisely because of my distaste for "ll-merge").
When we discussed adding additional "*-ll.h" files, a request was made
that we use "ll" consistently as either a prefix or a suffix.  Since it
is already in use as both a prefix and a suffix, the only way to do so
is to rename some files.

Besides my distaste for the ll-merge.[ch] name, let me also note that
the files
  ll-fsmonitor.h, ll-hash.h, ll-merge.h, ll-object-store.h, ll-read-cache.h
would have essentially nothing to do with each other and make no sense
to group.  But giving them the common "ll-" prefix would group them.  Using
"-ll" as a suffix thus seems just much more logical to me.  Rename
ll-merge.[ch] to merge-ll.[ch] to achieve this consistency, and to
ensure we get a more logical grouping of files.

[1] https://lore.kernel.org/git/kl6lsfcu1g8w.fsf@chooglen-macbookpro.roam.corp.google.com/

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agogit-compat-util.h: remove unneccessary include of wildmatch.h
Elijah Newren [Tue, 16 May 2023 06:34:03 +0000 (06:34 +0000)] 
git-compat-util.h: remove unneccessary include of wildmatch.h

The include of wildmatch.h in git-compat-util.h was added in cebcab189aa
(Makefile: add USE_WILDMATCH to use wildmatch as fnmatch, 2013-01-01) as
a way to be able to compile-time force any calls to fnmatch() to instead
invoke wildmatch().  The defines and inline function were removed in
70a8fc999d9 (stop using fnmatch (either native or compat), 2014-02-15),
and this include in git-compat-util.h has been unnecessary ever since.

Remove the include from git-compat-util.h, but add it to the .c files
that had omitted the direct #include they needed.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agobuiltin.h: remove unneccessary includes
Elijah Newren [Tue, 16 May 2023 06:34:02 +0000 (06:34 +0000)] 
builtin.h: remove unneccessary includes

This also made it clear that a few .c files under builtin/ were
depending upon some headers but had forgotten to #include them.  Add the
missing direct includes while at it.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agolist-objects-filter-options.h: remove unneccessary include
Elijah Newren [Tue, 16 May 2023 06:34:01 +0000 (06:34 +0000)] 
list-objects-filter-options.h: remove unneccessary include

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agodiff.h: remove unnecessary include of oidset.h
Elijah Newren [Tue, 16 May 2023 06:34:00 +0000 (06:34 +0000)] 
diff.h: remove unnecessary include of oidset.h

This also made it clear that several .c files depended upon various
things that oidset included, but had omitted the direct #include for
those headers.  Add those now.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agorepository: remove unnecessary include of path.h
Elijah Newren [Tue, 16 May 2023 06:33:59 +0000 (06:33 +0000)] 
repository: remove unnecessary include of path.h

This also made it clear that several .c files that depended upon path.h
were missing a #include for it; add the missing includes while at it.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agolog-tree: replace include of revision.h with simple forward declaration
Elijah Newren [Tue, 16 May 2023 06:33:58 +0000 (06:33 +0000)] 
log-tree: replace include of revision.h with simple forward declaration

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agocache.h: remove this no-longer-used header
Elijah Newren [Tue, 16 May 2023 06:33:57 +0000 (06:33 +0000)] 
cache.h: remove this no-longer-used header

Since this header showed up in some places besides just #include
statements, update/clean-up/remove those other places as well.

Note that compat/fsmonitor/fsm-path-utils-darwin.c previously got
away with violating the rule that all files must start with an include
of git-compat-util.h (or a short-list of alternate headers that happen
to include it first).  This change exposed the violation and caused it
to stop building correctly; fix it by having it include
git-compat-util.h first, as per policy.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoread-cache*.h: move declarations for read-cache.c functions from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:56 +0000 (06:33 +0000)] 
read-cache*.h: move declarations for read-cache.c functions from cache.h

For the functions defined in read-cache.c, move their declarations from
cache.h to a new header, read-cache-ll.h.  Also move some related inline
functions from cache.h to read-cache.h.  The purpose of the
read-cache-ll.h/read-cache.h split is that about 70% of the sites don't
need the inline functions and the extra headers they include.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agorepository.h: move declaration of the_index from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:55 +0000 (06:33 +0000)] 
repository.h: move declaration of the_index from cache.h

the_index is a global variable defined in repository.c; as such, its
declaration feels better suited living in repository.h rather than
cache.h.  Move it.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agomerge.h: move declarations for merge.c from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:54 +0000 (06:33 +0000)] 
merge.h: move declarations for merge.c from cache.h

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agodiff.h: move declaration for global in diff.c from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:53 +0000 (06:33 +0000)] 
diff.h: move declaration for global in diff.c from cache.h

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agopreload-index.h: move declarations for preload-index.c from elsewhere
Elijah Newren [Tue, 16 May 2023 06:33:52 +0000 (06:33 +0000)] 
preload-index.h: move declarations for preload-index.c from elsewhere

We already have a preload-index.c file; move the declarations for the
functions in that file into a new preload-index.h.  These were
previously split between cache.h and repository.h.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agosparse-index.h: move declarations for sparse-index.c from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:51 +0000 (06:33 +0000)] 
sparse-index.h: move declarations for sparse-index.c from cache.h

Note in particular that this reverses the decision made in 118a2e8bde0
("cache: move ensure_full_index() to cache.h", 2021-04-01).

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoname-hash.h: move declarations for name-hash.c from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:50 +0000 (06:33 +0000)] 
name-hash.h: move declarations for name-hash.c from cache.h

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agorun-command.h: move declarations for run-command.c from cache.h
Elijah Newren [Tue, 16 May 2023 06:33:49 +0000 (06:33 +0000)] 
run-command.h: move declarations for run-command.c from cache.h

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agostatinfo: move stat_{data,validity} functions from cache/read-cache
Elijah Newren [Tue, 16 May 2023 06:33:48 +0000 (06:33 +0000)] 
statinfo: move stat_{data,validity} functions from cache/read-cache

These functions do not depend upon struct cache_entry or struct
index_state in any way, and it seems more logical to break them out into
this file, especially since statinfo.h already has the struct stat_data
declaration.

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoread-cache: move shared add/checkout/commit code
Elijah Newren [Tue, 16 May 2023 06:33:47 +0000 (06:33 +0000)] 
read-cache: move shared add/checkout/commit code

The function add_files_to_cache(), plus associated helper functions,
were defined in builtin/add.c, but also shared with builtin/checkout.c
and builtin/commit.c.  Move these shared functions to read-cache.c.

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoadd: modify add_files_to_cache() to avoid globals
Elijah Newren [Tue, 16 May 2023 06:33:46 +0000 (06:33 +0000)] 
add: modify add_files_to_cache() to avoid globals

The function add_files_to_cache() is used by all three of builtin/{add,
checkout, commit}.c.  That suggests this is common library code, and
should be moved somewhere else, like read-cache.c.  However, the
function and its helpers made use of two global variables that made
straight code movement difficult:
  * the_index
  * include_sparse
The latter was perhaps more problematic since it was only accessible in
builtin/add.c but was still affecting builtin/checkout.c and
builtin/commit.c without this fact being very clear from the code.  I'm
not sure if the other two callers would want to add a `--sparse` flag
similar to add.c to get non-default behavior, but exposing this
dependence will help if we ever decide we do want to add such a flag.

Modify add_files_to_cache() and its helpers to accept the necessary
arguments instead of relying on globals.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoread-cache: move shared commit and ls-files code
Elijah Newren [Tue, 16 May 2023 06:33:45 +0000 (06:33 +0000)] 
read-cache: move shared commit and ls-files code

The function overlay_tree_on_index(), plus associated helper functions,
were defined in builtin/ls-files.c, but also shared with
builtin/commit.c.  Move these shared functions to read-cache.c.

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agosetup: adopt shared init-db & clone code
Elijah Newren [Tue, 16 May 2023 06:33:44 +0000 (06:33 +0000)] 
setup: adopt shared init-db & clone code

The functions init_db() and initialize_repository_version() were shared
by builtin/init-db.c and builtin/clone.c, and declared in cache.h.

Move these functions, plus their several helpers only used by these
functions, to setup.[ch].

Diff best viewed with `--color-moved`.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoinit-db, clone: change unnecessary global into passed parameter
Elijah Newren [Tue, 16 May 2023 06:33:43 +0000 (06:33 +0000)] 
init-db, clone: change unnecessary global into passed parameter

Much like the parent commit, this commit was prompted by a desire to
move the functions which builtin/init-db.c and builtin/clone.c share out
of the former file and into setup.c.  A secondary issue that made it
difficult was the init_shared_repository global variable; replace it
with a simple parameter that is passed to the relevant functions.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoinit-db: remove unnecessary global variable
Elijah Newren [Tue, 16 May 2023 06:33:42 +0000 (06:33 +0000)] 
init-db: remove unnecessary global variable

This commit was prompted by a desire to move the functions which
builtin/init-db.c and builtin/clone.c share out of the former file and
into setup.c.  One issue that made it difficult was the
init_is_bare_repository global variable.

init_is_bare_repository's sole use in life it to cache a value in
init_db(), and then be used in create_default_files().  This is a bit
odd since init_db() directly calls create_default_files(), and is the
only caller of that function.  Convert the global to a simple function
parameter instead.

(Of course, this doesn't fix the fact that this value is then ignored by
create_default_files(), as noted in a big TODO comment in that function,
but it at least includes no behavioral change other than getting rid of
a very questionable global variable.)

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoinit-db: document existing bug with core.bare in template config
Elijah Newren [Tue, 16 May 2023 06:33:41 +0000 (06:33 +0000)] 
init-db: document existing bug with core.bare in template config

The comments in create_default_files() talks about reading config from
the config file in the specified `--templates` directory, which leads to
the question of whether core.bare could be set in such a config file and
thus whether the code is doing the right thing.  It turns out, that it
doesn't; it unconditionally ignores core.bare in the config file in any
--templates directory.  It is not clear to me that fixing it can be done
within this function; it seems to occur too late:
  * create_default_files() is called by init_db()
  * init_db() is called by both builtin/{clone.c,init-db.c}
  * both callers of init_db() call set_git_work_tree() before init_db()
and in order to actual affect whether a repository is bear, we'd need to
somewhere reset these values, not just the is_bare_repository_cfg
setting.

I do not want to open this can of worms at this time; I'm trying to
clean up some headers, for which I need to move some functions, for
which I need to clean up some globals, and that's far enough down the
rabbit hole.  So, simply document the issue with a careful TODO comment
and a few testcases.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agonotes: introduce "--no-separator" option
Teng Long [Sat, 27 May 2023 07:57:54 +0000 (15:57 +0800)] 
notes: introduce "--no-separator" option

Sometimes, the user may want to add or append multiple notes
without any separator to be added between them.

Disscussion:

  https://public-inbox.org/git/3f86a553-246a-4626-b1bd-bacd8148318a@app.fastmail.com/

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agonotes.c: introduce "--[no-]stripspace" option
Teng Long [Sat, 27 May 2023 07:57:53 +0000 (15:57 +0800)] 
notes.c: introduce "--[no-]stripspace" option

This commit introduces a new option "--[no-]stripspace" to git notes
append, git notes edit, and git notes add. This option allows users to
control whether the note message need to stripped out.

For the consideration of backward compatibility, let's look at the
behavior about "stripspace" in "git notes" command:

1. "Edit Message" case: using the default editor to edit the note
message.

    In "edit" case, the edited message will always be stripped out, the
    implementation which can be found in the "prepare_note_data()". In
    addition, the "-c" option supports to reuse an existing blob as a
    note message, then open the editor to make a further edition on it,
    the edited message will be stripped.

    This commit doesn't change the default behavior of "edit" case by
    using an enum "notes_stripspace", only when "--no-stripspace" option
    is specified, the note message will not be stripped out. If you do
    not specify the option or you specify "--stripspace", clearly, the
    note message will be stripped out.

2. "Assign Message" case: using the "-m"/"-F"/"-C" option to specify the
note message.

    In "assign" case, when specify message by "-m" or "-F", the message
    will be stripped out by default, but when specify message by "-C",
    the message will be copied verbatim, in other word, the message will
    not be stripped out. One more thing need to note is "the order of
    the options matter", that is, if you specify "-C" before "-m" or
    "-F", the reused message by "-C" will be stripped out together,
    because everytime concat "-m" or "-F" message, the concated message
    will be stripped together. Oppositely, if you specify "-m" or "-F"
    before "-C", the reused message by "-C" will not be stripped out.

    This commit doesn't change the default behavior of "assign" case by
    extending the "stripspace" field in "struct note_msg", so we can
    distinguish the different behavior of "-m"/"-F" and "-C" options
    when we need to parse and concat the message.

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agonotes.c: append separator instead of insert by pos
Teng Long [Sat, 27 May 2023 07:57:52 +0000 (15:57 +0800)] 
notes.c: append separator instead of insert by pos

Rename "insert_separator" to "append_separator" and also remove the
"postion" argument, this serves two purpose:

The first is that when specifying more than one "-m" ( like "-F", etc)
to "git notes add" or "git notes append", the order of them matters,
which means we need to append the each separator and message in turn,
so we don't have to make the caller specify the position, the "append"
operation is enough and clear.

The second is that when we execute the "git notes append" subcommand,
we need to combine the "prev_note" and "current_note" to get the
final result. Before, we inserted a newline character at the beginning
of "current_note". Now, we will append a newline to the end of
"prev_note" instead, this will give the consisitent results.

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agonotes.c: introduce '--separator=<paragraph-break>' option
Teng Long [Sat, 27 May 2023 07:57:51 +0000 (15:57 +0800)] 
notes.c: introduce '--separator=<paragraph-break>' option

When adding new notes or appending to an existing notes, we will
insert a blank line between the paragraphs, like:

     $ git notes add -m foo -m bar
     $ git notes show HEAD
     foo

     bar

The default behavour sometimes is not enough, the user may want
to use a custom delimiter between paragraphs, like when
specifying '-m', '-F', '-C', '-c' options. So this commit
introduce a new '--separator' option for 'git notes add' and
'git notes append', for example when executing:

    $ git notes add -m foo -m bar --separator="-"
    $ git notes show HEAD
    foo
    -
    bar

a newline is added to the value given to --separator if it
does not end with one already. So when executing:

      $ git notes add -m foo -m bar --separator="-"
and
      $ export LF="
      "
      $ git notes add -m foo -m bar --separator="-$LF"

Both the two exections produce the same result.

The reason we use a "strbuf" array to concat but not "string_list", is
that the binary file content may contain '\0' in the middle, this will
cause the corrupt result if using a string to save.

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agot3321: add test cases about the notes stripspace behavior
Teng Long [Sat, 27 May 2023 07:57:50 +0000 (15:57 +0800)] 
t3321: add test cases about the notes stripspace behavior

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agonotes.c: use designated initializers for clarity
Teng Long [Sat, 27 May 2023 07:57:49 +0000 (15:57 +0800)] 
notes.c: use designated initializers for clarity

The "struct note_data d = { 0, 0, NULL, STRBUF_INIT };" style could be
replaced with designated initializer for clarity.

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agonotes.c: cleanup 'strbuf_grow' call in 'append_edit'
Teng Long [Sat, 27 May 2023 07:57:48 +0000 (15:57 +0800)] 
notes.c: cleanup 'strbuf_grow' call in 'append_edit'

Let's cleanup the unnecessary 'strbuf_grow' call in 'append_edit'. This
"strbuf_grow(&d.buf, size + 1);" is prepared for insert a blank line if
needed, but actually when inserting, "strbuf_insertstr(&d.buf, 0,
"\n");" will do the "grow" for us.

348f199b (builtin-notes: Refactor handling of -F option to allow
combining -m and -F, 2010-02-13) added these to mimic the code
introduced by 2347fae5 (builtin-notes: Add "append" subcommand for
appending to note objects, 2010-02-13) that reads in previous note
before the message.  And the resulting code with explicit sizing is
carried to this day.

In the context of reading an existing note in, exact sizing may have
made sense, but because the resulting note needs cleansing with
stripspace() when appending with this option, such an exact sizing
does not buy us all that much in practice.

It may help avoiding overallocation due to ALLOC_GROW() slop, but
nobody can feed so many long messages for it to matter from the
command line.

Signed-off-by: Teng Long <dyroneteng@gmail.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoThe second batch for 2.42
Junio C Hamano [Tue, 20 Jun 2023 22:12:15 +0000 (15:12 -0700)] 
The second batch for 2.42

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 years agoMerge branch 'la/doc-interpret-trailers'
Junio C Hamano [Tue, 20 Jun 2023 22:53:13 +0000 (15:53 -0700)] 
Merge branch 'la/doc-interpret-trailers'

Doc update.

* la/doc-interpret-trailers:
  doc: trailer: add more examples in DESCRIPTION
  doc: trailer: mention 'key' in DESCRIPTION
  doc: trailer.<token>.command: emphasize deprecation
  doc: trailer: use angle brackets for <token> and <value>
  doc: trailer: remove redundant phrasing
  doc: trailer: examples: avoid the word "message" by itself
  doc: trailer: drop "commit message part" phrasing
  doc: trailer: swap verb order
  doc: trailer: fix grammar

2 years agoMerge branch 'jk/log-follow-with-non-literal-pathspec'
Junio C Hamano [Tue, 20 Jun 2023 22:53:13 +0000 (15:53 -0700)] 
Merge branch 'jk/log-follow-with-non-literal-pathspec'

"git [-c log.follow=true] log [--follow] ':(glob)f**'" used to barf.

* jk/log-follow-with-non-literal-pathspec:
  diff: detect pathspec magic not supported by --follow
  diff: factor out --follow pathspec check
  pathspec: factor out magic-to-name function

2 years agoMerge branch 'vd/worktree-config-is-per-repository'
Junio C Hamano [Tue, 20 Jun 2023 22:53:13 +0000 (15:53 -0700)] 
Merge branch 'vd/worktree-config-is-per-repository'

The value of config.worktree is per-repository, but has been kept
in a singleton global variable per process. This has been OK as
most Git operations interacted with a single repository at a time,
but not right for operations like recursive "grep" that want to
access multiple repositories from a single process without forking.

The global variable has been eliminated and made into a member in
the per-repository data structure.

* vd/worktree-config-is-per-repository:
  repository: move 'repository_format_worktree_config' to repo scope
  config: pass 'repo' directly to 'config_with_options()'
  config: use gitdir to get worktree config

2 years agoMerge branch 'tb/submodule-null-deref-fix'
Junio C Hamano [Tue, 20 Jun 2023 22:53:12 +0000 (15:53 -0700)] 
Merge branch 'tb/submodule-null-deref-fix'

"git submodule" code trusted the data coming from the config (and
the in-tree .gitmodules file) too much without validating, leading
to NULL dereference if the user mucks with a repository (e.g.
submodule.<name>.url is removed).  This has been corrected.

* tb/submodule-null-deref-fix:
  builtin/submodule--helper.c: handle missing submodule URLs

2 years agoMerge branch 'jc/test-modernization-2'
Junio C Hamano [Tue, 20 Jun 2023 22:53:12 +0000 (15:53 -0700)] 
Merge branch 'jc/test-modernization-2'

Test style updates.

* jc/test-modernization-2:
  t9400-git-cvsserver-server: modernize test format
  t9200-git-cvsexportcommit: modernize test format
  t9104-git-svn-follow-parent: modernize test format
  t9100-git-svn-basic: modernize test format
  t7700-repack: modernize test format
  t7600-merge: modernize test format
  t7508-status: modernize test format
  t7201-co: modernize test format
  t7111-reset-table: modernize test format
  t7110-reset-merge: modernize test format