]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/blame-contents-with-arbitrary-commit'
authorJunio C Hamano <gitster@pobox.com>
Tue, 4 Apr 2023 21:28:28 +0000 (14:28 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 4 Apr 2023 21:28:28 +0000 (14:28 -0700)
"git blame --contents=<file> <rev> -- <path>" used to be forbidden,
but now it finds the origins of lines starting at <file> contents
through the history that leads to <rev>.

* jk/blame-contents-with-arbitrary-commit:
  blame: allow --contents to work with non-HEAD commit

424 files changed:
Documentation/CodingGuidelines
Documentation/Makefile
Documentation/RelNotes/2.41.0.txt [new file with mode: 0644]
Documentation/config/advice.txt
Documentation/config/format.txt
Documentation/config/rebase.txt
Documentation/diff-options.txt
Documentation/git-am.txt
Documentation/git-bundle.txt
Documentation/git-credential.txt
Documentation/git-merge-tree.txt
Documentation/git-rebase.txt
Documentation/git-rev-parse.txt
Documentation/manpage-quote-apos.xsl [deleted file]
Documentation/rev-list-options.txt
GIT-VERSION-GEN
Makefile
RelNotes
abspath.c
add-interactive.c
add-patch.c
advice.c
advice.h
alias.c
alloc.c
alloc.h
apply.c
archive-tar.c
archive-zip.c
archive.c
attr.c
bisect.c
blame.c
blame.h
blob.c
branch.c
builtin/am.c
builtin/archive.c
builtin/bisect.c
builtin/blame.c
builtin/bundle.c
builtin/cat-file.c
builtin/check-mailmap.c
builtin/checkout--worker.c
builtin/checkout.c
builtin/clone.c
builtin/commit-graph.c
builtin/commit-tree.c
builtin/commit.c
builtin/config.c
builtin/count-objects.c
builtin/credential-cache--daemon.c
builtin/describe.c
builtin/diff-tree.c
builtin/difftool.c
builtin/fast-export.c
builtin/fast-import.c
builtin/fetch-pack.c
builtin/fetch.c
builtin/fsck.c
builtin/fsmonitor--daemon.c
builtin/gc.c
builtin/grep.c
builtin/hash-object.c
builtin/index-pack.c
builtin/log.c
builtin/ls-files.c
builtin/ls-remote.c
builtin/ls-tree.c
builtin/merge-base.c
builtin/merge-index.c
builtin/merge-tree.c
builtin/merge.c
builtin/mktag.c
builtin/mktree.c
builtin/mv.c
builtin/name-rev.c
builtin/notes.c
builtin/pack-objects.c
builtin/pack-redundant.c
builtin/patch-id.c
builtin/prune.c
builtin/pull.c
builtin/push.c
builtin/read-tree.c
builtin/rebase.c
builtin/receive-pack.c
builtin/reflog.c
builtin/repack.c
builtin/replace.c
builtin/reset.c
builtin/rev-list.c
builtin/rev-parse.c
builtin/revert.c
builtin/rm.c
builtin/send-pack.c
builtin/show-branch.c
builtin/show-index.c
builtin/show-ref.c
builtin/sparse-checkout.c
builtin/stash.c
builtin/submodule--helper.c
builtin/tag.c
builtin/unpack-file.c
builtin/unpack-objects.c
builtin/update-index.c
builtin/upload-pack.c
builtin/var.c
builtin/verify-commit.c
builtin/verify-tag.c
builtin/worktree.c
builtin/write-tree.c
bulk-checkin.c
bundle-uri.c
bundle.c
cache-tree.c
cache-tree.h
cache.h
cbtree.c
cbtree.h
checkout.h
chunk-format.c
chunk-format.h
color.c
combine-diff.c
commit-graph.c
commit-graph.h
commit-reach.c
commit-slab-impl.h
commit.c
commit.h
compat/fsmonitor/fsm-ipc-darwin.c
compat/fsmonitor/fsm-ipc-win32.c
compat/fsmonitor/fsm-settings-darwin.c
compat/mingw.c
config.c
connect.c
connect.h
connected.c
contrib/completion/git-prompt.sh
contrib/subtree/t/Makefile
convert.c
credential.c
credential.h
daemon.c
decorate.c
delta-islands.c
diagnose.c
diagnose.h
diff-lib.c
diff-merges.c
diff-no-index.c
diff.c
diff.h
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore-rotate.c
diffcore.h
dir-iterator.c
dir.c
dir.h
entry.c
entry.h
environment.c
ewah/bitmap.c
ewah/ewah_bitmap.c
fetch-pack.c
fmt-merge-msg.c
fsck.c
fsck.h
fsmonitor-settings.c
fsmonitor.h
git-compat-util.h
git.c
gpg-interface.c
gpg-interface.h
graph.c
grep.c
grep.h
hash.h
hashmap.c
hashmap.h
help.c
hex.c
hex.h [new file with mode: 0644]
hook.c
http-backend.c
http-fetch.c
http-push.c
http-walker.c
http.c
ident.c
ident.h [new file with mode: 0644]
imap-send.c
json-writer.c
khash.h
kwset.c
levenshtein.c
line-log.c
line-log.h
linear-assignment.c
list-objects-filter-options.c
list-objects-filter-options.h
list-objects-filter.c
list-objects.c
log-tree.c
ls-refs.c
mailinfo.c
match-trees.c
mem-pool.c
merge-blobs.c
merge-ort.c
merge-recursive.c
merge.c
midx.c
negotiator/noop.c
negotiator/skipping.c
notes-merge.c
notes.c
object-file.c
object-name.c
object-store.h
object.c
object.h
oid-array.c
oidmap.c
oidmap.h
oidset.c
oidtree.c
oss-fuzz/fuzz-commit-graph.c
oss-fuzz/fuzz-pack-headers.c
oss-fuzz/fuzz-pack-idx.c
pack-bitmap-write.c
pack-bitmap.c
pack-check.c
pack-mtimes.h
pack-objects.c
pack-write.c
packfile.c
parallel-checkout.c
parse-options.c
parse-options.h
patch-ids.c
path.c
pathspec.h
pkt-line.c
pkt-line.h
pretty.c
pretty.h
prio-queue.c
progress.c
promisor-remote.c
protocol-caps.c
prune-packed.c
quote.c
reachable.c
read-cache.c
rebase.c
ref-filter.c
ref-filter.h
reflog-walk.c
reflog-walk.h
refs.c
refs/debug.c
refs/files-backend.c
refs/packed-backend.c
refs/ref-cache.c
refs/refs-internal.h
refspec.c
remote-curl.c
remote.c
remote.h
replace-object.c
replace-object.h
repo-settings.c
repository.h
rerere.c
reset.c
revision.c
revision.h
run-command.c
send-pack.c
sequencer.c
sequencer.h
serve.c
server-info.c
sha1dc_git.c
shallow.c
shallow.h
shell.c
sigchain.c
sparse-index.c
split-index.c
statinfo.h [new file with mode: 0644]
strbuf.c
string-list.c
strvec.c
sub-process.c
sub-process.h
submodule-config.c
submodule-config.h
submodule.c
t/Makefile
t/aggregate-results.sh
t/helper/test-bloom.c
t/helper/test-cache-tree.c
t/helper/test-crontab.c
t/helper/test-ctype.c
t/helper/test-dump-cache-tree.c
t/helper/test-dump-split-index.c
t/helper/test-dump-untracked-cache.c
t/helper/test-example-decorate.c
t/helper/test-fast-rebase.c
t/helper/test-hash.c
t/helper/test-json-writer.c
t/helper/test-match-trees.c
t/helper/test-oid-array.c
t/helper/test-oidmap.c
t/helper/test-oidtree.c
t/helper/test-pack-mtimes.c
t/helper/test-parse-pathspec-file.c
t/helper/test-partial-clone.c
t/helper/test-pcre2-config.c
t/helper/test-prio-queue.c
t/helper/test-proc-receive.c
t/helper/test-reach.c
t/helper/test-read-midx.c
t/helper/test-ref-store.c
t/helper/test-repository.c
t/helper/test-run-command.c
t/helper/test-sigchain.c
t/helper/test-simple-ipc.c
t/helper/test-submodule-nested-repo-config.c
t/helper/test-wildmatch.c
t/lib-httpd.sh
t/lib-httpd/apache.conf
t/lib-httpd/nph-custom-auth.sh [new file with mode: 0644]
t/lib-patch-mode.sh
t/lib-submodule-update.sh
t/perf/p2000-sparse-operations.sh
t/t0001-init.sh
t/t0002-gitfile.sh
t/t0027-auto-crlf.sh
t/t0055-beyond-symlinks.sh
t/t0060-path-utils.sh
t/t0100-previous.sh
t/t1401-symbolic-ref.sh
t/t1450-fsck.sh
t/t1504-ceiling-dirs.sh
t/t1507-rev-parse-upstream.sh
t/t2005-checkout-index-symlinks.sh
t/t2021-checkout-overwrite.sh
t/t2060-switch.sh
t/t2070-restore.sh
t/t3013-ls-files-format.sh
t/t3070-wildmatch.sh
t/t3200-branch.sh
t/t3400-rebase.sh
t/t3422-rebase-incompatible-options.sh
t/t3430-rebase-merges.sh
t/t3436-rebase-more-options.sh
t/t3700-add.sh
t/t3701-add-interactive.sh
t/t4013-diff-various.sh
t/t4014-format-patch.sh
t/t5000-tar-tree.sh
t/t5510-fetch.sh
t/t5514-fetch-multiple.sh
t/t5516-fetch-push.sh
t/t5522-pull-symlink.sh
t/t5526-fetch-submodules.sh
t/t5563-simple-http-auth.sh [new file with mode: 0755]
t/t5605-clone-local.sh
t/t5702-protocol-v2.sh
t/t6018-rev-list-glob.sh
t/t6020-bundle-misc.sh
t/t6021-rev-list-exclude-hidden.sh
t/t6030-bisect-porcelain.sh
t/t7031-verify-tag-signed-ssh.sh
t/t7402-submodule-rebase.sh
t/t7504-commit-msg-hook.sh
t/t7516-commit-races.sh
t/t7527-builtin-fsmonitor.sh
t/t7810-grep.sh
t/t9351-fast-export-anonymize.sh
t/t9903-bash-prompt.sh
tag.c
thread-utils.c
trace.h
trace2.c
trace2/tr2_ctr.c
trace2/tr2_sid.c
trace2/tr2_sysenv.c
trace2/tr2_tbuf.c
trace2/tr2_tgt_event.c
trace2/tr2_tgt_normal.c
trace2/tr2_tgt_perf.c
trace2/tr2_tls.c
trace2/tr2_tmr.c
trailer.c
transport-helper.c
transport.c
tree-walk.c
tree-walk.h
tree.c
unicode-width.h
unix-socket.c
unix-stream-server.c
unpack-trees.c
unpack-trees.h
upload-pack.c
url.c
urlmatch.c
userdiff.c
walker.c
wildmatch.c
wildmatch.h
worktree.c
worktree.h
wt-status.c
xdiff-interface.c
xdiff-interface.h

index 9d5c27807a40bcf597c6266b848d89f15afb5165..003393ed161dab04a5c73269d49fa2e2f2fdd1f6 100644 (file)
@@ -442,8 +442,12 @@ For C programs:
    detail.
 
  - The first #include in C files, except in platform specific compat/
-   implementations, must be either "git-compat-util.h", "cache.h" or
-   "builtin.h".  You do not have to include more than one of these.
+   implementations and sha1dc/, must be either "git-compat-util.h" or
+   one of the approved headers that includes it first for you.  (The
+   approved headers currently include "cache.h", "builtin.h",
+   "t/helper/test-tool.h", "xdiff/xinclude.h", or
+   "reftable/system.h").  You do not have to include more than one of
+   these.
 
  - A C file must directly include the header files that declare the
    functions and the types it uses, except for the functions and types
index 9c67c3a1c50d4b87853a1cb2fcbfd6f0619d118c..a6ba5bd460208b099b9281fafb5d1a65db4b2937 100644 (file)
@@ -191,14 +191,6 @@ MAN_BASE_URL = file://$(htmldir)/
 endif
 XMLTO_EXTRA += -m manpage-base-url.xsl
 
-# If your target system uses GNU groff, it may try to render
-# apostrophes as a "pretty" apostrophe using unicode.  This breaks
-# cut&paste, so you should set GNU_ROFF to force them to be ASCII
-# apostrophes.  Unfortunately does not work with non-GNU roff.
-ifdef GNU_ROFF
-XMLTO_EXTRA += -m manpage-quote-apos.xsl
-endif
-
 ifdef USE_ASCIIDOCTOR
 ASCIIDOC = asciidoctor
 ASCIIDOC_CONF =
diff --git a/Documentation/RelNotes/2.41.0.txt b/Documentation/RelNotes/2.41.0.txt
new file mode 100644 (file)
index 0000000..fa2cb4b
--- /dev/null
@@ -0,0 +1,145 @@
+Git v2.41 Release Notes
+=======================
+
+UI, Workflows & Features
+
+ * Allow information carried on the WWW-AUthenticate header to be
+   passed to the credential helpers.
+
+ * A new "fetch.hideRefs" option can be used to exclude specified refs
+   from "rev-list --objects --stdin --not --all" traversal for
+   checking object connectivity, most useful when there are many
+   unrelated histories in a single repository.
+
+ * "git push" has been taught to allow deletion of refs with one-level
+   names to help repairing a repository who acquired such a ref by
+   mistake.  In general, we don't encourage use of such a ref, and
+   creation or update to such a ref is rejected as before.
+
+ * Allow "git bisect reset" to check out the original branch when the
+   branch is already checked out in a different worktree linked to the
+   same repository.
+
+ * A few subcommands have been taught to stop users from working on a
+   branch that is being used in another worktree linked to the same
+   repository.
+
+ * "git format-patch" learned to write a log-message only output file
+   for empty commits.
+
+ * "git format-patch" honors the src/dst prefixes set to nonstandard
+   values with configuration variables like "diff.noprefix", causing
+   receiving end of the patch that expects the standard -p1 format to
+   break.  "format-patch" has been taught to ignore end-user configuration
+   and always use the standard prefixes.
+
+   This is a backward compatibility breaking change.
+
+ * Lift the limitation that colored prompts can only be used with
+   PROMPT_COMMAND mode.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * Code clean-up to clarify directory traversal API.
+
+ * Code clean-up to clarify the rule that "git-compat-util.h" must be
+   the first to be included.
+
+ * More work towards -Wunused.
+
+ * Instead of forcing each command to choose to honor GPG related
+   configuration variables, make the subsystem lazily initialize
+   itself.
+
+ * Remove workaround for ancient versions of DocBook to make it work
+   correctly with groff, which has not been necessary since docbook
+   1.76 from 2010.
+
+ * Code clean-up to include and/or uninclude parse-options.h file as
+   needed.
+
+
+Fixes since v2.40
+-----------------
+
+ * "git fsck" learned to check the index files in other worktrees,
+   just like "git gc" honors them as anchoring points.
+   (merge 8d3e7eac52 jk/fsck-indices-in-worktrees later to maint).
+
+ * Fix a segfaulting loop.  The function and its caller may need
+   further clean-up.
+   (merge c5773dc078 ew/commit-reach-clean-up-flags-fix later to maint).
+
+ * "git restore" supports options like "--ours" that are only
+   meaningful during a conflicted merge, but these options are only
+   meaningful when updating the working tree files.  These options are
+   marked to be incompatible when both "--staged" and "--worktree" are
+   in effect.
+   (merge ee8a88826a ak/restore-both-incompatible-with-conflicts later to maint).
+
+ * Simplify UI to control progress meter given by "git bundle" command.
+   (merge 8b95521edb jk/bundle-progress later to maint).
+
+ * "git bundle" learned that "-" is a common way to say that the input
+   comes from the standard input and/or the output goes to the
+   standard output.  It used to work only for output and only from the
+   root level of the working tree.
+   (merge 0bbe10313e jk/bundle-use-dash-for-stdfiles later to maint).
+
+ * Once we start running, we assumed that the list of alternate object
+   databases would never change.  Hook into the machinery used to
+   update the list of packfiles during runtime to update this list as
+   well.
+   (merge e2d003dbed ds/reprepare-alternates-when-repreparing-packfiles later to maint).
+
+ * The code to parse "git rebase -X<opt>" was not prepared to see an
+   unparsable option string, which has been corrected.
+   (merge 15a4cc912e ab/fix-strategy-opts-parsing later to maint).
+
+ * "git add -p" while the index is unmerged sometimes failed to parse
+   the diff output it internally produces and died, which has been
+   corrected.
+   (merge 28d1122f9c jk/add-p-unmerged-fix later to maint).
+
+ * Fix for a "ls-files --format="%(path)" that produced nonsense
+   output, which was a bug in 2.38.
+   (merge cfb62dd006 aj/ls-files-format-fix later to maint).
+
+ * "git receive-pack" that responds to "git push" requests failed to
+   clean a stale lockfile when killed in the middle, which has been
+   corrected.
+   (merge c55c30669c ps/receive-pack-unlock-before-die later to maint).
+
+ * "git rev-parse --quiet foo@{u}", or anything that asks @{u} to be
+   parsed with GET_OID_QUIETLY option, did not quietly fail, which has
+   been corrected.
+   (merge dfbfdc521d fc/oid-quietly-parse-upstream later to maint).
+
+ * Transports that do not support protocol v2 did not correctly fall
+   back to protocol v0 under certain conditions, which has been
+   corrected.
+   (merge eaa0fd6584 jk/fix-proto-downgrade-to-v0 later to maint).
+
+ * time(2) on glib 2.31+, especially on Linux, goes out of sync with
+   higher resolution timers used for gettimeofday(2) and by the
+   filesystem.  Replace all calls to it with a git_time() wrapper and
+   (merge 370ddcbc89 pe/time-use-gettimeofday later to maint).
+
+ * Code clean-up to use designated initializers in parse-options API.
+   (merge 353e6d4554 sg/parse-options-h-initializers later to maint).
+
+ * A recent-ish change to allow unicode character classes to be used
+   with "grep -P" triggered a JIT bug in older pcre2 libraries.
+   The problematic change in Git built with these older libraries has
+   been disabled to work around the bug.
+   (merge 14b9a04479 mk/workaround-pcre-jit-ucp-bug later to maint).
+
+ * Other code cleanup, docfix, build fix, etc.
+   (merge f7111175df as/doc-markup-fix later to maint).
+   (merge 90ff7c9898 fc/test-aggregation-clean-up later to maint).
+   (merge 9b0c7f308a jc/am-doc-refer-to-format-patch later to maint).
+   (merge b10cbdac4c bb/unicode-width-table-15 later to maint).
+   (merge 3457b50e8c ab/retire-scripted-add-p later to maint).
+   (merge d52fcf493b ds/p2000-fix-grep-sparse later to maint).
+   (merge ec063d2591 ss/hashmap-typofix later to maint).
index a00d0100a82ba710ea52470764b047e2aeb38d56..c96b5b2e5d2160c3f6b1147fc6500f22acf06a55 100644 (file)
@@ -136,4 +136,6 @@ advice.*::
                Advice shown when either linkgit:git-add[1] or linkgit:git-rm[1]
                is asked to update index entries outside the current sparse
                checkout.
+       diverging::
+               Advice shown when a fast-forward is not possible.
 --
index 73678d88a1dba172c43f4fb850e750c6a0c7f96c..8cf6f00d9365cf19b6244ba005d078c5ebed8a05 100644 (file)
@@ -144,3 +144,10 @@ will only show notes from `refs/notes/bar`.
 format.mboxrd::
        A boolean value which enables the robust "mboxrd" format when
        `--stdout` is in use to escape "^>+From " lines.
+
+format.noprefix::
+       If set, do not show any source or destination prefix in patches.
+       This is equivalent to the `diff.noprefix` option used by `git
+       diff` (but which is not respected by `format-patch`). Note that
+       by setting this, the receiver of any patches you generate will
+       have to apply them using the `-p0` option.
index f19bd0e04079051d6be21ee461d1a98c9a632629..afaf6dad99b5542ab06c31e4276a695128ee6b8a 100644 (file)
@@ -67,3 +67,13 @@ rebase.rescheduleFailedExec::
 
 rebase.forkPoint::
        If set to false set `--no-fork-point` option by default.
+
+rebase.rebaseMerges::
+       Whether and how to set the `--rebase-merges` option by default. Can
+       be `rebase-cousins`, `no-rebase-cousins`, or a boolean. Setting to
+       true or to `no-rebase-cousins` is equivalent to
+       `--rebase-merges=no-rebase-cousins`, setting to `rebase-cousins` is
+       equivalent to `--rebase-merges=rebase-cousins`, and setting to false is
+       equivalent to `--no-rebase-merges`. Passing `--rebase-merges` on the
+       command line, with or without an argument, overrides any
+       `rebase.rebaseMerges` configuration.
index 7d73e976d9936bb35981ad7f64b0af66865491b8..08ab86189a7b62cf88898d04a57ed3e943bdc311 100644 (file)
@@ -852,6 +852,11 @@ endif::git-format-patch[]
 --no-prefix::
        Do not show any source or destination prefix.
 
+--default-prefix::
+       Use the default source and destination prefixes ("a/" and "b/").
+       This is usually the default already, but may be used to override
+       config such as `diff.noprefix`.
+
 --line-prefix=<prefix>::
        Prepend an additional prefix to every line of output.
 
index 0c1dfb3c98b440f87e561a0d44c240a41d80dc14..900be198b14e933d19f87febd9860cb0c67a6bf0 100644 (file)
@@ -24,7 +24,9 @@ DESCRIPTION
 -----------
 Splits mail messages in a mailbox into commit log message,
 authorship information and patches, and applies them to the
-current branch.
+current branch. You could think of it as a reverse operation
+of linkgit:git-format-patch[1] run on a branch with a straight
+history without merges.
 
 OPTIONS
 -------
@@ -273,7 +275,8 @@ include::config/am.txt[]
 
 SEE ALSO
 --------
-linkgit:git-apply[1].
+linkgit:git-apply[1],
+linkgit:git-format-patch[1].
 
 GIT
 ---
index 18a022b4b40c345040c23e83bed1fd1983bd725e..3ab42a19cae4aca0e6a3a83db92d25a4d88bf927 100644 (file)
@@ -9,7 +9,7 @@ git-bundle - Move objects and refs by archive
 SYNOPSIS
 --------
 [verse]
-'git bundle' create [-q | --quiet | --progress | --all-progress] [--all-progress-implied]
+'git bundle' create [-q | --quiet | --progress]
                    [--version=<version>] <file> <git-rev-list-args>
 'git bundle' verify [-q | --quiet] <file>
 'git bundle' list-heads <file> [<refname>...]
@@ -66,7 +66,7 @@ create [options] <file> <git-rev-list-args>::
        Used to create a bundle named 'file'.  This requires the
        '<git-rev-list-args>' arguments to define the bundle contents.
        'options' contains the options specific to the 'git bundle create'
-       subcommand.
+       subcommand. If 'file' is `-`, the bundle is written to stdout.
 
 verify <file>::
        Used to check that a bundle file is valid and will apply
@@ -77,12 +77,13 @@ verify <file>::
        Finally, information about additional capabilities, such as "object
        filter", is printed. See "Capabilities" in linkgit:gitformat-bundle[5]
        for more information. The exit code is zero for success, but will
-       be nonzero if the bundle file is invalid.
+       be nonzero if the bundle file is invalid. If 'file' is `-`, the
+       bundle is read from stdin.
 
 list-heads <file>::
        Lists the references defined in the bundle.  If followed by a
        list of references, only references matching those given are
-       printed out.
+       printed out. If 'file' is `-`, the bundle is read from stdin.
 
 unbundle <file>::
        Passes the objects in the bundle to 'git index-pack'
@@ -90,6 +91,7 @@ unbundle <file>::
        defined references. If a list of references is given, only
        references matching those in the list are printed. This command is
        really plumbing, intended to be called only by 'git fetch'.
+       If 'file' is `-`, the bundle is read from stdin.
 
 <git-rev-list-args>::
        A list of arguments, acceptable to 'git rev-parse' and
@@ -115,22 +117,6 @@ unbundle <file>::
        is specified. This flag forces progress status even if
        the standard error stream is not directed to a terminal.
 
---all-progress::
-       When --stdout is specified then progress report is
-       displayed during the object count and compression phases
-       but inhibited during the write-out phase. The reason is
-       that in some cases the output stream is directly linked
-       to another command which may wish to display progress
-       status of its own as it processes incoming pack data.
-       This flag is like --progress except that it forces progress
-       report for the write-out phase as well even if --stdout is
-       used.
-
---all-progress-implied::
-       This is used to imply --all-progress whenever progress display
-       is activated.  Unlike --all-progress this flag doesn't actually
-       force any progress display by itself.
-
 --version=<version>::
        Specify the bundle version.  Version 2 is the older format and can only be
        used with SHA-1 repositories; the newer version 3 contains capabilities that
index 29d184ab82420c3177b11df875e38efa016a01d9..3394c036113acd827b824a1f6ed7ae6fb13f143b 100644 (file)
@@ -113,7 +113,13 @@ separated by an `=` (equals) sign, followed by a newline.
 The key may contain any bytes except `=`, newline, or NUL. The value may
 contain any bytes except newline or NUL.
 
-In both cases, all bytes are treated as-is (i.e., there is no quoting,
+Attributes with keys that end with C-style array brackets `[]` can have
+multiple values. Each instance of a multi-valued attribute forms an
+ordered list of values - the order of the repeated attributes defines
+the order of the values. An empty multi-valued attribute (`key[]=\n`)
+acts to clear any previous entries and reset the list.
+
+In all cases, all bytes are treated as-is (i.e., there is no quoting,
 and one cannot transmit a value with newline or NUL in it). The list of
 attributes is terminated by a blank line or end-of-file.
 
@@ -166,6 +172,17 @@ empty string.
 Components which are missing from the URL (e.g., there is no
 username in the example above) will be left unset.
 
+`wwwauth[]`::
+
+       When an HTTP response is received by Git that includes one or more
+       'WWW-Authenticate' authentication headers, these will be passed by Git
+       to credential helpers.
++
+Each 'WWW-Authenticate' header value is passed as a multi-valued
+attribute 'wwwauth[]', where the order of the attributes is the same as
+they appear in the HTTP response. This attribute is 'one-way' from Git
+to pass additional information to credential helpers.
+
 Unrecognised attributes are silently discarded.
 
 GIT
index 88ee942101a7748ac2a7b5030b364ed7e27d5fdb..ffc4fbf7e89a89b075bb00bafcb041c19adc271f 100644 (file)
@@ -108,7 +108,7 @@ This is an integer status followed by a NUL character.  The integer status is:
 
      0: merge had conflicts
      1: merge was clean
-     &lt;0: something prevented the merge from running (e.g. access to repository
+     <0: something prevented the merge from running (e.g. access to repository
         objects denied by filesystem)
 
 [[OIDTLT]]
index 9a295bcee45f4f817c5b319789a32beb22e5f07c..e7b39ad244a4bebc90e9c1974e4239ae771c56d4 100644 (file)
@@ -529,20 +529,25 @@ See also INCOMPATIBLE OPTIONS below.
 
 -r::
 --rebase-merges[=(rebase-cousins|no-rebase-cousins)]::
+--no-rebase-merges::
        By default, a rebase will simply drop merge commits from the todo
        list, and put the rebased commits into a single, linear branch.
        With `--rebase-merges`, the rebase will instead try to preserve
        the branching structure within the commits that are to be rebased,
        by recreating the merge commits. Any resolved merge conflicts or
        manual amendments in these merge commits will have to be
-       resolved/re-applied manually.
+       resolved/re-applied manually. `--no-rebase-merges` can be used to
+       countermand both the `rebase.rebaseMerges` config option and a previous
+       `--rebase-merges`.
 +
-By default, or when `no-rebase-cousins` was specified, commits which do not
-have `<upstream>` as direct ancestor will keep their original branch point,
-i.e. commits that would be excluded by linkgit:git-log[1]'s
-`--ancestry-path` option will keep their original ancestry by default. If
-the `rebase-cousins` mode is turned on, such commits are instead rebased
-onto `<upstream>` (or `<onto>`, if specified).
+When rebasing merges, there are two modes: `rebase-cousins` and
+`no-rebase-cousins`. If the mode is not specified, it defaults to
+`no-rebase-cousins`. In `no-rebase-cousins` mode, commits which do not have
+`<upstream>` as direct ancestor will keep their original branch point, i.e.
+commits that would be excluded by linkgit:git-log[1]'s `--ancestry-path`
+option will keep their original ancestry by default. In `rebase-cousins` mode,
+such commits are instead rebased onto `<upstream>` (or `<onto>`, if
+specified).
 +
 It is currently only possible to recreate the merge commits using the
 `ort` merge strategy; different merge strategies can be used only via
index bcd80692870ae002db0bc3c1684c9a0959673964..f26a7591e3737df6bcf190fc26f0fe2bf50fcd83 100644 (file)
@@ -197,10 +197,11 @@ respectively, and they must begin with `refs/` when applied to `--glob`
 or `--all`. If a trailing '/{asterisk}' is intended, it must be given
 explicitly.
 
---exclude-hidden=[receive|uploadpack]::
-       Do not include refs that would be hidden by `git-receive-pack` or
-       `git-upload-pack` by consulting the appropriate `receive.hideRefs` or
-       `uploadpack.hideRefs` configuration along with `transfer.hideRefs` (see
+--exclude-hidden=[fetch|receive|uploadpack]::
+       Do not include refs that would be hidden by `git-fetch`,
+       `git-receive-pack` or `git-upload-pack` by consulting the appropriate
+       `fetch.hideRefs`, `receive.hideRefs` or `uploadpack.hideRefs`
+       configuration along with `transfer.hideRefs` (see
        linkgit:git-config[1]). This option affects the next pseudo-ref option
        `--all` or `--glob` and is cleared after processing them.
 
diff --git a/Documentation/manpage-quote-apos.xsl b/Documentation/manpage-quote-apos.xsl
deleted file mode 100644 (file)
index aeb8839..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-               version="1.0">
-
-<!-- work around newer groff/man setups using a prettier apostrophe
-     that unfortunately does not quote anything when cut&pasting
-     examples to the shell -->
-<xsl:template name="escape.apostrophe">
-  <xsl:param name="content"/>
-  <xsl:call-template name="string.subst">
-    <xsl:with-param name="string" select="$content"/>
-    <xsl:with-param name="target">'</xsl:with-param>
-    <xsl:with-param name="replacement">\(aq</xsl:with-param>
-  </xsl:call-template>
-</xsl:template>
-
-</xsl:stylesheet>
index 0d90d5b1549aa2e50647e1a0a6195a2ed301d699..90c73d6708b1d7dc90f50380c20521a1f713ff90 100644 (file)
@@ -195,10 +195,11 @@ respectively, and they must begin with `refs/` when applied to `--glob`
 or `--all`. If a trailing '/{asterisk}' is intended, it must be given
 explicitly.
 
---exclude-hidden=[receive|uploadpack]::
-       Do not include refs that would be hidden by `git-receive-pack` or
-       `git-upload-pack` by consulting the appropriate `receive.hideRefs` or
-       `uploadpack.hideRefs` configuration along with `transfer.hideRefs` (see
+--exclude-hidden=[fetch|receive|uploadpack]::
+       Do not include refs that would be hidden by `git-fetch`,
+       `git-receive-pack` or `git-upload-pack` by consulting the appropriate
+       `fetch.hideRefs`, `receive.hideRefs` or `uploadpack.hideRefs`
+       configuration along with `transfer.hideRefs` (see
        linkgit:git-config[1]). This option affects the next pseudo-ref option
        `--all` or `--glob` and is cleared after processing them.
 
index a87f0adf803117e8152a8bc3549acb858ec2c481..9a1111af9b14f373be57a832931062d57e0723f1 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.40.0
+DEF_VER=v2.40.GIT
 
 LF='
 '
index 50ee51fde3208db679e118338b364efc72658fe1..60ab1a8b4f4f2f72b6d6232d1d0130a57eb4a082 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -207,10 +207,6 @@ include shared.mak
 # Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
 # field that counts the on-disk footprint in 512-byte blocks.
 #
-# Define GNU_ROFF if your target system uses GNU groff.  This forces
-# apostrophes to be ASCII so that cut&pasting examples to the shell
-# will work.
-#
 # Define USE_ASCIIDOCTOR to use Asciidoctor instead of AsciiDoc to build the
 # documentation.
 #
index 47807bf257fd5e52f95f1fb628867a349034571b..4da73c9a6d376789944260138a56c6d8d79fd5fb 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.40.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.41.0.txt
\ No newline at end of file
index 39e06b58486e3e94e640929c27460e786533a2f8..9a81c5525bea667ecaba3909f195f40bb4e69d7d 100644 (file)
--- a/abspath.c
+++ b/abspath.c
@@ -280,3 +280,10 @@ char *prefix_filename(const char *pfx, const char *arg)
 #endif
        return strbuf_detach(&path, NULL);
 }
+
+char *prefix_filename_except_for_dash(const char *pfx, const char *arg)
+{
+       if (!strcmp(arg, "-"))
+               return xstrdup(arg);
+       return prefix_filename(pfx, arg);
+}
index 00a0f6f96f3f5ebc54bbfb841921c5ceff88c1c3..ae25ec50bce77289a7486bda135de8f91f8fb6cc 100644 (file)
@@ -3,6 +3,7 @@
 #include "color.h"
 #include "config.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "revision.h"
 #include "refs.h"
 #include "string-list.h"
index a86a92e16461384cbe8ac880fa6515e0f74e243c..e6c34b9c381c6732cf310106c29bdf60a62241e7 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "add-interactive.h"
+#include "alloc.h"
 #include "strbuf.h"
 #include "run-command.h"
 #include "strvec.h"
@@ -483,7 +484,8 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
                if (!eol)
                        eol = pend;
 
-               if (starts_with(p, "diff ")) {
+               if (starts_with(p, "diff ") ||
+                   starts_with(p, "* Unmerged path ")) {
                        complete_file(marker, hunk);
                        ALLOC_GROW_BY(s->file_diff, s->file_diff_nr, 1,
                                   file_diff_alloc);
index fd189689437c7512e549482fe696f7a2d2400cd2..d6232439c3863b4c6136adfd12465b0aa714e81f 100644 (file)
--- a/advice.c
+++ b/advice.c
@@ -1,6 +1,8 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "advice.h"
 #include "config.h"
 #include "color.h"
+#include "gettext.h"
 #include "help.h"
 #include "string-list.h"
 
@@ -44,6 +46,7 @@ static struct {
        [ADVICE_COMMIT_BEFORE_MERGE]                    = { "commitBeforeMerge", 1 },
        [ADVICE_DETACHED_HEAD]                          = { "detachedHead", 1 },
        [ADVICE_SUGGEST_DETACHING_HEAD]                 = { "suggestDetachingHead", 1 },
+       [ADVICE_DIVERGING]                              = { "diverging", 1 },
        [ADVICE_FETCH_SHOW_FORCED_UPDATES]              = { "fetchShowForcedUpdates", 1 },
        [ADVICE_GRAFT_FILE_DEPRECATED]                  = { "graftFileDeprecated", 1 },
        [ADVICE_IGNORED_HOOK]                           = { "ignoredHook", 1 },
@@ -217,6 +220,14 @@ void NORETURN die_conclude_merge(void)
 
 void NORETURN die_ff_impossible(void)
 {
+       advise_if_enabled(ADVICE_DIVERGING,
+               _("Diverging branches can't be fast-forwarded, you need to either:\n"
+               "\n"
+               "\tgit merge --no-ff\n"
+               "\n"
+               "or:\n"
+               "\n"
+               "\tgit rebase\n"));
        die(_("Not possible to fast-forward, aborting."));
 }
 
index 07e0f76833e78070a26ec288db929ec966024d7e..0f584163f5808ce536ff5d1a5294eed2437ba23b 100644 (file)
--- a/advice.h
+++ b/advice.h
@@ -1,8 +1,6 @@
 #ifndef ADVICE_H
 #define ADVICE_H
 
-#include "git-compat-util.h"
-
 struct string_list;
 
 /*
@@ -21,6 +19,7 @@ struct string_list;
        ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME,
        ADVICE_COMMIT_BEFORE_MERGE,
        ADVICE_DETACHED_HEAD,
+       ADVICE_DIVERGING,
        ADVICE_SUGGEST_DETACHING_HEAD,
        ADVICE_FETCH_SHOW_FORCED_UPDATES,
        ADVICE_GRAFT_FILE_DEPRECATED,
diff --git a/alias.c b/alias.c
index 00abde081739436236aa077412c3b5b686144f42..e814948ced329937a5ad2e0a6c5b17b05a653183 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -1,6 +1,8 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "alias.h"
+#include "alloc.h"
 #include "config.h"
+#include "gettext.h"
 #include "string-list.h"
 
 struct config_alias_data {
diff --git a/alloc.c b/alloc.c
index 27f697e4c87a05ef7cc847a17e83e14e9cfd2a4d..2886aa93543478f4bf221ca3e4a830a40f9baf42 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -8,7 +8,7 @@
  * up with maximal alignment because it doesn't know what the object alignment
  * for the new allocation is.
  */
-#include "cache.h"
+#include "git-compat-util.h"
 #include "object.h"
 #include "blob.h"
 #include "tree.h"
diff --git a/alloc.h b/alloc.h
index 3f4a0ad310a94bd026f48f48491985e3e2053ee2..4312db4bd087bde3632c547bb72d0b5cc77be713 100644 (file)
--- a/alloc.h
+++ b/alloc.h
@@ -17,4 +17,79 @@ void *alloc_object_node(struct repository *r);
 struct alloc_state *allocate_alloc_state(void);
 void clear_alloc_state(struct alloc_state *s);
 
+#define alloc_nr(x) (((x)+16)*3/2)
+
+/**
+ * Dynamically growing an array using realloc() is error prone and boring.
+ *
+ * Define your array with:
+ *
+ * - a pointer (`item`) that points at the array, initialized to `NULL`
+ *   (although please name the variable based on its contents, not on its
+ *   type);
+ *
+ * - an integer variable (`alloc`) that keeps track of how big the current
+ *   allocation is, initialized to `0`;
+ *
+ * - another integer variable (`nr`) to keep track of how many elements the
+ *   array currently has, initialized to `0`.
+ *
+ * Then before adding `n`th element to the item, call `ALLOC_GROW(item, n,
+ * alloc)`.  This ensures that the array can hold at least `n` elements by
+ * calling `realloc(3)` and adjusting `alloc` variable.
+ *
+ * ------------
+ * sometype *item;
+ * size_t nr;
+ * size_t alloc
+ *
+ * for (i = 0; i < nr; i++)
+ *     if (we like item[i] already)
+ *             return;
+ *
+ * // we did not like any existing one, so add one
+ * ALLOC_GROW(item, nr + 1, alloc);
+ * item[nr++] = value you like;
+ * ------------
+ *
+ * You are responsible for updating the `nr` variable.
+ *
+ * If you need to specify the number of elements to allocate explicitly
+ * then use the macro `REALLOC_ARRAY(item, alloc)` instead of `ALLOC_GROW`.
+ *
+ * Consider using ALLOC_GROW_BY instead of ALLOC_GROW as it has some
+ * added niceties.
+ *
+ * DO NOT USE any expression with side-effect for 'x', 'nr', or 'alloc'.
+ */
+#define ALLOC_GROW(x, nr, alloc) \
+       do { \
+               if ((nr) > alloc) { \
+                       if (alloc_nr(alloc) < (nr)) \
+                               alloc = (nr); \
+                       else \
+                               alloc = alloc_nr(alloc); \
+                       REALLOC_ARRAY(x, alloc); \
+               } \
+       } while (0)
+
+/*
+ * Similar to ALLOC_GROW but handles updating of the nr value and
+ * zeroing the bytes of the newly-grown array elements.
+ *
+ * DO NOT USE any expression with side-effect for any of the
+ * arguments.
+ */
+#define ALLOC_GROW_BY(x, nr, increase, alloc) \
+       do { \
+               if (increase) { \
+                       size_t new_nr = nr + (increase); \
+                       if (new_nr < nr) \
+                               BUG("negative growth in ALLOC_GROW_BY"); \
+                       ALLOC_GROW(x, new_nr, alloc); \
+                       memset((x) + nr, 0, sizeof(*(x)) * (increase)); \
+                       nr = new_nr; \
+               } \
+       } while (0)
+
 #endif
diff --git a/apply.c b/apply.c
index 5cc5479c9c356fb955839fc808d0742d1d54b8e5..8776ab939ad8cbe0c20ee85c8bc166b8f2614095 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -8,12 +8,14 @@
  */
 
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "object-store.h"
 #include "blob.h"
 #include "delta.h"
 #include "diff.h"
 #include "dir.h"
+#include "hex.h"
 #include "xdiff-interface.h"
 #include "ll-merge.h"
 #include "lockfile.h"
index f8fad2946ef97324756b78363fb90d329f504209..ee27fa0b39b8e082fa8680d44b8ff54a0637658f 100644 (file)
@@ -1,8 +1,10 @@
 /*
  * Copyright (c) 2005, 2006 Rene Scharfe
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "tar.h"
 #include "archive.h"
 #include "object-store.h"
index 0456f1ebf15c839639f4759c329cb957b0a64feb..c5d1f72eb800e771ec6599ddbfaf90de4d7aa90f 100644 (file)
@@ -4,6 +4,7 @@
 #include "cache.h"
 #include "config.h"
 #include "archive.h"
+#include "hex.h"
 #include "streaming.h"
 #include "utf8.h"
 #include "object-store.h"
index 9aeaf2bd87dfb884479f6e6a1b609d082ac39896..1c2ca78e52a8daaf3a7b123ce2ea004f970b1a79 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "refs.h"
 #include "object-store.h"
 #include "commit.h"
diff --git a/attr.c b/attr.c
index 1053dfcd4b61b56e99df60e469ec4e757c80e860..657ee52229ee3efca65a7e6e5dcadbc83cbbbe70 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -7,6 +7,7 @@
  */
 
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "exec-cmd.h"
 #include "attr.h"
index ef5ee5a6436f066e33510219e9a0f73b09bf7aaf..1409150c5c316726f396a644566a987f87214b86 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -2,6 +2,7 @@
 #include "config.h"
 #include "commit.h"
 #include "diff.h"
+#include "hex.h"
 #include "revision.h"
 #include "refs.h"
 #include "list-objects.h"
diff --git a/blame.c b/blame.c
index 2c1f47b94472159bf37d7bf4d626b623873d82f5..63ce7eb6301a92c785fdfebf16d5452be437a623 100644 (file)
--- a/blame.c
+++ b/blame.c
@@ -5,6 +5,7 @@
 #include "mergesort.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "tag.h"
 #include "blame.h"
 #include "alloc.h"
diff --git a/blame.h b/blame.h
index 38bde535b3d46461d0619bc68c852210693de571..b60d1d81e3032acc5df2191321202b13eecc81fe 100644 (file)
--- a/blame.h
+++ b/blame.h
@@ -1,7 +1,6 @@
 #ifndef BLAME_H
 #define BLAME_H
 
-#include "cache.h"
 #include "commit.h"
 #include "xdiff-interface.h"
 #include "revision.h"
diff --git a/blob.c b/blob.c
index 8f83523b0cde6dbf1b808b3dcf8ab1c1c23085f3..888e28a5594747bd263df0bb8f2179122bccb131 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "blob.h"
 #include "repository.h"
 #include "alloc.h"
index e5614b53b3699d9fc08d41135b16a4a875b0fc68..eacef62b7c97efde6e193f49f604346678d989f4 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "config.h"
 #include "branch.h"
+#include "hex.h"
 #include "refs.h"
 #include "refspec.h"
 #include "remote.h"
@@ -820,12 +821,16 @@ void remove_branch_state(struct repository *r, int verbose)
 void die_if_checked_out(const char *branch, int ignore_current_worktree)
 {
        struct worktree **worktrees = get_worktrees();
-       const struct worktree *wt;
 
-       wt = find_shared_symref(worktrees, "HEAD", branch);
-       if (wt && (!ignore_current_worktree || !wt->is_current)) {
-               skip_prefix(branch, "refs/heads/", &branch);
-               die(_("'%s' is already checked out at '%s'"), branch, wt->path);
+       for (int i = 0; worktrees[i]; i++) {
+               if (worktrees[i]->is_current && ignore_current_worktree)
+                       continue;
+
+               if (is_shared_symref(worktrees[i], "HEAD", branch)) {
+                       skip_prefix(branch, "refs/heads/", &branch);
+                       die(_("'%s' is already checked out at '%s'"),
+                               branch, worktrees[i]->path);
+               }
        }
 
        free_worktrees(worktrees);
index e0848ddadfeb26617bcf2188b034a3968d1e0b67..5e6b237c4240da3112212259e1853e3521614508 100644 (file)
@@ -8,6 +8,7 @@
 #include "config.h"
 #include "builtin.h"
 #include "exec-cmd.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "dir.h"
 #include "run-command.h"
@@ -2300,17 +2301,6 @@ static int parse_opt_show_current_patch(const struct option *opt, const char *ar
        return 0;
 }
 
-static int git_am_config(const char *k, const char *v, void *cb UNUSED)
-{
-       int status;
-
-       status = git_gpg_config(k, v, NULL);
-       if (status)
-               return status;
-
-       return git_default_config(k, v, NULL);
-}
-
 int cmd_am(int argc, const char **argv, const char *prefix)
 {
        struct am_state state;
@@ -2434,7 +2424,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage_with_options(usage, options);
 
-       git_config(git_am_config, NULL);
+       git_config(git_default_config, NULL);
 
        am_state_init(&state);
 
index f094390ee01f810e7035f2efc2be75deedc3befa..d0a583ea95864e8746806b9a7799b0d4cc950a11 100644 (file)
@@ -81,7 +81,7 @@ static int run_remote_archiver(int argc, const char **argv,
 int cmd_archive(int argc, const char **argv, const char *prefix)
 {
        const char *exec = "git-upload-archive";
-       const char *output = NULL;
+       char *output = NULL;
        const char *remote = NULL;
        struct option local_opts[] = {
                OPT_FILENAME('o', "output", &output,
@@ -106,5 +106,6 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
 
        setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
 
+       UNLEAK(output);
        return write_archive(argc, argv, prefix, the_repository, output, 0);
 }
index 73017402671d30ce7f868a9691f9bb6f520695e1..c64c8d715a5cae653103e6a802e0251afdea80d1 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "cache.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "bisect.h"
 #include "refs.h"
@@ -244,7 +245,8 @@ static int bisect_reset(const char *commit)
                struct child_process cmd = CHILD_PROCESS_INIT;
 
                cmd.git_cmd = 1;
-               strvec_pushl(&cmd.args, "checkout", branch.buf, "--", NULL);
+               strvec_pushl(&cmd.args, "checkout", "--ignore-other-worktrees",
+                               branch.buf, "--", NULL);
                if (run_command(&cmd)) {
                        error(_("could not check out original"
                                " HEAD '%s'. Try 'git bisect"
index 71f925e456c34513b85e64e7dd6a72d510a8307e..fdd9f0c0fc7a775e57111f6550d936e22e89a708 100644 (file)
@@ -5,10 +5,12 @@
  * See COPYING for licensing conditions
  */
 
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "color.h"
 #include "builtin.h"
+#include "hex.h"
 #include "repository.h"
 #include "commit.h"
 #include "diff.h"
index acceef6200172cf7a44de45bfa6f3e940b6444c9..666f01bccd040104418d0714e9dd42969c09e918 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #define BUILTIN_BUNDLE_CREATE_USAGE \
-       N_("git bundle create [-q | --quiet | --progress | --all-progress] [--all-progress-implied]\n" \
+       N_("git bundle create [-q | --quiet | --progress]\n" \
           "                  [--version=<version>] <file> <git-rev-list-args>")
 #define BUILTIN_BUNDLE_VERIFY_USAGE \
        N_("git bundle verify [-q | --quiet] <file>")
@@ -59,12 +59,12 @@ static int parse_options_cmd_bundle(int argc,
                             PARSE_OPT_STOP_AT_NON_OPTION);
        if (!argc)
                usage_msg_opt(_("need a <file> argument"), usagestr, options);
-       *bundle_file = prefix_filename(prefix, argv[0]);
+       *bundle_file = prefix_filename_except_for_dash(prefix, argv[0]);
        return argc;
 }
 
 static int cmd_bundle_create(int argc, const char **argv, const char *prefix) {
-       int all_progress_implied = 0;
+       int all_progress_implied = 1;
        int progress = isatty(STDERR_FILENO);
        struct strvec pack_opts;
        int version = -1;
@@ -74,11 +74,12 @@ static int cmd_bundle_create(int argc, const char **argv, const char *prefix) {
                            N_("do not show progress meter"), 0),
                OPT_SET_INT(0, "progress", &progress,
                            N_("show progress meter"), 1),
-               OPT_SET_INT(0, "all-progress", &progress,
-                           N_("show progress meter during object writing phase"), 2),
-               OPT_BOOL(0, "all-progress-implied",
-                        &all_progress_implied,
-                        N_("similar to --all-progress when progress meter is shown")),
+               OPT_SET_INT_F(0, "all-progress", &progress,
+                             N_("historical; same as --progress"), 2,
+                             PARSE_OPT_HIDDEN),
+               OPT_HIDDEN_BOOL(0, "all-progress-implied",
+                               &all_progress_implied,
+                               N_("historical; does nothing")),
                OPT_INTEGER(0, "version", &version,
                            N_("specify bundle format version")),
                OPT_END()
@@ -107,6 +108,23 @@ static int cmd_bundle_create(int argc, const char **argv, const char *prefix) {
        return ret;
 }
 
+/*
+ * Similar to read_bundle_header(), but handle "-" as stdin.
+ */
+static int open_bundle(const char *path, struct bundle_header *header,
+                      const char **name)
+{
+       if (!strcmp(path, "-")) {
+               if (name)
+                       *name = "<stdin>";
+               return read_bundle_header_fd(0, header, "<stdin>");
+       }
+
+       if (name)
+               *name = path;
+       return read_bundle_header(path, header);
+}
+
 static int cmd_bundle_verify(int argc, const char **argv, const char *prefix) {
        struct bundle_header header = BUNDLE_HEADER_INIT;
        int bundle_fd = -1;
@@ -118,12 +136,13 @@ static int cmd_bundle_verify(int argc, const char **argv, const char *prefix) {
                OPT_END()
        };
        char *bundle_file;
+       const char *name;
 
        argc = parse_options_cmd_bundle(argc, argv, prefix,
                        builtin_bundle_verify_usage, options, &bundle_file);
        /* bundle internals use argv[1] as further parameters */
 
-       if ((bundle_fd = read_bundle_header(bundle_file, &header)) < 0) {
+       if ((bundle_fd = open_bundle(bundle_file, &header, &name)) < 0) {
                ret = 1;
                goto cleanup;
        }
@@ -134,7 +153,7 @@ static int cmd_bundle_verify(int argc, const char **argv, const char *prefix) {
                goto cleanup;
        }
 
-       fprintf(stderr, _("%s is okay\n"), bundle_file);
+       fprintf(stderr, _("%s is okay\n"), name);
        ret = 0;
 cleanup:
        free(bundle_file);
@@ -155,7 +174,7 @@ static int cmd_bundle_list_heads(int argc, const char **argv, const char *prefix
                        builtin_bundle_list_heads_usage, options, &bundle_file);
        /* bundle internals use argv[1] as further parameters */
 
-       if ((bundle_fd = read_bundle_header(bundle_file, &header)) < 0) {
+       if ((bundle_fd = open_bundle(bundle_file, &header, NULL)) < 0) {
                ret = 1;
                goto cleanup;
        }
@@ -185,7 +204,7 @@ static int cmd_bundle_unbundle(int argc, const char **argv, const char *prefix)
                        builtin_bundle_unbundle_usage, options, &bundle_file);
        /* bundle internals use argv[1] as further parameters */
 
-       if ((bundle_fd = read_bundle_header(bundle_file, &header)) < 0) {
+       if ((bundle_fd = open_bundle(bundle_file, &header, NULL)) < 0) {
                ret = 1;
                goto cleanup;
        }
index cc17635e76536471a0a756903a8187eaa01d5733..9e7e03ade41ec1671559921ab878495f3d3079c5 100644 (file)
@@ -5,9 +5,12 @@
  */
 #define USE_THE_INDEX_VARIABLE
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "builtin.h"
 #include "diff.h"
+#include "hex.h"
+#include "ident.h"
 #include "parse-options.h"
 #include "userdiff.h"
 #include "streaming.h"
@@ -15,6 +18,7 @@
 #include "oid-array.h"
 #include "packfile.h"
 #include "object-store.h"
+#include "replace-object.h"
 #include "promisor-remote.h"
 #include "mailmap.h"
 
@@ -559,7 +563,7 @@ static int batch_object_cb(const struct object_id *oid, void *vdata)
 }
 
 static int collect_loose_object(const struct object_id *oid,
-                               const char *path,
+                               const char *path UNUSED,
                                void *data)
 {
        oid_array_append(data, oid);
@@ -567,8 +571,8 @@ static int collect_loose_object(const struct object_id *oid,
 }
 
 static int collect_packed_object(const struct object_id *oid,
-                                struct packed_git *pack,
-                                uint32_t pos,
+                                struct packed_git *pack UNUSED,
+                                uint32_t pos UNUSED,
                                 void *data)
 {
        oid_array_append(data, oid);
@@ -591,7 +595,7 @@ static int batch_unordered_object(const struct object_id *oid,
 }
 
 static int batch_unordered_loose(const struct object_id *oid,
-                                const char *path,
+                                const char *path UNUSED,
                                 void *data)
 {
        return batch_unordered_object(oid, NULL, 0, data);
index 7dc47e47932c7d2e76128e54f49fa2ea0c570d62..96db3ddb4bb0c74b8e237fdeb49fdd58f394b741 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "config.h"
+#include "ident.h"
 #include "mailmap.h"
 #include "parse-options.h"
 #include "string-list.h"
index ede7dc32a43c01a78a0074e1bddd5ba18b487568..0a7d762573ce3b99550161b1119914f880b6ddd2 100644 (file)
@@ -1,4 +1,5 @@
 #include "builtin.h"
+#include "alloc.h"
 #include "config.h"
 #include "entry.h"
 #include "parallel-checkout.h"
index a5155cf55c1e5150fd954a5b59363ee899974361..734d730980c18e7fd8e774ac2b720e1e823dc47e 100644 (file)
@@ -9,6 +9,7 @@
 #include "config.h"
 #include "diff.h"
 #include "dir.h"
+#include "hex.h"
 #include "hook.h"
 #include "ll-merge.h"
 #include "lockfile.h"
@@ -75,7 +76,7 @@ struct checkout_opts {
        const char *ignore_unmerged_opt;
        int ignore_unmerged;
        int pathspec_file_nul;
-       const char *pathspec_from_file;
+       char *pathspec_from_file;
 
        const char *new_branch;
        const char *new_branch_force;
@@ -489,15 +490,28 @@ static int checkout_paths(const struct checkout_opts *opts,
                die(_("'%s' must be used when '%s' is not specified"),
                    "--worktree", "--source");
 
-       if (opts->checkout_index && !opts->checkout_worktree &&
-           opts->writeout_stage)
-               die(_("'%s' or '%s' cannot be used with %s"),
-                   "--ours", "--theirs", "--staged");
-
-       if (opts->checkout_index && !opts->checkout_worktree &&
-           opts->merge)
-               die(_("'%s' or '%s' cannot be used with %s"),
-                   "--merge", "--conflict", "--staged");
+       /*
+        * Reject --staged option to the restore command when combined with
+        * merge-related options. Use the accept_ref flag to distinguish it
+        * from the checkout command, which does not accept --staged anyway.
+        *
+        * `restore --ours|--theirs --worktree --staged` could mean resolving
+        * conflicted paths to one side in both the worktree and the index,
+        * but does not currently.
+        *
+        * `restore --merge|--conflict=<style>` already recreates conflicts
+        * in both the worktree and the index, so adding --staged would be
+        * meaningless.
+        */
+       if (!opts->accept_ref && opts->checkout_index) {
+               if (opts->writeout_stage)
+                       die(_("'%s' or '%s' cannot be used with %s"),
+                           "--ours", "--theirs", "--staged");
+
+               if (opts->merge)
+                       die(_("'%s' or '%s' cannot be used with %s"),
+                           "--merge", "--conflict", "--staged");
+       }
 
        if (opts->patch_mode) {
                enum add_p_mode patch_mode;
@@ -1876,6 +1890,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                            options, checkout_usage, &new_branch_info);
        branch_info_release(&new_branch_info);
        clear_pathspec(&opts.pathspec);
+       free(opts.pathspec_from_file);
        FREE_AND_NULL(options);
        return ret;
 }
index 65b5b7db6de5bdac835ad95b6438c1cc548d1599..462c286274c73a76b8ae08ae3023563243502156 100644 (file)
@@ -11,6 +11,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "parse-options.h"
 #include "fetch-pack.h"
index 93704f95a9da8ab8313e7a17589153951e3bb9fe..d3be7f3b3189b89b6345e367911129cf3c196239 100644 (file)
@@ -1,12 +1,14 @@
 #include "builtin.h"
 #include "config.h"
 #include "dir.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "parse-options.h"
 #include "repository.h"
 #include "commit-graph.h"
 #include "object-store.h"
 #include "progress.h"
+#include "replace-object.h"
 #include "tag.h"
 
 #define BUILTIN_COMMIT_GRAPH_VERIFY_USAGE \
index cc8d584be2f4a9d3b0c950a4b8cbc6c140904d8c..e805da5bb1cc5b08715dc981aab7686e4e30e121 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "repository.h"
 #include "commit.h"
@@ -37,14 +38,6 @@ static void new_parent(struct commit *parent, struct commit_list **parents_p)
        commit_list_insert(parent, parents_p);
 }
 
-static int commit_tree_config(const char *var, const char *value, void *cb)
-{
-       int status = git_gpg_config(var, value, NULL);
-       if (status)
-               return status;
-       return git_default_config(var, value, cb);
-}
-
 static int parse_parent_arg_callback(const struct option *opt,
                const char *arg, int unset)
 {
@@ -121,7 +114,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
                OPT_END()
        };
 
-       git_config(commit_tree_config, NULL);
+       git_config(git_default_config, NULL);
 
        if (argc < 2 || !strcmp(argv[1], "-h"))
                usage_with_options(commit_tree_usage, options);
index 985a0445b7897c936cc69e828d1e9f4ad98abaf7..f71ed41bf59e3054a2ca6960a2d9a17625868233 100644 (file)
@@ -1600,7 +1600,6 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 static int git_commit_config(const char *k, const char *v, void *cb)
 {
        struct wt_status *s = cb;
-       int status;
 
        if (!strcmp(k, "commit.template"))
                return git_config_pathname(&template_file, k, v);
@@ -1620,9 +1619,6 @@ static int git_commit_config(const char *k, const char *v, void *cb)
                return 0;
        }
 
-       status = git_gpg_config(k, v, NULL);
-       if (status)
-               return status;
        return git_status_config(k, v, s);
 }
 
index 060cf9f3e05e6718ae02923e132e4804dbdcb291..49d832d40931c8a895e0381a995581dfd936b038 100644 (file)
@@ -1,7 +1,8 @@
 #include "builtin.h"
-#include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "color.h"
+#include "ident.h"
 #include "parse-options.h"
 #include "urlmatch.h"
 #include "quote.h"
index 07b941959628b9d02dbf0282e779040cea5b27be..bb21bc43e42e606b53dd268a9eb19df30fd98500 100644 (file)
@@ -57,7 +57,8 @@ static void loose_garbage(const char *path)
                report_garbage(PACKDIR_FILE_GARBAGE, path);
 }
 
-static int count_loose(const struct object_id *oid, const char *path, void *data)
+static int count_loose(const struct object_id *oid, const char *path,
+                      void *data UNUSED)
 {
        struct stat st;
 
@@ -72,7 +73,8 @@ static int count_loose(const struct object_id *oid, const char *path, void *data
        return 0;
 }
 
-static int count_cruft(const char *basename, const char *path, void *data)
+static int count_cruft(const char *basename UNUSED, const char *path,
+                      void *data UNUSED)
 {
        loose_garbage(path);
        return 0;
index 338058be7f943759619965911a7ad18f19263e48..6e509d02c370486a22fe45b39cfc9ee0fa938384 100644 (file)
@@ -1,4 +1,5 @@
 #include "builtin.h"
+#include "alloc.h"
 #include "parse-options.h"
 
 #ifndef NO_UNIX_SOCKETS
index eea1e330c00c62a649b5a059bbfcf6e351f95269..5b5930f5c8c05dfa7581be78b6fc2f8e73e758d0 100644 (file)
@@ -1,6 +1,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "commit.h"
 #include "tag.h"
index 25b853b85ca99d210d230d6783b824a270de9d6c..a393efa4f0807f4608d7c1f7499e222d530c6e70 100644 (file)
@@ -3,6 +3,7 @@
 #include "config.h"
 #include "diff.h"
 #include "commit.h"
+#include "hex.h"
 #include "log-tree.h"
 #include "builtin.h"
 #include "submodule.h"
index dbbfb19f1921028f78b499af0ad35a67c9595d59..01681d0fb88f305e50f9836c1c0cbcdc03b5e1c6 100644 (file)
@@ -17,6 +17,7 @@
 #include "builtin.h"
 #include "run-command.h"
 #include "exec-cmd.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "strvec.h"
 #include "strbuf.h"
index 39a890fc005192a5082a1c170550f4be102efbc1..f3cc548686180fb12faee8cd717e99eb2e2d61b7 100644 (file)
@@ -6,6 +6,7 @@
 #include "builtin.h"
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "refs.h"
 #include "refspec.h"
 #include "object-store.h"
@@ -109,7 +110,7 @@ static struct decoration idnums;
 static uint32_t last_idnum;
 struct anonymized_entry {
        struct hashmap_entry hash;
-       const char *anon;
+       char *anon;
        const char orig[FLEX_ARRAY];
 };
 
@@ -138,43 +139,56 @@ static int anonymized_entry_cmp(const void *cmp_data UNUSED,
        return strcmp(a->orig, b->orig);
 }
 
+static struct anonymized_entry *add_anonymized_entry(struct hashmap *map,
+                                                    unsigned hash,
+                                                    const char *orig, size_t len,
+                                                    char *anon)
+{
+       struct anonymized_entry *ret, *old;
+
+       if (!map->cmpfn)
+               hashmap_init(map, anonymized_entry_cmp, NULL, 0);
+
+       FLEX_ALLOC_MEM(ret, orig, orig, len);
+       hashmap_entry_init(&ret->hash, hash);
+       ret->anon = anon;
+       old = hashmap_put_entry(map, ret, hash);
+
+       if (old) {
+               free(old->anon);
+               free(old);
+       }
+
+       return ret;
+}
+
 /*
  * Basically keep a cache of X->Y so that we can repeatedly replace
  * the same anonymized string with another. The actual generation
  * is farmed out to the generate function.
  */
 static const char *anonymize_str(struct hashmap *map,
-                                char *(*generate)(void *),
-                                const char *orig, size_t len,
-                                void *data)
+                                char *(*generate)(void),
+                                const char *orig, size_t len)
 {
        struct anonymized_entry_key key;
        struct anonymized_entry *ret;
 
-       if (!map->cmpfn)
-               hashmap_init(map, anonymized_entry_cmp, NULL, 0);
-
        hashmap_entry_init(&key.hash, memhash(orig, len));
        key.orig = orig;
        key.orig_len = len;
 
        /* First check if it's a token the user configured manually... */
-       if (anonymized_seeds.cmpfn)
-               ret = hashmap_get_entry(&anonymized_seeds, &key, hash, &key);
-       else
-               ret = NULL;
+       ret = hashmap_get_entry(&anonymized_seeds, &key, hash, &key);
 
        /* ...otherwise check if we've already seen it in this context... */
        if (!ret)
                ret = hashmap_get_entry(map, &key, hash, &key);
 
        /* ...and finally generate a new mapping if necessary */
-       if (!ret) {
-               FLEX_ALLOC_MEM(ret, orig, orig, len);
-               hashmap_entry_init(&ret->hash, key.hash.hash);
-               ret->anon = generate(data);
-               hashmap_put(map, &ret->hash);
-       }
+       if (!ret)
+               ret = add_anonymized_entry(map, key.hash.hash,
+                                          orig, len, generate());
 
        return ret->anon;
 }
@@ -187,12 +201,12 @@ static const char *anonymize_str(struct hashmap *map,
  */
 static void anonymize_path(struct strbuf *out, const char *path,
                           struct hashmap *map,
-                          char *(*generate)(void *))
+                          char *(*generate)(void))
 {
        while (*path) {
                const char *end_of_component = strchrnul(path, '/');
                size_t len = end_of_component - path;
-               const char *c = anonymize_str(map, generate, path, len, NULL);
+               const char *c = anonymize_str(map, generate, path, len);
                strbuf_addstr(out, c);
                path = end_of_component;
                if (*path)
@@ -367,7 +381,7 @@ static void print_path_1(const char *path)
                printf("%s", path);
 }
 
-static char *anonymize_path_component(void *data)
+static char *anonymize_path_component(void)
 {
        static int counter;
        struct strbuf out = STRBUF_INIT;
@@ -389,7 +403,7 @@ static void print_path(const char *path)
        }
 }
 
-static char *generate_fake_oid(void *data)
+static char *generate_fake_oid(void)
 {
        static uint32_t counter = 1; /* avoid null oid */
        const unsigned hashsz = the_hash_algo->rawsz;
@@ -405,7 +419,7 @@ static const char *anonymize_oid(const char *oid_hex)
 {
        static struct hashmap objs;
        size_t len = strlen(oid_hex);
-       return anonymize_str(&objs, generate_fake_oid, oid_hex, len, NULL);
+       return anonymize_str(&objs, generate_fake_oid, oid_hex, len);
 }
 
 static void show_filemodify(struct diff_queue_struct *q,
@@ -502,7 +516,7 @@ static const char *find_encoding(const char *begin, const char *end)
        return bol;
 }
 
-static char *anonymize_ref_component(void *data)
+static char *anonymize_ref_component(void)
 {
        static int counter;
        struct strbuf out = STRBUF_INIT;
@@ -542,13 +556,13 @@ static const char *anonymize_refname(const char *refname)
  * We do not even bother to cache commit messages, as they are unlikely
  * to be repeated verbatim, and it is not that interesting when they are.
  */
-static char *anonymize_commit_message(const char *old)
+static char *anonymize_commit_message(void)
 {
        static int counter;
        return xstrfmt("subject %d\n\nbody\n", counter++);
 }
 
-static char *anonymize_ident(void *data)
+static char *anonymize_ident(void)
 {
        static int counter;
        struct strbuf out = STRBUF_INIT;
@@ -591,7 +605,7 @@ static void anonymize_ident_line(const char **beg, const char **end)
 
                len = split.mail_end - split.name_begin;
                ident = anonymize_str(&idents, anonymize_ident,
-                                     split.name_begin, len, NULL);
+                                     split.name_begin, len);
                strbuf_addstr(out, ident);
                strbuf_addch(out, ' ');
                strbuf_add(out, split.date_begin, split.tz_end - split.date_begin);
@@ -669,7 +683,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
 
        mark_next_object(&commit->object);
        if (anonymize) {
-               reencoded = anonymize_commit_message(message);
+               reencoded = anonymize_commit_message();
        } else if (encoding) {
                switch(reencode_mode) {
                case REENCODE_YES:
@@ -732,7 +746,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
        show_progress();
 }
 
-static char *anonymize_tag(void *data)
+static char *anonymize_tag(void)
 {
        static int counter;
        struct strbuf out = STRBUF_INIT;
@@ -794,7 +808,7 @@ static void handle_tag(const char *name, struct tag *tag)
                if (message) {
                        static struct hashmap tags;
                        message = anonymize_str(&tags, anonymize_tag,
-                                               message, message_size, NULL);
+                                               message, message_size);
                        message_size = strlen(message);
                }
        }
@@ -1125,11 +1139,6 @@ static void handle_deletes(void)
        }
 }
 
-static char *anonymize_seed(void *data)
-{
-       return xstrdup(data);
-}
-
 static int parse_opt_anonymize_map(const struct option *opt,
                                   const char *arg, int unset)
 {
@@ -1151,7 +1160,8 @@ static int parse_opt_anonymize_map(const struct option *opt,
        if (!keylen || !*value)
                return error(_("--anonymize-map token cannot be empty"));
 
-       anonymize_str(map, anonymize_seed, arg, keylen, (void *)value);
+       add_anonymized_entry(map, memhash(arg, keylen), arg, keylen,
+                            xstrdup(value));
 
        return 0;
 }
index 7134683ab93f96d4c213d478fc7fadc8a17856c0..f7548ff4a35c081d79af0d895cbf18ca888e2758 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "cache.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "lockfile.h"
@@ -436,7 +437,7 @@ static void set_checkpoint_signal(void)
 
 #else
 
-static void checkpoint_signal(int signo)
+static void checkpoint_signal(int signo UNUSED)
 {
        checkpoint_requested = 1;
 }
index afe679368deec2a0288de1606259b73847ce434b..d1a4306da3ad76574603c01d199cf5f7914d014c 100644 (file)
@@ -1,4 +1,6 @@
 #include "builtin.h"
+#include "alloc.h"
+#include "hex.h"
 #include "pkt-line.h"
 #include "fetch-pack.h"
 #include "remote.h"
@@ -211,8 +213,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
                int flags = args.verbose ? CONNECT_VERBOSE : 0;
                if (args.diag_url)
                        flags |= CONNECT_DIAG_URL;
-               conn = git_connect(fd, dest, args.uploadpack,
-                                  flags);
+               conn = git_connect(fd, dest, "git-upload-pack",
+                                  args.uploadpack, flags);
                if (!conn)
                        return args.diag_url ? 0 : 1;
        }
index a09606b472622c133a683513ffdbe184952f2b01..7221e57f3529f22104b55a7200d5df04c2c4e63d 100644 (file)
@@ -3,6 +3,7 @@
  */
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "repository.h"
 #include "refs.h"
 #include "refspec.h"
@@ -1132,6 +1133,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
        if (!connectivity_checked) {
                struct check_connected_options opt = CHECK_CONNECTED_INIT;
 
+               opt.exclude_hidden_refs_section = "fetch";
                rm = ref_map;
                if (check_connected(iterate_ref_map, &rm, &opt)) {
                        rc = error(_("%s did not send all necessary objects\n"), url);
@@ -1325,6 +1327,7 @@ static int check_exist_and_connected(struct ref *ref_map)
        }
 
        opt.quiet = 1;
+       opt.exclude_hidden_refs_section = "fetch";
        return check_connected(iterate_ref_map, &rm, &opt);
 }
 
@@ -1880,6 +1883,8 @@ static void add_options_to_argv(struct strvec *argv)
                strvec_push(argv, "--ipv4");
        else if (family == TRANSPORT_FAMILY_IPV6)
                strvec_push(argv, "--ipv6");
+       if (!write_fetch_head)
+               strvec_push(argv, "--no-write-fetch-head");
 }
 
 /* Fetch multiple remotes in parallel */
@@ -1890,7 +1895,8 @@ struct parallel_fetch_state {
        int next, result;
 };
 
-static int fetch_next_remote(struct child_process *cp, struct strbuf *out,
+static int fetch_next_remote(struct child_process *cp,
+                            struct strbuf *out UNUSED,
                             void *cb, void **task_cb)
 {
        struct parallel_fetch_state *state = cb;
@@ -1912,7 +1918,8 @@ static int fetch_next_remote(struct child_process *cp, struct strbuf *out,
        return 1;
 }
 
-static int fetch_failed_to_start(struct strbuf *out, void *cb, void *task_cb)
+static int fetch_failed_to_start(struct strbuf *out UNUSED,
+                                void *cb, void *task_cb)
 {
        struct parallel_fetch_state *state = cb;
        const char *remote = task_cb;
index d207bd909b4b6da0671628c20bb29e98f427b550..c4a633c0329a8ec84a353de90bb2a7af4de1ae08 100644 (file)
@@ -1,6 +1,6 @@
-#define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "cache.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "commit.h"
@@ -19,6 +19,7 @@
 #include "decorate.h"
 #include "packfile.h"
 #include "object-store.h"
+#include "replace-object.h"
 #include "resolve-undo.h"
 #include "run-command.h"
 #include "worktree.h"
@@ -233,17 +234,17 @@ static void mark_unreachable_referents(const struct object_id *oid)
 }
 
 static int mark_loose_unreachable_referents(const struct object_id *oid,
-                                           const char *path,
-                                           void *data)
+                                           const char *path UNUSED,
+                                           void *data UNUSED)
 {
        mark_unreachable_referents(oid);
        return 0;
 }
 
 static int mark_packed_unreachable_referents(const struct object_id *oid,
-                                            struct packed_git *pack,
-                                            uint32_t pos,
-                                            void *data)
+                                            struct packed_git *pack UNUSED,
+                                            uint32_t pos UNUSED,
+                                            void *data UNUSED)
 {
        mark_unreachable_referents(oid);
        return 0;
@@ -661,14 +662,15 @@ static int fsck_loose(const struct object_id *oid, const char *path, void *data)
        return 0; /* keep checking other objects, even if we saw an error */
 }
 
-static int fsck_cruft(const char *basename, const char *path, void *data)
+static int fsck_cruft(const char *basename, const char *path,
+                     void *data UNUSED)
 {
        if (!starts_with(basename, "tmp_obj_"))
                fprintf_ln(stderr, _("bad sha1 file: %s"), path);
        return 0;
 }
 
-static int fsck_subdir(unsigned int nr, const char *path, void *data)
+static int fsck_subdir(unsigned int nr, const char *path UNUSED, void *data)
 {
        struct for_each_loose_cb *cb_data = data;
        struct progress *progress = cb_data->progress;
@@ -732,19 +734,19 @@ static int fsck_head_link(const char *head_ref_name,
        return 0;
 }
 
-static int fsck_cache_tree(struct cache_tree *it)
+static int fsck_cache_tree(struct cache_tree *it, const char *index_path)
 {
        int i;
        int err = 0;
 
        if (verbose)
-               fprintf_ln(stderr, _("Checking cache tree"));
+               fprintf_ln(stderr, _("Checking cache tree of %s"), index_path);
 
        if (0 <= it->entry_count) {
                struct object *obj = parse_object(the_repository, &it->oid);
                if (!obj) {
-                       error(_("%s: invalid sha1 pointer in cache-tree"),
-                             oid_to_hex(&it->oid));
+                       error(_("%s: invalid sha1 pointer in cache-tree of %s"),
+                             oid_to_hex(&it->oid), index_path);
                        errors_found |= ERROR_REFS;
                        return 1;
                }
@@ -755,11 +757,12 @@ static int fsck_cache_tree(struct cache_tree *it)
                        err |= objerror(obj, _("non-tree in cache-tree"));
        }
        for (i = 0; i < it->subtree_nr; i++)
-               err |= fsck_cache_tree(it->down[i]->cache_tree);
+               err |= fsck_cache_tree(it->down[i]->cache_tree, index_path);
        return err;
 }
 
-static int fsck_resolve_undo(struct index_state *istate)
+static int fsck_resolve_undo(struct index_state *istate,
+                            const char *index_path)
 {
        struct string_list_item *item;
        struct string_list *resolve_undo = istate->resolve_undo;
@@ -782,8 +785,9 @@ static int fsck_resolve_undo(struct index_state *istate)
 
                        obj = parse_object(the_repository, &ru->oid[i]);
                        if (!obj) {
-                               error(_("%s: invalid sha1 pointer in resolve-undo"),
-                                     oid_to_hex(&ru->oid[i]));
+                               error(_("%s: invalid sha1 pointer in resolve-undo of %s"),
+                                     oid_to_hex(&ru->oid[i]),
+                                     index_path);
                                errors_found |= ERROR_REFS;
                                continue;
                        }
@@ -796,6 +800,38 @@ static int fsck_resolve_undo(struct index_state *istate)
        return 0;
 }
 
+static void fsck_index(struct index_state *istate, const char *index_path,
+                      int is_main_index)
+{
+       unsigned int i;
+
+       /* TODO: audit for interaction with sparse-index. */
+       ensure_full_index(istate);
+       for (i = 0; i < istate->cache_nr; i++) {
+               unsigned int mode;
+               struct blob *blob;
+               struct object *obj;
+
+               mode = istate->cache[i]->ce_mode;
+               if (S_ISGITLINK(mode))
+                       continue;
+               blob = lookup_blob(the_repository,
+                                  &istate->cache[i]->oid);
+               if (!blob)
+                       continue;
+               obj = &blob->object;
+               obj->flags |= USED;
+               fsck_put_object_name(&fsck_walk_options, &obj->oid,
+                                    "%s:%s",
+                                    is_main_index ? "" : index_path,
+                                    istate->cache[i]->name);
+               mark_object_reachable(obj);
+       }
+       if (istate->cache_tree)
+               fsck_cache_tree(istate->cache_tree, index_path);
+       fsck_resolve_undo(istate, index_path);
+}
+
 static void mark_object_for_connectivity(const struct object_id *oid)
 {
        struct object *obj = lookup_unknown_object(the_repository, oid);
@@ -803,17 +839,17 @@ static void mark_object_for_connectivity(const struct object_id *oid)
 }
 
 static int mark_loose_for_connectivity(const struct object_id *oid,
-                                      const char *path,
-                                      void *data)
+                                      const char *path UNUSED,
+                                      void *data UNUSED)
 {
        mark_object_for_connectivity(oid);
        return 0;
 }
 
 static int mark_packed_for_connectivity(const struct object_id *oid,
-                                       struct packed_git *pack,
-                                       uint32_t pos,
-                                       void *data)
+                                       struct packed_git *pack UNUSED,
+                                       uint32_t pos UNUSED,
+                                       void *data UNUSED)
 {
        mark_object_for_connectivity(oid);
        return 0;
@@ -956,32 +992,30 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
        }
 
        if (keep_cache_objects) {
+               struct worktree **worktrees, **p;
+
                verify_index_checksum = 1;
                verify_ce_order = 1;
-               repo_read_index(the_repository);
-               /* TODO: audit for interaction with sparse-index. */
-               ensure_full_index(&the_index);
-               for (i = 0; i < the_index.cache_nr; i++) {
-                       unsigned int mode;
-                       struct blob *blob;
-                       struct object *obj;
 
-                       mode = the_index.cache[i]->ce_mode;
-                       if (S_ISGITLINK(mode))
-                               continue;
-                       blob = lookup_blob(the_repository,
-                                          &the_index.cache[i]->oid);
-                       if (!blob)
-                               continue;
-                       obj = &blob->object;
-                       obj->flags |= USED;
-                       fsck_put_object_name(&fsck_walk_options, &obj->oid,
-                                            ":%s", the_index.cache[i]->name);
-                       mark_object_reachable(obj);
+               worktrees = get_worktrees();
+               for (p = worktrees; *p; p++) {
+                       struct worktree *wt = *p;
+                       struct index_state istate =
+                               INDEX_STATE_INIT(the_repository);
+                       char *path;
+
+                       /*
+                        * Make a copy since the buffer is reusable
+                        * and may get overwritten by other calls
+                        * while we're examining the index.
+                        */
+                       path = xstrdup(worktree_git_path(wt, "index"));
+                       read_index_from(&istate, path, get_worktree_git_dir(wt));
+                       fsck_index(&istate, path, wt->is_current);
+                       discard_index(&istate);
+                       free(path);
                }
-               if (the_index.cache_tree)
-                       fsck_cache_tree(the_index.cache_tree);
-               fsck_resolve_undo(&the_index);
+               free_worktrees(worktrees);
        }
 
        check_connectivity();
index 0feef8caf6d5e27d508b3d4ea3e2679cd50a9966..cae804a190808bf787ad098f749c721d440c1036 100644 (file)
@@ -1,4 +1,5 @@
 #include "builtin.h"
+#include "alloc.h"
 #include "config.h"
 #include "parse-options.h"
 #include "fsmonitor.h"
index 02455fdcd73603ad640a7a54c697c7d7f58225cf..c58fe8c936c63da46134c5ab764228baaa0b88ef 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include "builtin.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "tempfile.h"
@@ -976,9 +977,9 @@ struct write_loose_object_data {
 
 static int loose_object_auto_limit = 100;
 
-static int loose_object_count(const struct object_id *oid,
-                              const char *path,
-                              void *data)
+static int loose_object_count(const struct object_id *oid UNUSED,
+                             const char *path UNUSED,
+                             void *data)
 {
        int *count = (int*)data;
        if (++(*count) >= loose_object_auto_limit)
@@ -1003,15 +1004,15 @@ static int loose_object_auto_condition(void)
                                             NULL, NULL, &count);
 }
 
-static int bail_on_loose(const struct object_id *oid,
-                        const char *path,
-                        void *data)
+static int bail_on_loose(const struct object_id *oid UNUSED,
+                        const char *path UNUSED,
+                        void *data UNUSED)
 {
        return 1;
 }
 
 static int write_loose_object_to_stdin(const struct object_id *oid,
-                                      const char *path,
+                                      const char *path UNUSED,
                                       void *data)
 {
        struct write_loose_object_data *d = (struct write_loose_object_data *)data;
index f7821c5fbbaeda3888f3011ee5215393e1319952..c590fcb19dd2044c434dd70246f0cc443e3281da 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (c) 2006 Junio C Hamano
  */
 #include "cache.h"
+#include "alloc.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "blob.h"
index 44db83f07fd12c535d758f596b6b12f20b7eeb2e..1848768b97c92e0073fa213fb99d7c33fbd6712f 100644 (file)
@@ -6,6 +6,7 @@
  */
 #include "builtin.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "blob.h"
 #include "quote.h"
index 6648f2daef5cef38fd59dfba47c048ce72bb4c36..b451755f405a89bf8bfdfd28e288a6c7e1dbedf1 100644 (file)
@@ -1,6 +1,8 @@
 #include "builtin.h"
+#include "alloc.h"
 #include "config.h"
 #include "delta.h"
+#include "hex.h"
 #include "pack.h"
 #include "csum-file.h"
 #include "blob.h"
@@ -14,6 +16,7 @@
 #include "thread-utils.h"
 #include "packfile.h"
 #include "object-store.h"
+#include "replace-object.h"
 #include "promisor-remote.h"
 
 static const char index_pack_usage[] =
index a70fba198f9451c9005b3ecd14cfce8765e1d838..4693385e8ed307ad104c5238284f4930286c8c1e 100644 (file)
@@ -4,8 +4,10 @@
  * (C) Copyright 2006 Linus Torvalds
  *              2006 Junio Hamano
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "refs.h"
 #include "object-store.h"
 #include "color.h"
@@ -56,6 +58,7 @@ static int stdout_mboxrd;
 static const char *fmt_patch_subject_prefix = "PATCH";
 static int fmt_patch_name_max = FORMAT_PATCH_NAME_MAX_DEFAULT;
 static const char *fmt_pretty;
+static int format_no_prefix;
 
 static const char * const builtin_log_usage[] = {
        N_("git log [<options>] [<revision-range>] [[--] <path>...]"),
@@ -436,7 +439,7 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list)
        setitimer(ITIMER_REAL, &early_output_timer, NULL);
 }
 
-static void early_output(int signal)
+static void early_output(int signal UNUSED)
 {
        show_early_output = log_show_early;
 }
@@ -601,8 +604,6 @@ static int git_log_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
-       if (git_gpg_config(var, value, cb) < 0)
-               return -1;
        return git_diff_ui_config(var, value, cb);
 }
 
@@ -1084,6 +1085,19 @@ static int git_format_config(const char *var, const char *value, void *cb)
                stdout_mboxrd = git_config_bool(var, value);
                return 0;
        }
+       if (!strcmp(var, "format.noprefix")) {
+               format_no_prefix = 1;
+               return 0;
+       }
+
+       /*
+        * ignore some porcelain config which would otherwise be parsed by
+        * git_diff_ui_config(), via git_log_config(); we can't just avoid
+        * diff_ui_config completely, because we do care about some ui options
+        * like color.
+        */
+       if (!strcmp(var, "diff.noprefix"))
+               return 0;
 
        return git_log_config(var, value, cb);
 }
@@ -1993,6 +2007,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        s_r_opt.def = "HEAD";
        s_r_opt.revarg_opt = REVARG_COMMITTISH;
 
+       if (format_no_prefix)
+               diff_set_noprefix(&rev.diffopt);
+
        if (default_attach) {
                rev.mime_boundary = default_attach;
                rev.no_inline = 1;
@@ -2097,6 +2114,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 
        /* Always generate a patch */
        rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
+       rev.always_show_header = 1;
 
        rev.zero_commit = zero_commit;
        rev.patch_name_max = fmt_patch_name_max;
index a03b559ecaab4caeba9a9a18bb268f22274e7b2a..26e309f533a7e5303f203775b1618a6ea8e1a95e 100644 (file)
@@ -89,12 +89,15 @@ static void write_name(const char *name)
 
 static void write_name_to_buf(struct strbuf *sb, const char *name)
 {
-       const char *rel = relative_path(name, prefix_len ? prefix : NULL, sb);
+       struct strbuf buf = STRBUF_INIT;
+       const char *rel = relative_path(name, prefix_len ? prefix : NULL, &buf);
 
        if (line_terminator)
                quote_c_style(rel, sb, NULL, 0);
        else
                strbuf_addstr(sb, rel);
+
+       strbuf_release(&buf);
 }
 
 static const char *get_tag(const struct cache_entry *ce, const char *tag)
index 6516177348996cd6e73d69e5c3884e53e6dfda73..a9de0575ce5685329385658711fa84cf9d4d1984 100644 (file)
@@ -1,9 +1,11 @@
 #include "builtin.h"
 #include "cache.h"
+#include "hex.h"
 #include "transport.h"
 #include "ref-filter.h"
 #include "remote.h"
 #include "refs.h"
+#include "parse-options.h"
 
 static const char * const ls_remote_usage[] = {
        N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
index 8cc8c995df9399cd84465060965d065d33cd5d3b..64d8e54318c97ee8b9e74afdcc5a9607bf6f4325 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "blob.h"
 #include "tree.h"
index 6f3941f2a49ce51ee295158a4d78f5c80c1afeb7..be8f3b221c97be3f5e7c23d2790e420b245d752e 100644 (file)
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "config.h"
 #include "commit.h"
+#include "hex.h"
 #include "refs.h"
 #include "diff.h"
 #include "revision.h"
index 452f833ac4610121d5194a65087d733e4b66914f..c875f5d37ee63f489f03a3f0f8007998fca69ca0 100644 (file)
@@ -1,5 +1,6 @@
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
+#include "hex.h"
 #include "run-command.h"
 
 static const char *pgm;
index 828dc81c426514d822e6bbce172495373f9a92c5..e78251816485d9d9fae2c37afc2073165649351e 100644 (file)
@@ -3,6 +3,7 @@
 #include "tree-walk.h"
 #include "xdiff-interface.h"
 #include "help.h"
+#include "hex.h"
 #include "commit.h"
 #include "commit-reach.h"
 #include "merge-ort.h"
index 0a3c10a0966bdfc8f354cffb19d8f27987298600..19c31d4ff488335e5c2e5717fb8649589f72f0bb 100644 (file)
@@ -8,7 +8,9 @@
 
 #define USE_THE_INDEX_VARIABLE
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "builtin.h"
 #include "lockfile.h"
@@ -659,9 +661,6 @@ static int git_merge_config(const char *k, const char *v, void *cb)
        }
 
        status = fmt_merge_msg_config(k, v, cb);
-       if (status)
-               return status;
-       status = git_gpg_config(k, v, NULL);
        if (status)
                return status;
        return git_diff_ui_config(k, v, cb);
index 5d22909122d195873f2427812084dc8bd4319180..42c2457c7052c715549f313d2df0b4531a130a41 100644 (file)
@@ -1,4 +1,5 @@
 #include "builtin.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "tag.h"
 #include "replace-object.h"
index 06d81400f558152292718a57c384e12078e2b9be..848c7b47476fab78c15984178654f62e8b74cfd9 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (c) Junio C Hamano, 2006, 2009
  */
 #include "builtin.h"
+#include "alloc.h"
+#include "hex.h"
 #include "quote.h"
 #include "tree.h"
 #include "parse-options.h"
index edd7b931fdb95f84eec899acbf0b4ae2a120f2d7..8129050377529e99cb851f08876b7a013a8f5f27 100644 (file)
@@ -5,6 +5,7 @@
  */
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
+#include "alloc.h"
 #include "config.h"
 #include "pathspec.h"
 #include "lockfile.h"
index 97959bfaf9eb018dbe83780f60093e3f04f7be42..723ba616a88d46c8e04f4df28ee5ba8efe6c5d2f 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
-#include "cache.h"
+#include "alloc.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "commit.h"
index 80d9dfd25cad2afcb90c0219894529bcc1558cac..75ce7f3f5742b60ce2f76253aef4f9c357635def 100644 (file)
@@ -10,6 +10,7 @@
 #include "cache.h"
 #include "config.h"
 #include "builtin.h"
+#include "hex.h"
 #include "notes.h"
 #include "object-store.h"
 #include "repository.h"
@@ -113,8 +114,9 @@ static void free_note_data(struct note_data *d)
 }
 
 static int list_each_note(const struct object_id *object_oid,
-               const struct object_id *note_oid, char *note_path,
-               void *cb_data)
+                         const struct object_id *note_oid,
+                         char *note_path UNUSED,
+                         void *cb_data UNUSED)
 {
        printf("%s %s\n", oid_to_hex(note_oid), oid_to_hex(object_oid));
        return 0;
index 74a167a180cd4080919d8c3a614c098ad96a2b42..7e9e20172a22abeb800a62ac4c8527038832a74c 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
-#include "cache.h"
+#include "alloc.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "attr.h"
 #include "list.h"
 #include "packfile.h"
 #include "object-store.h"
+#include "replace-object.h"
 #include "dir.h"
 #include "midx.h"
 #include "trace2.h"
 #include "shallow.h"
 #include "promisor-remote.h"
 #include "pack-mtimes.h"
+#include "parse-options.h"
 
 /*
  * Objects we are going to pack are collected in the `to_pack` structure.
@@ -1590,7 +1593,7 @@ static int add_object_entry(const struct object_id *oid, enum object_type type,
 
 static int add_object_entry_from_bitmap(const struct object_id *oid,
                                        enum object_type type,
-                                       int flags, uint32_t name_hash,
+                                       int flags UNUSED, uint32_t name_hash,
                                        struct packed_git *pack, off_t offset)
 {
        display_progress(progress_state, ++nr_seen);
@@ -3260,13 +3263,14 @@ static int add_object_entry_from_pack(const struct object_id *oid,
        return 0;
 }
 
-static void show_commit_pack_hint(struct commit *commit, void *_data)
+static void show_commit_pack_hint(struct commit *commit UNUSED,
+                                 void *data UNUSED)
 {
        /* nothing to do; commits don't have a namehash */
 }
 
 static void show_object_pack_hint(struct object *object, const char *name,
-                                 void *_data)
+                                 void *data UNUSED)
 {
        struct object_entry *oe = packlist_find(&to_pack, &object->oid);
        if (!oe)
@@ -3464,7 +3468,7 @@ static void add_cruft_object_entry(const struct object_id *oid, enum object_type
        return;
 }
 
-static void show_cruft_object(struct object *obj, const char *name, void *data)
+static void show_cruft_object(struct object *obj, const char *name, void *data UNUSED)
 {
        /*
         * if we did not record it earlier, it's at least as old as our
@@ -3484,7 +3488,7 @@ static void show_cruft_commit(struct commit *commit, void *data)
        show_cruft_object((struct object*)commit, NULL, data);
 }
 
-static int cruft_include_check_obj(struct object *obj, void *data)
+static int cruft_include_check_obj(struct object *obj, void *data UNUSED)
 {
        return !has_object_kept_pack(&obj->oid, IN_CORE_KEEP_PACKS);
 }
@@ -3663,7 +3667,7 @@ static void read_object_list_from_stdin(void)
        }
 }
 
-static void show_commit(struct commit *commit, void *data)
+static void show_commit(struct commit *commit, void *data UNUSED)
 {
        add_object_entry(&commit->object.oid, OBJ_COMMIT, NULL, 0);
 
@@ -3674,7 +3678,8 @@ static void show_commit(struct commit *commit, void *data)
                propagate_island_marks(commit);
 }
 
-static void show_object(struct object *obj, const char *name, void *data)
+static void show_object(struct object *obj, const char *name,
+                       void *data UNUSED)
 {
        add_preferred_base_object(name);
        add_object_entry(&obj->oid, obj->type, name, 0);
@@ -3761,7 +3766,7 @@ static void show_edge(struct commit *commit)
 static int add_object_in_unpacked_pack(const struct object_id *oid,
                                       struct packed_git *pack,
                                       uint32_t pos,
-                                      void *_data)
+                                      void *data UNUSED)
 {
        if (cruft) {
                off_t offset;
@@ -3795,7 +3800,7 @@ static void add_objects_in_unpacked_packs(void)
 }
 
 static int add_loose_object(const struct object_id *oid, const char *path,
-                           void *data)
+                           void *data UNUSED)
 {
        enum object_type type = oid_object_info(the_repository, oid, NULL);
 
@@ -3946,13 +3951,13 @@ static int get_object_list_from_bitmap(struct rev_info *revs)
 }
 
 static void record_recent_object(struct object *obj,
-                                const char *name,
-                                void *data)
+                                const char *name UNUSED,
+                                void *data UNUSED)
 {
        oid_array_append(&recent_objects, &obj->oid);
 }
 
-static void record_recent_commit(struct commit *commit, void *data)
+static void record_recent_commit(struct commit *commit, void *data UNUSED)
 {
        oid_array_append(&recent_objects, &commit->object.oid);
 }
index ecd49ca268f53bb4b986d5fdbf3876c0dc010733..82115c5808caf34ff875621fbbac22201f80aee0 100644 (file)
@@ -7,6 +7,7 @@
 */
 
 #include "builtin.h"
+#include "hex.h"
 #include "repository.h"
 #include "packfile.h"
 #include "object-store.h"
index f840fbf1c7e81332bd5f898b6eca7363c645ec60..338b15cd7b018c82467fadc624dc6555e38d7a7a 100644 (file)
@@ -2,6 +2,7 @@
 #include "builtin.h"
 #include "config.h"
 #include "diff.h"
+#include "hex.h"
 #include "parse-options.h"
 
 static void flush_current_id(int patchlen, struct object_id *id, struct object_id *result)
index 27192201086877115157d6f5cedb2f8fc1e231a6..119a253a2adc4b3e867b95d61c97c40f21625614 100644 (file)
@@ -1,12 +1,14 @@
 #include "cache.h"
 #include "commit.h"
 #include "diff.h"
+#include "hex.h"
 #include "revision.h"
 #include "builtin.h"
 #include "reachable.h"
 #include "parse-options.h"
 #include "progress.h"
 #include "prune-packed.h"
+#include "replace-object.h"
 #include "object-store.h"
 #include "shallow.h"
 
@@ -98,7 +100,8 @@ static int prune_object(const struct object_id *oid, const char *fullpath,
        return 0;
 }
 
-static int prune_cruft(const char *basename, const char *path, void *data)
+static int prune_cruft(const char *basename, const char *path,
+                      void *data UNUSED)
 {
        if (starts_with(basename, "tmp_obj_"))
                prune_tmp_file(path);
@@ -107,7 +110,8 @@ static int prune_cruft(const char *basename, const char *path, void *data)
        return 0;
 }
 
-static int prune_subdir(unsigned int nr, const char *path, void *data)
+static int prune_subdir(unsigned int nr UNUSED, const char *path,
+                       void *data UNUSED)
 {
        if (!show_only)
                rmdir(path);
index 1ab4de0005da3f6d2aa4b6a93d61544818af8700..56f679d94a07353e7dfabdbc76b7aae9ccccc055 100644 (file)
@@ -9,6 +9,7 @@
 #include "cache.h"
 #include "config.h"
 #include "builtin.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "exec-cmd.h"
 #include "run-command.h"
@@ -359,8 +360,6 @@ static enum rebase_type config_get_rebase(int *rebase_unspecified)
  */
 static int git_pull_config(const char *var, const char *value, void *cb)
 {
-       int status;
-
        if (!strcmp(var, "rebase.autostash")) {
                config_autostash = git_config_bool(var, value);
                return 0;
@@ -372,10 +371,6 @@ static int git_pull_config(const char *var, const char *value, void *cb)
                check_trust_level = 0;
        }
 
-       status = git_gpg_config(var, value, cb);
-       if (status)
-               return status;
-
        return git_default_config(var, value, cb);
 }
 
index 8f7d326ab3f4b06d3d3d1262d5276fd8c6b2b968..12a402aea3d952e409c394bc853c56deae963dbd 100644 (file)
@@ -508,11 +508,6 @@ static int git_push_config(const char *k, const char *v, void *cb)
 {
        const char *slot_name;
        int *flags = cb;
-       int status;
-
-       status = git_gpg_config(k, v, NULL);
-       if (status)
-               return status;
 
        if (!strcmp(k, "push.followtags")) {
                if (git_config_bool(k, v))
index 3ce75417833bf9f57ca1ddfa17a53c67ef39a9d8..11759c415f31f35cbc7a633a2e345ae83b6fcf4e 100644 (file)
@@ -7,6 +7,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "object.h"
 #include "tree.h"
@@ -87,9 +88,9 @@ static int debug_merge(const struct cache_entry * const *stages,
 {
        int i;
 
-       printf("* %d-way merge\n", o->merge_size);
+       printf("* %d-way merge\n", o->internal.merge_size);
        debug_stage("index", stages[0], o);
-       for (i = 1; i <= o->merge_size; i++) {
+       for (i = 1; i <= o->internal.merge_size; i++) {
                char buf[24];
                xsnprintf(buf, sizeof(buf), "ent#%d", i);
                debug_stage(buf, stages[i], o);
@@ -144,7 +145,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
                OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
                OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
                         N_("skip applying sparse checkout filter")),
-               OPT_BOOL(0, "debug-unpack", &opts.debug_unpack,
+               OPT_BOOL(0, "debug-unpack", &opts.internal.debug_unpack,
                         N_("debug unpack-trees")),
                OPT_CALLBACK_F(0, "recurse-submodules", NULL,
                            "checkout", "control recursive updating of submodules",
@@ -247,7 +248,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
                        opts.head_idx = 1;
        }
 
-       if (opts.debug_unpack)
+       if (opts.internal.debug_unpack)
                opts.fn = debug_merge;
 
        /* If we're going to prime_cache_tree later, skip cache tree update */
@@ -263,7 +264,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
        if (unpack_trees(nr_trees, t, &opts))
                return 128;
 
-       if (opts.debug_unpack || opts.dry_run)
+       if (opts.internal.debug_unpack || opts.dry_run)
                return 0; /* do not write the index out */
 
        /*
index 6635f10d5294d16d017eae225de799efb7b1b9aa..beebeb8f52f9815bd9951d122cc55460f82756c8 100644 (file)
@@ -6,6 +6,7 @@
 
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
+#include "hex.h"
 #include "run-command.h"
 #include "exec-cmd.h"
 #include "strvec.h"
@@ -123,6 +124,7 @@ struct rebase_options {
        int fork_point;
        int update_refs;
        int config_autosquash;
+       int config_rebase_merges;
        int config_update_refs;
 };
 
@@ -140,6 +142,8 @@ struct rebase_options {
                .allow_empty_message = 1,               \
                .autosquash = -1,                       \
                .config_autosquash = -1,                \
+               .rebase_merges = -1,                    \
+               .config_rebase_merges = -1,             \
                .update_refs = -1,                      \
                .config_update_refs = -1,               \
        }
@@ -660,7 +664,7 @@ static int run_am(struct rebase_options *opts)
        format_patch.git_cmd = 1;
        strvec_pushl(&format_patch.args, "format-patch", "-k", "--stdout",
                     "--full-index", "--cherry-pick", "--right-only",
-                    "--src-prefix=a/", "--dst-prefix=b/", "--no-renames",
+                    "--default-prefix", "--no-renames",
                     "--no-cover-letter", "--pretty=mboxrd", "--topo-order",
                     "--no-base", NULL);
        if (opts->git_format_patch_opt.len)
@@ -771,6 +775,16 @@ static int run_specific_rebase(struct rebase_options *opts)
        return status ? -1 : 0;
 }
 
+static void parse_rebase_merges_value(struct rebase_options *options, const char *value)
+{
+       if (!strcmp("no-rebase-cousins", value))
+               options->rebase_cousins = 0;
+       else if (!strcmp("rebase-cousins", value))
+               options->rebase_cousins = 1;
+       else
+               die(_("Unknown rebase-merges mode: %s"), value);
+}
+
 static int rebase_config(const char *var, const char *value, void *data)
 {
        struct rebase_options *opts = data;
@@ -800,6 +814,17 @@ static int rebase_config(const char *var, const char *value, void *data)
                return 0;
        }
 
+       if (!strcmp(var, "rebase.rebasemerges")) {
+               opts->config_rebase_merges = git_parse_maybe_bool(value);
+               if (opts->config_rebase_merges < 0) {
+                       opts->config_rebase_merges = 1;
+                       parse_rebase_merges_value(opts, value);
+               } else {
+                       opts->rebase_cousins = 0;
+               }
+               return 0;
+       }
+
        if (!strcmp(var, "rebase.updaterefs")) {
                opts->config_update_refs = git_config_bool(var, value);
                return 0;
@@ -980,6 +1005,28 @@ static int parse_opt_empty(const struct option *opt, const char *arg, int unset)
        return 0;
 }
 
+static int parse_opt_rebase_merges(const struct option *opt, const char *arg, int unset)
+{
+       struct rebase_options *options = opt->value;
+
+       options->rebase_merges = !unset;
+       options->rebase_cousins = 0;
+
+       if (arg) {
+               if (!*arg) {
+                       warning(_("--rebase-merges with an empty string "
+                                 "argument is deprecated and will stop "
+                                 "working in a future version of Git. Use "
+                                 "--rebase-merges without an argument "
+                                 "instead, which does the same thing."));
+                       return 0;
+               }
+               parse_rebase_merges_value(options, arg);
+       }
+
+       return 0;
+}
+
 static void NORETURN error_on_missing_default_upstream(void)
 {
        struct branch *current_branch = branch_get(NULL);
@@ -1035,7 +1082,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
        struct object_id branch_base;
        int ignore_whitespace = 0;
        const char *gpg_sign = NULL;
-       const char *rebase_merges = NULL;
        struct string_list strategy_options = STRING_LIST_INIT_NODUP;
        struct object_id squash_onto;
        char *squash_onto_name = NULL;
@@ -1137,10 +1183,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
                           &options.allow_empty_message,
                           N_("allow rebasing commits with empty messages"),
                           PARSE_OPT_HIDDEN),
-               {OPTION_STRING, 'r', "rebase-merges", &rebase_merges,
-                       N_("mode"),
+               OPT_CALLBACK_F('r', "rebase-merges", &options, N_("mode"),
                        N_("try to rebase merges instead of skipping them"),
-                       PARSE_OPT_OPTARG, NULL, (intptr_t)""},
+                       PARSE_OPT_OPTARG, parse_opt_rebase_merges),
                OPT_BOOL(0, "fork-point", &options.fork_point,
                         N_("use 'merge-base --fork-point' to refine upstream")),
                OPT_STRING('s', "strategy", &options.strategy,
@@ -1436,17 +1481,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
        if (options.exec.nr)
                imply_merge(&options, "--exec");
 
-       if (rebase_merges) {
-               if (!*rebase_merges)
-                       ; /* default mode; do nothing */
-               else if (!strcmp("rebase-cousins", rebase_merges))
-                       options.rebase_cousins = 1;
-               else if (strcmp("no-rebase-cousins", rebase_merges))
-                       die(_("Unknown mode: %s"), rebase_merges);
-               options.rebase_merges = 1;
-               imply_merge(&options, "--rebase-merges");
-       }
-
        if (options.type == REBASE_APPLY) {
                if (ignore_whitespace)
                        strvec_push(&options.git_am_opts,
@@ -1513,7 +1547,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
                                die(_("apply options and merge options "
                                          "cannot be used together"));
                        else if (options.autosquash == -1 && options.config_autosquash == 1)
-                               die(_("apply options are incompatible with rebase.autosquash.  Consider adding --no-autosquash"));
+                               die(_("apply options are incompatible with rebase.autoSquash.  Consider adding --no-autosquash"));
+                       else if (options.rebase_merges == -1 && options.config_rebase_merges == 1)
+                               die(_("apply options are incompatible with rebase.rebaseMerges.  Consider adding --no-rebase-merges"));
                        else if (options.update_refs == -1 && options.config_update_refs == 1)
                                die(_("apply options are incompatible with rebase.updateRefs.  Consider adding --no-update-refs"));
                        else
@@ -1526,6 +1562,11 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
        options.update_refs = (options.update_refs >= 0) ? options.update_refs :
                             ((options.config_update_refs >= 0) ? options.config_update_refs : 0);
 
+       if (options.rebase_merges == 1)
+               imply_merge(&options, "--rebase-merges");
+       options.rebase_merges = (options.rebase_merges >= 0) ? options.rebase_merges :
+                               ((options.config_rebase_merges >= 0) ? options.config_rebase_merges : 0);
+
        if (options.autosquash == 1)
                imply_merge(&options, "--autosquash");
        options.autosquash = (options.autosquash >= 0) ? options.autosquash :
index cd5c7a28eff08f048b79a9d739800709c443c160..554cda269d0110340097c5b09d4f6651bd093c44 100644 (file)
@@ -1,6 +1,7 @@
 #include "builtin.h"
 #include "repository.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "pack.h"
 #include "refs.h"
@@ -30,6 +31,7 @@
 #include "commit-reach.h"
 #include "worktree.h"
 #include "shallow.h"
+#include "parse-options.h"
 
 static const char * const receive_pack_usage[] = {
        N_("git receive-pack <git-dir>"),
@@ -133,10 +135,6 @@ static int receive_pack_config(const char *var, const char *value, void *cb)
 {
        int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
 
-       if (status)
-               return status;
-
-       status = git_gpg_config(var, value, NULL);
        if (status)
                return status;
 
@@ -1463,8 +1461,10 @@ static const char *update(struct command *cmd, struct shallow_info *si)
                find_shared_symref(worktrees, "HEAD", name);
 
        /* only refs/... are allowed */
-       if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
-               rp_error("refusing to create funny ref '%s' remotely", name);
+       if (!starts_with(name, "refs/") ||
+           check_refname_format(name + 5, is_null_oid(new_oid) ?
+                                REFNAME_ALLOW_ONELEVEL : 0)) {
+               rp_error("refusing to update funny ref '%s' remotely", name);
                ret = "funny refname";
                goto out;
        }
@@ -2184,7 +2184,7 @@ static const char *parse_pack_header(struct pack_header *hdr)
        }
 }
 
-static const char *pack_lockfile;
+static struct tempfile *pack_lockfile;
 
 static void push_header_arg(struct strvec *args, struct pack_header *hdr)
 {
@@ -2251,6 +2251,7 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                        return "unpack-objects abnormal exit";
        } else {
                char hostname[HOST_NAME_MAX + 1];
+               char *lockfile;
 
                strvec_pushl(&child.args, "index-pack", "--stdin", NULL);
                push_header_arg(&child.args, &hdr);
@@ -2280,8 +2281,14 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                status = start_command(&child);
                if (status)
                        return "index-pack fork failed";
-               pack_lockfile = index_pack_lockfile(child.out, NULL);
+
+               lockfile = index_pack_lockfile(child.out, NULL);
+               if (lockfile) {
+                       pack_lockfile = register_tempfile(lockfile);
+                       free(lockfile);
+               }
                close(child.out);
+
                status = finish_command(&child);
                if (status)
                        return "index-pack abnormal exit";
@@ -2568,8 +2575,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
                use_keepalive = KEEPALIVE_ALWAYS;
                execute_commands(commands, unpack_status, &si,
                                 &push_options);
-               if (pack_lockfile)
-                       unlink_or_warn(pack_lockfile);
+               delete_tempfile(&pack_lockfile);
                sigchain_push(SIGPIPE, SIG_IGN);
                if (report_status_v2)
                        report_v2(commands, unpack_status);
index 270681dcdf40e3c7ff0bf2969340eb1b981cf8e8..9b000bb6bcaf0fe8f243e01b236bdeb341b1ca6e 100644 (file)
@@ -4,6 +4,7 @@
 #include "reachable.h"
 #include "worktree.h"
 #include "reflog.h"
+#include "parse-options.h"
 
 #define BUILTIN_REFLOG_SHOW_USAGE \
        N_("git reflog [show] [<log-options>] [<ref>]")
index f64937953184fd346923bafed6f7868bd99cded5..87f73c8923a92a57a75a3204fbbdd19969c8287c 100644 (file)
@@ -1,7 +1,8 @@
 #include "builtin.h"
-#include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "dir.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "run-command.h"
 #include "sigchain.h"
@@ -182,8 +183,9 @@ static void prepare_pack_objects(struct child_process *cmd,
  * Write oid to the given struct child_process's stdin, starting it first if
  * necessary.
  */
-static int write_oid(const struct object_id *oid, struct packed_git *pack,
-                    uint32_t pos, void *data)
+static int write_oid(const struct object_id *oid,
+                    struct packed_git *pack UNUSED,
+                    uint32_t pos UNUSED, void *data)
 {
        struct child_process *cmd = data;
 
index a29e911d3099be9d327ecc030d68c56fe046a04a..71d8e949e353c8583c5a3cbf383edab3544c95c2 100644 (file)
 #include "cache.h"
 #include "config.h"
 #include "builtin.h"
+#include "hex.h"
 #include "refs.h"
 #include "parse-options.h"
 #include "run-command.h"
 #include "object-store.h"
+#include "replace-object.h"
 #include "repository.h"
 #include "tag.h"
 
index 0697fa89de22414a58cce94b5f129c9e97d03fa1..24b04aeecb9222750fe9dd7dcff1e1ab97cb467f 100644 (file)
@@ -10,6 +10,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "tag.h"
 #include "object.h"
@@ -317,7 +318,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
        int reset_type = NONE, update_ref_status = 0, quiet = 0;
        int no_refresh = 0;
        int patch_mode = 0, pathspec_file_nul = 0, unborn;
-       const char *rev, *pathspec_from_file = NULL;
+       const char *rev;
+       char *pathspec_from_file = NULL;
        struct object_id oid;
        struct pathspec pathspec;
        int intent_to_add = 0;
@@ -495,5 +497,6 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
 
 cleanup:
        clear_pathspec(&pathspec);
+       free(pathspec_from_file);
        return update_ref_status;
 }
index d42db0b0cc9fa22ad8674ceddef8d1c735791f37..85e522dff8a98bd541c1b8169d72d8e28ec6dcc6 100644 (file)
@@ -2,6 +2,7 @@
 #include "config.h"
 #include "commit.h"
 #include "diff.h"
+#include "hex.h"
 #include "revision.h"
 #include "list-objects.h"
 #include "list-objects-filter.h"
@@ -38,7 +39,7 @@ static const char rev_list_usage[] =
 "    --tags\n"
 "    --remotes\n"
 "    --stdin\n"
-"    --exclude-hidden=[receive|uploadpack]\n"
+"    --exclude-hidden=[fetch|receive|uploadpack]\n"
 "    --quiet\n"
 "  ordering output:\n"
 "    --topo-order\n"
@@ -257,7 +258,8 @@ static inline void finish_object__ma(struct object *obj)
        }
 }
 
-static int finish_object(struct object *obj, const char *name, void *cb_data)
+static int finish_object(struct object *obj, const char *name UNUSED,
+                        void *cb_data)
 {
        struct rev_list_info *info = cb_data;
        if (oid_object_info_extended(the_repository, &obj->oid, NULL, 0) < 0) {
@@ -362,11 +364,11 @@ static int show_bisect_vars(struct rev_list_info *info, int reaches, int all)
 
 static int show_object_fast(
        const struct object_id *oid,
-       enum object_type type,
-       int exclude,
-       uint32_t name_hash,
-       struct packed_git *found_pack,
-       off_t found_offset)
+       enum object_type type UNUSED,
+       int exclude UNUSED,
+       uint32_t name_hash UNUSED,
+       struct packed_git *found_pack UNUSED,
+       off_t found_offset UNUSED)
 {
        fprintf(stdout, "%s\n", oid_to_hex(oid));
        return 1;
index e67999e5ebc5ef640fe5dcd45dfa1b4126a9c7a8..e1fa9c6348ceccb7d26fb9c312f5499ac2a1b478 100644 (file)
@@ -5,8 +5,10 @@
  */
 #define USE_THE_INDEX_VARIABLE
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "commit.h"
+#include "hex.h"
 #include "refs.h"
 #include "quote.h"
 #include "builtin.h"
index 77d2035616efa1aa60b412f024da1a7836df4478..62986a7b1b07984a8f1af60cf93fb24492c3d0b4 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "builtin.h"
 #include "parse-options.h"
index 8844f90655799b16f59080c8a69ca86fcbb9fd6f..dc198f79082093f3ac95b39801b6ab890ae7bd4b 100644 (file)
@@ -5,6 +5,7 @@
  */
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
+#include "alloc.h"
 #include "advice.h"
 #include "config.h"
 #include "lockfile.h"
index 4c5d125fa0a1cb4a01deac04637bd4e71763c619..640125fe955de2deff642b2d40a29a69263ff27b 100644 (file)
@@ -1,6 +1,7 @@
 #include "builtin.h"
 #include "config.h"
 #include "commit.h"
+#include "hex.h"
 #include "refs.h"
 #include "pkt-line.h"
 #include "sideband.h"
@@ -15,6 +16,7 @@
 #include "gpg-interface.h"
 #include "gettext.h"
 #include "protocol.h"
+#include "parse-options.h"
 
 static const char * const send_pack_usage[] = {
        N_("git send-pack [--mirror] [--dry-run] [--force]\n"
@@ -130,8 +132,6 @@ static void print_helper_status(struct ref *ref)
 
 static int send_pack_config(const char *k, const char *v, void *cb)
 {
-       git_gpg_config(k, v, NULL);
-
        if (!strcmp(k, "push.gpgsign")) {
                const char *value;
                if (!git_config_get_value("push.gpgsign", &value)) {
@@ -275,7 +275,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
                fd[0] = 0;
                fd[1] = 1;
        } else {
-               conn = git_connect(fd, dest, receivepack,
+               conn = git_connect(fd, dest, "git-receive-pack", receivepack,
                        args.verbose ? CONNECT_VERBOSE : 0);
        }
 
index 358ac3e519a717f1a354b5d6fa00a8fcd8d77ca5..8342b68aef706e2455f50a0a9f7c023754927b63 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "pretty.h"
 #include "refs.h"
 #include "builtin.h"
index 0e0b9fb95bc11395fecb3718cbe85fd7a0bea903..98ec40ddf46874f6ce1e67d10e3366a989e6f9d5 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "cache.h"
+#include "hex.h"
 #include "pack.h"
 #include "parse-options.h"
 
index 3af6a53ee9750ef5d4e45031ae0088d5e12f37a4..1f28d7fe4b9486184b3c01b3f78ca65e295c619b 100644 (file)
@@ -1,6 +1,7 @@
 #include "builtin.h"
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "refs.h"
 #include "object-store.h"
 #include "object.h"
index c37381549181837ce4afe3659e5790e88485a816..8d5ae6f2a60f913323cebf7014fd305ab09403bc 100644 (file)
@@ -217,16 +217,14 @@ static int update_working_directory(struct pattern_list *pl)
        o.head_idx = -1;
        o.src_index = r->index;
        o.dst_index = r->index;
-       index_state_init(&o.result, r);
        o.skip_sparse_checkout = 0;
-       o.pl = pl;
 
        setup_work_tree();
 
        repo_hold_locked_index(r, &lock_file, LOCK_DIE_ON_ERROR);
 
        setup_unpack_trees_porcelain(&o, "sparse-checkout");
-       result = update_sparsity(&o);
+       result = update_sparsity(&o, pl);
        clear_unpack_trees_porcelain(&o);
 
        if (result == UPDATE_SPARSITY_WARNINGS)
index 3a4f9fd566d27cfea7039f9c92f7a9730f37f912..6a12fed2713073f91441bd9058058591f4155ddf 100644 (file)
@@ -1,6 +1,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "config.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "refs.h"
 #include "lockfile.h"
index 4c173d8b37adfc72ec840fd88ca27e36f432aef3..d05d1a846233341046a4835a579964323b4e07d0 100644 (file)
@@ -1,5 +1,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
+#include "alloc.h"
+#include "hex.h"
 #include "repository.h"
 #include "cache.h"
 #include "config.h"
@@ -2132,9 +2134,9 @@ static int update_clone_get_next_task(struct child_process *child,
        return 0;
 }
 
-static int update_clone_start_failure(struct strbuf *err,
+static int update_clone_start_failure(struct strbuf *err UNUSED,
                                      void *suc_cb,
-                                     void *idx_task_cb)
+                                     void *idx_task_cb UNUSED)
 {
        struct submodule_update_clone *suc = suc_cb;
 
index d428c45dc8d812255336ed5da20804981d3be4ab..adcaa547b0d57094fa811f5f81e3a601cc05e2b2 100644 (file)
@@ -9,6 +9,7 @@
 #include "cache.h"
 #include "config.h"
 #include "builtin.h"
+#include "hex.h"
 #include "refs.h"
 #include "object-store.h"
 #include "tag.h"
@@ -180,8 +181,6 @@ static const char tag_template_nocleanup[] =
 
 static int git_tag_config(const char *var, const char *value, void *cb)
 {
-       int status;
-
        if (!strcmp(var, "tag.gpgsign")) {
                config_sign_tag = git_config_bool(var, value);
                return 0;
@@ -194,9 +193,6 @@ static int git_tag_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
-       status = git_gpg_config(var, value, cb);
-       if (status)
-               return status;
        if (!strcmp(var, "tag.forcesignannotated")) {
                force_sign_annotate = git_config_bool(var, value);
                return 0;
@@ -433,7 +429,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        int create_reflog = 0;
        int annotate = 0, force = 0;
        int cmdmode = 0, create_tag_object = 0;
-       const char *msgfile = NULL, *keyid = NULL;
+       char *msgfile = NULL;
+       const char *keyid = NULL;
        struct msg_arg msg = { .buf = STRBUF_INIT };
        struct ref_transaction *transaction;
        struct strbuf err = STRBUF_INIT;
@@ -643,5 +640,6 @@ cleanup:
        strbuf_release(&reflog_msg);
        strbuf_release(&msg.buf);
        strbuf_release(&err);
+       free(msgfile);
        return ret;
 }
index 88de32b7d7e66e3d7e1c57775b5f0a1b0b045175..e9b105a5397a3fe232f8aa0c005f8ce72599b98b 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 
 static char *create_temp_file(struct object_id *oid)
index 43789b8ef294d8aa3fc9517f65712ac90e1fa60c..1908dcfcffb7b89234cdcd788f1302e307beed2b 100644 (file)
@@ -2,12 +2,14 @@
 #include "cache.h"
 #include "bulk-checkin.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "object.h"
 #include "delta.h"
 #include "pack.h"
 #include "blob.h"
 #include "commit.h"
+#include "replace-object.h"
 #include "tag.h"
 #include "tree.h"
 #include "tree-walk.h"
index bf38885d5469b24e1ac64e4d3df74a4e70a3dd7b..11dc1352716f9dcf8da717a0fb909280a1ca4d7b 100644 (file)
@@ -7,6 +7,7 @@
 #include "cache.h"
 #include "bulk-checkin.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "quote.h"
 #include "cache-tree.h"
index 25b69da2bf2815796d885030c91dbf177a4c4e2e..7a3c68720f14666cb839dd22cb5dd41688405cea 100644 (file)
@@ -4,6 +4,7 @@
 #include "pkt-line.h"
 #include "parse-options.h"
 #include "protocol.h"
+#include "replace-object.h"
 #include "upload-pack.h"
 #include "serve.h"
 
index a80c1df86fd532bb6353b990381bfb050ac5e688..d9943be9afd73dfc46e471ecee426aed00f8da08 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include "builtin.h"
 #include "config.h"
+#include "ident.h"
 #include "refs.h"
 
 static const char var_usage[] = "git var (-l | <variable>)";
index 3ebad32b0f14fffb5cfafce87411a534bccdf724..7aedf10e856952f035d506dd678b8dfb8b410ebc 100644 (file)
@@ -52,14 +52,6 @@ static int verify_commit(const char *name, unsigned flags)
        return run_gpg_verify((struct commit *)obj, flags);
 }
 
-static int git_verify_commit_config(const char *var, const char *value, void *cb)
-{
-       int status = git_gpg_config(var, value, cb);
-       if (status)
-               return status;
-       return git_default_config(var, value, cb);
-}
-
 int cmd_verify_commit(int argc, const char **argv, const char *prefix)
 {
        int i = 1, verbose = 0, had_error = 0;
@@ -70,7 +62,7 @@ int cmd_verify_commit(int argc, const char **argv, const char *prefix)
                OPT_END()
        };
 
-       git_config(git_verify_commit_config, NULL);
+       git_config(git_default_config, NULL);
 
        argc = parse_options(argc, argv, prefix, verify_commit_options,
                             verify_commit_usage, PARSE_OPT_KEEP_ARGV0);
index 217566952d83ce0c657128d6d5e253bebc72f3bb..5c00b0b0f77d4e16301b5726dde640426604434e 100644 (file)
@@ -19,14 +19,6 @@ static const char * const verify_tag_usage[] = {
                NULL
 };
 
-static int git_verify_tag_config(const char *var, const char *value, void *cb)
-{
-       int status = git_gpg_config(var, value, cb);
-       if (status)
-               return status;
-       return git_default_config(var, value, cb);
-}
-
 int cmd_verify_tag(int argc, const char **argv, const char *prefix)
 {
        int i = 1, verbose = 0, had_error = 0;
@@ -39,7 +31,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
                OPT_END()
        };
 
-       git_config(git_verify_tag_config, NULL);
+       git_config(git_default_config, NULL);
 
        argc = parse_options(argc, argv, prefix, verify_tag_options,
                             verify_tag_usage, PARSE_OPT_KEEP_ARGV0);
index 254283aa6f5716ab2ab83a477972b4630c056b1b..80d05e246d8c4615e6858a700a08d842575ff165 100644 (file)
@@ -3,6 +3,7 @@
 #include "config.h"
 #include "builtin.h"
 #include "dir.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "strvec.h"
 #include "branch.h"
index 078010315f004647f22865db68f5cab63a799f8f..7ad0d05945378a2e640e795f38bd83f891c81898 100644 (file)
@@ -7,6 +7,7 @@
 #include "builtin.h"
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "tree.h"
 #include "cache-tree.h"
 #include "parse-options.h"
index 855b68ec23bdb1bdc85c1184a9c144c226f0245c..d64cd5c52d01b1ccbd72a062c0dea963a8a3dfd2 100644 (file)
@@ -1,8 +1,10 @@
 /*
  * Copyright (c) 2011, Google Inc.
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "bulk-checkin.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "repository.h"
 #include "csum-file.h"
index 8a3c39ce572b6c0fcfcfd07a0fb2f3d6da2bdecc..177c18104022ac23a87bdc21e51f3c5073ebb855 100644 (file)
@@ -884,7 +884,7 @@ int bundle_uri_command(struct repository *r,
         * Read all "bundle.*" config lines to the client as key=value
         * packet lines.
         */
-       git_config(config_to_packet_line, &writer);
+       repo_config(r, config_to_packet_line, &writer);
 
        packet_writer_flush(&writer);
 
index 6ab6cd7378d2d633d5d6dc6100e98793799c7f4e..99d7de97f6cf9cc4ff8c93f10b898ba5857069f4 100644 (file)
--- a/bundle.c
+++ b/bundle.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "lockfile.h"
 #include "bundle.h"
+#include "hex.h"
 #include "object-store.h"
 #include "repository.h"
 #include "object.h"
index 88c2c04f87fe5fcfce380b47f9d9377f9b59d8ef..9d46ecef09162a2d01d6f4ee508b2b1cdb1c2304 100644 (file)
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "tree.h"
 #include "tree-walk.h"
index bd97caa07b08f6b5dc62f73485d93d232e179327..faae88be63c2ce012c700af3a88e02e165982a4e 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef CACHE_TREE_H
 #define CACHE_TREE_H
 
-#include "cache.h"
 #include "tree.h"
 #include "tree-walk.h"
 
diff --git a/cache.h b/cache.h
index 12789903e883df94783b75defa89fbbd5cbcca1f..5a736a2b7e714afbc28cc398e6b088c9f0a52293 100644 (file)
--- a/cache.h
+++ b/cache.h
 #include "pack-revindex.h"
 #include "hash.h"
 #include "path.h"
+#include "pathspec.h"
+#include "object.h"
 #include "oid-array.h"
 #include "repository.h"
+#include "statinfo.h"
 #include "mem-pool.h"
 
 typedef struct git_zstream {
@@ -118,26 +121,6 @@ struct cache_header {
 #define INDEX_FORMAT_LB 2
 #define INDEX_FORMAT_UB 4
 
-/*
- * The "cache_time" is just the low 32 bits of the
- * time. It doesn't matter if it overflows - we only
- * check it for equality in the 32 bits we save.
- */
-struct cache_time {
-       uint32_t sec;
-       uint32_t nsec;
-};
-
-struct stat_data {
-       struct cache_time sd_ctime;
-       struct cache_time sd_mtime;
-       unsigned int sd_dev;
-       unsigned int sd_ino;
-       unsigned int sd_uid;
-       unsigned int sd_gid;
-       unsigned int sd_size;
-};
-
 struct cache_entry {
        struct hashmap_entry ent;
        struct stat_data ce_stat_data;
@@ -293,6 +276,15 @@ static inline unsigned int canon_mode(unsigned int mode)
        return S_IFGITLINK;
 }
 
+static inline int ce_path_match(struct index_state *istate,
+                               const struct cache_entry *ce,
+                               const struct pathspec *pathspec,
+                               char *seen)
+{
+       return match_pathspec(istate, pathspec, ce->name, ce_namelen(ce), 0, seen,
+                             S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode));
+}
+
 #define cache_entry_size(len) (offsetof(struct cache_entry,name) + (len) + 1)
 
 #define SOMETHING_CHANGED      (1 << 0) /* unclassified changes go here */
@@ -453,26 +445,6 @@ void prefetch_cache_entries(const struct index_state *istate,
 extern struct index_state the_index;
 #endif
 
-#define TYPE_BITS 3
-
-/*
- * Values in this enum (except those outside the 3 bit range) are part
- * of pack file format. See gitformat-pack(5) for more information.
- */
-enum object_type {
-       OBJ_BAD = -1,
-       OBJ_NONE = 0,
-       OBJ_COMMIT = 1,
-       OBJ_TREE = 2,
-       OBJ_BLOB = 3,
-       OBJ_TAG = 4,
-       /* 5 for future expansion */
-       OBJ_OFS_DELTA = 6,
-       OBJ_REF_DELTA = 7,
-       OBJ_ANY,
-       OBJ_MAX
-};
-
 static inline enum object_type object_type(unsigned int mode)
 {
        return S_ISDIR(mode) ? OBJ_TREE :
@@ -638,6 +610,9 @@ char *prefix_path_gently(const char *prefix, int len, int *remaining, const char
  */
 char *prefix_filename(const char *prefix, const char *path);
 
+/* Likewise, but path=="-" always yields "-" */
+char *prefix_filename_except_for_dash(const char *prefix, const char *path);
+
 int check_filename(const char *prefix, const char *name);
 void verify_filename(const char *prefix,
                     const char *name,
@@ -656,81 +631,6 @@ void initialize_repository_version(int hash_algo, int reinit);
 void sanitize_stdfds(void);
 int daemonize(void);
 
-#define alloc_nr(x) (((x)+16)*3/2)
-
-/**
- * Dynamically growing an array using realloc() is error prone and boring.
- *
- * Define your array with:
- *
- * - a pointer (`item`) that points at the array, initialized to `NULL`
- *   (although please name the variable based on its contents, not on its
- *   type);
- *
- * - an integer variable (`alloc`) that keeps track of how big the current
- *   allocation is, initialized to `0`;
- *
- * - another integer variable (`nr`) to keep track of how many elements the
- *   array currently has, initialized to `0`.
- *
- * Then before adding `n`th element to the item, call `ALLOC_GROW(item, n,
- * alloc)`.  This ensures that the array can hold at least `n` elements by
- * calling `realloc(3)` and adjusting `alloc` variable.
- *
- * ------------
- * sometype *item;
- * size_t nr;
- * size_t alloc
- *
- * for (i = 0; i < nr; i++)
- *     if (we like item[i] already)
- *             return;
- *
- * // we did not like any existing one, so add one
- * ALLOC_GROW(item, nr + 1, alloc);
- * item[nr++] = value you like;
- * ------------
- *
- * You are responsible for updating the `nr` variable.
- *
- * If you need to specify the number of elements to allocate explicitly
- * then use the macro `REALLOC_ARRAY(item, alloc)` instead of `ALLOC_GROW`.
- *
- * Consider using ALLOC_GROW_BY instead of ALLOC_GROW as it has some
- * added niceties.
- *
- * DO NOT USE any expression with side-effect for 'x', 'nr', or 'alloc'.
- */
-#define ALLOC_GROW(x, nr, alloc) \
-       do { \
-               if ((nr) > alloc) { \
-                       if (alloc_nr(alloc) < (nr)) \
-                               alloc = (nr); \
-                       else \
-                               alloc = alloc_nr(alloc); \
-                       REALLOC_ARRAY(x, alloc); \
-               } \
-       } while (0)
-
-/*
- * Similar to ALLOC_GROW but handles updating of the nr value and
- * zeroing the bytes of the newly-grown array elements.
- *
- * DO NOT USE any expression with side-effect for any of the
- * arguments.
- */
-#define ALLOC_GROW_BY(x, nr, increase, alloc) \
-       do { \
-               if (increase) { \
-                       size_t new_nr = nr + (increase); \
-                       if (new_nr < nr) \
-                               BUG("negative growth in ALLOC_GROW_BY"); \
-                       ALLOC_GROW(x, new_nr, alloc); \
-                       memset((x) + nr, 0, sizeof(*(x)) * (increase)); \
-                       nr = new_nr; \
-               } \
-       } while (0)
-
 /* Initialize and use the cache information */
 struct lock_file;
 void preload_index(struct index_state *index,
@@ -989,14 +889,6 @@ void set_shared_repository(int value);
 int get_shared_repository(void);
 void reset_shared_repository(void);
 
-/*
- * Do replace refs need to be checked this run?  This variable is
- * initialized to true unless --no-replace-object is used or
- * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some
- * commands that do not want replace references to be active.
- */
-extern int read_replace_refs;
-
 /*
  * These values are used to help identify parts of a repository to fsync.
  * FSYNC_COMPONENT_NONE identifies data that will not be a persistent part of the
@@ -1400,22 +1292,6 @@ int finalize_object_file(const char *tmpfile, const char *filename);
 /* Helper to check and "touch" a file */
 int check_and_freshen_file(const char *fn, int freshen);
 
-extern const signed char hexval_table[256];
-static inline unsigned int hexval(unsigned char c)
-{
-       return hexval_table[c];
-}
-
-/*
- * Convert two consecutive hexadecimal digits into a char.  Return a
- * negative value on error.  Don't run over the end of short strings.
- */
-static inline int hex2chr(const char *s)
-{
-       unsigned int val = hexval(s[0]);
-       return (val & ~0xf) ? val : (val << 4) | hexval(s[1]);
-}
-
 /* Convert to/from hex/sha1 representation */
 #define MINIMUM_ABBREV minimum_abbrev
 #define DEFAULT_ABBREV default_abbrev
@@ -1438,40 +1314,6 @@ struct object_context {
        char *path;
 };
 
-#define GET_OID_QUIETLY           01
-#define GET_OID_COMMIT            02
-#define GET_OID_COMMITTISH        04
-#define GET_OID_TREE             010
-#define GET_OID_TREEISH          020
-#define GET_OID_BLOB             040
-#define GET_OID_FOLLOW_SYMLINKS 0100
-#define GET_OID_RECORD_PATH     0200
-#define GET_OID_ONLY_TO_DIE    04000
-#define GET_OID_REQUIRE_PATH  010000
-
-#define GET_OID_DISAMBIGUATORS \
-       (GET_OID_COMMIT | GET_OID_COMMITTISH | \
-       GET_OID_TREE | GET_OID_TREEISH | \
-       GET_OID_BLOB)
-
-enum get_oid_result {
-       FOUND = 0,
-       MISSING_OBJECT = -1, /* The requested object is missing */
-       SHORT_NAME_AMBIGUOUS = -2,
-       /* The following only apply when symlinks are followed */
-       DANGLING_SYMLINK = -4, /*
-                               * The initial symlink is there, but
-                               * (transitively) points to a missing
-                               * in-tree file
-                               */
-       SYMLINK_LOOP = -5,
-       NOT_DIR = -6, /*
-                      * Somewhere along the symlink chain, a path is
-                      * requested which contains a file as a
-                      * non-final element.
-                      */
-};
-
 int repo_get_oid(struct repository *r, const char *str, struct object_id *oid);
 __attribute__((format (printf, 2, 3)))
 int get_oidf(struct object_id *oid, const char *fmt, ...);
@@ -1502,68 +1344,6 @@ int repo_for_each_abbrev(struct repository *r, const char *prefix, each_abbrev_f
 
 int set_disambiguate_hint_config(const char *var, const char *value);
 
-/*
- * Try to read a SHA1 in hexadecimal format from the 40 characters
- * starting at hex.  Write the 20-byte result to sha1 in binary form.
- * Return 0 on success.  Reading stops if a NUL is encountered in the
- * input, so it is safe to pass this function an arbitrary
- * null-terminated string.
- */
-int get_sha1_hex(const char *hex, unsigned char *sha1);
-int get_oid_hex(const char *hex, struct object_id *sha1);
-
-/* Like get_oid_hex, but for an arbitrary hash algorithm. */
-int get_oid_hex_algop(const char *hex, struct object_id *oid, const struct git_hash_algo *algop);
-
-/*
- * Read `len` pairs of hexadecimal digits from `hex` and write the
- * values to `binary` as `len` bytes. Return 0 on success, or -1 if
- * the input does not consist of hex digits).
- */
-int hex_to_bytes(unsigned char *binary, const char *hex, size_t len);
-
-/*
- * Convert a binary hash in "unsigned char []" or an object name in
- * "struct object_id *" to its hex equivalent. The `_r` variant is reentrant,
- * and writes the NUL-terminated output to the buffer `out`, which must be at
- * least `GIT_MAX_HEXSZ + 1` bytes, and returns a pointer to out for
- * convenience.
- *
- * The non-`_r` variant returns a static buffer, but uses a ring of 4
- * buffers, making it safe to make multiple calls for a single statement, like:
- *
- *   printf("%s -> %s", hash_to_hex(one), hash_to_hex(two));
- *   printf("%s -> %s", oid_to_hex(one), oid_to_hex(two));
- */
-char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash, const struct git_hash_algo *);
-char *oid_to_hex_r(char *out, const struct object_id *oid);
-char *hash_to_hex_algop(const unsigned char *hash, const struct git_hash_algo *);      /* static buffer result! */
-char *hash_to_hex(const unsigned char *hash);                                          /* same static buffer */
-char *oid_to_hex(const struct object_id *oid);                                         /* same static buffer */
-
-/*
- * Parse a 40-character hexadecimal object ID starting from hex, updating the
- * pointer specified by end when parsing stops.  The resulting object ID is
- * stored in oid.  Returns 0 on success.  Parsing will stop on the first NUL or
- * other invalid character.  end is only updated on success; otherwise, it is
- * unmodified.
- */
-int parse_oid_hex(const char *hex, struct object_id *oid, const char **end);
-
-/* Like parse_oid_hex, but for an arbitrary hash algorithm. */
-int parse_oid_hex_algop(const char *hex, struct object_id *oid, const char **end,
-                       const struct git_hash_algo *algo);
-
-
-/*
- * These functions work like get_oid_hex and parse_oid_hex, but they will parse
- * a hex value for any algorithm. The algorithm is detected based on the length
- * and the algorithm in use is returned. If this is not a hex object ID in any
- * algorithm, returns GIT_HASH_UNKNOWN.
- */
-int get_oid_hex_any(const char *hex, struct object_id *oid);
-int parse_oid_hex_any(const char *hex, struct object_id *oid, const char **end);
-
 /*
  * This reads short-hand syntax that not only evaluates to a commit
  * object name, but also can act as if the end user spelled the name
@@ -1632,65 +1412,10 @@ struct object *repo_peel_to_type(struct repository *r,
 #define peel_to_type(name, namelen, obj, type) \
        repo_peel_to_type(the_repository, name, namelen, obj, type)
 
-#define IDENT_STRICT          1
-#define IDENT_NO_DATE         2
-#define IDENT_NO_NAME         4
-
-enum want_ident {
-       WANT_BLANK_IDENT,
-       WANT_AUTHOR_IDENT,
-       WANT_COMMITTER_IDENT
-};
-
-const char *git_author_info(int);
-const char *git_committer_info(int);
-const char *fmt_ident(const char *name, const char *email,
-                     enum want_ident whose_ident,
-                     const char *date_str, int);
-const char *fmt_name(enum want_ident);
-const char *ident_default_name(void);
-const char *ident_default_email(void);
 const char *git_editor(void);
 const char *git_sequence_editor(void);
 const char *git_pager(int stdout_is_tty);
 int is_terminal_dumb(void);
-int git_ident_config(const char *, const char *, void *);
-/*
- * Prepare an ident to fall back on if the user didn't configure it.
- */
-void prepare_fallback_ident(const char *name, const char *email);
-void reset_ident_date(void);
-
-struct ident_split {
-       const char *name_begin;
-       const char *name_end;
-       const char *mail_begin;
-       const char *mail_end;
-       const char *date_begin;
-       const char *date_end;
-       const char *tz_begin;
-       const char *tz_end;
-};
-/*
- * Signals an success with 0, but time part of the result may be NULL
- * if the input lacks timestamp and zone
- */
-int split_ident_line(struct ident_split *, const char *, int);
-
-/*
- * Given a commit or tag object buffer and the commit or tag headers, replaces
- * the idents in the headers with their canonical versions using the mailmap mechanism.
- */
-void apply_mailmap_to_header(struct strbuf *, const char **, struct string_list *);
-
-/*
- * Compare split idents for equality or strict ordering. Note that we
- * compare only the ident part of the line, ignoring any timestamp.
- *
- * Because there are two fields, we must choose one as the primary key; we
- * currently arbitrarily pick the email.
- */
-int ident_cmp(const struct ident_split *, const struct ident_split *);
 
 struct cache_def {
        struct strbuf path;
@@ -1757,9 +1482,6 @@ int update_server_info(int);
 const char *get_log_output_encoding(void);
 const char *get_commit_output_encoding(void);
 
-int committer_ident_sufficiently_given(void);
-int author_ident_sufficiently_given(void);
-
 extern const char *git_commit_encoding;
 extern const char *git_log_output_encoding;
 extern const char *git_mailmap_file;
index 336e46dbba5a06e7d9b5fdb5dd6f3c7bdd971186..c1cc30a5dc7edaadfa69877b4a8f7a6e3a92ffdb 100644 (file)
--- a/cbtree.c
+++ b/cbtree.c
@@ -4,6 +4,7 @@
  * Based on Adam Langley's adaptation of Dan Bernstein's public domain code
  * git clone https://github.com/agl/critbit.git
  */
+#include "git-compat-util.h"
 #include "cbtree.h"
 
 static struct cb_node *cb_node_of(const void *p)
index 0be14fb7ee4276dff338eb27b35c68973dd2c4b2..43193abdda23cef279f9e9cee99370509611f7c5 100644 (file)
--- a/cbtree.h
+++ b/cbtree.h
@@ -14,8 +14,6 @@
 #ifndef CBTREE_H
 #define CBTREE_H
 
-#include "git-compat-util.h"
-
 struct cb_node;
 struct cb_node {
        struct cb_node *child[2];
index 1152133bd77a773f40afd6c3477224e051318e0c..1917f3b32300abf113bf3128450da26eb2efd9b4 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef CHECKOUT_H
 #define CHECKOUT_H
 
-#include "cache.h"
+#include "hash.h"
 
 /*
  * Check if the branch name uniquely matches a branch name on a remote
index 0275b74a895a17bb62b7fe12299e6f12aa503d92..f65e9a1e4290c1b704e61c0c9909c61c14bf67da 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "chunk-format.h"
 #include "csum-file.h"
 
index 7885aa084878dde2f2786545b7edc05e7d3fee24..025c38f938ed38bd4fdb0c280b3ddc23af8dd525 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef CHUNK_FORMAT_H
 #define CHUNK_FORMAT_H
 
-#include "git-compat-util.h"
 #include "hash.h"
 
 struct hashfile;
diff --git a/color.c b/color.c
index f05d8a81d72115edbf47d34950a31615a15ea98e..6b577ce0a75545f532fb189ccedb5d48c99ce3a4 100644 (file)
--- a/color.c
+++ b/color.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "config.h"
 #include "color.h"
+#include "hex.h"
 
 static int git_use_color_default = GIT_COLOR_AUTO;
 int color_stdout_is_tty = -1;
index 1a39b5dde0946df0c1e36c7b1f4c48552885985a..91051dc3258925a10d6de5d67101720376b8d630 100644 (file)
@@ -4,6 +4,7 @@
 #include "blob.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "quote.h"
 #include "xdiff-interface.h"
 #include "xdiff/xmacros.h"
index c11b59f28b3164cee21ab972088c32082d8f5bb6..5e6098ff356b937f7790e2c8dfe5634ebc5f56be 100644 (file)
@@ -1,5 +1,6 @@
 #include "git-compat-util.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "pack.h"
 #include "packfile.h"
index 37faee6b66d59c693dc9ee829dbd5ad61654fe3c..bb88bec7aa3d8f0d56b262b21b3a2ea47b969b52 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef COMMIT_GRAPH_H
 #define COMMIT_GRAPH_H
 
-#include "git-compat-util.h"
 #include "object-store.h"
 #include "oidset.h"
 
index 2e33c599a82c81127b9a24547d0834e6c7a55bcf..7c0c39fd2864c2db72b81adc4c0b1b6d7cf0337e 100644 (file)
@@ -1,7 +1,9 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "commit.h"
 #include "commit-graph.h"
 #include "decorate.h"
+#include "hex.h"
 #include "prio-queue.h"
 #include "tree.h"
 #include "ref-filter.h"
@@ -807,8 +809,12 @@ cleanup:
        clear_commit_marks_many(nr_commits, list, RESULT | assign_flag);
        free(list);
 
-       for (i = 0; i < from->nr; i++)
-               from->objects[i].item->flags &= ~assign_flag;
+       for (i = 0; i < from->nr; i++) {
+               struct object *from_one = from->objects[i].item;
+
+               if (from_one)
+                       from_one->flags &= ~assign_flag;
+       }
 
        return result;
 }
index 557738df271c7dd78c5ddcc65d6fe6e47c665758..4a414ee905d5de4498d1fcca2da53e7c6a07b50e 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef COMMIT_SLAB_IMPL_H
 #define COMMIT_SLAB_IMPL_H
 
-#include "git-compat-util.h"
-
 #define implement_static_commit_slab(slabname, elemtype) \
        implement_commit_slab(slabname, elemtype, MAYBE_UNUSED static)
 
index e433c33bb01fa6e3688a0b163c44d62f204d62d0..7b63d3b0e1c0f2004e463b3d5fc4ca9ff28d9684 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -2,6 +2,7 @@
 #include "tag.h"
 #include "commit.h"
 #include "commit-graph.h"
+#include "hex.h"
 #include "repository.h"
 #include "object-store.h"
 #include "pkt-line.h"
@@ -801,7 +802,8 @@ int compare_commits_by_author_date(const void *a_, const void *b_,
        return 0;
 }
 
-int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void *unused)
+int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_,
+                                           void *unused UNUSED)
 {
        const struct commit *a = a_, *b = b_;
        const timestamp_t generation_a = commit_graph_generation(a),
@@ -821,7 +823,8 @@ int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void
        return 0;
 }
 
-int compare_commits_by_commit_date(const void *a_, const void *b_, void *unused)
+int compare_commits_by_commit_date(const void *a_, const void *b_,
+                                  void *unused UNUSED)
 {
        const struct commit *a = a_, *b = b_;
        /* newer commits with larger date first */
index cc2c5da7bdb8344e9dbe69ae16092fcbf004d544..06657b4c6e7494899b4e9671f6dd08d8c5c96db1 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -205,7 +205,6 @@ void free_commit_list(struct commit_list *list);
 
 struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
 
-int has_non_ascii(const char *text);
 const char *logmsg_reencode(const struct commit *commit,
                            char **commit_encoding,
                            const char *output_encoding);
index d67b0ee50d351682f2a9e5e80c3164fa601f65e6..eb25123fa124866d7438b0dc155e8ea4932edc9f 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "strbuf.h"
 #include "fsmonitor.h"
 #include "fsmonitor-ipc.h"
index e08c505c148933ed830ae2071198999827d84d14..c9536dfb666318468612701481d7216fd3b723e9 100644 (file)
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "config.h"
 #include "fsmonitor-ipc.h"
 
index 6abbc7af3ab53cd4911edf93d91ebf18e2c5c152..58b623fbb9a3bf598e44d6fe377340d960e004f4 100644 (file)
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "config.h"
 #include "fsmonitor.h"
 #include "fsmonitor-ipc.h"
index e433740381be9cad8cd6c7453508931684832209..3afbde789449c786873733dba935eb9a00cdc04b 100644 (file)
@@ -7,6 +7,7 @@
 #include "../strbuf.h"
 #include "../run-command.h"
 #include "../cache.h"
+#include "../alloc.h"
 #include "win32/lazyload.h"
 #include "../config.h"
 #include "dir.h"
index 00090a32fc3a2bd82fe01f9060eb7b0b4f7b8ca1..0b2679994e1a387241edbc3db710ea383a6dc1db 100644 (file)
--- a/config.c
+++ b/config.c
@@ -5,11 +5,13 @@
  * Copyright (C) Johannes Schindelin, 2005
  *
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "date.h"
 #include "branch.h"
 #include "config.h"
 #include "environment.h"
+#include "ident.h"
 #include "repository.h"
 #include "lockfile.h"
 #include "exec-cmd.h"
@@ -21,6 +23,7 @@
 #include "utf8.h"
 #include "dir.h"
 #include "color.h"
+#include "replace-object.h"
 #include "refs.h"
 #include "worktree.h"
 
@@ -1683,7 +1686,7 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
                        comment_line_char = value[0];
                        auto_comment_line_char = 0;
                } else
-                       return error(_("core.commentChar should only be one character"));
+                       return error(_("core.commentChar should only be one ASCII character"));
                return 0;
        }
 
index 63e59641c0d4d5c60fc4bee2761e6acd471535a2..ed486116ee1e5f36c5fa42031e5b656d67ed5d5a 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -1,6 +1,7 @@
 #include "git-compat-util.h"
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "pkt-line.h"
 #include "quote.h"
 #include "refs.h"
@@ -30,7 +31,8 @@ static int check_ref(const char *name, unsigned int flags)
                return 0;
 
        /* REF_NORMAL means that we don't want the magic fake tag refs */
-       if ((flags & REF_NORMAL) && check_refname_format(name, 0))
+       if ((flags & REF_NORMAL) && check_refname_format(name,
+                                                        REFNAME_ALLOW_ONELEVEL))
                return 0;
 
        /* REF_HEADS means that we want regular branch heads */
@@ -1406,6 +1408,7 @@ static void fill_ssh_args(struct child_process *conn, const char *ssh_host,
  * the connection failed).
  */
 struct child_process *git_connect(int fd[2], const char *url,
+                                 const char *name,
                                  const char *prog, int flags)
 {
        char *hostandport, *path;
@@ -1415,10 +1418,11 @@ struct child_process *git_connect(int fd[2], const char *url,
 
        /*
         * NEEDSWORK: If we are trying to use protocol v2 and we are planning
-        * to perform a push, then fallback to v0 since the client doesn't know
-        * how to push yet using v2.
+        * to perform any operation that doesn't involve upload-pack (i.e., a
+        * fetch, ls-remote, etc), then fallback to v0 since we don't know how
+        * to do anything else (like push or remote archive) via v2.
         */
-       if (version == protocol_v2 && !strcmp("git-receive-pack", prog))
+       if (version == protocol_v2 && strcmp("git-upload-pack", name))
                version = protocol_v0;
 
        /* Without this we cannot rely on waitpid() to tell
index b26f7de7841838e0d6e88bb81169191f579fb56d..f41a0b4c1fb766523d6bee7964989063a6ceeaa2 100644 (file)
--- a/connect.h
+++ b/connect.h
@@ -7,7 +7,7 @@
 #define CONNECT_DIAG_URL      (1u << 1)
 #define CONNECT_IPV4          (1u << 2)
 #define CONNECT_IPV6          (1u << 3)
-struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags);
+struct child_process *git_connect(int fd[2], const char *url, const char *name, const char *prog, int flags);
 int finish_connect(struct child_process *conn);
 int git_connection_is_socket(struct child_process *conn);
 int server_supports(const char *feature);
index b90fd61790cef00d4141bb2eb30f33522e6e8c47..39cb1e1074dc6ced60e73fc625bcec0491bdd017 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "object-store.h"
 #include "run-command.h"
 #include "sigchain.h"
index 57972c2845c135dc45aeb560d289aade4caa5e5d..76ee4ab1e54965f6bf02afb5b562eb327d66ebac 100644 (file)
 #
 # If you would like a colored hint about the current dirty state, set
 # GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
-# the colored output of "git status -sb" and are available only when
-# using __git_ps1 for PROMPT_COMMAND or precmd in Bash,
-# but always available in Zsh.
+# the colored output of "git status -sb".
 #
 # If you would like __git_ps1 to do nothing in the case when the current
 # directory is set up to be ignored by git, then set
@@ -259,12 +257,12 @@ __git_ps1_colorize_gitstring ()
                local c_lblue='%F{blue}'
                local c_clear='%f'
        else
-               # Using \[ and \] around colors is necessary to prevent
+               # Using \001 and \002 around colors is necessary to prevent
                # issues with command line editing/browsing/completion!
-               local c_red='\[\e[31m\]'
-               local c_green='\[\e[32m\]'
-               local c_lblue='\[\e[1;34m\]'
-               local c_clear='\[\e[0m\]'
+               local c_red=$'\001\e[31m\002'
+               local c_green=$'\001\e[32m\002'
+               local c_lblue=$'\001\e[1;34m\002'
+               local c_clear=$'\001\e[0m\002'
        fi
        local bad_color=$c_red
        local ok_color=$c_green
@@ -574,11 +572,8 @@ __git_ps1 ()
                b="\${__git_ps1_branch_name}"
        fi
 
-       # NO color option unless in PROMPT_COMMAND mode or it's Zsh
        if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
-               if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
-                       __git_ps1_colorize_gitstring
-               fi
+               __git_ps1_colorize_gitstring
        fi
 
        local f="$h$w$i$s$u$p"
index 4655e0987b32a837e966832eaebf89ed3ea829e9..093399c788178f3d4f005fc9d580e7c030e2d40a 100644 (file)
@@ -74,9 +74,7 @@ aggregate-results-and-cleanup: $(T)
        $(MAKE) clean
 
 aggregate-results:
-       for f in '$(TEST_RESULTS_DIRECTORY_SQ)'/t*-*.counts; do \
-               echo "$$f"; \
-       done | '$(SHELL_PATH_SQ)' ../../../t/aggregate-results.sh
+       @'$(SHELL_PATH_SQ)' ../../../t/aggregate-results.sh '$(TEST_RESULTS_DIRECTORY_SQ)'
 
 valgrind:
        $(MAKE) GIT_TEST_OPTS="$(GIT_TEST_OPTS) --valgrind"
index a54d1690c083178fd0c1356c8c8c8bee5cfdbda1..349c7e4af155357417b937836da43c84111435b8 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "attr.h"
 #include "run-command.h"
index f32011343f9400a80cb9999fe75e0eeefde48146..ea40a2a410bb5b7b1294ca2a77944d9f7ca6c878 100644 (file)
@@ -23,6 +23,7 @@ void credential_clear(struct credential *c)
        free(c->username);
        free(c->password);
        string_list_clear(&c->helpers, 0);
+       strvec_clear(&c->wwwauth_headers);
 
        credential_init(c);
 }
@@ -280,6 +281,8 @@ void credential_write(const struct credential *c, FILE *fp)
                credential_write_item(fp, "password_expiry_utc", s, 0);
                free(s);
        }
+       for (size_t i = 0; i < c->wwwauth_headers.nr; i++)
+               credential_write_item(fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
 }
 
 static int run_credential_helper(struct credential *c,
index 935b28a70f16ec788e9df0126ccfb00fa86de7cd..2b5958cd431706026b243057cdb68f4274300703 100644 (file)
@@ -2,6 +2,7 @@
 #define CREDENTIAL_H
 
 #include "string-list.h"
+#include "strvec.h"
 
 /**
  * The credentials API provides an abstracted way of gathering username and
@@ -115,6 +116,20 @@ struct credential {
         */
        struct string_list helpers;
 
+       /**
+        * A `strvec` of WWW-Authenticate header values. Each string
+        * is the value of a WWW-Authenticate header in an HTTP response,
+        * in the order they were received in the response.
+        */
+       struct strvec wwwauth_headers;
+
+       /**
+        * Internal use only. Keeps track of if we previously matched against a
+        * WWW-Authenticate header line in order to re-fold future continuation
+        * lines into one value.
+        */
+       unsigned header_is_last_match:1;
+
        unsigned approved:1,
                 configured:1,
                 quit:1,
@@ -132,6 +147,7 @@ struct credential {
 #define CREDENTIAL_INIT { \
        .helpers = STRING_LIST_INIT_DUP, \
        .password_expiry_utc = TIME_MAX, \
+       .wwwauth_headers = STRVEC_INIT, \
 }
 
 /* Initialize a credential structure, setting all fields to empty. */
index 0ae7d12b5c132883907192d16c3e2f04d56a80fb..8908e7f8d2a27c4e81225f69c4a4401e0698c363 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "pkt-line.h"
 #include "run-command.h"
@@ -928,7 +929,7 @@ static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
                add_child(&cld, addr, addrlen);
 }
 
-static void child_handler(int signo)
+static void child_handler(int signo UNUSED)
 {
        /*
         * Otherwise empty handler because systemcalls will get interrupted
index 2036d15967125303effff870a45066710ef99e3e..71e79daa8259684f836f0addade83d644af91601 100644 (file)
@@ -2,7 +2,8 @@
  * decorate.c - decorate a git object with some arbitrary
  * data.
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "hashmap.h"
 #include "object.h"
 #include "decorate.h"
 
index afdec0a878d9368b134342084442317e15007a9c..fe12c93005b049b417ff77988e80bb14a9ae4494 100644 (file)
@@ -1,8 +1,10 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "attr.h"
 #include "object.h"
 #include "blob.h"
 #include "commit.h"
+#include "hex.h"
 #include "tag.h"
 #include "tree.h"
 #include "delta.h"
index 8f2656989666b67a3281d29a83f73ff82a006a1d..998f517c48869836c4c634ef9f0c129cbe2d274a 100644 (file)
@@ -4,9 +4,11 @@
 #include "archive.h"
 #include "dir.h"
 #include "help.h"
+#include "hex.h"
 #include "strvec.h"
 #include "object-store.h"
 #include "packfile.h"
+#include "parse-options.h"
 
 struct archive_dir {
        const char *path;
@@ -43,7 +45,8 @@ int option_parse_diagnose(const struct option *opt, const char *arg, int unset)
        return error(_("invalid --%s value '%s'"), opt->long_name, arg);
 }
 
-static void dir_file_stats_objects(const char *full_path, size_t full_path_len,
+static void dir_file_stats_objects(const char *full_path,
+                                  size_t full_path_len UNUSED,
                                   const char *file_name, void *data)
 {
        struct strbuf *buf = data;
index 7a4951a7863bcea8ac37e2d40d656b794f9bc925..f525219ab0cf9b36249892c847e731b952b081af 100644 (file)
@@ -2,7 +2,8 @@
 #define DIAGNOSE_H
 
 #include "strbuf.h"
-#include "parse-options.h"
+
+struct option;
 
 enum diagnose_mode {
        DIAGNOSE_NONE,
index dec040c366c82a71bc57bad9cf9db865182efe20..70b3578b907b0cd69a18c24b6bf03f8cb8dcd8d2 100644 (file)
@@ -6,6 +6,7 @@
 #include "commit.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "revision.h"
 #include "cache-tree.h"
 #include "unpack-trees.h"
index 85cbefa5afd7c00e903232011ef3d2ff7aca4a8f..ec97616db1dfaa0673945bb08a9f364b2d570db1 100644 (file)
@@ -1,5 +1,7 @@
+#include "git-compat-util.h"
 #include "diff-merges.h"
 
+#include "gettext.h"
 #include "revision.h"
 
 typedef void (*diff_merges_setup_func_t)(struct rev_info *);
index 05fafd0019b6d5acc7295b999a8a46c92e1a649e..a3cf358baf0c1e24417c57094d80e3e3ce838808 100644 (file)
@@ -13,7 +13,6 @@
 #include "diffcore.h"
 #include "revision.h"
 #include "log-tree.h"
-#include "builtin.h"
 #include "parse-options.h"
 #include "string-list.h"
 #include "dir.h"
diff --git a/diff.c b/diff.c
index 469e18aed20ed0128bfa85774cb617d455287eaa..1617aa50a983fdfe2421566efdf192d2ce87fbb3 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2,12 +2,14 @@
  * Copyright (C) 2005 Junio C Hamano
  */
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "tempfile.h"
 #include "quote.h"
 #include "diff.h"
 #include "diffcore.h"
 #include "delta.h"
+#include "hex.h"
 #include "xdiff-interface.h"
 #include "color.h"
 #include "attr.h"
@@ -3374,6 +3376,17 @@ void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const
                options->b_prefix = b;
 }
 
+void diff_set_noprefix(struct diff_options *options)
+{
+       options->a_prefix = options->b_prefix = "";
+}
+
+void diff_set_default_prefix(struct diff_options *options)
+{
+       options->a_prefix = "a/";
+       options->b_prefix = "b/";
+}
+
 struct userdiff_driver *get_textconv(struct repository *r,
                                     struct diff_filespec *one)
 {
@@ -4674,10 +4687,9 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
                options->flags.ignore_untracked_in_submodules = 1;
 
        if (diff_no_prefix) {
-               options->a_prefix = options->b_prefix = "";
+               diff_set_noprefix(options);
        } else if (!diff_mnemonic_prefix) {
-               options->a_prefix = "a/";
-               options->b_prefix = "b/";
+               diff_set_default_prefix(options);
        }
 
        options->color_moved = diff_color_moved_default;
@@ -5261,8 +5273,18 @@ static int diff_opt_no_prefix(const struct option *opt,
 
        BUG_ON_OPT_NEG(unset);
        BUG_ON_OPT_ARG(optarg);
-       options->a_prefix = "";
-       options->b_prefix = "";
+       diff_set_noprefix(options);
+       return 0;
+}
+
+static int diff_opt_default_prefix(const struct option *opt,
+                                  const char *optarg, int unset)
+{
+       struct diff_options *options = opt->value;
+
+       BUG_ON_OPT_NEG(unset);
+       BUG_ON_OPT_ARG(optarg);
+       diff_set_default_prefix(options);
        return 0;
 }
 
@@ -5555,6 +5577,9 @@ struct option *add_diff_options(const struct option *opts,
                OPT_CALLBACK_F(0, "no-prefix", options, NULL,
                               N_("do not show any source or destination prefix"),
                               PARSE_OPT_NONEG | PARSE_OPT_NOARG, diff_opt_no_prefix),
+               OPT_CALLBACK_F(0, "default-prefix", options, NULL,
+                              N_("use default prefixes a/ and b/"),
+                              PARSE_OPT_NONEG | PARSE_OPT_NOARG, diff_opt_default_prefix),
                OPT_INTEGER_F(0, "inter-hunk-context", &options->interhunkcontext,
                              N_("show context between diff hunks up to the specified number of lines"),
                              PARSE_OPT_NONEG),
diff --git a/diff.h b/diff.h
index 8d770b1d579c8ec61ce52c4ac4c9df799c509901..09627f6e84a5bfc2a2030670bc3a35a86e68d269 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -6,8 +6,8 @@
 
 #include "tree-walk.h"
 #include "pathspec.h"
-#include "object.h"
 #include "oidset.h"
+#include "strbuf.h"
 
 /**
  * The diff API is for programs that compare two sets of files (e.g. two trees,
@@ -71,7 +71,6 @@ struct oid_array;
 struct option;
 struct repository;
 struct rev_info;
-struct strbuf;
 struct userdiff_driver;
 
 typedef int (*pathchange_fn_t)(struct diff_options *options,
@@ -497,6 +496,8 @@ void diff_tree_combined(const struct object_id *oid, const struct oid_array *par
 void diff_tree_combined_merge(const struct commit *commit, struct rev_info *rev);
 
 void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const char *b);
+void diff_set_noprefix(struct diff_options *options);
+void diff_set_default_prefix(struct diff_options *options);
 
 int diff_can_quit_early(struct diff_options *);
 
index 18d8f766d70108e868a5bb21ad6c45550bb8c34d..c30b56e983bda39e18eda24bb81608ae7a33942c 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "diff.h"
 #include "diffcore.h"
 
index 19e73311f9cd830da70428439b7b6a14d5345eec..57ccab284645693322301e59b07f6fceb62d6224 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Copyright (C) 2005 Junio C Hamano
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "gettext.h"
 #include "diff.h"
 #include "diffcore.h"
 
index 03fcbcb40ba6ab42037d1c429658ed48ee40982f..13c98a7b5e7751c8db6a9d78575a9b76e0313f92 100644 (file)
@@ -2,12 +2,12 @@
  * Copyright (C) 2005 Junio C Hamano
  * Copyright (C) 2010 Google Inc.
  */
-#include "cache.h"
+#include "git-compat-util.h"
 #include "diff.h"
 #include "diffcore.h"
 #include "xdiff-interface.h"
 #include "kwset.h"
-#include "commit.h"
+#include "pretty.h"
 #include "quote.h"
 
 typedef int (*pickaxe_fn)(mmfile_t *one, mmfile_t *two,
index c0422d9e709a65d5a77d1444fcff0a4d313299bd..7e9ff96d435819307071fd9ff5cf94a0892bb510 100644 (file)
@@ -2,14 +2,19 @@
  *
  * Copyright (C) 2005 Junio C Hamano
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "diff.h"
 #include "diffcore.h"
 #include "object-store.h"
 #include "hashmap.h"
+#include "mem-pool.h"
+#include "oid-array.h"
 #include "progress.h"
 #include "promisor-remote.h"
+#include "string-list.h"
 #include "strmap.h"
+#include "trace2.h"
 
 /* Table of rename/copy destinations */
 
index 445f060ab0010ede4009b92c3d4acb0b34f644b9..533986cf632d4231fd067b244e2776a256af8e3e 100644 (file)
@@ -2,7 +2,8 @@
  * Copyright (C) 2021, Google LLC.
  * Based on diffcore-order.c, which is Copyright (C) 2005, Junio C Hamano
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "gettext.h"
 #include "diff.h"
 #include "diffcore.h"
 
index 9b588a1ee15a3bc93eaf4464f7d1e74265b2f3a2..1701ed50b9c823ffc5f06b299b92eafc7ea477a3 100644 (file)
@@ -4,9 +4,11 @@
 #ifndef DIFFCORE_H
 #define DIFFCORE_H
 
-#include "cache.h"
+#include "hash.h"
 
 struct diff_options;
+struct mem_pool;
+struct oid_array;
 struct repository;
 struct strintmap;
 struct strmap;
index cedd30475992d41fd8371d51572117c71e9e9b6c..fb7c47f0e8a9516d17ded95d70e3dabaa61264bb 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "dir.h"
 #include "iterator.h"
 #include "dir-iterator.h"
diff --git a/dir.c b/dir.c
index 4e99f0c868f3d7955c4a6f84bf22bbce0d917ae3..d5bb199f4b43ea6ad8b8f404b2221ee3b1e30cce 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -5,7 +5,8 @@
  * Copyright (C) Linus Torvalds, 2005-2006
  *              Junio Hamano, 2005-2006
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "dir.h"
 #include "object-store.h"
@@ -1190,7 +1191,7 @@ struct pattern_list *add_pattern_list(struct dir_struct *dir,
        struct pattern_list *pl;
        struct exclude_list_group *group;
 
-       group = &dir->exclude_list_group[group_type];
+       group = &dir->internal.exclude_list_group[group_type];
        ALLOC_GROW(group->pl, group->nr + 1, group->alloc);
        pl = &group->pl[group->nr++];
        memset(pl, 0, sizeof(*pl));
@@ -1211,7 +1212,7 @@ static void add_patterns_from_file_1(struct dir_struct *dir, const char *fname,
         * differently when dir->untracked is non-NULL.
         */
        if (!dir->untracked)
-               dir->unmanaged_exclude_files++;
+               dir->internal.unmanaged_exclude_files++;
        pl = add_pattern_list(dir, EXC_FILE, fname);
        if (add_patterns(fname, "", 0, pl, NULL, 0, oid_stat) < 0)
                die(_("cannot use %s as an exclude file"), fname);
@@ -1219,7 +1220,7 @@ static void add_patterns_from_file_1(struct dir_struct *dir, const char *fname,
 
 void add_patterns_from_file(struct dir_struct *dir, const char *fname)
 {
-       dir->unmanaged_exclude_files++; /* see validate_untracked_cache() */
+       dir->internal.unmanaged_exclude_files++; /* see validate_untracked_cache() */
        add_patterns_from_file_1(dir, fname, NULL);
 }
 
@@ -1519,7 +1520,7 @@ static struct path_pattern *last_matching_pattern_from_lists(
        struct exclude_list_group *group;
        struct path_pattern *pattern;
        for (i = EXC_CMDL; i <= EXC_FILE; i++) {
-               group = &dir->exclude_list_group[i];
+               group = &dir->internal.exclude_list_group[i];
                for (j = group->nr - 1; j >= 0; j--) {
                        pattern = last_matching_pattern_from_list(
                                pathname, pathlen, basename, dtype_p,
@@ -1545,20 +1546,20 @@ static void prep_exclude(struct dir_struct *dir,
        struct untracked_cache_dir *untracked;
        int current;
 
-       group = &dir->exclude_list_group[EXC_DIRS];
+       group = &dir->internal.exclude_list_group[EXC_DIRS];
 
        /*
         * Pop the exclude lists from the EXCL_DIRS exclude_list_group
         * which originate from directories not in the prefix of the
         * path being checked.
         */
-       while ((stk = dir->exclude_stack) != NULL) {
+       while ((stk = dir->internal.exclude_stack) != NULL) {
                if (stk->baselen <= baselen &&
-                   !strncmp(dir->basebuf.buf, base, stk->baselen))
+                   !strncmp(dir->internal.basebuf.buf, base, stk->baselen))
                        break;
-               pl = &group->pl[dir->exclude_stack->exclude_ix];
-               dir->exclude_stack = stk->prev;
-               dir->pattern = NULL;
+               pl = &group->pl[dir->internal.exclude_stack->exclude_ix];
+               dir->internal.exclude_stack = stk->prev;
+               dir->internal.pattern = NULL;
                free((char *)pl->src); /* see strbuf_detach() below */
                clear_pattern_list(pl);
                free(stk);
@@ -1566,7 +1567,7 @@ static void prep_exclude(struct dir_struct *dir,
        }
 
        /* Skip traversing into sub directories if the parent is excluded */
-       if (dir->pattern)
+       if (dir->internal.pattern)
                return;
 
        /*
@@ -1574,12 +1575,12 @@ static void prep_exclude(struct dir_struct *dir,
         * memset(dir, 0, sizeof(*dir)) before use. Changing all of
         * them seems lots of work for little benefit.
         */
-       if (!dir->basebuf.buf)
-               strbuf_init(&dir->basebuf, PATH_MAX);
+       if (!dir->internal.basebuf.buf)
+               strbuf_init(&dir->internal.basebuf, PATH_MAX);
 
        /* Read from the parent directories and push them down. */
        current = stk ? stk->baselen : -1;
-       strbuf_setlen(&dir->basebuf, current < 0 ? 0 : current);
+       strbuf_setlen(&dir->internal.basebuf, current < 0 ? 0 : current);
        if (dir->untracked)
                untracked = stk ? stk->ucd : dir->untracked->root;
        else
@@ -1599,32 +1600,33 @@ static void prep_exclude(struct dir_struct *dir,
                                die("oops in prep_exclude");
                        cp++;
                        untracked =
-                               lookup_untracked(dir->untracked, untracked,
+                               lookup_untracked(dir->untracked,
+                                                untracked,
                                                 base + current,
                                                 cp - base - current);
                }
-               stk->prev = dir->exclude_stack;
+               stk->prev = dir->internal.exclude_stack;
                stk->baselen = cp - base;
                stk->exclude_ix = group->nr;
                stk->ucd = untracked;
                pl = add_pattern_list(dir, EXC_DIRS, NULL);
-               strbuf_add(&dir->basebuf, base + current, stk->baselen - current);
-               assert(stk->baselen == dir->basebuf.len);
+               strbuf_add(&dir->internal.basebuf, base + current, stk->baselen - current);
+               assert(stk->baselen == dir->internal.basebuf.len);
 
                /* Abort if the directory is excluded */
                if (stk->baselen) {
                        int dt = DT_DIR;
-                       dir->basebuf.buf[stk->baselen - 1] = 0;
-                       dir->pattern = last_matching_pattern_from_lists(dir,
+                       dir->internal.basebuf.buf[stk->baselen - 1] = 0;
+                       dir->internal.pattern = last_matching_pattern_from_lists(dir,
                                                                        istate,
-                               dir->basebuf.buf, stk->baselen - 1,
-                               dir->basebuf.buf + current, &dt);
-                       dir->basebuf.buf[stk->baselen - 1] = '/';
-                       if (dir->pattern &&
-                           dir->pattern->flags & PATTERN_FLAG_NEGATIVE)
-                               dir->pattern = NULL;
-                       if (dir->pattern) {
-                               dir->exclude_stack = stk;
+                               dir->internal.basebuf.buf, stk->baselen - 1,
+                               dir->internal.basebuf.buf + current, &dt);
+                       dir->internal.basebuf.buf[stk->baselen - 1] = '/';
+                       if (dir->internal.pattern &&
+                           dir->internal.pattern->flags & PATTERN_FLAG_NEGATIVE)
+                               dir->internal.pattern = NULL;
+                       if (dir->internal.pattern) {
+                               dir->internal.exclude_stack = stk;
                                return;
                        }
                }
@@ -1647,15 +1649,15 @@ static void prep_exclude(struct dir_struct *dir,
                      */
                     !is_null_oid(&untracked->exclude_oid))) {
                        /*
-                        * dir->basebuf gets reused by the traversal, but we
-                        * need fname to remain unchanged to ensure the src
-                        * member of each struct path_pattern correctly
+                        * dir->internal.basebuf gets reused by the traversal,
+                        * but we need fname to remain unchanged to ensure the
+                        * src member of each struct path_pattern correctly
                         * back-references its source file.  Other invocations
                         * of add_pattern_list provide stable strings, so we
                         * strbuf_detach() and free() here in the caller.
                         */
                        struct strbuf sb = STRBUF_INIT;
-                       strbuf_addbuf(&sb, &dir->basebuf);
+                       strbuf_addbuf(&sb, &dir->internal.basebuf);
                        strbuf_addstr(&sb, dir->exclude_per_dir);
                        pl->src = strbuf_detach(&sb, NULL);
                        add_patterns(pl->src, pl->src, stk->baselen, pl, istate,
@@ -1681,10 +1683,10 @@ static void prep_exclude(struct dir_struct *dir,
                        invalidate_gitignore(dir->untracked, untracked);
                        oidcpy(&untracked->exclude_oid, &oid_stat.oid);
                }
-               dir->exclude_stack = stk;
+               dir->internal.exclude_stack = stk;
                current = stk->baselen;
        }
-       strbuf_setlen(&dir->basebuf, baselen);
+       strbuf_setlen(&dir->internal.basebuf, baselen);
 }
 
 /*
@@ -1704,8 +1706,8 @@ struct path_pattern *last_matching_pattern(struct dir_struct *dir,
 
        prep_exclude(dir, istate, pathname, basename-pathname);
 
-       if (dir->pattern)
-               return dir->pattern;
+       if (dir->internal.pattern)
+               return dir->internal.pattern;
 
        return last_matching_pattern_from_lists(dir, istate, pathname, pathlen,
                        basename, dtype_p);
@@ -1742,7 +1744,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir,
        if (index_file_exists(istate, pathname, len, ignore_case))
                return NULL;
 
-       ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc);
+       ALLOC_GROW(dir->entries, dir->nr+1, dir->internal.alloc);
        return dir->entries[dir->nr++] = dir_entry_new(pathname, len);
 }
 
@@ -1753,7 +1755,7 @@ struct dir_entry *dir_add_ignored(struct dir_struct *dir,
        if (!index_name_is_other(istate, pathname, len))
                return NULL;
 
-       ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc);
+       ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->internal.ignored_alloc);
        return dir->ignored[dir->ignored_nr++] = dir_entry_new(pathname, len);
 }
 
@@ -2569,7 +2571,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
 
        if (open_cached_dir(&cdir, dir, untracked, istate, &path, check_only))
                goto out;
-       dir->visited_directories++;
+       dir->internal.visited_directories++;
 
        if (untracked)
                untracked->check_only = !!check_only;
@@ -2578,7 +2580,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                /* check how the file or directory should be treated */
                state = treat_path(dir, untracked, &cdir, istate, &path,
                                   baselen, pathspec);
-               dir->visited_paths++;
+               dir->internal.visited_paths++;
 
                if (state > dir_state)
                        dir_state = state;
@@ -2586,7 +2588,8 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                /* recurse into subdir if instructed by treat_path */
                if (state == path_recurse) {
                        struct untracked_cache_dir *ud;
-                       ud = lookup_untracked(dir->untracked, untracked,
+                       ud = lookup_untracked(dir->untracked,
+                                             untracked,
                                              path.buf + baselen,
                                              path.len - baselen);
                        subdir_state =
@@ -2846,7 +2849,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
         * condition also catches running setup_standard_excludes()
         * before setting dir->untracked!
         */
-       if (dir->unmanaged_exclude_files)
+       if (dir->internal.unmanaged_exclude_files)
                return NULL;
 
        /*
@@ -2875,7 +2878,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
         * EXC_CMDL is not considered in the cache. If people set it,
         * skip the cache.
         */
-       if (dir->exclude_list_group[EXC_CMDL].nr)
+       if (dir->internal.exclude_list_group[EXC_CMDL].nr)
                return NULL;
 
        if (!ident_in_untracked(dir->untracked)) {
@@ -2935,15 +2938,15 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
 
        /* Validate $GIT_DIR/info/exclude and core.excludesfile */
        root = dir->untracked->root;
-       if (!oideq(&dir->ss_info_exclude.oid,
+       if (!oideq(&dir->internal.ss_info_exclude.oid,
                   &dir->untracked->ss_info_exclude.oid)) {
                invalidate_gitignore(dir->untracked, root);
-               dir->untracked->ss_info_exclude = dir->ss_info_exclude;
+               dir->untracked->ss_info_exclude = dir->internal.ss_info_exclude;
        }
-       if (!oideq(&dir->ss_excludes_file.oid,
+       if (!oideq(&dir->internal.ss_excludes_file.oid,
                   &dir->untracked->ss_excludes_file.oid)) {
                invalidate_gitignore(dir->untracked, root);
-               dir->untracked->ss_excludes_file = dir->ss_excludes_file;
+               dir->untracked->ss_excludes_file = dir->internal.ss_excludes_file;
        }
 
        /* Make sure this directory is not dropped out at saving phase */
@@ -2969,9 +2972,9 @@ static void emit_traversal_statistics(struct dir_struct *dir,
        }
 
        trace2_data_intmax("read_directory", repo,
-                          "directories-visited", dir->visited_directories);
+                          "directories-visited", dir->internal.visited_directories);
        trace2_data_intmax("read_directory", repo,
-                          "paths-visited", dir->visited_paths);
+                          "paths-visited", dir->internal.visited_paths);
 
        if (!dir->untracked)
                return;
@@ -2993,8 +2996,8 @@ int read_directory(struct dir_struct *dir, struct index_state *istate,
        struct untracked_cache_dir *untracked;
 
        trace2_region_enter("dir", "read_directory", istate->repo);
-       dir->visited_paths = 0;
-       dir->visited_directories = 0;
+       dir->internal.visited_paths = 0;
+       dir->internal.visited_directories = 0;
 
        if (has_symlink_leading_path(path, len)) {
                trace2_region_leave("dir", "read_directory", istate->repo);
@@ -3342,14 +3345,14 @@ void setup_standard_excludes(struct dir_struct *dir)
                excludes_file = xdg_config_home("ignore");
        if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
                add_patterns_from_file_1(dir, excludes_file,
-                                        dir->untracked ? &dir->ss_excludes_file : NULL);
+                                        dir->untracked ? &dir->internal.ss_excludes_file : NULL);
 
        /* per repository user preference */
        if (startup_info->have_repository) {
                const char *path = git_path_info_exclude();
                if (!access_or_warn(path, R_OK, 0))
                        add_patterns_from_file_1(dir, path,
-                                                dir->untracked ? &dir->ss_info_exclude : NULL);
+                                                dir->untracked ? &dir->internal.ss_info_exclude : NULL);
        }
 }
 
@@ -3405,7 +3408,7 @@ void dir_clear(struct dir_struct *dir)
        struct dir_struct new = DIR_INIT;
 
        for (i = EXC_CMDL; i <= EXC_FILE; i++) {
-               group = &dir->exclude_list_group[i];
+               group = &dir->internal.exclude_list_group[i];
                for (j = 0; j < group->nr; j++) {
                        pl = &group->pl[j];
                        if (i == EXC_DIRS)
@@ -3422,13 +3425,13 @@ void dir_clear(struct dir_struct *dir)
        free(dir->ignored);
        free(dir->entries);
 
-       stk = dir->exclude_stack;
+       stk = dir->internal.exclude_stack;
        while (stk) {
                struct exclude_stack *prev = stk->prev;
                free(stk);
                stk = prev;
        }
-       strbuf_release(&dir->basebuf);
+       strbuf_release(&dir->internal.basebuf);
 
        memcpy(dir, &new, sizeof(*dir));
 }
diff --git a/dir.h b/dir.h
index 8acfc044181ca2f47aa39bef25713b1a811e987c..3d6c87387e964311783bf749dafc450809b7d512 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -1,8 +1,9 @@
 #ifndef DIR_H
 #define DIR_H
 
-#include "cache.h"
 #include "hashmap.h"
+#include "pathspec.h"
+#include "statinfo.h"
 #include "strbuf.h"
 
 /**
@@ -212,17 +213,6 @@ struct untracked_cache {
  */
 struct dir_struct {
 
-       /* The number of members in `entries[]` array. */
-       int nr;
-
-       /* Internal use; keeps track of allocation of `entries[]` array.*/
-       int alloc;
-
-       /* The number of members in `ignored[]` array. */
-       int ignored_nr;
-
-       int ignored_alloc;
-
        /* bit-field of options */
        enum {
 
@@ -287,60 +277,81 @@ struct dir_struct {
                DIR_SKIP_NESTED_GIT = 1<<9
        } flags;
 
+       /* The number of members in `entries[]` array. */
+       int nr; /* output only */
+
+       /* The number of members in `ignored[]` array. */
+       int ignored_nr; /* output only */
+
        /* An array of `struct dir_entry`, each element of which describes a path. */
-       struct dir_entry **entries;
+       struct dir_entry **entries; /* output only */
 
        /**
         * used for ignored paths with the `DIR_SHOW_IGNORED_TOO` and
         * `DIR_COLLECT_IGNORED` flags.
         */
-       struct dir_entry **ignored;
+       struct dir_entry **ignored; /* output only */
+
+       /* Enable/update untracked file cache if set */
+       struct untracked_cache *untracked;
 
        /**
-        * The name of the file to be read in each directory for excluded files
-        * (typically `.gitignore`).
+        * Deprecated: ls-files is the only allowed caller; all other callers
+        * should leave this as NULL; it pre-dated the
+        * setup_standard_excludes() mechanism that replaces this.
+        *
+        * This field tracks the name of the file to be read in each directory
+        * for excluded files (typically `.gitignore`).
         */
        const char *exclude_per_dir;
 
-       /*
-        * We maintain three groups of exclude pattern lists:
-        *
-        * EXC_CMDL lists patterns explicitly given on the command line.
-        * EXC_DIRS lists patterns obtained from per-directory ignore files.
-        * EXC_FILE lists patterns from fallback ignore files, e.g.
-        *   - .git/info/exclude
-        *   - core.excludesfile
-        *
-        * Each group contains multiple exclude lists, a single list
-        * per source.
-        */
+       struct dir_struct_internal {
+               /* Keeps track of allocation of `entries[]` array.*/
+               int alloc;
+
+               /* Keeps track of allocation of `ignored[]` array. */
+               int ignored_alloc;
+
+               /*
+                * We maintain three groups of exclude pattern lists:
+                *
+                * EXC_CMDL lists patterns explicitly given on the command line.
+                * EXC_DIRS lists patterns obtained from per-directory ignore
+                *          files.
+                * EXC_FILE lists patterns from fallback ignore files, e.g.
+                *   - .git/info/exclude
+                *   - core.excludesfile
+                *
+                * Each group contains multiple exclude lists, a single list
+                * per source.
+                */
 #define EXC_CMDL 0
 #define EXC_DIRS 1
 #define EXC_FILE 2
-       struct exclude_list_group exclude_list_group[3];
-
-       /*
-        * Temporary variables which are used during loading of the
-        * per-directory exclude lists.
-        *
-        * exclude_stack points to the top of the exclude_stack, and
-        * basebuf contains the full path to the current
-        * (sub)directory in the traversal. Exclude points to the
-        * matching exclude struct if the directory is excluded.
-        */
-       struct exclude_stack *exclude_stack;
-       struct path_pattern *pattern;
-       struct strbuf basebuf;
+               struct exclude_list_group exclude_list_group[3];
 
-       /* Enable untracked file cache if set */
-       struct untracked_cache *untracked;
-       struct oid_stat ss_info_exclude;
-       struct oid_stat ss_excludes_file;
-       unsigned unmanaged_exclude_files;
-
-       /* Stats about the traversal */
-       unsigned visited_paths;
-       unsigned visited_directories;
+               /*
+                * Temporary variables which are used during loading of the
+                * per-directory exclude lists.
+                *
+                * exclude_stack points to the top of the exclude_stack, and
+                * basebuf contains the full path to the current
+                * (sub)directory in the traversal. Exclude points to the
+                * matching exclude struct if the directory is excluded.
+                */
+               struct exclude_stack *exclude_stack;
+               struct path_pattern *pattern;
+               struct strbuf basebuf;
+
+               /* Additional metadata related to 'untracked' */
+               struct oid_stat ss_info_exclude;
+               struct oid_stat ss_excludes_file;
+               unsigned unmanaged_exclude_files;
+
+               /* Stats about the traversal */
+               unsigned visited_paths;
+               unsigned visited_directories;
+       } internal;
 };
 
 #define DIR_INIT { 0 }
@@ -363,10 +374,6 @@ int count_slashes(const char *s);
 int simple_length(const char *match);
 int no_wildcard(const char *string);
 char *common_prefix(const struct pathspec *pathspec);
-int match_pathspec(struct index_state *istate,
-                  const struct pathspec *pathspec,
-                  const char *name, int namelen,
-                  int prefix, char *seen, int is_dir);
 int report_path_error(const char *ps_matched, const struct pathspec *pathspec);
 int within_depth(const char *name, int namelen, int depth, int max_depth);
 
@@ -533,15 +540,6 @@ int submodule_path_match(struct index_state *istate,
                         const char *submodule_name,
                         char *seen);
 
-static inline int ce_path_match(struct index_state *istate,
-                               const struct cache_entry *ce,
-                               const struct pathspec *pathspec,
-                               char *seen)
-{
-       return match_pathspec(istate, pathspec, ce->name, ce_namelen(ce), 0, seen,
-                             S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode));
-}
-
 static inline int dir_path_match(struct index_state *istate,
                                 const struct dir_entry *ent,
                                 const struct pathspec *pathspec,
diff --git a/entry.c b/entry.c
index 971ab268714b96cdaa179ae7589c8377ff728e74..c97cfa833bbd253a6b0d5153ddacaa6cf66f3989 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -2,6 +2,7 @@
 #include "blob.h"
 #include "object-store.h"
 #include "dir.h"
+#include "hex.h"
 #include "streaming.h"
 #include "submodule.h"
 #include "progress.h"
diff --git a/entry.h b/entry.h
index 2d4fbb88c8ffabbd36faec0247d5a39a30f99c4f..7329f918a97ee3f80aeeaff07e4236143fcf3cbf 100644 (file)
--- a/entry.h
+++ b/entry.h
@@ -1,9 +1,11 @@
 #ifndef ENTRY_H
 #define ENTRY_H
 
-#include "cache.h"
 #include "convert.h"
 
+struct cache_entry;
+struct index_state;
+
 struct checkout {
        struct index_state *istate;
        const char *base_dir;
index 1ee3686fd8a34270db8d47738f2ea12fcdbc1976..89d89110e4190c8220c13469c3c72c1a5f6f8f6d 100644 (file)
@@ -17,6 +17,7 @@
 #include "commit.h"
 #include "strvec.h"
 #include "object-store.h"
+#include "replace-object.h"
 #include "tmp-objdir.h"
 #include "chdir-notify.h"
 #include "shallow.h"
index ac618641632f8c347b2a2900fb15b0de9ed8dd8a..12d6aa398e907f83eeaee9e9635ccbf11220ce35 100644 (file)
@@ -16,7 +16,8 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "ewok.h"
 
 #define EWAH_MASK(x) ((eword_t)1 << (x % BITS_IN_EWORD))
index 6fe48d3ae0449a0298deb109b967ef3479ef0c47..c6d4ffc87cacaaaefb3edf4f81f62f7481b4b742 100644 (file)
@@ -17,9 +17,9 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 #include "git-compat-util.h"
+#include "alloc.h"
 #include "ewok.h"
 #include "ewok_rlw.h"
-#include "cache.h"
 
 static inline size_t min_size(size_t a, size_t b)
 {
index 04016d1e3250f28ae6cd53a784913f02879769d8..4ddabb4ec765ae3b29b72cd19394aea8f65fc8e4 100644 (file)
@@ -1,6 +1,8 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "repository.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "refs.h"
 #include "pkt-line.h"
@@ -722,7 +724,7 @@ static void filter_refs(struct fetch_pack_args *args,
        *refs = newlist;
 }
 
-static void mark_alternate_complete(struct fetch_negotiator *unused,
+static void mark_alternate_complete(struct fetch_negotiator *negotiator UNUSED,
                                    struct object *obj)
 {
        mark_complete(&obj->oid);
index f48f44f9cd1dbdd3aeafbe5a4bd3598e783d0e25..24cc44bdbc9070d699447e10fc3e03bd8b71965f 100644 (file)
@@ -1,8 +1,11 @@
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "refs.h"
 #include "object-store.h"
 #include "diff.h"
 #include "diff-merges.h"
+#include "hex.h"
 #include "revision.h"
 #include "tag.h"
 #include "string-list.h"
@@ -17,8 +20,6 @@ static struct string_list suppress_dest_patterns = STRING_LIST_INIT_DUP;
 
 int fmt_merge_msg_config(const char *key, const char *value, void *cb)
 {
-       int status = 0;
-
        if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) {
                int is_bool;
                merge_log_config = git_config_bool_or_int(key, value, &is_bool);
@@ -37,9 +38,6 @@ int fmt_merge_msg_config(const char *key, const char *value, void *cb)
                        string_list_append(&suppress_dest_patterns, value);
                suppress_dest_pattern_seen = 1;
        } else {
-               status = git_gpg_config(key, value, NULL);
-               if (status)
-                       return status;
                return git_default_config(key, value, cb);
        }
        return 0;
diff --git a/fsck.c b/fsck.c
index 2b18717ee805bc73aa50943731ac9a7212303d18..871c0a9a2522cdf1abd16ceef4d224d12fcb7d2e 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "object-store.h"
 #include "repository.h"
 #include "object.h"
diff --git a/fsck.h b/fsck.h
index 668330880ef65f72ba4e9d38487152cc28c205a1..e17730e9da94053f39f1610e8cd81ab80bbf8a9f 100644 (file)
--- a/fsck.h
+++ b/fsck.h
@@ -1,6 +1,7 @@
 #ifndef GIT_FSCK_H
 #define GIT_FSCK_H
 
+#include "object.h"
 #include "oidset.h"
 
 enum fsck_msg_type {
index 899bfe9c8138e1ae46f1fd0f0dfc7aebba05b81a..b62acf44aee2b9c029fac4389f6af7e4c4df6dab 100644 (file)
@@ -1,5 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
+#include "gettext.h"
 #include "repository.h"
 #include "fsmonitor-ipc.h"
 #include "fsmonitor-settings.h"
index edf7ce5203b1a850e26c4b81cdb565350cd7f748..778707b131ba01f8a800ab4f3253b1b841709d1d 100644 (file)
@@ -86,7 +86,7 @@ static inline void mark_fsmonitor_valid(struct index_state *istate, struct cache
            !(ce->ce_flags & CE_FSMONITOR_VALID)) {
                if (S_ISGITLINK(ce->ce_mode))
                        return;
-               istate->cache_changed = 1;
+               istate->cache_changed |= FSMONITOR_CHANGED;
                ce->ce_flags |= CE_FSMONITOR_VALID;
                trace_printf_key(&trace_fsmonitor, "mark_fsmonitor_clean '%s'", ce->name);
        }
index 4f0028ce60ce44ca7febc1fe78dda77b5a793a01..4a200a9fb41123e1d945ae9a397f09d7c0456367 100644 (file)
@@ -339,6 +339,25 @@ static inline const char *precompose_string_if_needed(const char *in)
 int compat_mkdir_wo_trailing_slash(const char*, mode_t);
 #endif
 
+#ifdef time
+#undef time
+#endif
+static inline time_t git_time(time_t *tloc)
+{
+       struct timeval tv;
+
+       /*
+        * Avoid time(NULL), which can disagree with gettimeofday(2)
+        * and filesystem timestamps.
+        */
+       gettimeofday(&tv, NULL);
+
+       if (tloc)
+               *tloc = tv.tv_sec;
+       return tv.tv_sec;
+}
+#define time git_time
+
 #ifdef NO_STRUCT_ITIMERVAL
 struct itimerval {
        struct timeval it_interval;
@@ -1225,6 +1244,7 @@ extern const unsigned char tolower_trans_tbl[256];
 #undef isxdigit
 
 extern const unsigned char sane_ctype[256];
+extern const signed char hexval_table[256];
 #define GIT_SPACE 0x01
 #define GIT_DIGIT 0x02
 #define GIT_ALPHA 0x04
@@ -1287,6 +1307,25 @@ static inline int skip_iprefix(const char *str, const char *prefix,
        return 0;
 }
 
+/*
+ * Like skip_prefix_mem, but compare case-insensitively. Note that the
+ * comparison is done via tolower(), so it is strictly ASCII (no multi-byte
+ * characters or locale-specific conversions).
+ */
+static inline int skip_iprefix_mem(const char *buf, size_t len,
+                                  const char *prefix,
+                                  const char **out, size_t *outlen)
+{
+       do {
+               if (!*prefix) {
+                       *out = buf;
+                       *outlen = len;
+                       return 1;
+               }
+       } while (len-- > 0 && tolower(*buf++) == tolower(*prefix++));
+       return 0;
+}
+
 static inline int strtoul_ui(char const *s, int base, unsigned int *result)
 {
        unsigned long ul;
diff --git a/git.c b/git.c
index 6171fd6769d715df1ce232bcac6d2465eca847dd..ae2134f29a803f6ea4d68af9cba3c5ca3cfec325 100644 (file)
--- a/git.c
+++ b/git.c
@@ -4,6 +4,7 @@
 #include "help.h"
 #include "run-command.h"
 #include "alias.h"
+#include "replace-object.h"
 #include "shallow.h"
 
 #define RUN_SETUP              (1<<0)
index 5cd66d3a7864a443ed74ce0ae9e08b31673047c2..855970bb939fb84c09d9b52c4afbc0b7689f9956 100644 (file)
@@ -4,11 +4,24 @@
 #include "run-command.h"
 #include "strbuf.h"
 #include "dir.h"
+#include "ident.h"
 #include "gpg-interface.h"
 #include "sigchain.h"
 #include "tempfile.h"
 #include "alias.h"
 
+static int git_gpg_config(const char *, const char *, void *);
+
+static void gpg_interface_lazy_init(void)
+{
+       static int done;
+
+       if (done)
+               return;
+       done = 1;
+       git_config(git_gpg_config, NULL);
+}
+
 static char *configured_signing_key;
 static const char *ssh_default_key_command, *ssh_allowed_signers, *ssh_revocation_file;
 static enum signature_trust_level configured_min_trust_level = TRUST_UNDEFINED;
@@ -632,6 +645,8 @@ int check_signature(struct signature_check *sigc,
        struct gpg_format *fmt;
        int status;
 
+       gpg_interface_lazy_init();
+
        sigc->result = 'N';
        sigc->trust_level = -1;
 
@@ -695,11 +710,13 @@ int parse_signature(const char *buf, size_t size, struct strbuf *payload, struct
 
 void set_signing_key(const char *key)
 {
+       gpg_interface_lazy_init();
+
        free(configured_signing_key);
        configured_signing_key = xstrdup(key);
 }
 
-int git_gpg_config(const char *var, const char *value, void *cb UNUSED)
+static int git_gpg_config(const char *var, const char *value, void *cb UNUSED)
 {
        struct gpg_format *fmt = NULL;
        char *fmtname = NULL;
@@ -888,6 +905,8 @@ static const char *get_ssh_key_id(void) {
 /* Returns a textual but unique representation of the signing key */
 const char *get_signing_key_id(void)
 {
+       gpg_interface_lazy_init();
+
        if (use_format->get_key_id) {
                return use_format->get_key_id();
        }
@@ -898,6 +917,8 @@ const char *get_signing_key_id(void)
 
 const char *get_signing_key(void)
 {
+       gpg_interface_lazy_init();
+
        if (configured_signing_key)
                return configured_signing_key;
        if (use_format->get_default_key) {
@@ -923,6 +944,8 @@ const char *gpg_trust_level_to_str(enum signature_trust_level level)
 
 int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
 {
+       gpg_interface_lazy_init();
+
        return use_format->sign_buffer(buffer, signature, signing_key);
 }
 
index 8a9ef41779e2fe91305dcb1b13cf66a282446cf6..143cdc1c02d4b31fa08f92fbcae1691c80d2c2d6 100644 (file)
@@ -79,7 +79,6 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature,
  */
 const char *gpg_trust_level_to_str(enum signature_trust_level level);
 
-int git_gpg_config(const char *, const char *, void *);
 void set_signing_key(const char *);
 const char *get_signing_key(void);
 
diff --git a/graph.c b/graph.c
index 568b6e7cd41512d17cc68e0595675ee858165164..2a9dc430fae105c8d6fb5a8763320ae40fb1e5c8 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "gettext.h"
 #include "config.h"
 #include "commit.h"
 #include "color.h"
diff --git a/grep.c b/grep.c
index cee44a78d044dad174f5560b14432b396d6fdfb4..25dc2ec78841b9e97103c267f37db665bb4d4149 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "config.h"
 #include "grep.h"
+#include "hex.h"
 #include "object-store.h"
 #include "userdiff.h"
 #include "xdiff-interface.h"
@@ -320,6 +321,15 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
        if (!opt->ignore_locale && is_utf8_locale() && !literal)
                options |= (PCRE2_UTF | PCRE2_UCP | PCRE2_MATCH_INVALID_UTF);
 
+#ifndef GIT_PCRE2_VERSION_10_35_OR_HIGHER
+       /*
+        * Work around a JIT bug related to invalid Unicode character handling
+        * fixed in 10.35:
+        * https://github.com/PCRE2Project/pcre2/commit/c21bd977547d
+        */
+       options &= ~PCRE2_UCP;
+#endif
+
 #ifndef GIT_PCRE2_VERSION_10_36_OR_HIGHER
        /* Work around https://bugs.exim.org/show_bug.cgi?id=2642 fixed in 10.36 */
        if (PCRE2_MATCH_INVALID_UTF && options & (PCRE2_UTF | PCRE2_CASELESS))
diff --git a/grep.h b/grep.h
index 6075f997e68f5594f771123ae62655181278d38e..c59592e3bdba5205befb38b5a19881ba3c6c9ce2 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -7,6 +7,9 @@
 #if (PCRE2_MAJOR >= 10 && PCRE2_MINOR >= 36) || PCRE2_MAJOR >= 11
 #define GIT_PCRE2_VERSION_10_36_OR_HIGHER
 #endif
+#if (PCRE2_MAJOR >= 10 && PCRE2_MINOR >= 35) || PCRE2_MAJOR >= 11
+#define GIT_PCRE2_VERSION_10_35_OR_HIGHER
+#endif
 #if (PCRE2_MAJOR >= 10 && PCRE2_MINOR >= 34) || PCRE2_MAJOR >= 11
 #define GIT_PCRE2_VERSION_10_34_OR_HIGHER
 #endif
diff --git a/hash.h b/hash.h
index 36b64165fc96375457415a6348eeebd2944c41f9..d39f73618cb8d9e8678ccf3d0794fbef1a55243c 100644 (file)
--- a/hash.h
+++ b/hash.h
@@ -1,7 +1,6 @@
 #ifndef HASH_H
 #define HASH_H
 
-#include "git-compat-util.h"
 #include "repository.h"
 
 #if defined(SHA1_APPLE)
@@ -124,6 +123,40 @@ struct object_id {
        int algo;       /* XXX requires 4-byte alignment */
 };
 
+#define GET_OID_QUIETLY           01
+#define GET_OID_COMMIT            02
+#define GET_OID_COMMITTISH        04
+#define GET_OID_TREE             010
+#define GET_OID_TREEISH          020
+#define GET_OID_BLOB             040
+#define GET_OID_FOLLOW_SYMLINKS 0100
+#define GET_OID_RECORD_PATH     0200
+#define GET_OID_ONLY_TO_DIE    04000
+#define GET_OID_REQUIRE_PATH  010000
+
+#define GET_OID_DISAMBIGUATORS \
+       (GET_OID_COMMIT | GET_OID_COMMITTISH | \
+       GET_OID_TREE | GET_OID_TREEISH | \
+       GET_OID_BLOB)
+
+enum get_oid_result {
+       FOUND = 0,
+       MISSING_OBJECT = -1, /* The requested object is missing */
+       SHORT_NAME_AMBIGUOUS = -2,
+       /* The following only apply when symlinks are followed */
+       DANGLING_SYMLINK = -4, /*
+                               * The initial symlink is there, but
+                               * (transitively) points to a missing
+                               * in-tree file
+                               */
+       SYMLINK_LOOP = -5,
+       NOT_DIR = -6, /*
+                      * Somewhere along the symlink chain, a path is
+                      * requested which contains a file as a
+                      * non-final element.
+                      */
+};
+
 /* A suitably aligned type for stack allocations of hash contexts. */
 union git_hash_ctx {
        git_SHA_CTX sha1;
index cf5fea87eb02bf753d408f1eeb00f5de2a02e907..ee45ef00852c86b5f0fe0de8177c806c53d7efa0 100644 (file)
--- a/hashmap.c
+++ b/hashmap.c
@@ -1,7 +1,7 @@
 /*
  * Generic implementation of hash-based key value mappings.
  */
-#include "cache.h"
+#include "git-compat-util.h"
 #include "hashmap.h"
 
 #define FNV32_BASE ((unsigned int) 0x811c9dc5)
index 7251687d730d608437a8ed24e4551cf9344fd7f4..e2cf9c78d84ff3046844af498b9539d1edb83445 100644 (file)
--- a/hashmap.h
+++ b/hashmap.h
@@ -270,7 +270,7 @@ void hashmap_clear_(struct hashmap *map, ssize_t offset);
 #define hashmap_clear(map) hashmap_clear_(map, -1)
 
 /*
- * Similar to hashmap_clear(), except that the table is no deallocated; it
+ * Similar to hashmap_clear(), except that the table is not deallocated; it
  * is merely zeroed out but left the same size as before.  If the hashmap
  * will be reused, this avoids the overhead of deallocating and
  * reallocating map->table.  As with hashmap_clear(), you may need to free
diff --git a/help.c b/help.c
index 812af4cdea62129c12ec33813d934d677c61d714..5d7637dce92867c1c0bee7f6f6b904852d237222 100644 (file)
--- a/help.c
+++ b/help.c
@@ -1,9 +1,11 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "builtin.h"
 #include "exec-cmd.h"
 #include "run-command.h"
 #include "levenshtein.h"
+#include "gettext.h"
 #include "help.h"
 #include "command-list.h"
 #include "string-list.h"
@@ -540,7 +542,8 @@ static struct cmdnames aliases;
 #define AUTOCORRECT_NEVER (-2)
 #define AUTOCORRECT_IMMEDIATELY (-1)
 
-static int git_unknown_cmd_config(const char *var, const char *value, void *cb)
+static int git_unknown_cmd_config(const char *var, const char *value,
+                                 void *cb UNUSED)
 {
        const char *p;
 
diff --git a/hex.c b/hex.c
index 4f64d34696379d35e7ace281a5d471f55f1737ad..0a1bddc1284320fa4709715d53a6d59905cc3d8c 100644 (file)
--- a/hex.c
+++ b/hex.c
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "hex.h"
 
 const signed char hexval_table[256] = {
         -1, -1, -1, -1, -1, -1, -1, -1,                /* 00-07 */
diff --git a/hex.h b/hex.h
new file mode 100644 (file)
index 0000000..e2abfc5
--- /dev/null
+++ b/hex.h
@@ -0,0 +1,84 @@
+#ifndef HEX_H
+#define HEX_H
+
+#include "hash.h"
+
+extern const signed char hexval_table[256];
+static inline unsigned int hexval(unsigned char c)
+{
+       return hexval_table[c];
+}
+
+/*
+ * Convert two consecutive hexadecimal digits into a char.  Return a
+ * negative value on error.  Don't run over the end of short strings.
+ */
+static inline int hex2chr(const char *s)
+{
+       unsigned int val = hexval(s[0]);
+       return (val & ~0xf) ? val : (val << 4) | hexval(s[1]);
+}
+
+/*
+ * Try to read a SHA1 in hexadecimal format from the 40 characters
+ * starting at hex.  Write the 20-byte result to sha1 in binary form.
+ * Return 0 on success.  Reading stops if a NUL is encountered in the
+ * input, so it is safe to pass this function an arbitrary
+ * null-terminated string.
+ */
+int get_sha1_hex(const char *hex, unsigned char *sha1);
+int get_oid_hex(const char *hex, struct object_id *sha1);
+
+/* Like get_oid_hex, but for an arbitrary hash algorithm. */
+int get_oid_hex_algop(const char *hex, struct object_id *oid, const struct git_hash_algo *algop);
+
+/*
+ * Read `len` pairs of hexadecimal digits from `hex` and write the
+ * values to `binary` as `len` bytes. Return 0 on success, or -1 if
+ * the input does not consist of hex digits).
+ */
+int hex_to_bytes(unsigned char *binary, const char *hex, size_t len);
+
+/*
+ * Convert a binary hash in "unsigned char []" or an object name in
+ * "struct object_id *" to its hex equivalent. The `_r` variant is reentrant,
+ * and writes the NUL-terminated output to the buffer `out`, which must be at
+ * least `GIT_MAX_HEXSZ + 1` bytes, and returns a pointer to out for
+ * convenience.
+ *
+ * The non-`_r` variant returns a static buffer, but uses a ring of 4
+ * buffers, making it safe to make multiple calls for a single statement, like:
+ *
+ *   printf("%s -> %s", hash_to_hex(one), hash_to_hex(two));
+ *   printf("%s -> %s", oid_to_hex(one), oid_to_hex(two));
+ */
+char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash, const struct git_hash_algo *);
+char *oid_to_hex_r(char *out, const struct object_id *oid);
+char *hash_to_hex_algop(const unsigned char *hash, const struct git_hash_algo *);      /* static buffer result! */
+char *hash_to_hex(const unsigned char *hash);                                          /* same static buffer */
+char *oid_to_hex(const struct object_id *oid);                                         /* same static buffer */
+
+/*
+ * Parse a 40-character hexadecimal object ID starting from hex, updating the
+ * pointer specified by end when parsing stops.  The resulting object ID is
+ * stored in oid.  Returns 0 on success.  Parsing will stop on the first NUL or
+ * other invalid character.  end is only updated on success; otherwise, it is
+ * unmodified.
+ */
+int parse_oid_hex(const char *hex, struct object_id *oid, const char **end);
+
+/* Like parse_oid_hex, but for an arbitrary hash algorithm. */
+int parse_oid_hex_algop(const char *hex, struct object_id *oid, const char **end,
+                       const struct git_hash_algo *algo);
+
+
+/*
+ * These functions work like get_oid_hex and parse_oid_hex, but they will parse
+ * a hex value for any algorithm. The algorithm is detected based on the length
+ * and the algorithm in use is returned. If this is not a hex object ID in any
+ * algorithm, returns GIT_HASH_UNKNOWN.
+ */
+int get_oid_hex_any(const char *hex, struct object_id *oid);
+int parse_oid_hex_any(const char *hex, struct object_id *oid, const char **end);
+
+#endif
diff --git a/hook.c b/hook.c
index 1a8483186349b00608d40bc3d8702aa39ffb79c8..76e322f5804852ee44850fcf8339efc1ce785260 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -1,7 +1,10 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "advice.h"
+#include "gettext.h"
 #include "hook.h"
 #include "run-command.h"
 #include "config.h"
+#include "strbuf.h"
 
 const char *find_hook(const char *name)
 {
@@ -43,9 +46,9 @@ int hook_exists(const char *name)
 }
 
 static int pick_next_hook(struct child_process *cp,
-                         struct strbuf *out,
+                         struct strbuf *out UNUSED,
                          void *pp_cb,
-                         void **pp_task_cb)
+                         void **pp_task_cb UNUSED)
 {
        struct hook_cb_data *hook_cb = pp_cb;
        const char *hook_path = hook_cb->hook_path;
@@ -77,9 +80,9 @@ static int pick_next_hook(struct child_process *cp,
        return 1;
 }
 
-static int notify_start_failure(struct strbuf *out,
+static int notify_start_failure(struct strbuf *out UNUSED,
                                void *pp_cb,
-                               void *pp_task_cp)
+                               void *pp_task_cp UNUSED)
 {
        struct hook_cb_data *hook_cb = pp_cb;
 
@@ -89,9 +92,9 @@ static int notify_start_failure(struct strbuf *out,
 }
 
 static int notify_hook_finished(int result,
-                               struct strbuf *out,
+                               struct strbuf *out UNUSED,
                                void *pp_cb,
-                               void *pp_task_cb)
+                               void *pp_task_cb UNUSED)
 {
        struct hook_cb_data *hook_cb = pp_cb;
        struct run_hooks_opt *opt = hook_cb->options;
index 8ab58e55f8524851fa77e047e9b9a5dfd31eb6bd..9cfc6f25414b5cc40b7b1e4389339f47aead50b0 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "repository.h"
 #include "refs.h"
 #include "pkt-line.h"
@@ -524,7 +526,7 @@ static int show_text_ref(const char *name, const struct object_id *oid,
        return 0;
 }
 
-static void get_info_refs(struct strbuf *hdr, char *arg)
+static void get_info_refs(struct strbuf *hdr, char *arg UNUSED)
 {
        const char *service_name = get_parameter("service");
        struct strbuf buf = STRBUF_INIT;
@@ -578,7 +580,7 @@ static int show_head_ref(const char *refname, const struct object_id *oid,
        return 0;
 }
 
-static void get_head(struct strbuf *hdr, char *arg)
+static void get_head(struct strbuf *hdr, char *arg UNUSED)
 {
        struct strbuf buf = STRBUF_INIT;
 
@@ -588,7 +590,7 @@ static void get_head(struct strbuf *hdr, char *arg)
        strbuf_release(&buf);
 }
 
-static void get_info_packs(struct strbuf *hdr, char *arg)
+static void get_info_packs(struct strbuf *hdr, char *arg UNUSED)
 {
        size_t objdirlen = strlen(get_object_directory());
        struct strbuf buf = STRBUF_INIT;
@@ -736,7 +738,7 @@ static int bad_request(struct strbuf *hdr, const struct service_cmd *c)
        return 0;
 }
 
-int cmd_main(int argc, const char **argv)
+int cmd_main(int argc UNUSED, const char **argv UNUSED)
 {
        char *method = getenv("REQUEST_METHOD");
        const char *proto_header;
index 258fec2068262c815ae68b08c8729b0bc60ee498..8db35b9767d4936749675f275e41f6b7260a84b7 100644 (file)
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "config.h"
 #include "exec-cmd.h"
+#include "hex.h"
 #include "http.h"
 #include "walker.h"
 #include "strvec.h"
index 7f71316456c6832daa28bfc054f53b3224bf970f..88aa045ecba453eaab7f56c02c54a972ab07fd7c 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "repository.h"
 #include "commit.h"
 #include "tag.h"
index b8f0f98ae146999adf3770cc7338cbacbbbf8cb3..c3e902c40e654d86b8e2cefe2d8ccd6a475d3e5e 100644 (file)
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "repository.h"
 #include "commit.h"
+#include "hex.h"
 #include "walker.h"
 #include "http.h"
 #include "list.h"
diff --git a/http.c b/http.c
index c4b6ddef287b90f6492706cdaa483c1832d8b06c..dbe4d29ef7abb87bf4a9cba21558745975ac795f 100644 (file)
--- a/http.c
+++ b/http.c
@@ -1,5 +1,6 @@
 #include "git-compat-util.h"
 #include "git-curl-compat.h"
+#include "hex.h"
 #include "http.h"
 #include "config.h"
 #include "pack.h"
@@ -181,6 +182,115 @@ size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
        return nmemb;
 }
 
+/*
+ * A folded header continuation line starts with any number of spaces or
+ * horizontal tab characters (SP or HTAB) as per RFC 7230 section 3.2.
+ * It is not a continuation line if the line starts with any other character.
+ */
+static inline int is_hdr_continuation(const char *ptr, const size_t size)
+{
+       return size && (*ptr == ' ' || *ptr == '\t');
+}
+
+static size_t fwrite_wwwauth(char *ptr, size_t eltsize, size_t nmemb, void *p)
+{
+       size_t size = eltsize * nmemb;
+       struct strvec *values = &http_auth.wwwauth_headers;
+       struct strbuf buf = STRBUF_INIT;
+       const char *val;
+       size_t val_len;
+
+       /*
+        * Header lines may not come NULL-terminated from libcurl so we must
+        * limit all scans to the maximum length of the header line, or leverage
+        * strbufs for all operations.
+        *
+        * In addition, it is possible that header values can be split over
+        * multiple lines as per RFC 7230. 'Line folding' has been deprecated
+        * but older servers may still emit them. A continuation header field
+        * value is identified as starting with a space or horizontal tab.
+        *
+        * The formal definition of a header field as given in RFC 7230 is:
+        *
+        * header-field   = field-name ":" OWS field-value OWS
+        *
+        * field-name     = token
+        * field-value    = *( field-content / obs-fold )
+        * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
+        * field-vchar    = VCHAR / obs-text
+        *
+        * obs-fold       = CRLF 1*( SP / HTAB )
+        *                ; obsolete line folding
+        *                ; see Section 3.2.4
+        */
+
+       /* Start of a new WWW-Authenticate header */
+       if (skip_iprefix_mem(ptr, size, "www-authenticate:", &val, &val_len)) {
+               strbuf_add(&buf, val, val_len);
+
+               /*
+                * Strip the CRLF that should be present at the end of each
+                * field as well as any trailing or leading whitespace from the
+                * value.
+                */
+               strbuf_trim(&buf);
+
+               strvec_push(values, buf.buf);
+               http_auth.header_is_last_match = 1;
+               goto exit;
+       }
+
+       /*
+        * This line could be a continuation of the previously matched header
+        * field. If this is the case then we should append this value to the
+        * end of the previously consumed value.
+        */
+       if (http_auth.header_is_last_match && is_hdr_continuation(ptr, size)) {
+               /*
+                * Trim the CRLF and any leading or trailing from this line.
+                */
+               strbuf_add(&buf, ptr, size);
+               strbuf_trim(&buf);
+
+               /*
+                * At this point we should always have at least one existing
+                * value, even if it is empty. Do not bother appending the new
+                * value if this continuation header is itself empty.
+                */
+               if (!values->nr) {
+                       BUG("should have at least one existing header value");
+               } else if (buf.len) {
+                       char *prev = xstrdup(values->v[values->nr - 1]);
+
+                       /* Join two non-empty values with a single space. */
+                       const char *const sp = *prev ? " " : "";
+
+                       strvec_pop(values);
+                       strvec_pushf(values, "%s%s%s", prev, sp, buf.buf);
+                       free(prev);
+               }
+
+               goto exit;
+       }
+
+       /* Not a continuation of a previously matched auth header line. */
+       http_auth.header_is_last_match = 0;
+
+       /*
+        * If this is a HTTP status line and not a header field, this signals
+        * a different HTTP response. libcurl writes all the output of all
+        * response headers of all responses, including redirects.
+        * We only care about the last HTTP request response's headers so clear
+        * the existing array.
+        */
+       if (skip_iprefix_mem(ptr, size, "http/", &val, &val_len))
+               strvec_clear(values);
+
+exit:
+       strbuf_release(&buf);
+       return size;
+}
+
 size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf)
 {
        return nmemb;
@@ -1895,6 +2005,8 @@ static int http_request(const char *url,
                                         fwrite_buffer);
        }
 
+       curl_easy_setopt(slot->curl, CURLOPT_HEADERFUNCTION, fwrite_wwwauth);
+
        accept_language = http_get_accept_language_header();
 
        if (accept_language)
diff --git a/ident.c b/ident.c
index 6de76f9421d57f38c478cca68fcb97c4ede2d36c..8fad92d7007e2101d630680f4aecd9626c97d6bd 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -5,10 +5,13 @@
  *
  * Copyright (C) 2005 Linus Torvalds
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "ident.h"
 #include "config.h"
 #include "date.h"
+#include "gettext.h"
 #include "mailmap.h"
+#include "strbuf.h"
 
 static struct strbuf git_default_name = STRBUF_INIT;
 static struct strbuf git_default_email = STRBUF_INIT;
diff --git a/ident.h b/ident.h
new file mode 100644 (file)
index 0000000..96a6489
--- /dev/null
+++ b/ident.h
@@ -0,0 +1,67 @@
+#ifndef IDENT_H
+#define IDENT_H
+
+#include "string-list.h"
+
+struct ident_split {
+       const char *name_begin;
+       const char *name_end;
+       const char *mail_begin;
+       const char *mail_end;
+       const char *date_begin;
+       const char *date_end;
+       const char *tz_begin;
+       const char *tz_end;
+};
+
+#define IDENT_STRICT          1
+#define IDENT_NO_DATE         2
+#define IDENT_NO_NAME         4
+
+enum want_ident {
+       WANT_BLANK_IDENT,
+       WANT_AUTHOR_IDENT,
+       WANT_COMMITTER_IDENT
+};
+
+const char *ident_default_name(void);
+const char *ident_default_email(void);
+/*
+ * Prepare an ident to fall back on if the user didn't configure it.
+ */
+void prepare_fallback_ident(const char *name, const char *email);
+void reset_ident_date(void);
+/*
+ * Signals an success with 0, but time part of the result may be NULL
+ * if the input lacks timestamp and zone
+ */
+int split_ident_line(struct ident_split *, const char *, int);
+
+/*
+ * Given a commit or tag object buffer and the commit or tag headers, replaces
+ * the idents in the headers with their canonical versions using the mailmap mechanism.
+ */
+void apply_mailmap_to_header(struct strbuf *, const char **, struct string_list *);
+
+/*
+ * Compare split idents for equality or strict ordering. Note that we
+ * compare only the ident part of the line, ignoring any timestamp.
+ *
+ * Because there are two fields, we must choose one as the primary key; we
+ * currently arbitrarily pick the email.
+ */
+int ident_cmp(const struct ident_split *, const struct ident_split *);
+
+const char *git_author_info(int);
+const char *git_committer_info(int);
+const char *fmt_ident(const char *name, const char *email,
+                     enum want_ident whose_ident,
+                     const char *date_str, int);
+const char *fmt_name(enum want_ident);
+
+int committer_ident_sufficiently_given(void);
+int author_ident_sufficiently_given(void);
+
+int git_ident_config(const char *, const char *, void *);
+
+#endif
index a50af56b827033dc68923e038566e7718fb81a65..93e9018439c51193b12a52609ae125ae2ae6cfdb 100644 (file)
@@ -21,7 +21,7 @@
  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "credential.h"
 #include "exec-cmd.h"
index f1cfd8fa8c664bfca0dcaada59e59af8dd2db38a..005c820aa42e1f3c98bd2c1a376bd3a52bfc32a2 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "json-writer.h"
 
 void jw_init(struct json_writer *jw)
diff --git a/khash.h b/khash.h
index cb79bf885674ea6fc54fdcea17543739530a3b14..85362718c565e727da2beb9b10c9f32dd44a505a 100644 (file)
--- a/khash.h
+++ b/khash.h
@@ -26,7 +26,6 @@
 #ifndef __AC_KHASH_H
 #define __AC_KHASH_H
 
-#include "cache.h"
 #include "hashmap.h"
 
 #define AC_VERSION_KHASH_H "0.2.8"
diff --git a/kwset.c b/kwset.c
index 08aadf03117c5069116bb7e7fa4aa5ed7a9b1fb0..4b14d4f86b8d1965023a49586fdd56631631cb8e 100644 (file)
--- a/kwset.c
+++ b/kwset.c
@@ -32,7 +32,7 @@
    String Matching:  An Aid to Bibliographic Search," CACM June 1975,
    Vol. 18, No. 6, which describes the failure function used below. */
 
-#include "cache.h"
+#include "git-compat-util.h"
 
 #include "kwset.h"
 #include "compat/obstack.h"
index d2632690d5107b53ee8a7ac4832cd85eb8c7bfc1..fd8026fe20182e5d90dad6db72ab453b5ed0a23c 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "levenshtein.h"
 
 /*
index a7f3e7f6ce43e0ce4786e417608a1a43bac47105..6e7fc4b2e0baa7d56e1b205213a752b70c3037e8 100644 (file)
@@ -1,6 +1,8 @@
 #include "git-compat-util.h"
+#include "alloc.h"
 #include "line-range.h"
 #include "cache.h"
+#include "hex.h"
 #include "tag.h"
 #include "blob.h"
 #include "tree.h"
@@ -1281,7 +1283,8 @@ int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, struct commit
        return changed;
 }
 
-static enum rewrite_result line_log_rewrite_one(struct rev_info *rev, struct commit **pp)
+static enum rewrite_result line_log_rewrite_one(struct rev_info *rev UNUSED,
+                                               struct commit **pp)
 {
        for (;;) {
                struct commit *p = *pp;
index 82ae8d98a403bb644eede373a8def1a37a811fdd..adff361b1bc93905641341df88a7cfcbfb6c118d 100644 (file)
@@ -5,6 +5,7 @@
 
 struct rev_info;
 struct commit;
+struct string_list;
 
 /* A range [start,end].  Lines are numbered starting at 0, and the
  * ranges include start but exclude end. */
index ecffc09be6ec5c1a9646ac152a899f3415f6321d..5416cbcf409d2689d4fe620564f2e010a93131b8 100644 (file)
@@ -3,7 +3,7 @@
  * algorithm for dense and sparse linear assignment problems</i>. Computing,
  * 38(4), 325-340.
  */
-#include "cache.h"
+#include "git-compat-util.h"
 #include "linear-assignment.h"
 
 #define COST(column, row) cost[(column) + column_count * (row)]
index ee01bcd2cc365c12c72bcd3f5597ecceecb2a7d9..72aeb089cc94633f5e7af5917d9398888d143ff9 100644 (file)
@@ -1,6 +1,8 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "commit.h"
 #include "config.h"
+#include "gettext.h"
 #include "revision.h"
 #include "strvec.h"
 #include "list-objects.h"
@@ -9,6 +11,7 @@
 #include "promisor-remote.h"
 #include "trace.h"
 #include "url.h"
+#include "parse-options.h"
 
 static int parse_combine_filter(
        struct list_objects_filter_options *filter_options,
index 1fe393f447303a6d94abbd571a1ea83a1bfc7620..727c986122fc710b72bc827f1a18cb05b2fb0622 100644 (file)
@@ -1,9 +1,11 @@
 #ifndef LIST_OBJECTS_FILTER_OPTIONS_H
 #define LIST_OBJECTS_FILTER_OPTIONS_H
 
-#include "cache.h"
-#include "parse-options.h"
+#include "object.h"
 #include "string-list.h"
+#include "strbuf.h"
+
+struct option;
 
 /*
  * The list of defined filters for list-objects.
index 7ed21cb299c126fb2d2107eb3e418a18e64fbc6c..5d7b33166086e66372be44d756728f7e1f56fc0f 100644 (file)
@@ -1,5 +1,7 @@
 #include "cache.h"
+#include "alloc.h"
 #include "dir.h"
+#include "hex.h"
 #include "tag.h"
 #include "commit.h"
 #include "tree.h"
index 7528fe1db2c85c0b4d923854ef3ec53c3a8f1fad..ab5745bbfe4d2149694eb3f358ea0ce184ad494d 100644 (file)
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "tag.h"
 #include "commit.h"
+#include "hex.h"
 #include "tree.h"
 #include "blob.h"
 #include "diff.h"
index 1dd5fcbf7be433740d83382db4c401d438a51720..3adcb576e4cae12052af13d25bcd861c84bd4174 100644 (file)
@@ -2,6 +2,7 @@
 #include "commit-reach.h"
 #include "config.h"
 #include "diff.h"
+#include "hex.h"
 #include "object-store.h"
 #include "repository.h"
 #include "tmp-objdir.h"
@@ -12,6 +13,7 @@
 #include "merge-ort.h"
 #include "reflog-walk.h"
 #include "refs.h"
+#include "replace-object.h"
 #include "string-list.h"
 #include "color.h"
 #include "gpg-interface.h"
@@ -196,7 +198,8 @@ static int add_ref_decoration(const char *refname, const struct object_id *oid,
        return 0;
 }
 
-static int add_graft_decoration(const struct commit_graft *graft, void *cb_data)
+static int add_graft_decoration(const struct commit_graft *graft,
+                               void *cb_data UNUSED)
 {
        struct commit *commit = lookup_commit(the_repository, &graft->oid);
        if (!commit)
index 697d4beb8de43a4a7ae48be8284e10c6be2a9bfd..8091b0cca8cae05112230e7644674e37138dfa93 100644 (file)
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "repository.h"
 #include "refs.h"
 #include "remote.h"
@@ -8,38 +9,32 @@
 #include "config.h"
 #include "string-list.h"
 
-static int config_read;
-static int advertise_unborn;
-static int allow_unborn;
-
-static void ensure_config_read(void)
+static enum {
+       UNBORN_IGNORE = 0,
+       UNBORN_ALLOW,
+       UNBORN_ADVERTISE /* implies ALLOW */
+} unborn_config(struct repository *r)
 {
        const char *str = NULL;
 
-       if (config_read)
-               return;
-
-       if (repo_config_get_string_tmp(the_repository, "lsrefs.unborn", &str)) {
+       if (repo_config_get_string_tmp(r, "lsrefs.unborn", &str)) {
                /*
                 * If there is no such config, advertise and allow it by
                 * default.
                 */
-               advertise_unborn = 1;
-               allow_unborn = 1;
+               return UNBORN_ADVERTISE;
        } else {
                if (!strcmp(str, "advertise")) {
-                       advertise_unborn = 1;
-                       allow_unborn = 1;
+                       return UNBORN_ADVERTISE;
                } else if (!strcmp(str, "allow")) {
-                       allow_unborn = 1;
+                       return UNBORN_ALLOW;
                } else if (!strcmp(str, "ignore")) {
-                       /* do nothing */
+                       return UNBORN_IGNORE;
                } else {
                        die(_("invalid value for '%s': '%s'"),
                            "lsrefs.unborn", str);
                }
        }
-       config_read = 1;
 }
 
 /*
@@ -159,7 +154,6 @@ int ls_refs(struct repository *r, struct packet_reader *request)
        strbuf_init(&data.buf, 0);
        string_list_init_dup(&data.hidden_refs);
 
-       ensure_config_read();
        git_config(ls_refs_config, &data);
 
        while (packet_reader_read(request) == PACKET_READ_NORMAL) {
@@ -175,7 +169,7 @@ int ls_refs(struct repository *r, struct packet_reader *request)
                                strvec_push(&data.prefixes, out);
                }
                else if (!strcmp("unborn", arg))
-                       data.unborn = allow_unborn;
+                       data.unborn = !!unborn_config(r);
                else
                        die(_("unexpected line: '%s'"), arg);
        }
@@ -206,11 +200,8 @@ int ls_refs(struct repository *r, struct packet_reader *request)
 
 int ls_refs_advertise(struct repository *r, struct strbuf *value)
 {
-       if (value) {
-               ensure_config_read();
-               if (advertise_unborn)
-                       strbuf_addstr(value, "unborn");
-       }
+       if (value && unborn_config(r) == UNBORN_ADVERTISE)
+               strbuf_addstr(value, "unborn");
 
        return 1;
 }
index 833d28612f77473e9a50d6329ba55bd9706ba81d..9f1495ddcf1e1df362038bd72ad286595372cde3 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
+#include "gettext.h"
+#include "hex.h"
 #include "utf8.h"
 #include "strbuf.h"
 #include "mailinfo.h"
index 49398e599fe3afdc88f481608fb58b0887b019e3..c38dcbac7c6e241b957348465702ea16e21f7774 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "tree.h"
 #include "tree-walk.h"
 #include "object-store.h"
index 599d8e895f81216e0e0cb44696734cb2a157309b..c34846d176c886ecb9f028ec48bb847402d242f9 100644 (file)
@@ -2,7 +2,7 @@
  * Memory Pool implementation logic.
  */
 
-#include "cache.h"
+#include "git-compat-util.h"
 #include "mem-pool.h"
 
 #define BLOCK_GROWTH_SIZE (1024 * 1024 - sizeof(struct mp_block))
index 8138090f81cf726ee9834daa7edbfc5b542aec44..aedcab81138ebe1e4b2e38cf6dcbb93f6f8dcb80 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "run-command.h"
 #include "xdiff-interface.h"
 #include "ll-merge.h"
index d1611ca400a40b05914a14759a009bf16d76f5ce..4c5be8ed910df704839024affc98cf265492012e 100644 (file)
@@ -26,6 +26,7 @@
 #include "diff.h"
 #include "diffcore.h"
 #include "dir.h"
+#include "hex.h"
 #include "entry.h"
 #include "ll-merge.h"
 #include "object-store.h"
index ae469f8cc81d58a2be40be4e0365c715866012ec..89731f40908e484d2a6e1b1f715c193f64d8bc74 100644 (file)
@@ -10,7 +10,6 @@
 #include "alloc.h"
 #include "attr.h"
 #include "blob.h"
-#include "builtin.h"
 #include "cache-tree.h"
 #include "commit.h"
 #include "commit-reach.h"
@@ -18,6 +17,7 @@
 #include "diff.h"
 #include "diffcore.h"
 #include "dir.h"
+#include "hex.h"
 #include "ll-merge.h"
 #include "lockfile.h"
 #include "object-store.h"
diff --git a/merge.c b/merge.c
index 445b4f19aa8618b5641f3f007e8cb42d9d39b57c..2c8b84568421b193f5032f3a9b095287666ddc46 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "commit.h"
 #include "run-command.h"
diff --git a/midx.c b/midx.c
index 7cfad04a24027c1f0703dafdeeb31989414a13c5..47989f7ea70931f53c00c7b385e66282d9f5e1b4 100644 (file)
--- a/midx.c
+++ b/midx.c
@@ -1,7 +1,9 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "csum-file.h"
 #include "dir.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "packfile.h"
 #include "object-store.h"
@@ -1607,7 +1609,7 @@ struct clear_midx_data {
        const char *ext;
 };
 
-static void clear_midx_file_ext(const char *full_path, size_t full_path_len,
+static void clear_midx_file_ext(const char *full_path, size_t full_path_len UNUSED,
                                const char *file_name, void *_data)
 {
        struct clear_midx_data *data = _data;
index 60569b83501a0d789452a934fcabcfc7aa5b24e4..7b729376867afee47c76aaf74901aa19f3615804 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "noop.h"
 #include "../commit.h"
 #include "../fetch-negotiator.h"
index 0f5ac48e87608ee9fee69efb94b51d985b60c707..264acf8bbeade378e1ba8358d8b39bcea5515693 100644 (file)
@@ -2,6 +2,7 @@
 #include "skipping.h"
 #include "../commit.h"
 #include "../fetch-negotiator.h"
+#include "../hex.h"
 #include "../prio-queue.h"
 #include "../refs.h"
 #include "../tag.h"
@@ -50,7 +51,7 @@ struct data {
        int non_common_revs;
 };
 
-static int compare(const void *a_, const void *b_, void *unused)
+static int compare(const void *a_, const void *b_, void *data UNUSED)
 {
        const struct entry *a = a_;
        const struct entry *b = b_;
index b4cc594a790965aca297fe87392a50b643e6fb41..5b1a9ff13f77238d23a18bd54a0049669f875ff7 100644 (file)
@@ -5,6 +5,7 @@
 #include "repository.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "xdiff-interface.h"
 #include "ll-merge.h"
 #include "dir.h"
diff --git a/notes.c b/notes.c
index f2805d51bb15131c46d41fa9554c43ab2e9a492d..a7187236e981ff0bd4d996bdcfedee6fe6767315 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "notes.h"
 #include "object-store.h"
 #include "blob.h"
@@ -752,7 +753,7 @@ static int write_each_non_note_until(const char *note_path,
        return 0;
 }
 
-static int write_each_note(const struct object_id *object_oid,
+static int write_each_note(const struct object_id *object_oid UNUSED,
                const struct object_id *note_oid, char *note_path,
                void *cb_data)
 {
@@ -780,8 +781,9 @@ struct note_delete_list {
 };
 
 static int prune_notes_helper(const struct object_id *object_oid,
-               const struct object_id *note_oid, char *note_path,
-               void *cb_data)
+                             const struct object_id *note_oid UNUSED,
+                             char *note_path UNUSED,
+                             void *cb_data)
 {
        struct note_delete_list **l = (struct note_delete_list **) cb_data;
        struct note_delete_list *n;
@@ -848,8 +850,8 @@ int combine_notes_overwrite(struct object_id *cur_oid,
        return 0;
 }
 
-int combine_notes_ignore(struct object_id *cur_oid,
-                        const struct object_id *new_oid)
+int combine_notes_ignore(struct object_id *cur_oid UNUSED,
+                        const struct object_id *new_oid UNUSED)
 {
        return 0;
 }
index 939865c1ae0566ba577861505f2ecf2e9fd19eeb..8fab8dbe80bb33cd09f8d31fead747095cce3288 100644 (file)
@@ -6,8 +6,10 @@
  * This handles basic git object files - packing, unpacking,
  * creation etc.
  */
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "string-list.h"
 #include "lockfile.h"
 #include "delta.h"
@@ -2644,7 +2646,8 @@ int for_each_loose_object(each_loose_object_fn cb, void *data,
        return 0;
 }
 
-static int append_loose_object(const struct object_id *oid, const char *path,
+static int append_loose_object(const struct object_id *oid,
+                              const char *path UNUSED,
                               void *data)
 {
        oidtree_insert(data, oid);
index 2dd1a0f56e1e442dec47dfbbcdd46d58aecc812c..61e8540f2ec26281436be0422fdcd93d2098e997 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "tag.h"
 #include "commit.h"
 #include "tree.h"
@@ -223,7 +224,7 @@ static int finish_object_disambiguation(struct disambiguate_state *ds,
 
 static int disambiguate_commit_only(struct repository *r,
                                    const struct object_id *oid,
-                                   void *cb_data_unused)
+                                   void *cb_data UNUSED)
 {
        int kind = oid_object_info(r, oid, NULL);
        return kind == OBJ_COMMIT;
@@ -231,7 +232,7 @@ static int disambiguate_commit_only(struct repository *r,
 
 static int disambiguate_committish_only(struct repository *r,
                                        const struct object_id *oid,
-                                       void *cb_data_unused)
+                                       void *cb_data UNUSED)
 {
        struct object *obj;
        int kind;
@@ -251,7 +252,7 @@ static int disambiguate_committish_only(struct repository *r,
 
 static int disambiguate_tree_only(struct repository *r,
                                  const struct object_id *oid,
-                                 void *cb_data_unused)
+                                 void *cb_data UNUSED)
 {
        int kind = oid_object_info(r, oid, NULL);
        return kind == OBJ_TREE;
@@ -259,7 +260,7 @@ static int disambiguate_tree_only(struct repository *r,
 
 static int disambiguate_treeish_only(struct repository *r,
                                     const struct object_id *oid,
-                                    void *cb_data_unused)
+                                    void *cb_data UNUSED)
 {
        struct object *obj;
        int kind;
@@ -279,7 +280,7 @@ static int disambiguate_treeish_only(struct repository *r,
 
 static int disambiguate_blob_only(struct repository *r,
                                  const struct object_id *oid,
-                                 void *cb_data_unused)
+                                 void *cb_data UNUSED)
 {
        int kind = oid_object_info(r, oid, NULL);
        return kind == OBJ_BLOB;
@@ -473,7 +474,7 @@ static int collect_ambiguous(const struct object_id *oid, void *data)
        return 0;
 }
 
-static int repo_collect_ambiguous(struct repository *r,
+static int repo_collect_ambiguous(struct repository *r UNUSED,
                                  const struct object_id *oid,
                                  void *data)
 {
@@ -665,7 +666,7 @@ static int extend_abbrev_len(const struct object_id *oid, void *cb_data)
        return 0;
 }
 
-static int repo_extend_abbrev_len(struct repository *r,
+static int repo_extend_abbrev_len(struct repository *r UNUSED,
                                  const struct object_id *oid,
                                  void *cb_data)
 {
@@ -898,6 +899,7 @@ static int get_oid_basic(struct repository *r, const char *str, int len,
        char *real_ref = NULL;
        int refs_found = 0;
        int at, reflog_len, nth_prior = 0;
+       int fatal = !(flags & GET_OID_QUIETLY);
 
        if (len == r->hash_algo->hexsz && !get_oid_hex(str, oid)) {
                if (warn_ambiguous_refs && warn_on_object_refname_ambiguity) {
@@ -952,11 +954,11 @@ static int get_oid_basic(struct repository *r, const char *str, int len,
 
        if (!len && reflog_len)
                /* allow "@{...}" to mean the current branch reflog */
-               refs_found = repo_dwim_ref(r, "HEAD", 4, oid, &real_ref, 0);
+               refs_found = repo_dwim_ref(r, "HEAD", 4, oid, &real_ref, !fatal);
        else if (reflog_len)
                refs_found = repo_dwim_log(r, str, len, oid, &real_ref);
        else
-               refs_found = repo_dwim_ref(r, str, len, oid, &real_ref, 0);
+               refs_found = repo_dwim_ref(r, str, len, oid, &real_ref, !fatal);
 
        if (!refs_found)
                return -1;
index 1a713d89d7c872bfd253c4a88bec6efa8ed597f8..82201ec3e7b09ca5fa53b5be9d5ce8d144c1d42e 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef OBJECT_STORE_H
 #define OBJECT_STORE_H
 
-#include "cache.h"
+#include "object.h"
 #include "oidmap.h"
 #include "list.h"
 #include "oid-array.h"
@@ -284,6 +284,69 @@ int pretend_object_file(void *, unsigned long, enum object_type,
 
 int force_object_loose(const struct object_id *oid, time_t mtime);
 
+struct object_info {
+       /* Request */
+       enum object_type *typep;
+       unsigned long *sizep;
+       off_t *disk_sizep;
+       struct object_id *delta_base_oid;
+       struct strbuf *type_name;
+       void **contentp;
+
+       /* Response */
+       enum {
+               OI_CACHED,
+               OI_LOOSE,
+               OI_PACKED,
+               OI_DBCACHED
+       } whence;
+       union {
+               /*
+                * struct {
+                *      ... Nothing to expose in this case
+                * } cached;
+                * struct {
+                *      ... Nothing to expose in this case
+                * } loose;
+                */
+               struct {
+                       struct packed_git *pack;
+                       off_t offset;
+                       unsigned int is_delta;
+               } packed;
+       } u;
+};
+
+/*
+ * Initializer for a "struct object_info" that wants no items. You may
+ * also memset() the memory to all-zeroes.
+ */
+#define OBJECT_INFO_INIT { 0 }
+
+/* Invoke lookup_replace_object() on the given hash */
+#define OBJECT_INFO_LOOKUP_REPLACE 1
+/* Allow reading from a loose object file of unknown/bogus type */
+#define OBJECT_INFO_ALLOW_UNKNOWN_TYPE 2
+/* Do not retry packed storage after checking packed and loose storage */
+#define OBJECT_INFO_QUICK 8
+/*
+ * Do not attempt to fetch the object if missing (even if fetch_is_missing is
+ * nonzero).
+ */
+#define OBJECT_INFO_SKIP_FETCH_OBJECT 16
+/*
+ * This is meant for bulk prefetching of missing blobs in a partial
+ * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK
+ */
+#define OBJECT_INFO_FOR_PREFETCH (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK)
+
+/* Die if object corruption (not just an object being missing) was detected. */
+#define OBJECT_INFO_DIE_IF_CORRUPT 32
+
+int oid_object_info_extended(struct repository *r,
+                            const struct object_id *,
+                            struct object_info *, unsigned flags);
+
 /*
  * Open the loose object at path, check its hash, and return the contents,
  * use the "oi" argument to assert things about the object, or e.g. populate its
@@ -381,69 +444,6 @@ static inline void obj_read_unlock(void)
                pthread_mutex_unlock(&obj_read_mutex);
 }
 
-struct object_info {
-       /* Request */
-       enum object_type *typep;
-       unsigned long *sizep;
-       off_t *disk_sizep;
-       struct object_id *delta_base_oid;
-       struct strbuf *type_name;
-       void **contentp;
-
-       /* Response */
-       enum {
-               OI_CACHED,
-               OI_LOOSE,
-               OI_PACKED,
-               OI_DBCACHED
-       } whence;
-       union {
-               /*
-                * struct {
-                *      ... Nothing to expose in this case
-                * } cached;
-                * struct {
-                *      ... Nothing to expose in this case
-                * } loose;
-                */
-               struct {
-                       struct packed_git *pack;
-                       off_t offset;
-                       unsigned int is_delta;
-               } packed;
-       } u;
-};
-
-/*
- * Initializer for a "struct object_info" that wants no items. You may
- * also memset() the memory to all-zeroes.
- */
-#define OBJECT_INFO_INIT { 0 }
-
-/* Invoke lookup_replace_object() on the given hash */
-#define OBJECT_INFO_LOOKUP_REPLACE 1
-/* Allow reading from a loose object file of unknown/bogus type */
-#define OBJECT_INFO_ALLOW_UNKNOWN_TYPE 2
-/* Do not retry packed storage after checking packed and loose storage */
-#define OBJECT_INFO_QUICK 8
-/*
- * Do not attempt to fetch the object if missing (even if fetch_is_missing is
- * nonzero).
- */
-#define OBJECT_INFO_SKIP_FETCH_OBJECT 16
-/*
- * This is meant for bulk prefetching of missing blobs in a partial
- * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK
- */
-#define OBJECT_INFO_FOR_PREFETCH (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK)
-
-/* Die if object corruption (not just an object being missing) was detected. */
-#define OBJECT_INFO_DIE_IF_CORRUPT 32
-
-int oid_object_info_extended(struct repository *r,
-                            const struct object_id *,
-                            struct object_info *, unsigned flags);
-
 /*
  * Iterate over the files in the loose-object parts of the object
  * directory "path", triggering the following callbacks:
index 344087de4de5184fcbfb599277180cec8f39c474..609fed1b73da3c18661c2f04f06c97790103bd5a 100644 (file)
--- a/object.c
+++ b/object.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "object.h"
 #include "replace-object.h"
 #include "object-store.h"
index 31ebe114585bb14cb95f4c74486635754d199955..fc45b158da095d750d9dc55b93282aabe997e7f1 100644 (file)
--- a/object.h
+++ b/object.h
@@ -1,7 +1,7 @@
 #ifndef OBJECT_H
 #define OBJECT_H
 
-#include "cache.h"
+#include "hash.h"
 
 struct buffer_slab;
 
@@ -81,6 +81,26 @@ struct object_array {
  */
 #define FLAG_BITS  28
 
+#define TYPE_BITS 3
+
+/*
+ * Values in this enum (except those outside the 3 bit range) are part
+ * of pack file format. See gitformat-pack(5) for more information.
+ */
+enum object_type {
+       OBJ_BAD = -1,
+       OBJ_NONE = 0,
+       OBJ_COMMIT = 1,
+       OBJ_TREE = 2,
+       OBJ_BLOB = 3,
+       OBJ_TAG = 4,
+       /* 5 for future expansion */
+       OBJ_OFS_DELTA = 6,
+       OBJ_REF_DELTA = 7,
+       OBJ_ANY,
+       OBJ_MAX
+};
+
 /*
  * The object type is stored in 3 bits.
  */
index 73ba76e9e9a223306a03c3d04123c0c4af4aeda2..e8228c777b1619d6bd1baaac0e24f14124d3e4d3 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "oid-array.h"
 #include "hash-lookup.h"
 
index 49965fe856814393c9381788dced2b05d35aed1f..8c1a139c974d360afcd9b23608484af134d77c9f 100644 (file)
--- a/oidmap.c
+++ b/oidmap.c
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "oidmap.h"
 
 static int oidmap_neq(const void *hashmap_cmp_fn_data UNUSED,
index c66a83ab1d6891dbe6916d13339b64456b8cc440..c1642927fa614764312b0ebccd05a77d12a07388 100644 (file)
--- a/oidmap.h
+++ b/oidmap.h
@@ -1,7 +1,6 @@
 #ifndef OIDMAP_H
 #define OIDMAP_H
 
-#include "cache.h"
 #include "hashmap.h"
 
 /*
index b36a2bae86470236a51ffe6bec7792222de478fe..d1e5376316ecd5f9dcf549e1067697283bdc712c 100644 (file)
--- a/oidset.c
+++ b/oidset.c
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "oidset.h"
+#include "hex.h"
+#include "strbuf.h"
 
 void oidset_init(struct oidset *set, size_t initial_size)
 {
index 0d39389bee29be3f0496185331df1ac85f87003b..7d57b7b19e364706f037ccb44388e00e901b1583 100644 (file)
--- a/oidtree.c
+++ b/oidtree.c
@@ -2,6 +2,7 @@
  * A wrapper around cbtree which stores oids
  * May be used to replace oid-array for prefix (abbreviation) matches
  */
+#include "git-compat-util.h"
 #include "oidtree.h"
 #include "alloc.h"
 #include "hash.h"
index 914026f5d80f876c8a7c28a914a58295a5a72346..2992079dd97d75892f4f411cd4a979f459d68170 100644 (file)
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "commit-graph.h"
 #include "repository.h"
 
index 99da1d0fd385eb3bc0c7f0b4a0b8cd167e0cb5e0..150c0f5fa2d7ec2b9dd6a14f6000e5b58b753aa9 100644 (file)
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "packfile.h"
 
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
index 0c3d777aac8de618a36777c5c82edae302c1bbcc..609a343ee3ea41e6c4f18f0d07a104922dc952f2 100644 (file)
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "object-store.h"
 #include "packfile.h"
 
index cfa67a510fd9a98ec5461084d08373086de858d5..891d9d2772ea33253e309a6b83676dbc8e19a07e 100644 (file)
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "object-store.h"
 #include "commit.h"
 #include "tag.h"
index d2a42abf28cc7246b3d076b1c855a350edcded70..ca7c81b5c9f2770daf79d4fe15b889ac4e8b5251 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "commit.h"
+#include "hex.h"
 #include "strbuf.h"
 #include "tag.h"
 #include "diff.h"
@@ -951,7 +953,8 @@ static void show_object(struct object *object, const char *name, void *data_)
        bitmap_set(data->base, bitmap_pos);
 }
 
-static void show_commit(struct commit *commit, void *data)
+static void show_commit(struct commit *commit UNUSED,
+                       void *data UNUSED)
 {
 }
 
@@ -1940,7 +1943,8 @@ static void test_bitmap_type(struct bitmap_test_data *tdata,
                    type_name(bitmap_type));
 }
 
-static void test_show_object(struct object *object, const char *name,
+static void test_show_object(struct object *object,
+                            const char *name UNUSED,
                             void *data)
 {
        struct bitmap_test_data *tdata = data;
index bfb593ba7261a18a8283604f4e1cfdd10eb978f6..7ed594d6679744759956c200d63f09219ed0537b 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "repository.h"
 #include "pack.h"
 #include "pack-revindex.h"
index cc957b3e852716541f764a40641462cb39fe0407..107327cec0bc5202051b6139e926fd27a1ce6c9c 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef PACK_MTIMES_H
 #define PACK_MTIMES_H
 
-#include "git-compat-util.h"
-
 #define MTIMES_SIGNATURE 0x4d544d45 /* "MTME" */
 #define MTIMES_VERSION 1
 
index 272e8d451739e8466a35df155520c9c54d85e75c..ccab09fe654391ef8da95c4f4ecf0bf55d5f3df7 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "object.h"
 #include "pack.h"
 #include "pack-objects.h"
index 336372974872882a235598d254c876e31c49b24a..041e573bc164ca1fc8568f270957cc8ba68fc247 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "pack.h"
 #include "csum-file.h"
 #include "remote.h"
index 79e21ab18e7844461c3743e45ebb7ccc1022caea..2023df1b75b4a4694e49a08ca9c21f61f013659a 100644 (file)
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "list.h"
 #include "pack.h"
 #include "repository.h"
@@ -1008,6 +1010,16 @@ void reprepare_packed_git(struct repository *r)
        struct object_directory *odb;
 
        obj_read_lock();
+
+       /*
+        * Reprepare alt odbs, in case the alternates file was modified
+        * during the course of this process. This only _adds_ odbs to
+        * the linked list, so existing odbs will continue to exist for
+        * the lifetime of the process.
+        */
+       r->objects->loaded_alternates = 0;
+       prepare_alt_odb(r);
+
        for (odb = r->objects->odb; odb; odb = odb->next)
                odb_clear_loose_cache(odb);
 
@@ -2204,8 +2216,8 @@ int for_each_packed_object(each_packed_object_fn cb, void *data,
 }
 
 static int add_promisor_object(const struct object_id *oid,
-                              struct packed_git *pack,
-                              uint32_t pos,
+                              struct packed_git *pack UNUSED,
+                              uint32_t pos UNUSED,
                               void *set_)
 {
        struct oidset *set = set_;
index 4f6819f2406ea8f90651b7769cbaf1758ce4c098..2455aa356db920f00b9e025bcc5134468ce18ef0 100644 (file)
@@ -1,6 +1,8 @@
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "entry.h"
+#include "hex.h"
 #include "parallel-checkout.h"
 #include "pkt-line.h"
 #include "progress.h"
index fd4743293fc48f9453499ad4f9695462b9c08217..6dd4c090e03f39c6dd5e73695c1a8b8e82d2bc49 100644 (file)
@@ -59,12 +59,12 @@ static enum parse_opt_result get_arg(struct parse_opt_ctx_t *p,
        return 0;
 }
 
-static void fix_filename(const char *prefix, const char **file)
+static void fix_filename(const char *prefix, char **file)
 {
-       if (!file || !*file || !prefix || is_absolute_path(*file)
-           || !strcmp("-", *file))
-               return;
-       *file = prefix_filename(prefix, *file);
+       if (!file || !*file)
+               ; /* leave as NULL */
+       else
+               *file = prefix_filename_except_for_dash(prefix, *file);
 }
 
 static enum parse_opt_result opt_command_mode_error(
@@ -177,7 +177,7 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
                        err = get_arg(p, opt, flags, (const char **)opt->value);
 
                if (!err)
-                       fix_filename(p->prefix, (const char **)opt->value);
+                       fix_filename(p->prefix, (char **)opt->value);
                return err;
 
        case OPTION_CALLBACK:
index 50d852f2991738c951bb447ce8206640aabb8a80..26f19384e50ff6fcb7cbae915fa69468afa93faf 100644 (file)
@@ -158,71 +158,202 @@ struct option {
        parse_opt_subcommand_fn *subcommand_fn;
 };
 
-#define OPT_BIT_F(s, l, v, h, b, f) { OPTION_BIT, (s), (l), (v), NULL, (h), \
-                                     PARSE_OPT_NOARG|(f), NULL, (b) }
-#define OPT_COUNTUP_F(s, l, v, h, f) { OPTION_COUNTUP, (s), (l), (v), NULL, \
-                                      (h), PARSE_OPT_NOARG|(f) }
-#define OPT_SET_INT_F(s, l, v, h, i, f) { OPTION_SET_INT, (s), (l), (v), NULL, \
-                                         (h), PARSE_OPT_NOARG | (f), NULL, (i) }
+#define OPT_BIT_F(s, l, v, h, b, f) { \
+       .type = OPTION_BIT, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG|(f), \
+       .callback = NULL, \
+       .defval = (b), \
+}
+#define OPT_COUNTUP_F(s, l, v, h, f) { \
+       .type = OPTION_COUNTUP, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG|(f), \
+}
+#define OPT_SET_INT_F(s, l, v, h, i, f) { \
+       .type = OPTION_SET_INT, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG | (f), \
+       .defval = (i), \
+}
 #define OPT_BOOL_F(s, l, v, h, f)   OPT_SET_INT_F(s, l, v, h, 1, f)
-#define OPT_CALLBACK_F(s, l, v, a, h, f, cb)                   \
-       { OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), (cb) }
-#define OPT_STRING_F(s, l, v, a, h, f)   { OPTION_STRING,  (s), (l), (v), (a), (h), (f) }
-#define OPT_INTEGER_F(s, l, v, h, f)     { OPTION_INTEGER, (s), (l), (v), N_("n"), (h), (f) }
+#define OPT_CALLBACK_F(s, l, v, a, h, f, cb) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = (a), \
+       .help = (h), \
+       .flags = (f), \
+       .callback = (cb), \
+}
+#define OPT_STRING_F(s, l, v, a, h, f) { \
+       .type = OPTION_STRING, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = (a), \
+       .help = (h), \
+       .flags = (f), \
+}
+#define OPT_INTEGER_F(s, l, v, h, f) { \
+       .type = OPTION_INTEGER, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("n"), \
+       .help = (h), \
+       .flags = (f), \
+}
 
-#define OPT_END()                   { OPTION_END }
-#define OPT_GROUP(h)                { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
+#define OPT_END() { \
+       .type = OPTION_END, \
+}
+#define OPT_GROUP(h) { \
+       .type = OPTION_GROUP, \
+       .help = (h), \
+}
 #define OPT_BIT(s, l, v, h, b)      OPT_BIT_F(s, l, v, h, b, 0)
-#define OPT_BITOP(s, l, v, h, set, clear) { OPTION_BITOP, (s), (l), (v), NULL, (h), \
-                                           PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, \
-                                           (set), NULL, (clear) }
-#define OPT_NEGBIT(s, l, v, h, b)   { OPTION_NEGBIT, (s), (l), (v), NULL, \
-                                     (h), PARSE_OPT_NOARG, NULL, (b) }
+#define OPT_BITOP(s, l, v, h, set, clear) { \
+       .type = OPTION_BITOP, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG|PARSE_OPT_NONEG, \
+       .defval = (set), \
+       .extra = (clear), \
+}
+#define OPT_NEGBIT(s, l, v, h, b) { \
+       .type = OPTION_NEGBIT, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG, \
+       .defval = (b), \
+}
 #define OPT_COUNTUP(s, l, v, h)     OPT_COUNTUP_F(s, l, v, h, 0)
 #define OPT_SET_INT(s, l, v, h, i)  OPT_SET_INT_F(s, l, v, h, i, 0)
 #define OPT_BOOL(s, l, v, h)        OPT_BOOL_F(s, l, v, h, 0)
-#define OPT_HIDDEN_BOOL(s, l, v, h) { OPTION_SET_INT, (s), (l), (v), NULL, \
-                                     (h), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1}
-#define OPT_CMDMODE_F(s, l, v, h, i, f)  { OPTION_SET_INT, (s), (l), (v), NULL, \
-                                     (h), PARSE_OPT_CMDMODE|PARSE_OPT_NOARG|PARSE_OPT_NONEG | (f), NULL, (i) }
+#define OPT_HIDDEN_BOOL(s, l, v, h) { \
+       .type = OPTION_SET_INT, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, \
+       .defval = 1, \
+}
+#define OPT_CMDMODE_F(s, l, v, h, i, f) { \
+       .type = OPTION_SET_INT, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_CMDMODE|PARSE_OPT_NOARG|PARSE_OPT_NONEG | (f), \
+       .defval = (i), \
+}
 #define OPT_CMDMODE(s, l, v, h, i)  OPT_CMDMODE_F(s, l, v, h, i, 0)
 
 #define OPT_INTEGER(s, l, v, h)     OPT_INTEGER_F(s, l, v, h, 0)
-#define OPT_MAGNITUDE(s, l, v, h)   { OPTION_MAGNITUDE, (s), (l), (v), \
-                                     N_("n"), (h), PARSE_OPT_NONEG }
+#define OPT_MAGNITUDE(s, l, v, h) { \
+       .type = OPTION_MAGNITUDE, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("n"), \
+       .help = (h), \
+       .flags = PARSE_OPT_NONEG, \
+}
 #define OPT_STRING(s, l, v, a, h)   OPT_STRING_F(s, l, v, a, h, 0)
-#define OPT_STRING_LIST(s, l, v, a, h) \
-                                   { OPTION_CALLBACK, (s), (l), (v), (a), \
-                                     (h), 0, &parse_opt_string_list }
-#define OPT_UYN(s, l, v, h)         { OPTION_CALLBACK, (s), (l), (v), NULL, \
-                                     (h), PARSE_OPT_NOARG, &parse_opt_tertiary }
-#define OPT_EXPIRY_DATE(s, l, v, h) \
-       { OPTION_CALLBACK, (s), (l), (v), N_("expiry-date"),(h), 0,     \
-         parse_opt_expiry_date_cb }
-#define OPT_CALLBACK(s, l, v, a, h, f) OPT_CALLBACK_F(s, l, v, a, h, 0, f)
-#define OPT_NUMBER_CALLBACK(v, h, f) \
-       { OPTION_NUMBER, 0, NULL, (v), NULL, (h), \
-         PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) }
-#define OPT_FILENAME(s, l, v, h)    { OPTION_FILENAME, (s), (l), (v), \
-                                      N_("file"), (h) }
-#define OPT_COLOR_FLAG(s, l, v, h) \
-       { OPTION_CALLBACK, (s), (l), (v), N_("when"), (h), PARSE_OPT_OPTARG, \
-               parse_opt_color_flag_cb, (intptr_t)"always" }
-
-#define OPT_NOOP_NOARG(s, l) \
-       { OPTION_CALLBACK, (s), (l), NULL, NULL, \
-         N_("no-op (backward compatibility)"),         \
-         PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb }
-
-#define OPT_ALIAS(s, l, source_long_name) \
-       { OPTION_ALIAS, (s), (l), (source_long_name) }
+#define OPT_STRING_LIST(s, l, v, a, h) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = (a), \
+       .help = (h), \
+       .callback = &parse_opt_string_list, \
+}
+#define OPT_UYN(s, l, v, h) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG, \
+       .callback = &parse_opt_tertiary, \
+}
+#define OPT_EXPIRY_DATE(s, l, v, h) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("expiry-date"), \
+       .help = (h), \
+       .callback = parse_opt_expiry_date_cb, \
+}
+#define OPT_CALLBACK(s, l, v, a, h, cb) OPT_CALLBACK_F(s, l, v, a, h, 0, cb)
+#define OPT_NUMBER_CALLBACK(v, h, cb) { \
+       .type = OPTION_NUMBER, \
+       .value = (v), \
+       .help = (h), \
+       .flags = PARSE_OPT_NOARG | PARSE_OPT_NONEG, \
+       .callback = (cb), \
+}
+#define OPT_FILENAME(s, l, v, h) { \
+       .type = OPTION_FILENAME, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("file"), \
+       .help = (h), \
+}
+#define OPT_COLOR_FLAG(s, l, v, h) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("when"), \
+       .help = (h), \
+       .flags = PARSE_OPT_OPTARG, \
+       .callback = parse_opt_color_flag_cb, \
+       .defval = (intptr_t)"always", \
+}
+
+#define OPT_NOOP_NOARG(s, l) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .help = N_("no-op (backward compatibility)"), \
+       .flags = PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, \
+       .callback = parse_opt_noop_cb, \
+}
+
+#define OPT_ALIAS(s, l, source_long_name) { \
+       .type = OPTION_ALIAS, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (source_long_name), \
+}
 
 #define OPT_SUBCOMMAND_F(l, v, fn, f) { \
        .type = OPTION_SUBCOMMAND, \
        .long_name = (l), \
        .value = (v), \
        .flags = (f), \
-       .subcommand_fn = (fn) }
+       .subcommand_fn = (fn), \
+}
 #define OPT_SUBCOMMAND(l, v, fn)    OPT_SUBCOMMAND_F((l), (v), (fn), 0)
 
 /*
@@ -358,34 +489,80 @@ int parse_opt_tracking_mode(const struct option *, const char *, int);
 
 #define OPT__VERBOSE(var, h)  OPT_COUNTUP('v', "verbose", (var), (h))
 #define OPT__QUIET(var, h)    OPT_COUNTUP('q', "quiet",   (var), (h))
-#define OPT__VERBOSITY(var) \
-       { OPTION_CALLBACK, 'v', "verbose", (var), NULL, N_("be more verbose"), \
-         PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \
-       { OPTION_CALLBACK, 'q', "quiet", (var), NULL, N_("be more quiet"), \
-         PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }
+#define OPT__VERBOSITY(var) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = 'v', \
+       .long_name = "verbose", \
+       .value = (var), \
+       .help = N_("be more verbose"), \
+       .flags = PARSE_OPT_NOARG, \
+       .callback = &parse_opt_verbosity_cb, \
+}, { \
+       .type = OPTION_CALLBACK, \
+       .short_name = 'q', \
+       .long_name = "quiet", \
+       .value = (var), \
+       .help = N_("be more quiet"), \
+       .flags = PARSE_OPT_NOARG, \
+       .callback = &parse_opt_verbosity_cb, \
+}
 #define OPT__DRY_RUN(var, h)  OPT_BOOL('n', "dry-run", (var), (h))
 #define OPT__FORCE(var, h, f) OPT_COUNTUP_F('f', "force",   (var), (h), (f))
-#define OPT__ABBREV(var)  \
-       { OPTION_CALLBACK, 0, "abbrev", (var), N_("n"), \
-         N_("use <n> digits to display object names"), \
-         PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
+#define OPT__ABBREV(var) { \
+       .type = OPTION_CALLBACK, \
+       .long_name = "abbrev", \
+       .value = (var), \
+       .argh = N_("n"), \
+       .help = N_("use <n> digits to display object names"), \
+       .flags = PARSE_OPT_OPTARG, \
+       .callback = &parse_opt_abbrev_cb, \
+}
 #define OPT__SUPER_PREFIX(var) \
        OPT_STRING_F(0, "super-prefix", (var), N_("prefix"), \
                N_("prefixed path to initial superproject"), PARSE_OPT_HIDDEN)
 
 #define OPT__COLOR(var, h) \
        OPT_COLOR_FLAG(0, "color", (var), (h))
-#define OPT_COLUMN(s, l, v, h) \
-       { OPTION_CALLBACK, (s), (l), (v), N_("style"), (h), PARSE_OPT_OPTARG, parseopt_column_callback }
-#define OPT_PASSTHRU(s, l, v, a, h, f) \
-       { OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), parse_opt_passthru }
-#define OPT_PASSTHRU_ARGV(s, l, v, a, h, f) \
-       { OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), parse_opt_passthru_argv }
-#define _OPT_CONTAINS_OR_WITH(name, variable, help, flag) \
-       { OPTION_CALLBACK, 0, name, (variable), N_("commit"), (help), \
-         PARSE_OPT_LASTARG_DEFAULT | flag, \
-         parse_opt_commits, (intptr_t) "HEAD" \
-       }
+#define OPT_COLUMN(s, l, v, h) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("style"), \
+       .help = (h), \
+       .flags = PARSE_OPT_OPTARG, \
+       .callback = parseopt_column_callback, \
+}
+#define OPT_PASSTHRU(s, l, v, a, h, f) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = (a), \
+       .help = (h), \
+       .flags = (f), \
+       .callback = parse_opt_passthru, \
+}
+#define OPT_PASSTHRU_ARGV(s, l, v, a, h, f) { \
+       .type = OPTION_CALLBACK, \
+       .short_name = (s), \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = (a), \
+       .help = (h), \
+       .flags = (f), \
+       .callback = parse_opt_passthru_argv, \
+}
+#define _OPT_CONTAINS_OR_WITH(l, v, h, f) { \
+       .type = OPTION_CALLBACK, \
+       .long_name = (l), \
+       .value = (v), \
+       .argh = N_("commit"), \
+       .help = (h), \
+       .flags = PARSE_OPT_LASTARG_DEFAULT | (f), \
+       .callback = parse_opt_commits, \
+       .defval = (intptr_t) "HEAD", \
+}
 #define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, PARSE_OPT_NONEG)
 #define OPT_NO_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("no-contains", v, h, PARSE_OPT_NONEG)
 #define OPT_WITH(v, h) _OPT_CONTAINS_OR_WITH("with", v, h, PARSE_OPT_HIDDEN | PARSE_OPT_NONEG)
index 31534466266ccd80cd02ce187a1a4c799934e056..a4473a88fa2f55b4f8e399fdcf4747f0e666a015 100644 (file)
@@ -2,6 +2,7 @@
 #include "diff.h"
 #include "commit.h"
 #include "hash-lookup.h"
+#include "hex.h"
 #include "patch-ids.h"
 
 static int patch_id_defined(struct commit *commit)
diff --git a/path.c b/path.c
index 492e17ad12106233ddde63b724992f388693be10..632a051809a3e69f79980b9f1a72fb10e842a084 100644 (file)
--- a/path.c
+++ b/path.c
@@ -2,6 +2,7 @@
  * Utilities for paths and pathnames
  */
 #include "cache.h"
+#include "hex.h"
 #include "repository.h"
 #include "strbuf.h"
 #include "string-list.h"
@@ -347,7 +348,8 @@ static void init_common_trie(void)
  * Helper function for update_common_dir: returns 1 if the dir
  * prefix is common.
  */
-static int check_common(const char *unmatched, void *value, void *baton)
+static int check_common(const char *unmatched, void *value,
+                       void *baton UNUSED)
 {
        struct common_dir *dir = value;
 
index 41f6adfbb421fee745e3717ffd57ff92acfc82b1..a5b38e0907a9b8c498d643653d445ed7cd71fe02 100644 (file)
@@ -171,6 +171,11 @@ int match_pathspec_attrs(struct index_state *istate,
                         const char *name, int namelen,
                         const struct pathspec_item *item);
 
+int match_pathspec(struct index_state *istate,
+                  const struct pathspec *pathspec,
+                  const char *name, int namelen,
+                  int prefix, char *seen, int is_dir);
+
 /*
  * Determine whether a pathspec will match only entire index entries (non-sparse
  * files and/or entire sparse directories). If the pathspec has the potential to
index ce4e73b6833a48119dfc5f36b64daa8e962dc9c4..1ea7f8600ec6a47f069e508da99103ff8e42dbe3 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "pkt-line.h"
+#include "hex.h"
 #include "run-command.h"
 
 char packet_buffer[LARGE_PACKET_MAX];
index 79c538b99e477660fb8819d7fd0175daf4520cc5..8e9846f3151eece6ebd782d946645c61a6382eb1 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef PKTLINE_H
 #define PKTLINE_H
 
-#include "git-compat-util.h"
 #include "strbuf.h"
 #include "sideband.h"
 
index 1e1e21878c833d54b165b0aa6d9720eb16536a94..05b557d09616de55ac4be5a03e1df02c6df65317 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -1,6 +1,8 @@
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "commit.h"
+#include "hex.h"
 #include "utf8.h"
 #include "diff.h"
 #include "revision.h"
@@ -1857,7 +1859,8 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */
        return consumed + 1;
 }
 
-static size_t userformat_want_item(struct strbuf *sb, const char *placeholder,
+static size_t userformat_want_item(struct strbuf *sb UNUSED,
+                                  const char *placeholder,
                                   void *context)
 {
        struct userformat_want *w = context;
index f34e24c53a4925aec51cd62117654fdd5f7f980e..921dd6e0cae3dde8a0e2520d607fdeabad8a759a 100644 (file)
--- a/pretty.h
+++ b/pretty.h
@@ -1,11 +1,11 @@
 #ifndef PRETTY_H
 #define PRETTY_H
 
-#include "cache.h"
 #include "date.h"
 #include "string-list.h"
 
 struct commit;
+struct repository;
 struct strbuf;
 struct process_trailer_options;
 
@@ -153,6 +153,8 @@ int commit_format_is_empty(enum cmit_fmt);
 /* Make subject of commit message suitable for filename */
 void format_sanitized_subject(struct strbuf *sb, const char *msg, size_t len);
 
+int has_non_ascii(const char *text);
+
 /*
  * Set values of fields in "struct process_trailer_options"
  * according to trailers arguments.
index d31b48e725083654222842049e121a35fe8d511b..dc2476be53a30a6e9c682d934f620422dd855ada 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "prio-queue.h"
 
 static inline int compare(struct prio_queue *queue, int i, int j)
index 0cdd875d37f166bedbbeb5f0e889046674ed58be..9b33a2df32557302500fbe8c736c100a2d1b2ba4 100644 (file)
@@ -59,7 +59,7 @@ void progress_test_force_update(void)
 }
 
 
-static void progress_interval(int signum)
+static void progress_interval(int signum UNUSED)
 {
        progress_update = 1;
 }
index faa7612941cc2a70bf24f9dff2c02f2c5a2c0428..1db566982ec6c10afb94837d22a4c7f39b1f36bf 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "config.h"
index bbde91810ac6667a1ee624d112ad26cf23776b1e..874bc815b4f7d59797bb840fb188e47304579ee2 100644 (file)
@@ -1,9 +1,11 @@
 #include "git-compat-util.h"
 #include "protocol-caps.h"
 #include "gettext.h"
+#include "hex.h"
 #include "pkt-line.h"
 #include "strvec.h"
 #include "hash.h"
+#include "hex.h"
 #include "object.h"
 #include "object-store.h"
 #include "string-list.h"
index 261520b472c9c2bbac57ea94460dcabeefb3a91b..d2813f6a40547035daaff40fcd0bc296c0832cca 100644 (file)
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "object-store.h"
 #include "packfile.h"
 #include "progress.h"
diff --git a/quote.c b/quote.c
index 26719d21d1e7555d92289b26402a73030e330606..7ccb5a06cd161c46ad2deeacc19de7bec99731a2 100644 (file)
--- a/quote.c
+++ b/quote.c
@@ -1,5 +1,7 @@
 #include "cache.h"
+#include "alloc.h"
 #include "quote.h"
+#include "strbuf.h"
 #include "strvec.h"
 
 int quote_path_fully = 1;
index aba63ebeb3be784a1fba95e13070e8bd847315c1..c9dab2a66b9140d1ad0c207ee6fa65ff842dc0e7 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "refs.h"
 #include "tag.h"
 #include "commit.h"
@@ -48,7 +49,9 @@ static int add_one_ref(const char *path, const struct object_id *oid,
  * The traversal will have already marked us as SEEN, so we
  * only need to handle any progress reporting here.
  */
-static void mark_object(struct object *obj, const char *name, void *data)
+static void mark_object(struct object *obj UNUSED,
+                       const char *name UNUSED,
+                       void *data)
 {
        update_progress(data);
 }
@@ -152,7 +155,8 @@ static int add_recent_loose(const struct object_id *oid,
 }
 
 static int add_recent_packed(const struct object_id *oid,
-                            struct packed_git *p, uint32_t pos,
+                            struct packed_git *p,
+                            uint32_t pos,
                             void *data)
 {
        struct object *obj;
@@ -202,10 +206,10 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
 
 static int mark_object_seen(const struct object_id *oid,
                             enum object_type type,
-                            int exclude,
-                            uint32_t name_hash,
-                            struct packed_git *found_pack,
-                            off_t found_offset)
+                            int exclude UNUSED,
+                            uint32_t name_hash UNUSED,
+                            struct packed_git *found_pack UNUSED,
+                            off_t found_offset UNUSED)
 {
        struct object *obj = lookup_object_by_type(the_repository, oid, type);
        if (!obj)
index 35e5657877c7a4ebd070654f7b252a99f05d702f..12564bbd90ce6f3512d0e574b5cbc6550e99fb74 100644 (file)
@@ -4,9 +4,11 @@
  * Copyright (C) Linus Torvalds, 2005
  */
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "hex.h"
 #include "tempfile.h"
 #include "lockfile.h"
 #include "cache-tree.h"
@@ -2901,6 +2903,16 @@ static int record_ieot(void)
        return !git_config_get_index_threads(&val) && val != 1;
 }
 
+enum write_extensions {
+       WRITE_NO_EXTENSION =              0,
+       WRITE_SPLIT_INDEX_EXTENSION =     1<<0,
+       WRITE_CACHE_TREE_EXTENSION =      1<<1,
+       WRITE_RESOLVE_UNDO_EXTENSION =    1<<2,
+       WRITE_UNTRACKED_CACHE_EXTENSION = 1<<3,
+       WRITE_FSMONITOR_EXTENSION =       1<<4,
+};
+#define WRITE_ALL_EXTENSIONS ((enum write_extensions)-1)
+
 /*
  * On success, `tempfile` is closed. If it is the temporary file
  * of a `struct lock_file`, we will therefore effectively perform
@@ -2909,7 +2921,7 @@ static int record_ieot(void)
  * rely on it.
  */
 static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
-                         int strip_extensions, unsigned flags)
+                         enum write_extensions write_extensions, unsigned flags)
 {
        uint64_t start = getnanotime();
        struct hashfile *f;
@@ -3082,8 +3094,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
                        return -1;
        }
 
-       if (!strip_extensions && istate->split_index &&
-           !is_null_oid(&istate->split_index->base_oid)) {
+       if (write_extensions & WRITE_SPLIT_INDEX_EXTENSION &&
+           istate->split_index) {
                struct strbuf sb = STRBUF_INIT;
 
                if (istate->sparse_index)
@@ -3097,7 +3109,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
                if (err)
                        return -1;
        }
-       if (!strip_extensions && !drop_cache_tree && istate->cache_tree) {
+       if (write_extensions & WRITE_CACHE_TREE_EXTENSION &&
+           !drop_cache_tree && istate->cache_tree) {
                struct strbuf sb = STRBUF_INIT;
 
                cache_tree_write(&sb, istate->cache_tree);
@@ -3107,7 +3120,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
                if (err)
                        return -1;
        }
-       if (!strip_extensions && istate->resolve_undo) {
+       if (write_extensions & WRITE_RESOLVE_UNDO_EXTENSION &&
+           istate->resolve_undo) {
                struct strbuf sb = STRBUF_INIT;
 
                resolve_undo_write(&sb, istate->resolve_undo);
@@ -3118,7 +3132,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
                if (err)
                        return -1;
        }
-       if (!strip_extensions && istate->untracked) {
+       if (write_extensions & WRITE_UNTRACKED_CACHE_EXTENSION &&
+           istate->untracked) {
                struct strbuf sb = STRBUF_INIT;
 
                write_untracked_extension(&sb, istate->untracked);
@@ -3129,7 +3144,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
                if (err)
                        return -1;
        }
-       if (!strip_extensions && istate->fsmonitor_last_update) {
+       if (write_extensions & WRITE_FSMONITOR_EXTENSION &&
+           istate->fsmonitor_last_update) {
                struct strbuf sb = STRBUF_INIT;
 
                write_fsmonitor_extension(&sb, istate);
@@ -3203,8 +3219,10 @@ static int commit_locked_index(struct lock_file *lk)
                return commit_lock_file(lk);
 }
 
-static int do_write_locked_index(struct index_state *istate, struct lock_file *lock,
-                                unsigned flags)
+static int do_write_locked_index(struct index_state *istate,
+                                struct lock_file *lock,
+                                unsigned flags,
+                                enum write_extensions write_extensions)
 {
        int ret;
        int was_full = istate->sparse_index == INDEX_EXPANDED;
@@ -3222,7 +3240,7 @@ static int do_write_locked_index(struct index_state *istate, struct lock_file *l
         */
        trace2_region_enter_printf("index", "do_write_index", the_repository,
                                   "%s", get_lock_file_path(lock));
-       ret = do_write_index(istate, lock->tempfile, 0, flags);
+       ret = do_write_index(istate, lock->tempfile, write_extensions, flags);
        trace2_region_leave_printf("index", "do_write_index", the_repository,
                                   "%s", get_lock_file_path(lock));
 
@@ -3251,7 +3269,7 @@ static int write_split_index(struct index_state *istate,
 {
        int ret;
        prepare_to_write_split_index(istate);
-       ret = do_write_locked_index(istate, lock, flags);
+       ret = do_write_locked_index(istate, lock, flags, WRITE_ALL_EXTENSIONS);
        finish_writing_split_index(istate);
        return ret;
 }
@@ -3326,7 +3344,7 @@ static int write_shared_index(struct index_state *istate,
 
        trace2_region_enter_printf("index", "shared/do_write_index",
                                   the_repository, "%s", get_tempfile_path(*temp));
-       ret = do_write_index(si->base, *temp, 1, flags);
+       ret = do_write_index(si->base, *temp, WRITE_NO_EXTENSION, flags);
        trace2_region_leave_printf("index", "shared/do_write_index",
                                   the_repository, "%s", get_tempfile_path(*temp));
 
@@ -3403,9 +3421,8 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
        if ((!si && !test_split_index_env) ||
            alternate_index_output ||
            (istate->cache_changed & ~EXTMASK)) {
-               if (si)
-                       oidclr(&si->base_oid);
-               ret = do_write_locked_index(istate, lock, flags);
+               ret = do_write_locked_index(istate, lock, flags,
+                                           ~WRITE_SPLIT_INDEX_EXTENSION);
                goto out;
        }
 
@@ -3431,8 +3448,8 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
                /* Same initial permissions as the main .git/index file */
                temp = mks_tempfile_sm(git_path("sharedindex_XXXXXX"), 0, 0666);
                if (!temp) {
-                       oidclr(&si->base_oid);
-                       ret = do_write_locked_index(istate, lock, flags);
+                       ret = do_write_locked_index(istate, lock, flags,
+                                                   ~WRITE_SPLIT_INDEX_EXTENSION);
                        goto out;
                }
                ret = write_shared_index(istate, &temp, flags);
index 6775cddb28434d0780cb483357476f4783e1f596..17a570f1ff97fab8e789d2960ae54894b1c42a80 100644 (file)
--- a/rebase.c
+++ b/rebase.c
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "rebase.h"
 #include "config.h"
 #include "gettext.h"
index f8203c6b05254b624cf98e6d4590d07064cbb101..ed802778da7208377d9054f2de1805f91be39509 100644 (file)
@@ -1,5 +1,6 @@
-#include "builtin.h"
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "refs.h"
 #include "wildmatch.h"
@@ -13,7 +14,6 @@
 #include "ref-filter.h"
 #include "revision.h"
 #include "utf8.h"
-#include "git-compat-util.h"
 #include "version.h"
 #include "trailer.h"
 #include "wt-status.h"
@@ -282,7 +282,8 @@ static int refname_atom_parser_internal(struct refname_atom *atom, const char *a
        return 0;
 }
 
-static int remote_ref_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int remote_ref_atom_parser(struct ref_format *format UNUSED,
+                                 struct used_atom *atom,
                                  const char *arg, struct strbuf *err)
 {
        struct string_list params = STRING_LIST_INIT_DUP;
@@ -329,7 +330,8 @@ static int remote_ref_atom_parser(struct ref_format *format, struct used_atom *a
        return 0;
 }
 
-static int objecttype_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int objecttype_atom_parser(struct ref_format *format UNUSED,
+                                 struct used_atom *atom,
                                  const char *arg, struct strbuf *err)
 {
        if (arg)
@@ -341,7 +343,8 @@ static int objecttype_atom_parser(struct ref_format *format, struct used_atom *a
        return 0;
 }
 
-static int objectsize_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int objectsize_atom_parser(struct ref_format *format UNUSED,
+                                 struct used_atom *atom,
                                  const char *arg, struct strbuf *err)
 {
        if (!arg) {
@@ -361,7 +364,8 @@ static int objectsize_atom_parser(struct ref_format *format, struct used_atom *a
        return 0;
 }
 
-static int deltabase_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int deltabase_atom_parser(struct ref_format *format UNUSED,
+                                struct used_atom *atom,
                                 const char *arg, struct strbuf *err)
 {
        if (arg)
@@ -373,7 +377,8 @@ static int deltabase_atom_parser(struct ref_format *format, struct used_atom *at
        return 0;
 }
 
-static int body_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int body_atom_parser(struct ref_format *format UNUSED,
+                           struct used_atom *atom,
                            const char *arg, struct strbuf *err)
 {
        if (arg)
@@ -382,7 +387,8 @@ static int body_atom_parser(struct ref_format *format, struct used_atom *atom,
        return 0;
 }
 
-static int subject_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int subject_atom_parser(struct ref_format *format UNUSED,
+                              struct used_atom *atom,
                               const char *arg, struct strbuf *err)
 {
        if (!arg)
@@ -394,7 +400,8 @@ static int subject_atom_parser(struct ref_format *format, struct used_atom *atom
        return 0;
 }
 
-static int trailers_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int trailers_atom_parser(struct ref_format *format UNUSED,
+                               struct used_atom *atom,
                                const char *arg, struct strbuf *err)
 {
        atom->u.contents.trailer_opts.no_divider = 1;
@@ -448,8 +455,9 @@ static int contents_atom_parser(struct ref_format *format, struct used_atom *ato
        return 0;
 }
 
-static int raw_atom_parser(struct ref_format *format, struct used_atom *atom,
-                               const char *arg, struct strbuf *err)
+static int raw_atom_parser(struct ref_format *format UNUSED,
+                          struct used_atom *atom,
+                          const char *arg, struct strbuf *err)
 {
        if (!arg)
                atom->u.raw_data.option = RAW_BARE;
@@ -460,7 +468,8 @@ static int raw_atom_parser(struct ref_format *format, struct used_atom *atom,
        return 0;
 }
 
-static int oid_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int oid_atom_parser(struct ref_format *format UNUSED,
+                          struct used_atom *atom,
                           const char *arg, struct strbuf *err)
 {
        if (!arg)
@@ -479,7 +488,8 @@ static int oid_atom_parser(struct ref_format *format, struct used_atom *atom,
        return 0;
 }
 
-static int person_email_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int person_email_atom_parser(struct ref_format *format UNUSED,
+                                   struct used_atom *atom,
                                    const char *arg, struct strbuf *err)
 {
        if (!arg)
@@ -493,7 +503,8 @@ static int person_email_atom_parser(struct ref_format *format, struct used_atom
        return 0;
 }
 
-static int refname_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int refname_atom_parser(struct ref_format *format UNUSED,
+                              struct used_atom *atom,
                               const char *arg, struct strbuf *err)
 {
        return refname_atom_parser_internal(&atom->u.refname, arg, atom->name, err);
@@ -510,7 +521,8 @@ static align_type parse_align_position(const char *s)
        return -1;
 }
 
-static int align_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int align_atom_parser(struct ref_format *format UNUSED,
+                            struct used_atom *atom,
                             const char *arg, struct strbuf *err)
 {
        struct align *align = &atom->u.align;
@@ -562,7 +574,8 @@ static int align_atom_parser(struct ref_format *format, struct used_atom *atom,
        return 0;
 }
 
-static int if_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int if_atom_parser(struct ref_format *format UNUSED,
+                         struct used_atom *atom,
                          const char *arg, struct strbuf *err)
 {
        if (!arg) {
@@ -577,7 +590,8 @@ static int if_atom_parser(struct ref_format *format, struct used_atom *atom,
        return 0;
 }
 
-static int rest_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int rest_atom_parser(struct ref_format *format,
+                           struct used_atom *atom UNUSED,
                            const char *arg, struct strbuf *err)
 {
        if (arg)
@@ -586,7 +600,8 @@ static int rest_atom_parser(struct ref_format *format, struct used_atom *atom,
        return 0;
 }
 
-static int head_atom_parser(struct ref_format *format, struct used_atom *atom,
+static int head_atom_parser(struct ref_format *format UNUSED,
+                           struct used_atom *atom,
                            const char *arg, struct strbuf *err)
 {
        if (arg)
@@ -791,7 +806,7 @@ static void quote_formatting(struct strbuf *s, const char *str, ssize_t len, int
 }
 
 static int append_atom(struct atom_value *v, struct ref_formatting_state *state,
-                      struct strbuf *unused_err)
+                      struct strbuf *err UNUSED)
 {
        /*
         * Quote formatting is only done when the stack has a single
@@ -841,7 +856,7 @@ static void end_align_handler(struct ref_formatting_stack **stack)
 }
 
 static int align_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state,
-                             struct strbuf *unused_err)
+                             struct strbuf *err UNUSED)
 {
        struct ref_formatting_stack *new_stack;
 
@@ -888,7 +903,7 @@ static void if_then_else_handler(struct ref_formatting_stack **stack)
 }
 
 static int if_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state,
-                          struct strbuf *unused_err)
+                          struct strbuf *err UNUSED)
 {
        struct ref_formatting_stack *new_stack;
        struct if_then_else *if_then_else = xcalloc(1,
@@ -915,7 +930,8 @@ static int is_empty(struct strbuf *buf)
        return cur == end;
  }
 
-static int then_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state,
+static int then_atom_handler(struct atom_value *atomv UNUSED,
+                            struct ref_formatting_state *state,
                             struct strbuf *err)
 {
        struct ref_formatting_stack *cur = state->stack;
@@ -952,7 +968,8 @@ static int then_atom_handler(struct atom_value *atomv, struct ref_formatting_sta
        return 0;
 }
 
-static int else_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state,
+static int else_atom_handler(struct atom_value *atomv UNUSED,
+                            struct ref_formatting_state *state,
                             struct strbuf *err)
 {
        struct ref_formatting_stack *prev = state->stack;
@@ -973,7 +990,8 @@ static int else_atom_handler(struct atom_value *atomv, struct ref_formatting_sta
        return 0;
 }
 
-static int end_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state,
+static int end_atom_handler(struct atom_value *atomv UNUSED,
+                           struct ref_formatting_state *state,
                            struct strbuf *err)
 {
        struct ref_formatting_stack *current = state->stack;
@@ -1822,7 +1840,7 @@ static void lazy_init_worktree_map(void)
        populate_worktree_map(&(ref_to_worktree_map.map), ref_to_worktree_map.worktrees);
 }
 
-static char *get_worktree_path(const struct used_atom *atom, const struct ref_array_item *ref)
+static char *get_worktree_path(const struct ref_array_item *ref)
 {
        struct hashmap_entry entry, *e;
        struct ref_to_worktree_entry *lookup_result;
@@ -1881,7 +1899,7 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
                        refname = get_refname(atom, ref);
                else if (atom_type == ATOM_WORKTREEPATH) {
                        if (ref->kind == FILTER_REFS_BRANCHES)
-                               v->s = get_worktree_path(atom, ref);
+                               v->s = get_worktree_path(ref);
                        else
                                v->s = xstrdup("");
                        continue;
index aa0eea4ecf591edd0620dc47db0e0bfc3e5c4208..daa6d02017489d5b6454790503afaa0b6079a08e 100644 (file)
@@ -4,7 +4,6 @@
 #include "oid-array.h"
 #include "refs.h"
 #include "commit.h"
-#include "parse-options.h"
 
 /* Quoting styles */
 #define QUOTE_NONE 0
@@ -24,6 +23,7 @@
 
 struct atom_value;
 struct ref_sorting;
+struct option;
 
 enum ref_sorting_order {
        REF_SORTING_REVERSE = 1<<0,
index 8a4d8fa3bd5589fca43e97b05982a830af8bd27a..4ba1a10c82cdd3920a1c2818de29a18e1ea153ca 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "commit.h"
 #include "refs.h"
 #include "diff.h"
index 8076f10d9fbc0dd5588582f5bfec105416037233..4d93a269571980772c49cb25d37749a033482b4f 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef REFLOG_WALK_H
 #define REFLOG_WALK_H
 
-#include "cache.h"
-
 struct commit;
 struct reflog_walk_info;
 struct date_mode;
diff --git a/refs.c b/refs.c
index aeae31c972f8c88084cc3d052329a3e23e60f1d4..53240bcc07bc1ec37f98afaf1a4d42a8a481138d 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -2,9 +2,11 @@
  * The backend-independent part of the reference module.
  */
 
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "hashmap.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "iterator.h"
 #include "refs.h"
index eed8bc94b04f68125bb84eddfc26381ad86d3157..adc34c836fce48f34e811af27c04e79aa50e617b 100644 (file)
@@ -1,4 +1,5 @@
-
+#include "git-compat-util.h"
+#include "hex.h"
 #include "refs-internal.h"
 #include "trace.h"
 
index b89954355debd64056e045a5f433647ca8ba0160..31bc5c45ee693f43358335436be74cbad31db7a9 100644 (file)
@@ -1,9 +1,11 @@
 #include "../cache.h"
 #include "../config.h"
+#include "../hex.h"
 #include "../refs.h"
 #include "refs-internal.h"
 #include "ref-cache.h"
 #include "packed-backend.h"
+#include "../ident.h"
 #include "../iterator.h"
 #include "../dir-iterator.h"
 #include "../lockfile.h"
index 6f5a0709fba65e80081fdb04563019e1f1e15400..b665d0f7d9b2792a05d79d8613b17b684dd7f318 100644 (file)
@@ -1,5 +1,7 @@
-#include "../cache.h"
+#include "../git-compat-util.h"
+#include "../alloc.h"
 #include "../config.h"
+#include "../hex.h"
 #include "../refs.h"
 #include "refs-internal.h"
 #include "packed-backend.h"
index 32afd8a40b0faf22d1ef2de5bb2a2990fa6eebb3..dc1ca49c85f7cd4be86d88dda0ba31f3f965e6bb 100644 (file)
@@ -1,4 +1,5 @@
-#include "../cache.h"
+#include "../git-compat-util.h"
+#include "../alloc.h"
 #include "../refs.h"
 #include "refs-internal.h"
 #include "ref-cache.h"
index 69f93b0e2ac9fa9ec2778b783fa98792030c327e..a85d113123c99b55e1e7047d334c7608843eb2d6 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef REFS_REFS_INTERNAL_H
 #define REFS_REFS_INTERNAL_H
 
-#include "cache.h"
 #include "refs.h"
 #include "iterator.h"
 
index 63e3112104a949e28e0cae1c8beaee0c27c099f1..28d90911aa5ed383afac90f6a444891cad7877ac 100644 (file)
--- a/refspec.c
+++ b/refspec.c
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "strvec.h"
 #include "refs.h"
 #include "refspec.h"
index a76b6405eb2fc443ff22b93b1598892d02508e20..bf5a0b186fe658abab4be1be610fef8b6fd0d2d4 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "remote.h"
 #include "connect.h"
 #include "strbuf.h"
@@ -472,10 +474,11 @@ static struct discovery *discover_refs(const char *service, int for_push)
 
        /*
         * NEEDSWORK: If we are trying to use protocol v2 and we are planning
-        * to perform a push, then fallback to v0 since the client doesn't know
-        * how to push yet using v2.
+        * to perform any operation that doesn't involve upload-pack (i.e., a
+        * fetch, ls-remote, etc), then fallback to v0 since we don't know how
+        * to do anything else (like push or remote archive) via v2.
         */
-       if (version == protocol_v2 && !strcmp("git-receive-pack", service))
+       if (version == protocol_v2 && strcmp("git-upload-pack", service))
                version = protocol_v0;
 
        /* Add the extra Git-Protocol header */
index 60869beebe7364a594cd45938d4ed97dcdd28840..641b083d90d6a4cf56886dd188273204fc11bf47 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "remote.h"
 #include "urlmatch.h"
 #include "refs.h"
@@ -15,6 +17,7 @@
 #include "commit-reach.h"
 #include "advice.h"
 #include "connect.h"
+#include "parse-options.h"
 
 enum map_direction { FROM_SRC, FROM_DST };
 
index 1ebbe42792ec67230b62dbbe4cb8ed9646576858..73638cefeb102d6dd9a6777645156a2034594240 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -1,11 +1,10 @@
 #ifndef REMOTE_H
 #define REMOTE_H
 
-#include "cache.h"
-#include "parse-options.h"
 #include "hashmap.h"
 #include "refspec.h"
 
+struct option;
 struct transport_ls_refs_options;
 
 /**
index 320be2522d80a87fdb1569a97c5e24b77fd4a525..0cf056c4fbf99c61b9bea72b3dde5550fe23b470 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "oidmap.h"
 #include "object-store.h"
 #include "replace-object.h"
index 3fbc32eb7b7ef7bf9119f83aa7e3a4b6c20104b3..500482b02b38ce30ee51a005d00ca00e76033f19 100644 (file)
@@ -5,6 +5,14 @@
 #include "repository.h"
 #include "object-store.h"
 
+/*
+ * Do replace refs need to be checked this run?  This variable is
+ * initialized to true unless --no-replace-object is used or
+ * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some
+ * commands that do not want replace references to be active.
+ */
+extern int read_replace_refs;
+
 struct replace_object {
        struct oidmap_entry original;
        struct object_id replacement;
index 3dbd3f0e2ec33df0753780f4d84605b16ebdc2b3..0a6c0b381fe13b50fb14b5b6e31ca06c0d44f695 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "repository.h"
 #include "midx.h"
index e8c67ffe16542425b3660b88f2dcf339a473369e..15a8afc5fb5b31b12bc3495663f9f3ca2f399c7e 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef REPOSITORY_H
 #define REPOSITORY_H
 
-#include "git-compat-util.h"
 #include "path.h"
 
 struct config_set;
index 876ab435da949c8359c315636225d9fd7fd962ab..a67abaab0776ee24c44d195e4d1a8f49acff5bdb 100644 (file)
--- a/rerere.c
+++ b/rerere.c
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "string-list.h"
 #include "rerere.h"
diff --git a/reset.c b/reset.c
index 5ded23611f3f7316e2327872a54474ce6e4f6200..58b3829ff7384c23446fe21faa50508d827ad90f 100644 (file)
--- a/reset.c
+++ b/reset.c
@@ -1,5 +1,6 @@
 #include "git-compat-util.h"
 #include "cache-tree.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "refs.h"
 #include "reset.h"
index 21f5f572c22ec7054da6bc20fef26ee2a59a19d5..8b1ecf07fcc6969aa571b8e5a570c9f08c6774f8 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "tag.h"
 #include "blob.h"
@@ -35,6 +37,7 @@
 #include "json-writer.h"
 #include "list-objects-filter-options.h"
 #include "resolve-undo.h"
+#include "parse-options.h"
 
 volatile show_early_output_fn_t show_early_output;
 
@@ -1574,7 +1577,8 @@ void exclude_hidden_refs(struct ref_exclusions *exclusions, const char *section)
 {
        struct exclude_hidden_refs_cb cb;
 
-       if (strcmp(section, "receive") && strcmp(section, "uploadpack"))
+       if (strcmp(section, "fetch") && strcmp(section, "receive") &&
+                       strcmp(section, "uploadpack"))
                die(_("unsupported section for hidden refs: %s"), section);
 
        if (exclusions->hidden_refs_configured)
@@ -3440,8 +3444,8 @@ void reset_revision_walk(void)
 }
 
 static int mark_uninteresting(const struct object_id *oid,
-                             struct packed_git *pack,
-                             uint32_t pos,
+                             struct packed_git *pack UNUSED,
+                             uint32_t pos UNUSED,
                              void *cb)
 {
        struct rev_info *revs = cb;
@@ -4159,7 +4163,7 @@ static struct commit *get_revision_1(struct rev_info *revs)
  * Return true for entries that have not yet been shown.  (This is an
  * object_array_each_func_t.)
  */
-static int entry_unshown(struct object_array_entry *entry, void *cb_data_unused)
+static int entry_unshown(struct object_array_entry *entry, void *cb_data UNUSED)
 {
        return !(entry->item->flags & SHOWN);
 }
index 30febad09a1e3493ed9b89cd57486134cc120f14..649f817f399f4f8fd58eebc728c13dd2fdd8a4e3 100644 (file)
@@ -2,12 +2,12 @@
 #define REVISION_H
 
 #include "commit.h"
-#include "parse-options.h"
 #include "grep.h"
 #include "notes.h"
 #include "pretty.h"
 #include "diff.h"
 #include "commit-slab-decl.h"
+#include "ident.h"
 #include "list-objects-filter-options.h"
 
 /**
@@ -61,6 +61,8 @@ struct string_list;
 struct saved_parents;
 struct bloom_key;
 struct bloom_filter_settings;
+struct option;
+struct parse_opt_ctx_t;
 define_shared_commit_slab(revision_sources, char *);
 
 struct rev_cmdline_info {
index 6bd16acb0603b16a71c729978bba812326ca9400..ba617655b23835325639df50409ee6d776810304 100644 (file)
@@ -341,19 +341,19 @@ static void child_close_pair(int fd[2])
        child_close(fd[1]);
 }
 
-static void child_error_fn(const char *err, va_list params)
+static void child_error_fn(const char *err UNUSED, va_list params UNUSED)
 {
        const char msg[] = "error() should not be called in child\n";
        xwrite(2, msg, sizeof(msg) - 1);
 }
 
-static void child_warn_fn(const char *err, va_list params)
+static void child_warn_fn(const char *err UNUSED, va_list params UNUSED)
 {
        const char msg[] = "warn() should not be called in child\n";
        xwrite(2, msg, sizeof(msg) - 1);
 }
 
-static void NORETURN child_die_fn(const char *err, va_list params)
+static void NORETURN child_die_fn(const char *err UNUSED, va_list params UNUSED)
 {
        const char msg[] = "die() should not be called in child\n";
        xwrite(2, msg, sizeof(msg) - 1);
index f2e19838c9c342b3b9d6df5e9bf24d0add0d47d1..0d0519116260cb851bb50df0f375b0c5e8e6dc64 100644 (file)
@@ -1,6 +1,7 @@
-#include "builtin.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "commit.h"
+#include "hex.h"
 #include "refs.h"
 #include "object-store.h"
 #include "pkt-line.h"
@@ -16,6 +17,7 @@
 #include "gpg-interface.h"
 #include "cache.h"
 #include "shallow.h"
+#include "parse-options.h"
 
 int option_parse_push_signed(const struct option *opt,
                             const char *arg, int unset)
index 1c96a75b1e9f8bbe9a7a2e40a3d4dd7bb80a9335..3be23d7ca20510179664fcc58c4a6856e0cbd776 100644 (file)
@@ -1,5 +1,7 @@
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "dir.h"
 #include "object-store.h"
@@ -263,10 +265,6 @@ static int git_sequencer_config(const char *k, const char *v, void *cb)
        if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
                opts->commit_use_reference = git_config_bool(k, v);
 
-       status = git_gpg_config(k, v, NULL);
-       if (status)
-               return status;
-
        return git_diff_basic_config(k, v, NULL);
 }
 
@@ -2921,13 +2919,18 @@ static int populate_opts_cb(const char *key, const char *value, void *data)
 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
 {
        int i;
+       int count;
        char *strategy_opts_string = raw_opts;
 
        if (*strategy_opts_string == ' ')
                strategy_opts_string++;
 
-       opts->xopts_nr = split_cmdline(strategy_opts_string,
-                                      (const char ***)&opts->xopts);
+       count = split_cmdline(strategy_opts_string,
+                             (const char ***)&opts->xopts);
+       if (count < 0)
+               die(_("could not split '%s': %s"), strategy_opts_string,
+                           split_cmdline_strerror(count));
+       opts->xopts_nr = count;
        for (i = 0; i < opts->xopts_nr; i++) {
                const char *arg = opts->xopts[i];
 
index 3bcdfa1b5865fc5209141870076b7325edfa36d4..33dbaf5b66d8bd803de8b0dfdc7d25300ed62ede 100644 (file)
@@ -1,11 +1,11 @@
 #ifndef SEQUENCER_H
 #define SEQUENCER_H
 
-#include "cache.h"
 #include "strbuf.h"
 #include "wt-status.h"
 
 struct commit;
+struct index_state;
 struct repository;
 
 const char *git_path_commit_editmsg(void);
diff --git a/serve.c b/serve.c
index cbf4a143cfea9bd450d5d033b1ec051025af8a1f..5329c91011f2919fc24bcc3039c264a0c9e2c877 100644 (file)
--- a/serve.c
+++ b/serve.c
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "repository.h"
 #include "config.h"
 #include "pkt-line.h"
@@ -8,17 +8,18 @@
 #include "serve.h"
 #include "upload-pack.h"
 #include "bundle-uri.h"
+#include "trace2.h"
 
 static int advertise_sid = -1;
 static int client_hash_algo = GIT_HASH_SHA1;
 
-static int always_advertise(struct repository *r,
-                           struct strbuf *value)
+static int always_advertise(struct repository *r UNUSED,
+                           struct strbuf *value UNUSED)
 {
        return 1;
 }
 
-static int agent_advertise(struct repository *r,
+static int agent_advertise(struct repository *r UNUSED,
                           struct strbuf *value)
 {
        if (value)
@@ -34,7 +35,7 @@ static int object_format_advertise(struct repository *r,
        return 1;
 }
 
-static void object_format_receive(struct repository *r,
+static void object_format_receive(struct repository *r UNUSED,
                                  const char *algo_name)
 {
        if (!algo_name)
@@ -48,7 +49,7 @@ static void object_format_receive(struct repository *r,
 static int session_id_advertise(struct repository *r, struct strbuf *value)
 {
        if (advertise_sid == -1 &&
-           git_config_get_bool("transfer.advertisesid", &advertise_sid))
+           repo_config_get_bool(r, "transfer.advertisesid", &advertise_sid))
                advertise_sid = 0;
        if (!advertise_sid)
                return 0;
@@ -57,7 +58,7 @@ static int session_id_advertise(struct repository *r, struct strbuf *value)
        return 1;
 }
 
-static void session_id_receive(struct repository *r,
+static void session_id_receive(struct repository *r UNUSED,
                               const char *client_sid)
 {
        if (!client_sid)
index 0ec6c0c16546a7a2ebb45a8e8a03e3270cedf214..40436892023f29f1008d6954fd8b7e5d272610a1 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "dir.h"
+#include "hex.h"
 #include "repository.h"
 #include "refs.h"
 #include "object.h"
index 5c300e812e0a11960dba743773720246e1a84cf1..9b675a046ee699189f54e31cf9a4e8bfc6d304a6 100644 (file)
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "sha1dc_git.h"
+#include "hex.h"
 
 #ifdef DC_SHA1_EXTERNAL
 /*
index 17f9bcdb5f38270c4f5910a2e1c930432ba350e5..1cbb05ba0e45637f1b0655b9b1dbd51ac4da8117 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "repository.h"
 #include "tempfile.h"
 #include "lockfile.h"
index aba6ff5829405647070c5b2a475318e2fd76282d..e9ca7e4bc80451a74dc10fb6d4e1a0b190dc4dcc 100644 (file)
--- a/shallow.h
+++ b/shallow.h
@@ -6,6 +6,8 @@
 #include "repository.h"
 #include "strbuf.h"
 
+struct oid_array;
+
 void set_alternate_shallow_file(struct repository *r, const char *path, int override);
 int register_shallow(struct repository *r, const struct object_id *oid);
 int unregister_shallow(const struct object_id *oid);
diff --git a/shell.c b/shell.c
index af0d7c734f8347082ab094cf1fc8898cbf26b64d..5c67e7bd97e2c825d79c3503267b5b41cd83bb8a 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "quote.h"
 #include "exec-cmd.h"
 #include "strbuf.h"
index 022677b6abaf918f51804a8fcbf18776aa3f2be5..ee778c0580b6d9eb47ebc0d5f1ea7a9d7637a96c 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "sigchain.h"
 
 #define SIGCHAIN_MAX_SIGNALS 32
index 147a13386a445b7278b87c5072d7d5c308a35b8f..63216b3e57f87f0a44749c9350f12d8cb6b45785 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "alloc.h"
 #include "repository.h"
 #include "sparse-index.h"
 #include "tree.h"
index 5d0f04763ea2d201a3bbe417bd1951aea23a8436..95ecfa531954e92947bd13175b760d680f18d0be 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "alloc.h"
 #include "split-index.h"
 #include "ewah/ewok.h"
 
diff --git a/statinfo.h b/statinfo.h
new file mode 100644 (file)
index 0000000..e49e305
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef STATINFO_H
+#define STATINFO_H
+
+/*
+ * The "cache_time" is just the low 32 bits of the
+ * time. It doesn't matter if it overflows - we only
+ * check it for equality in the 32 bits we save.
+ */
+struct cache_time {
+       uint32_t sec;
+       uint32_t nsec;
+};
+
+struct stat_data {
+       struct cache_time sd_ctime;
+       struct cache_time sd_mtime;
+       unsigned int sd_dev;
+       unsigned int sd_ino;
+       unsigned int sd_uid;
+       unsigned int sd_gid;
+       unsigned int sd_size;
+};
+
+#endif
index c383f41a3c5ccc6c6228c4ed4f9631529633f878..1c57ac6574fecf3dfe19dc38e426cb99d54e58f1 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
+#include "hex.h"
 #include "refs.h"
 #include "string-list.h"
 #include "utf8.h"
index 42bacaec55b6ca6bf885797c1c76fc6e964ddfbd..db473f273e1f77c45f2a5b0cf7a70b106bc19d02 100644 (file)
@@ -1,5 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "string-list.h"
+#include "alloc.h"
 
 void string_list_init_nodup(struct string_list *list)
 {
index 61a76ce6cb920f33744e82111c800da8439ed975..17d54b6c3bc500f7c8f927a702e1ec26ba66b7a1 100644 (file)
--- a/strvec.c
+++ b/strvec.c
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "strvec.h"
+#include "alloc.h"
+#include "hex.h"
 #include "strbuf.h"
 
 const char *empty_strvec[] = { NULL };
index 6d4232294dbee7ad2928b0ac12e1860dcf04a12d..1daf5a975254b9b9ea286c5486f4d07f3874bb26 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Generic implementation of background process infrastructure.
  */
+#include "git-compat-util.h"
 #include "sub-process.h"
 #include "sigchain.h"
 #include "pkt-line.h"
index e85f21fa1a7c2bc59f032b5b2a2cffd6cab771a5..6a61638a8ace0b760e1254bcbea14061c3843a25 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef SUBPROCESS_H
 #define SUBPROCESS_H
 
-#include "git-compat-util.h"
 #include "hashmap.h"
 #include "run-command.h"
 
index 4dc61b3a78a2916d737edf613af0f9c0e03d39c8..89a7bf0a93dd176d0d6f8e92bc84287484483428 100644 (file)
@@ -1,5 +1,7 @@
 #include "cache.h"
+#include "alloc.h"
 #include "dir.h"
+#include "hex.h"
 #include "repository.h"
 #include "config.h"
 #include "submodule-config.h"
index 28a8ca6bf46845906cb4bc2071a594a383eefc72..c2045875bbb4caa271e30d8318e8af353c525e37 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef SUBMODULE_CONFIG_CACHE_H
 #define SUBMODULE_CONFIG_CACHE_H
 
-#include "cache.h"
 #include "config.h"
 #include "hashmap.h"
 #include "submodule.h"
index 3a0dfc417c05b627a5100f518768a1b32ee22339..2a057c35b749a564e793a0f80c553744f5189746 100644 (file)
@@ -1,5 +1,5 @@
-
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "repository.h"
 #include "config.h"
 #include "submodule-config.h"
@@ -7,6 +7,7 @@
 #include "dir.h"
 #include "diff.h"
 #include "commit.h"
+#include "hex.h"
 #include "revision.h"
 #include "run-command.h"
 #include "diffcore.h"
@@ -1739,7 +1740,7 @@ static int get_next_submodule(struct child_process *cp, struct strbuf *err,
        return 0;
 }
 
-static int fetch_start_failure(struct strbuf *err,
+static int fetch_start_failure(struct strbuf *err UNUSED,
                               void *cb, void *task_cb)
 {
        struct submodule_parallel_fetch *spf = cb;
@@ -1760,7 +1761,7 @@ static int commit_missing_in_sub(const struct object_id *oid, void *data)
        return type != OBJ_COMMIT;
 }
 
-static int fetch_finish(int retvalue, struct strbuf *err,
+static int fetch_finish(int retvalue, struct strbuf *err UNUSED,
                        void *cb, void *task_cb)
 {
        struct submodule_parallel_fetch *spf = cb;
index 2c2b2522402d087bee89ae8c08be99449c893057..88fa50495734adbdb358103371dfe655a2b468e3 100644 (file)
@@ -140,9 +140,7 @@ aggregate-results-and-cleanup: $(T)
        $(MAKE) clean
 
 aggregate-results:
-       for f in '$(TEST_RESULTS_DIRECTORY_SQ)'/t*-*.counts; do \
-               echo "$$f"; \
-       done | '$(SHELL_PATH_SQ)' ./aggregate-results.sh
+       @'$(SHELL_PATH_SQ)' ./aggregate-results.sh '$(TEST_RESULTS_DIRECTORY_SQ)'
 
 valgrind:
        $(MAKE) GIT_TEST_OPTS="$(GIT_TEST_OPTS) --valgrind"
index 7f2b83bdc8181f6d653f40bf99a40bf8e7cc03f5..6e3bcc4aec7cb922b9fc9ed4469c79b1699c76cc 100755 (executable)
@@ -8,7 +8,7 @@ broken=0
 total=0
 missing_prereq=
 
-while read file
+for file in "$1"/t*-*.counts
 do
        while read type value
        do
index 6c900ca668467dcdbc92c6544ad173565c3a5f08..127f134a2a6e4709b4bed08419b88961354a05e7 100644 (file)
@@ -1,5 +1,6 @@
-#include "git-compat-util.h"
+#include "cache.h"
 #include "bloom.h"
+#include "hex.h"
 #include "test-tool.h"
 #include "commit.h"
 
index 9159a173015cd6efca2f686745cf765e9bdfe58f..615e648e555474fc6284dbea51675cb76fcbb0d5 100644 (file)
@@ -1,6 +1,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "tree.h"
 #include "cache-tree.h"
 #include "parse-options.h"
index e6c1b1e22bb36da604af3238341f6b7b14753796..597027a96e96c923ff630567a8de2f8c47dad3b2 100644 (file)
@@ -1,5 +1,4 @@
 #include "test-tool.h"
-#include "cache.h"
 
 /*
  * Usage: test-tool crontab <file> -l|<input>
index b21bd672d9ff63d1cf29a9c7a2ad300f0e58c0c0..534ca66441cd686f93b36f998bc4eb867d388f4b 100644 (file)
@@ -1,5 +1,4 @@
 #include "test-tool.h"
-#include "cache.h"
 
 static int rc;
 
index 454f17b1a0c1cceadffd6293db43790dcf42972a..92dfc1aa8c4a9e37e4c26c419ea8fcf640399182 100644 (file)
@@ -1,6 +1,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "tree.h"
 #include "cache-tree.h"
 
index 0ea97b8407296a3615ab786e9458ff9bbf638000..813d0a38fae206587438c609cf0282f9f3c6a6aa 100644 (file)
@@ -1,6 +1,7 @@
 #define USE_THE_INDEX_VARIABLE
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "split-index.h"
 #include "ewah/ewok.h"
 
index 6d53683f13b04c2c89680408f3e348cf97043ffd..af953fabe871cc1bc0d4a3999942a9113a6f1f2a 100644 (file)
@@ -2,6 +2,7 @@
 #include "test-tool.h"
 #include "cache.h"
 #include "dir.h"
+#include "hex.h"
 
 static int compare_untracked(const void *a_, const void *b_)
 {
index b9d1200eb988e19f3f0a2c0aeed941a6eb44b9bb..7c7fc8efc13d458df6745fb44804c8f92b4a9a9c 100644 (file)
@@ -1,5 +1,5 @@
 #include "test-tool.h"
-#include "cache.h"
+#include "git-compat-util.h"
 #include "object.h"
 #include "decorate.h"
 
index efc82dd80c5b5711ecb4947b3c082433845e1e50..b1edb92a03252817c5a0a388e75f83c8ce67a2d0 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "cache-tree.h"
 #include "commit.h"
+#include "hex.h"
 #include "lockfile.h"
 #include "merge-ort.h"
 #include "refs.h"
index 5860dab0ffac976bc3e6d0ef2da2153566477018..016248106a76bec6b2c85d535f2edeb4350ea8a8 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 
 int cmd_hash_impl(int ac, const char **av, int algo)
 {
index 8c3edacc0007df7ddb52f2f65d00e44b95edeb5a..86887f53203c0d7c1c7b9dd5b71ae78cb156b390 100644 (file)
@@ -1,5 +1,4 @@
 #include "test-tool.h"
-#include "cache.h"
 #include "json-writer.h"
 
 static const char *expect_obj1 = "{\"a\":\"abc\",\"b\":42,\"c\":true}";
index 4079fdee06776c8179fbc15283141f3890ff013e..04bc2563f3e5b96fcd12867f7b5743571046971e 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "tree.h"
 
 int cmd__match_trees(int ac, const char **av)
index d1324d086a24c0575e6beadaeef2ce1e8b6a80f0..0906993ad59bfcd0a4f3e20f8c1a1a0bff737a59 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "oid-array.h"
 
 static int print_oid(const struct object_id *oid, void *data)
index 0acf99931ee176982d61078dc0e2d882377c05fd..883d40efd45edc16fe486d2ad5228590451b8071 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "oidmap.h"
 #include "strbuf.h"
 
index d48a409f4e4fb377a7cbc4684fa05737ea32f2c1..0b82431a70fe99cb59e1729fae49eacd4920878e 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "oidtree.h"
 
 static enum cb_next print_oid(const struct object_id *oid, void *data)
index f7b79daf4c03843c5003100b63666f8dbdbfd1d5..f68b3761b68ca7bc2d6465f6a89a9f5a879215b7 100644 (file)
@@ -1,5 +1,6 @@
 #include "git-compat-util.h"
 #include "test-tool.h"
+#include "hex.h"
 #include "strbuf.h"
 #include "object-store.h"
 #include "packfile.h"
index b3e08cef4b3f86ba95509f1d66345f7ca6016ea3..71d2131fbad00f763eca42d50a779f8885887043 100644 (file)
@@ -6,7 +6,7 @@
 int cmd__parse_pathspec_file(int argc, const char **argv)
 {
        struct pathspec pathspec;
-       const char *pathspec_from_file = NULL;
+       char *pathspec_from_file = NULL;
        int pathspec_file_nul = 0, i;
 
        static const char *const usage[] = {
@@ -29,5 +29,6 @@ int cmd__parse_pathspec_file(int argc, const char **argv)
                printf("%s\n", pathspec.items[i].original);
 
        clear_pathspec(&pathspec);
+       free(pathspec_from_file);
        return 0;
 }
index 3f102cfddd3f4b6fe85391a8a2fc3a11b9b509c7..da17fd37eb1dc487eb12b1ca9aab3a443c2599fb 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "test-tool.h"
 #include "repository.h"
 #include "object-store.h"
index 5258fdddba0eb36829c04216fbb71b1a196810d0..5d0b2a2e10fa66e16dd954f97ba7561b106fce50 100644 (file)
@@ -1,5 +1,4 @@
 #include "test-tool.h"
-#include "cache.h"
 #include "grep.h"
 
 int cmd__pcre2_config(int argc, const char **argv)
index 133b5e6f4ae5fdbd90f6594223df60f918a036f4..4915412e074691f6ddf3396d0ca45dd6b03588ad 100644 (file)
@@ -1,8 +1,7 @@
 #include "test-tool.h"
-#include "cache.h"
 #include "prio-queue.h"
 
-static int intcmp(const void *va, const void *vb, void *data)
+static int intcmp(const void *va, const void *vb, void *data UNUSED)
 {
        const int *a = va, *b = vb;
        return *a - *b;
index a4b305f4947fd21da757807a4e85c1c62987867f..7e12d4f9aa2d00f2dbb8a46d8795bced622d4794 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "connect.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "pkt-line.h"
 #include "sigchain.h"
index 2f65c7f6a55bc146ea69ea9ef85d45a1f6172ac3..de8f26639d411710e1c745173091622df2cf0837 100644 (file)
@@ -1,8 +1,9 @@
 #include "test-tool.h"
-#include "cache.h"
+#include "alloc.h"
 #include "commit.h"
 #include "commit-reach.h"
 #include "config.h"
+#include "hex.h"
 #include "parse-options.h"
 #include "ref-filter.h"
 #include "string-list.h"
index 27072ba94d76005b6f49e04f60f2e697efd0e073..0a883cdf26b0871657e6dc3c778ae2ca9f323cef 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "midx.h"
 #include "repository.h"
 #include "object-store.h"
index ae8a5648daf5c1385afe43f327bf9a5a3d98e1f1..1745b088b7c2b924b006bf90e02ae4677b0cc30d 100644 (file)
@@ -1,5 +1,6 @@
 #include "test-tool.h"
 #include "cache.h"
+#include "hex.h"
 #include "refs.h"
 #include "worktree.h"
 #include "object-store.h"
index 56f0e3c1bef293dd505e28af4b48dfce11490b3c..10a6dfc2160f6628db768db3fc7968fa62971815 100644 (file)
@@ -3,6 +3,7 @@
 #include "commit-graph.h"
 #include "commit.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "object.h"
 #include "repository.h"
index 3ecb830f4a8cd196f20ff0c371108c8f5579f3cd..b0d041ec5ffb9d4a3fa718920355386b50f9b2a3 100644 (file)
@@ -9,8 +9,6 @@
  */
 
 #include "test-tool.h"
-#include "git-compat-util.h"
-#include "cache.h"
 #include "run-command.h"
 #include "strvec.h"
 #include "strbuf.h"
@@ -24,7 +22,7 @@ static int number_callbacks;
 static int parallel_next(struct child_process *cp,
                         struct strbuf *err,
                         void *cb,
-                        void **task_cb)
+                        void **task_cb UNUSED)
 {
        struct child_process *d = cb;
        if (number_callbacks >= 4)
@@ -40,10 +38,10 @@ static int parallel_next(struct child_process *cp,
        return 1;
 }
 
-static int no_job(struct child_process *cp,
+static int no_job(struct child_process *cp UNUSED,
                  struct strbuf *err,
-                 void *cb,
-                 void **task_cb)
+                 void *cb UNUSED,
+                 void **task_cb UNUSED)
 {
        if (err)
                strbuf_addstr(err, "no further jobs available\n");
@@ -52,10 +50,10 @@ static int no_job(struct child_process *cp,
        return 0;
 }
 
-static int task_finished(int result,
+static int task_finished(int result UNUSED,
                         struct strbuf *err,
-                        void *pp_cb,
-                        void *pp_task_cb)
+                        void *pp_cb UNUSED,
+                        void *pp_task_cb UNUSED)
 {
        if (err)
                strbuf_addstr(err, "asking for a quick stop\n");
index d013bccddaebd9c7fb0eb4b4c4e1be0643f82260..d1cf7377b7c60e0259f747a334983563b6c86715 100644 (file)
@@ -1,5 +1,4 @@
 #include "test-tool.h"
-#include "cache.h"
 #include "sigchain.h"
 
 #define X(f) \
index 28365ff85b69bbda4ca47b5284b2cbd7bebea9e9..3d1436da59872fcfe7551a5586c7720893221ddb 100644 (file)
@@ -3,13 +3,14 @@
  */
 
 #include "test-tool.h"
-#include "cache.h"
+#include "gettext.h"
 #include "strbuf.h"
 #include "simple-ipc.h"
 #include "parse-options.h"
 #include "thread-utils.h"
 #include "strvec.h"
 #include "run-command.h"
+#include "trace2.h"
 
 #ifndef SUPPORTS_SIMPLE_IPC
 int cmd__simple_ipc(int argc, const char **argv)
index dc1c14bde3741715f9dee0768f061e31ba2d7330..a3848a8b66859e58c3d43065208a4292e63fabec 100644 (file)
@@ -1,4 +1,5 @@
 #include "test-tool.h"
+#include "cache.h"
 #include "submodule-config.h"
 
 static void die_usage(const char **argv, const char *msg)
index 2c103d1824cfc7f035aea4a6453c9706f9b4491e..a95bb4da9b174e547b41eb2c57dee9fd9273c5ea 100644 (file)
@@ -1,5 +1,4 @@
 #include "test-tool.h"
-#include "cache.h"
 
 int cmd__wildmatch(int argc, const char **argv)
 {
index 09cf5ed0120bcb35119655596d2a24114363ee48..6805229dcb9528e75399aefc46735e8cd14f4b4c 100644 (file)
@@ -142,6 +142,7 @@ prepare_httpd() {
        install_script error-smart-http.sh
        install_script error.sh
        install_script apply-one-time-perl.sh
+       install_script nph-custom-auth.sh
 
        ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules"
 
@@ -227,8 +228,12 @@ test_http_push_nonff () {
                git commit -a -m path2 --amend &&
 
                test_must_fail git push -v origin >output 2>&1 &&
-               (cd "$REMOTE_REPO" &&
-                test $HEAD = $(git rev-parse --verify HEAD))
+               (
+                       cd "$REMOTE_REPO" &&
+                       echo "$HEAD" >expect &&
+                       git rev-parse --verify HEAD >actual &&
+                       test_cmp expect actual
+               )
        '
 
        test_expect_success 'non-fast-forward push show ref status' '
index 31f82fa0934dd545af91e7659e043ffaff740aef..f43a25c1f100d04d4b556b36a4b7f4d56ac89324 100644 (file)
@@ -141,6 +141,11 @@ Alias /auth/dumb/ www/auth/dumb/
        SetEnv GIT_HTTP_EXPORT_ALL
        SetEnv GIT_PROTOCOL
 </LocationMatch>
+<LocationMatch /custom_auth/>
+       SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
+       SetEnv GIT_HTTP_EXPORT_ALL
+       CGIPassAuth on
+</LocationMatch>
 ScriptAlias /smart/incomplete_length/git-upload-pack incomplete-length-upload-pack-v2-http.sh/
 ScriptAlias /smart/incomplete_body/git-upload-pack incomplete-body-upload-pack-v2-http.sh/
 ScriptAlias /smart/no_report/git-receive-pack error-no-report.sh/
@@ -150,6 +155,7 @@ ScriptAlias /broken_smart/ broken-smart-http.sh/
 ScriptAlias /error_smart/ error-smart-http.sh/
 ScriptAlias /error/ error.sh/
 ScriptAliasMatch /one_time_perl/(.*) apply-one-time-perl.sh/$1
+ScriptAliasMatch /custom_auth/(.*) nph-custom-auth.sh/$1
 <Directory ${GIT_EXEC_PATH}>
        Options FollowSymlinks
 </Directory>
diff --git a/t/lib-httpd/nph-custom-auth.sh b/t/lib-httpd/nph-custom-auth.sh
new file mode 100644 (file)
index 0000000..f5345e7
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+VALID_CREDS_FILE=custom-auth.valid
+CHALLENGE_FILE=custom-auth.challenge
+
+#
+# If $VALID_CREDS_FILE exists in $HTTPD_ROOT_PATH, consider each line as a valid
+# credential for the current request. Each line in the file is considered a
+# valid HTTP Authorization header value. For example:
+#
+# Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+#
+# If $CHALLENGE_FILE exists in $HTTPD_ROOT_PATH, output the contents as headers
+# in a 401 response if no valid authentication credentials were included in the
+# request. For example:
+#
+# WWW-Authenticate: Bearer authorize_uri="id.example.com" p=1 q=0
+# WWW-Authenticate: Basic realm="example.com"
+#
+
+if test -n "$HTTP_AUTHORIZATION" && \
+       grep -Fqsx "${HTTP_AUTHORIZATION}" "$VALID_CREDS_FILE"
+then
+       # Note that although git-http-backend returns a status line, it
+       # does so using a CGI 'Status' header. Because this script is an
+       # No Parsed Headers (NPH) script, we must return a real HTTP
+       # status line.
+       # This is only a test script, so we don't bother to check for
+       # the actual status from git-http-backend and always return 200.
+       echo 'HTTP/1.1 200 OK'
+       exec "$GIT_EXEC_PATH"/git-http-backend
+fi
+
+echo 'HTTP/1.1 401 Authorization Required'
+if test -f "$CHALLENGE_FILE"
+then
+       cat "$CHALLENGE_FILE"
+fi
+echo
index cfd76bf987bd902503cfcacd3e8ac1b9c4deb09c..89ca1f7805547eec1f4ee8e90c1afefc30b35da6 100644 (file)
@@ -29,8 +29,12 @@ set_and_save_state () {
 
 # verify_state <path> <expected-worktree-content> <expected-index-content>
 verify_state () {
-       test "$(cat "$1")" = "$2" &&
-       test "$(git show :"$1")" = "$3"
+       echo "$2" >expect &&
+       test_cmp expect "$1" &&
+
+       echo "$3" >expect &&
+       git show :"$1" >actual &&
+       test_cmp expect actual
 }
 
 # verify_saved_state <path>
@@ -46,5 +50,6 @@ save_head () {
 }
 
 verify_saved_head () {
-       test "$(cat _head)" = "$(git rev-parse HEAD)"
+       git rev-parse HEAD >actual &&
+       test_cmp _head actual
 }
index 2d31fcfda1f338973cfc868b7f01ae925b39d326..dee14992c52d5d24075c9b048dfe1e47c620b29e 100644 (file)
@@ -168,20 +168,16 @@ replace_gitfile_with_git_dir () {
 # Note that this only supports submodules at the root level of the
 # superproject, with the default name, i.e. same as its path.
 test_git_directory_is_unchanged () {
-       (
-               cd ".git/modules/$1" &&
-               # does core.worktree point at the right place?
-               test "$(git config core.worktree)" = "../../../$1" &&
-               # remove it temporarily before comparing, as
-               # "$1/.git/config" lacks it...
-               git config --unset core.worktree
-       ) &&
+       # does core.worktree point at the right place?
+       echo "../../../$1" >expect &&
+       git -C ".git/modules/$1" config core.worktree >actual &&
+       test_cmp expect actual &&
+       # remove it temporarily before comparing, as
+       # "$1/.git/config" lacks it...
+       git -C ".git/modules/$1" config --unset core.worktree &&
        diff -r ".git/modules/$1" "$1/.git" &&
-       (
-               # ... and then restore.
-               cd ".git/modules/$1" &&
-               git config core.worktree "../../../$1"
-       )
+       # ... and then restore.
+       git -C ".git/modules/$1" config core.worktree "../../../$1"
 }
 
 test_git_directory_exists () {
@@ -189,7 +185,9 @@ test_git_directory_exists () {
        if test -f sub1/.git
        then
                # does core.worktree point at the right place?
-               test "$(git -C .git/modules/$1 config core.worktree)" = "../../../$1"
+               echo "../../../$1" >expect &&
+               git -C ".git/modules/$1" config core.worktree >actual &&
+               test_cmp expect actual
        fi
 }
 
index 3242cfe91a096fef06d11cc589bb1ab415135e96..e4a132f5934488be8530dfdfcef03ea9fbc642d7 100755 (executable)
@@ -124,6 +124,6 @@ test_perf_on_all git read-tree -mu HEAD
 test_perf_on_all git checkout-index -f --all
 test_perf_on_all git update-index --add --remove $SPARSE_CONE/a
 test_perf_on_all "git rm -f $SPARSE_CONE/a && git checkout HEAD -- $SPARSE_CONE/a"
-test_perf_on_all git grep --cached --sparse bogus -- "f2/f1/f1/*"
+test_perf_on_all git grep --cached bogus -- "f2/f1/f1/*"
 
 test_done
index d479303efa03df6f818496f1cdcafe390bee0126..30a6edca1d29fcef63cfc155685600c63553f636 100755 (executable)
@@ -598,9 +598,14 @@ test_expect_success 'invalid default branch name' '
 test_expect_success 'branch -m with the initial branch' '
        git init rename-initial &&
        git -C rename-initial branch -m renamed &&
-       test renamed = $(git -C rename-initial symbolic-ref --short HEAD) &&
+       echo renamed >expect &&
+       git -C rename-initial symbolic-ref --short HEAD >actual &&
+       test_cmp expect actual &&
+
        git -C rename-initial branch -m renamed again &&
-       test again = $(git -C rename-initial symbolic-ref --short HEAD)
+       echo again >expect &&
+       git -C rename-initial symbolic-ref --short HEAD >actual &&
+       test_cmp expect actual
 '
 
 test_done
index 26eaca095a26a6a654364bdd8acf208af30b2d00..e013d38f485cc8b06c1afb51579ed6a4d322dfaa 100755 (executable)
@@ -33,7 +33,9 @@ test_expect_success 'bad setup: invalid .git file path' '
 
 test_expect_success 'final setup + check rev-parse --git-dir' '
        echo "gitdir: $REAL" >.git &&
-       test "$REAL" = "$(git rev-parse --git-dir)"
+       echo "$REAL" >expect &&
+       git rev-parse --git-dir >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'check hash-object' '
index a94ac1eae377c023ae3e02eaae393db6e8d232d3..2f57c8669cb5af3dd6fc79bfca4b486f50fa4d19 100755 (executable)
@@ -70,7 +70,8 @@ create_NNO_MIX_files () {
                                cp CRLF        ${pfx}_CRLF.txt &&
                                cp CRLF_mix_LF ${pfx}_CRLF_mix_LF.txt &&
                                cp LF_mix_CR   ${pfx}_LF_mix_CR.txt &&
-                               cp CRLF_nul    ${pfx}_CRLF_nul.txt
+                               cp CRLF_nul    ${pfx}_CRLF_nul.txt ||
+                               return 1
                        done
                done
        done
@@ -101,7 +102,8 @@ commit_check_warn () {
        do
                fname=${pfx}_$f.txt &&
                cp $f $fname &&
-               git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err"
+               git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err" ||
+               return 1
        done &&
        git commit -m "core.autocrlf $crlf" &&
        check_warning "$lfname" ${pfx}_LF.err &&
@@ -121,15 +123,19 @@ commit_chk_wrnNNO () {
        lfmixcr=$1 ; shift
        crlfnul=$1 ; shift
        pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
-       #Commit files on top of existing file
-       create_gitattributes "$attr" $aeol &&
-       for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
-       do
-               fname=${pfx}_$f.txt &&
-               cp $f $fname &&
-               printf Z >>"$fname" &&
-               git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err"
-       done
+
+       test_expect_success 'setup commit NNO files' '
+               #Commit files on top of existing file
+               create_gitattributes "$attr" $aeol &&
+               for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
+               do
+                       fname=${pfx}_$f.txt &&
+                       cp $f $fname &&
+                       printf Z >>"$fname" &&
+                       git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err" ||
+                       return 1
+               done
+       '
 
        test_expect_success "commit NNO files crlf=$crlf attr=$attr LF" '
                check_warning "$lfwarn" ${pfx}_LF.err
@@ -163,15 +169,19 @@ commit_MIX_chkwrn () {
        lfmixcr=$1 ; shift
        crlfnul=$1 ; shift
        pfx=MIX_attr_${attr}_aeol_${aeol}_${crlf}
-       #Commit file with CLRF_mix_LF on top of existing file
-       create_gitattributes "$attr" $aeol &&
-       for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
-       do
-               fname=${pfx}_$f.txt &&
-               cp CRLF_mix_LF $fname &&
-               printf Z >>"$fname" &&
-               git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err"
-       done
+
+       test_expect_success 'setup commit file with mixed EOL' '
+               #Commit file with CLRF_mix_LF on top of existing file
+               create_gitattributes "$attr" $aeol &&
+               for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
+               do
+                       fname=${pfx}_$f.txt &&
+                       cp CRLF_mix_LF $fname &&
+                       printf Z >>"$fname" &&
+                       git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err" ||
+                       return 1
+               done
+       '
 
        test_expect_success "commit file with mixed EOL onto LF crlf=$crlf attr=$attr" '
                check_warning "$lfwarn" ${pfx}_LF.err
@@ -289,17 +299,17 @@ checkout_files () {
        lfmixcrlf=$1 ; shift
        lfmixcr=$1 ; shift
        crlfnul=$1 ; shift
-       create_gitattributes "$attr" $ident $aeol &&
-       git config core.autocrlf $crlf &&
+       test_expect_success "setup config for checkout attr=$attr ident=$ident aeol=$aeol core.autocrlf=$crlf" '
+               create_gitattributes "$attr" $ident $aeol &&
+               git config core.autocrlf $crlf
+       '
        pfx=eol_${ceol}_crlf_${crlf}_attr_${attr}_ &&
        for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul
        do
-               rm crlf_false_attr__$f.txt &&
-               if test -z "$ceol"; then
-                       git checkout -- crlf_false_attr__$f.txt
-               else
-                       git -c core.eol=$ceol checkout -- crlf_false_attr__$f.txt
-               fi
+               test_expect_success "setup $f checkout ${ceol:+ with -c core.eol=$ceol}"  '
+                       rm -f crlf_false_attr__$f.txt &&
+                       git ${ceol:+-c core.eol=$ceol} checkout -- crlf_false_attr__$f.txt
+               '
        done
 
        test_expect_success "ls-files --eol attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol" '
index 6bada3702257649551558884237f71bea3fdadc2..c3eb1158ef9ae2eb10f3f7a6d5c882e41f3c576a 100755 (executable)
@@ -15,12 +15,22 @@ test_expect_success SYMLINKS setup '
 
 test_expect_success SYMLINKS 'update-index --add beyond symlinks' '
        test_must_fail git update-index --add c/d &&
-       ! ( git ls-files | grep c/d )
+       cat >expect <<-\EOF &&
+       a
+       b/d
+       EOF
+       git ls-files >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success SYMLINKS 'add beyond symlinks' '
        test_must_fail git add c/d &&
-       ! ( git ls-files | grep c/d )
+       cat >expect <<-\EOF &&
+       a
+       b/d
+       EOF
+       git ls-files >actual &&
+       test_cmp expect actual
 '
 
 test_done
index 68e29c904a62c9ef51d6a1bfc3449795d50ac10f..0afa3d0d312ca6d1788b76d3b0dfcba04f8397e7 100755 (executable)
@@ -10,20 +10,27 @@ TEST_PASSES_SANITIZE_LEAK=true
 
 norm_path() {
        expected=$(test-tool path-utils print_path "$2")
-       test_expect_success $3 "normalize path: $1 => $2" \
-       "test \"\$(test-tool path-utils normalize_path_copy '$1')\" = '$expected'"
+       test_expect_success $3 "normalize path: $1 => $2" "
+               echo '$expected' >expect &&
+               test-tool path-utils normalize_path_copy '$1' >actual &&
+               test_cmp expect actual
+       "
 }
 
 relative_path() {
        expected=$(test-tool path-utils print_path "$3")
-       test_expect_success $4 "relative path: $1 $2 => $3" \
-       "test \"\$(test-tool path-utils relative_path '$1' '$2')\" = '$expected'"
+       test_expect_success $4 "relative path: $1 $2 => $3" "
+               echo '$expected' >expect &&
+               test-tool path-utils relative_path '$1' '$2' >actual &&
+               test_cmp expect actual
+       "
 }
 
 test_submodule_relative_url() {
        test_expect_success "test_submodule_relative_url: $1 $2 $3 => $4" "
-               actual=\$(test-tool submodule resolve-relative-url '$1' '$2' '$3') &&
-               test \"\$actual\" = '$4'
+               echo '$4' >expect &&
+               test-tool submodule resolve-relative-url '$1' '$2' '$3' >actual &&
+               test_cmp expect actual
        "
 }
 
@@ -64,9 +71,11 @@ ancestor() {
                expected=$(($expected-$rootslash+$rootoff))
                ;;
        esac
-       test_expect_success $4 "longest ancestor: $1 $2 => $expected" \
-       "actual=\$(test-tool path-utils longest_ancestor_length '$1' '$2') &&
-        test \"\$actual\" = '$expected'"
+       test_expect_success $4 "longest ancestor: $1 $2 => $expected" "
+               echo '$expected' >expect &&
+               test-tool path-utils longest_ancestor_length '$1' '$2' >actual &&
+               test_cmp expect actual
+       "
 }
 
 # Some absolute path tests should be skipped on Windows due to path mangling
@@ -166,8 +175,10 @@ ancestor D:/Users/me C:/ -1 MINGW
 ancestor //server/share/my-directory //server/share/ 14 MINGW
 
 test_expect_success 'strip_path_suffix' '
-       test c:/msysgit = $(test-tool path-utils strip_path_suffix \
-               c:/msysgit/libexec//git-core libexec/git-core)
+       echo c:/msysgit >expect &&
+       test-tool path-utils strip_path_suffix \
+               c:/msysgit/libexec//git-core libexec/git-core >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'absolute path rejects the empty string' '
@@ -188,35 +199,61 @@ test_expect_success 'real path rejects the empty string' '
 '
 
 test_expect_success POSIX 'real path works on absolute paths 1' '
+       echo / >expect &&
+       test-tool path-utils real_path "/" >actual &&
+       test_cmp expect actual &&
+
        nopath="hopefully-absent-path" &&
-       test "/" = "$(test-tool path-utils real_path "/")" &&
-       test "/$nopath" = "$(test-tool path-utils real_path "/$nopath")"
+       echo "/$nopath" >expect &&
+       test-tool path-utils real_path "/$nopath" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'real path works on absolute paths 2' '
-       nopath="hopefully-absent-path" &&
        # Find an existing top-level directory for the remaining tests:
        d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
-       test "$d" = "$(test-tool path-utils real_path "$d")" &&
-       test "$d/$nopath" = "$(test-tool path-utils real_path "$d/$nopath")"
+       echo "$d" >expect &&
+       test-tool path-utils real_path "$d" >actual &&
+       test_cmp expect actual &&
+
+       nopath="hopefully-absent-path" &&
+       echo "$d/$nopath" >expect &&
+       test-tool path-utils real_path "$d/$nopath" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success POSIX 'real path removes extra leading slashes' '
+       echo "/" >expect &&
+       test-tool path-utils real_path "///" >actual &&
+       test_cmp expect actual &&
+
        nopath="hopefully-absent-path" &&
-       test "/" = "$(test-tool path-utils real_path "///")" &&
-       test "/$nopath" = "$(test-tool path-utils real_path "///$nopath")" &&
+       echo "/$nopath" >expect &&
+       test-tool path-utils real_path "///$nopath" >actual &&
+       test_cmp expect actual &&
+
        # Find an existing top-level directory for the remaining tests:
        d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
-       test "$d" = "$(test-tool path-utils real_path "//$d")" &&
-       test "$d/$nopath" = "$(test-tool path-utils real_path "//$d/$nopath")"
+       echo "$d" >expect &&
+       test-tool path-utils real_path "//$d" >actual &&
+       test_cmp expect actual &&
+
+       echo "$d/$nopath" >expect &&
+       test-tool path-utils real_path "//$d/$nopath" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'real path removes other extra slashes' '
-       nopath="hopefully-absent-path" &&
        # Find an existing top-level directory for the remaining tests:
        d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
-       test "$d" = "$(test-tool path-utils real_path "$d///")" &&
-       test "$d/$nopath" = "$(test-tool path-utils real_path "$d///$nopath")"
+       echo "$d" >expect &&
+       test-tool path-utils real_path "$d///" >actual &&
+       test_cmp expect actual &&
+
+       nopath="hopefully-absent-path" &&
+       echo "$d/$nopath" >expect &&
+       test-tool path-utils real_path "$d///$nopath" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success SYMLINKS 'real path works on symlinks' '
@@ -227,19 +264,29 @@ test_expect_success SYMLINKS 'real path works on symlinks' '
        mkdir third &&
        dir="$(cd .git && pwd -P)" &&
        dir2=third/../second/other/.git &&
-       test "$dir" = "$(test-tool path-utils real_path $dir2)" &&
+       echo "$dir" >expect &&
+       test-tool path-utils real_path $dir2 >actual &&
+       test_cmp expect actual &&
        file="$dir"/index &&
-       test "$file" = "$(test-tool path-utils real_path $dir2/index)" &&
+       echo "$file" >expect &&
+       test-tool path-utils real_path $dir2/index >actual &&
+       test_cmp expect actual &&
        basename=blub &&
-       test "$dir/$basename" = "$(cd .git && test-tool path-utils real_path "$basename")" &&
+       echo "$dir/$basename" >expect &&
+       test-tool -C .git path-utils real_path "$basename" >actual &&
+       test_cmp expect actual &&
        ln -s ../first/file .git/syml &&
        sym="$(cd first && pwd -P)"/file &&
-       test "$sym" = "$(test-tool path-utils real_path "$dir2/syml")"
+       echo "$sym" >expect &&
+       test-tool path-utils real_path "$dir2/syml" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success SYMLINKS 'prefix_path works with absolute paths to work tree symlinks' '
        ln -s target symlink &&
-       test "$(test-tool path-utils prefix_path prefix "$(pwd)/symlink")" = "symlink"
+       echo "symlink" >expect &&
+       test-tool path-utils prefix_path prefix "$(pwd)/symlink" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'prefix_path works with only absolute path to work tree' '
@@ -255,7 +302,10 @@ test_expect_success 'prefix_path rejects absolute path to dir with same beginnin
 test_expect_success SYMLINKS 'prefix_path works with absolute path to a symlink to work tree having  same beginning as work tree' '
        git init repo &&
        ln -s repo repolink &&
-       test "a" = "$(cd repo && test-tool path-utils prefix_path prefix "$(pwd)/../repolink/a")"
+       echo "a" >expect &&
+       repo_path="$(cd repo && pwd)" &&
+       test-tool -C repo path-utils prefix_path prefix "$repo_path/../repolink/a" >actual &&
+       test_cmp expect actual
 '
 
 relative_path /foo/a/b/c/      /foo/a/b/       c/
index a16cc3d298357be89e58514db83c1d3f04b3ad4d..70a3223f2199b06833166863e58489ba0f632e59 100755 (executable)
@@ -12,7 +12,9 @@ test_expect_success 'branch -d @{-1}' '
        test_commit A &&
        git checkout -b junk &&
        git checkout - &&
-       test "$(git symbolic-ref HEAD)" = refs/heads/main &&
+       echo refs/heads/main >expect &&
+       git symbolic-ref HEAD >actual &&
+       test_cmp expect actual &&
        git branch -d @{-1} &&
        test_must_fail git rev-parse --verify refs/heads/junk
 '
@@ -21,7 +23,9 @@ test_expect_success 'branch -d @{-12} when there is not enough switches yet' '
        git reflog expire --expire=now &&
        git checkout -b junk2 &&
        git checkout - &&
-       test "$(git symbolic-ref HEAD)" = refs/heads/main &&
+       echo refs/heads/main >expect &&
+       git symbolic-ref HEAD >actual &&
+       test_cmp expect actual &&
        test_must_fail git branch -d @{-12} &&
        git rev-parse --verify refs/heads/main
 '
index be23be30c768304d35d79cf6905d576293125801..c7745e1bf69e910c2d66a61bb8bef36b45473a56 100755 (executable)
@@ -33,7 +33,8 @@ test_expect_success 'symbolic-ref refuses non-ref for HEAD' '
 reset_to_sane
 
 test_expect_success 'symbolic-ref refuses bare sha1' '
-       test_must_fail git symbolic-ref HEAD $(git rev-parse HEAD)
+       rev=$(git rev-parse HEAD) &&
+       test_must_fail git symbolic-ref HEAD "$rev"
 '
 
 reset_to_sane
index fdb886dfe431f36dfc4ef6bcf24abf6827c2243d..bca46378b256f824708a0fb5bcb0afe3f1de1056 100755 (executable)
@@ -1023,4 +1023,34 @@ test_expect_success 'fsck error on gitattributes with excessive size' '
        test_cmp expected actual
 '
 
+test_expect_success 'fsck detects problems in worktree index' '
+       test_when_finished "git worktree remove -f wt" &&
+       git worktree add wt &&
+
+       echo "this will be removed to break the worktree index" >wt/file &&
+       git -C wt add file &&
+       blob=$(git -C wt rev-parse :file) &&
+       remove_object $blob &&
+
+       test_must_fail git fsck --name-objects >actual 2>&1 &&
+       cat >expect <<-EOF &&
+       missing blob $blob (.git/worktrees/wt/index:file)
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'fsck reports problems in main index without filename' '
+       test_when_finished "rm -f .git/index && git read-tree HEAD" &&
+       echo "this object will be removed to break the main index" >file &&
+       git add file &&
+       blob=$(git rev-parse :file) &&
+       remove_object $blob &&
+
+       test_must_fail git fsck --name-objects >actual 2>&1 &&
+       cat >expect <<-EOF &&
+       missing blob $blob (:file)
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index 0fafcf9dde385f2c2bac7fbd846098908a72f09b..c1679e31d8afca409323484d588bf63b264f45f2 100755 (executable)
@@ -6,8 +6,12 @@ TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_prefix() {
-       test_expect_success "$1" \
-       "test '$2' = \"\$(git rev-parse --show-prefix)\""
+       local expect="$2" &&
+       test_expect_success "$1: git rev-parse --show-prefix is '$2'" '
+               echo "$expect" >expect &&
+               git rev-parse --show-prefix >actual &&
+               test_cmp expect actual
+       '
 }
 
 test_fail() {
index c34714ffe3fbe5545da1d05b9a74cfc6113e43dd..549eb315a9037845e1dedea14ccb16b943714649 100755 (executable)
@@ -183,6 +183,11 @@ test_expect_success '@{u} error message when no upstream' '
        test_cmp expect actual
 '
 
+test_expect_success '@{u} silent error when no upstream' '
+       test_must_fail git rev-parse --verify --quiet @{u} 2>actual &&
+       test_must_be_empty actual
+'
+
 test_expect_success 'branch@{u} error message with misspelt branch' '
        cat >expect <<-EOF &&
        fatal: no such branch: ${SQ}no-such-branch${SQ}
index 112682a45a1df3d5c19eab03ec79c1202d2cab71..67d18cfa104b867bfdd2004df0bc8c9e305cfdc9 100755 (executable)
@@ -22,8 +22,10 @@ test_expect_success \
 git checkout-index symlink &&
 test -f symlink'
 
-test_expect_success \
-'the file must be the blob we added during the setup' '
-test "$(git hash-object -t blob symlink)" = $l'
+test_expect_success 'the file must be the blob we added during the setup' '
+       echo "$l" >expect &&
+       git hash-object -t blob symlink >actual &&
+       test_cmp expect actual
+'
 
 test_done
index 713c3fa6038632bff43ef8344be2d4a6a73cb32e..034f62c13c5949cd4b8dbadf14013f7ce980db31 100755 (executable)
@@ -50,10 +50,13 @@ test_expect_success 'checkout commit with dir must not remove untracked a/b' '
 
 test_expect_success SYMLINKS 'the symlink remained' '
 
-       test_when_finished "rm a/b" &&
        test -h a/b
 '
 
+test_expect_success 'cleanup after previous symlink tests' '
+       rm a/b
+'
+
 test_expect_success SYMLINKS 'checkout -f must not follow symlinks when removing entries' '
        git checkout -f start &&
        mkdir dir &&
@@ -66,4 +69,15 @@ test_expect_success SYMLINKS 'checkout -f must not follow symlinks when removing
        test_path_is_file untracked/f
 '
 
+test_expect_success 'checkout --overwrite-ignore should succeed if only ignored files in the way' '
+       git checkout -b df_conflict &&
+       test_commit contents some_dir &&
+       git checkout start &&
+       mkdir some_dir &&
+       echo autogenerated information >some_dir/ignore &&
+       echo ignore >.git/info/exclude &&
+       git checkout --overwrite-ignore df_conflict &&
+       ! test_path_is_dir some_dir
+'
+
 test_done
index 5a7caf958c346620f6daffcc78ceaa75e03afe8f..e247a4735bbc26b01fecd600ed3e529bea16f464 100755 (executable)
@@ -146,4 +146,33 @@ test_expect_success 'tracking info copied with autoSetupMerge=inherit' '
        test_cmp_config "" --default "" branch.main2.merge
 '
 
+test_expect_success 'switch back when temporarily detached and checked out elsewhere ' '
+       test_when_finished "
+               git worktree remove wt1 ||:
+               git worktree remove wt2 ||:
+               git checkout - ||:
+               git branch -D shared ||:
+       " &&
+       git checkout -b shared &&
+       test_commit shared-first &&
+       HASH1=$(git rev-parse --verify HEAD) &&
+       test_commit shared-second &&
+       test_commit shared-third &&
+       HASH2=$(git rev-parse --verify HEAD) &&
+       git worktree add wt1 -f shared &&
+       git -C wt1 bisect start &&
+       git -C wt1 bisect good $HASH1 &&
+       git -C wt1 bisect bad $HASH2 &&
+       git worktree add wt2 -f shared &&
+       git -C wt2 bisect start &&
+       git -C wt2 bisect good $HASH1 &&
+       git -C wt2 bisect bad $HASH2 &&
+       # we test in both worktrees to ensure that works
+       # as expected with "first" and "next" worktrees
+       test_must_fail git -C wt1 switch shared &&
+       git -C wt1 switch --ignore-other-worktrees shared &&
+       test_must_fail git -C wt2 switch shared &&
+       git -C wt2 switch --ignore-other-worktrees shared
+'
+
 test_done
index 7c43ddf1d99714ac5744b37dfb1badb6e0c785fc..c5d19dd973d7f4ea7a3a496d7df92a5c74fa667d 100755 (executable)
@@ -137,4 +137,20 @@ test_expect_success 'restore --staged invalidates cache tree for deletions' '
        test_must_fail git rev-parse HEAD:new1
 '
 
+test_expect_success 'restore with merge options rejects --staged' '
+       for opts in \
+               "--staged --ours" \
+               "--staged --theirs" \
+               "--staged --merge" \
+               "--staged --conflict=diff3" \
+               "--staged --worktree --ours" \
+               "--staged --worktree --theirs" \
+               "--staged --worktree --merge" \
+               "--staged --worktree --conflict=zdiff3"
+       do
+               test_must_fail git restore $opts . 2>err &&
+               grep "cannot be used with --staged" err || return
+       done
+'
+
 test_done
index efb7450bf1e9c14fc5563564b5b4e6913bd7c97c..ef6fb53f7f1cf53f6cf8c3727bc0b957ea7d9484 100755 (executable)
@@ -54,6 +54,22 @@ test_expect_success 'git ls-files --format path v.s. -s' '
        test_cmp expect actual
 '
 
+test_expect_success 'git ls-files --format with relative path' '
+       cat >expect <<-\EOF &&
+       ../o1.txt
+       ../o2.txt
+       ../o3.txt
+       ../o4.txt
+       ../o5.txt
+       ../o6.txt
+       EOF
+       mkdir sub &&
+       cd sub &&
+       git ls-files --format="%(path)" ":/" >../actual &&
+       cd .. &&
+       test_cmp expect actual
+'
+
 test_expect_success 'git ls-files --format with -m' '
        echo change >o1.txt &&
        cat >expect <<-\EOF &&
index 5d871fde960a032bbf5523dc2fee578745d1479d..4dd42df38c25615e0833b754d1a2c3132ef0bf1d 100755 (executable)
@@ -431,4 +431,15 @@ match 1 1 1 1 'a' '[B-a]'
 match 0 1 0 1 'z' '[Z-y]'
 match 1 1 1 1 'Z' '[Z-y]'
 
+test_expect_success 'matching does not exhibit exponential behavior' '
+       {
+               test-tool wildmatch wildmatch \
+                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab \
+                       "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a" &
+               pid=$!
+       } &&
+       sleep 2 &&
+       ! kill $!
+'
+
 test_done
index 5a169b68d6af4d3db62e88dcdc4fb765ee5232a6..5a8a48287c18bfb3518a90677c02a13bb1ac23f3 100755 (executable)
@@ -245,9 +245,13 @@ test_expect_success 'git branch -M baz bam should succeed within a worktree in w
        (
                cd bazdir &&
                git branch -M baz bam &&
-               test $(git rev-parse --abbrev-ref HEAD) = bam
+               echo bam >expect &&
+               git rev-parse --abbrev-ref HEAD >actual &&
+               test_cmp expect actual
        ) &&
-       test $(git rev-parse --abbrev-ref HEAD) = bam &&
+       echo bam >expect &&
+       git rev-parse --abbrev-ref HEAD >actual &&
+       test_cmp expect actual &&
        rm -r bazdir &&
        git worktree prune
 '
index d5a8ee39fc478d3d3ab2ab71ec780efd76140d20..3ce918fdb8062fc5f720bb890ad58a2676547218 100755 (executable)
@@ -388,6 +388,20 @@ test_expect_success 'switch to branch checked out here' '
        git rebase main main
 '
 
+test_expect_success 'switch to branch checked out elsewhere fails' '
+       test_when_finished "
+               git worktree remove wt1 &&
+               git worktree remove wt2 &&
+               git branch -d shared
+       " &&
+       git worktree add wt1 -b shared &&
+       git worktree add wt2 -f shared &&
+       # we test in both worktrees to ensure that works
+       # as expected with "first" and "next" worktrees
+       test_must_fail git -C wt1 rebase shared shared &&
+       test_must_fail git -C wt2 rebase shared shared
+'
+
 test_expect_success 'switch to branch not checked out' '
        git checkout main &&
        git branch other &&
index 4711b37a28863e50a06e098bcbcd9417951c9b4d..2eba00bdf5898531744c8f77429a8f4d1ad1b91d 100755 (executable)
@@ -85,6 +85,11 @@ test_rebase_am_only () {
                test_must_fail git rebase $opt --reapply-cherry-picks A
        "
 
+       test_expect_success "$opt incompatible with --rebase-merges" "
+               git checkout B^0 &&
+               test_must_fail git rebase $opt --rebase-merges A
+       "
+
        test_expect_success "$opt incompatible with --update-refs" "
                git checkout B^0 &&
                test_must_fail git rebase $opt --update-refs A
@@ -101,6 +106,12 @@ test_rebase_am_only () {
                grep -e --no-autosquash err
        "
 
+       test_expect_success "$opt incompatible with rebase.rebaseMerges" "
+               git checkout B^0 &&
+               test_must_fail git -c rebase.rebaseMerges=true rebase $opt A 2>err &&
+               grep -e --no-rebase-merges err
+       "
+
        test_expect_success "$opt incompatible with rebase.updateRefs" "
                git checkout B^0 &&
                test_must_fail git -c rebase.updateRefs=true rebase $opt A 2>err &&
@@ -113,6 +124,12 @@ test_rebase_am_only () {
                git -c rebase.autosquash=true rebase --no-autosquash $opt A
        "
 
+       test_expect_success "$opt okay with overridden rebase.rebaseMerges" "
+               test_when_finished \"git reset --hard B^0\" &&
+               git checkout B^0 &&
+               git -c rebase.rebaseMerges=true rebase --no-rebase-merges $opt A
+       "
+
        test_expect_success "$opt okay with overridden rebase.updateRefs" "
                test_when_finished \"git reset --hard B^0\" &&
                git checkout B^0 &&
index fa2a06c19f0ff9890733817d066778c7634ab523..f03599c63b969d6216f7370e1a24b0160bc6ab69 100755 (executable)
@@ -250,6 +250,16 @@ test_expect_success 'with a branch tip that was cherry-picked already' '
        EOF
 '
 
+test_expect_success '--no-rebase-merges countermands --rebase-merges' '
+       git checkout -b no-rebase-merges E &&
+       git rebase --rebase-merges --no-rebase-merges C &&
+       test_cmp_graph C.. <<-\EOF
+       * B
+       * D
+       o C
+       EOF
+'
+
 test_expect_success 'do not rebase cousins unless asked for' '
        git checkout -b cousins main &&
        before="$(git rev-parse --verify HEAD)" &&
@@ -268,6 +278,40 @@ test_expect_success 'do not rebase cousins unless asked for' '
        EOF
 '
 
+test_expect_success 'rebase.rebaseMerges=rebase-cousins is equivalent to --rebase-merges=rebase-cousins' '
+       test_config rebase.rebaseMerges rebase-cousins &&
+       git checkout -b config-rebase-cousins main &&
+       git rebase HEAD^ &&
+       test_cmp_graph HEAD^.. <<-\EOF
+       *   Merge the topic branch '\''onebranch'\''
+       |\
+       | * D
+       | * G
+       |/
+       o H
+       EOF
+'
+
+test_expect_success '--no-rebase-merges overrides rebase.rebaseMerges=no-rebase-cousins' '
+       test_config rebase.rebaseMerges no-rebase-cousins &&
+       git checkout -b override-config-no-rebase-cousins E &&
+       git rebase --no-rebase-merges C &&
+       test_cmp_graph C.. <<-\EOF
+       * B
+       * D
+       o C
+       EOF
+'
+
+test_expect_success '--rebase-merges overrides rebase.rebaseMerges=rebase-cousins' '
+       test_config rebase.rebaseMerges rebase-cousins &&
+       git checkout -b override-config-rebase-cousins E &&
+       before="$(git rev-parse --verify HEAD)" &&
+       test_tick &&
+       git rebase --rebase-merges C &&
+       test_cmp_rev HEAD $before
+'
+
 test_expect_success 'refs/rewritten/* is worktree-local' '
        git worktree add wt &&
        cat >wt/script-from-scratch <<-\EOF &&
index 94671d3c4650463525006090702210eda76594e0..c3184c9ade95861d9e30164dee9c6ba81f3616f3 100755 (executable)
@@ -40,6 +40,24 @@ test_expect_success 'setup' '
        EOF
 '
 
+test_expect_success 'bad -X <strategy-option> arguments: unclosed quote' '
+       cat >expect <<-\EOF &&
+       fatal: could not split '\''--bad'\'': unclosed quote
+       EOF
+       test_expect_code 128 git rebase -X"bad argument\"" side main >out 2>actual &&
+       test_must_be_empty out &&
+       test_cmp expect actual
+'
+
+test_expect_success 'bad -X <strategy-option> arguments: bad escape' '
+       cat >expect <<-\EOF &&
+       fatal: could not split '\''--bad'\'': cmdline ends with \
+       EOF
+       test_expect_code 128 git rebase -X"bad escape \\" side main >out 2>actual &&
+       test_must_be_empty out &&
+       test_cmp expect actual
+'
+
 test_expect_success '--ignore-whitespace works with apply backend' '
        test_must_fail git rebase --apply main side &&
        git rebase --abort &&
index 51afbd7b24a10c247520ba2f9be702da57f83afd..82dd768944fa5d566f32d7076ad2e36bd0f53cf7 100755 (executable)
@@ -106,24 +106,32 @@ test_expect_success '.gitignore test setup' '
 
 test_expect_success '.gitignore is honored' '
        git add . &&
-       ! (git ls-files | grep "\\.ig")
+       git ls-files >files &&
+       sed -n "/\\.ig/p" <files >actual &&
+       test_must_be_empty actual
 '
 
 test_expect_success 'error out when attempting to add ignored ones without -f' '
        test_must_fail git add a.?? &&
-       ! (git ls-files | grep "\\.ig")
+       git ls-files >files &&
+       sed -n "/\\.ig/p" <files >actual &&
+       test_must_be_empty actual
 '
 
 test_expect_success 'error out when attempting to add ignored ones without -f' '
        test_must_fail git add d.?? &&
-       ! (git ls-files | grep "\\.ig")
+       git ls-files >files &&
+       sed -n "/\\.ig/p" <files >actual &&
+       test_must_be_empty actual
 '
 
 test_expect_success 'error out when attempting to add ignored ones but add others' '
        touch a.if &&
        test_must_fail git add a.?? &&
-       ! (git ls-files | grep "\\.ig") &&
-       (git ls-files | grep a.if)
+       git ls-files >files &&
+       sed -n "/\\.ig/p" <files >actual &&
+       test_must_be_empty actual &&
+       grep a.if files
 '
 
 test_expect_success 'add ignored ones with -f' '
index 3a99837d9b15f78f2f8e034d4fdea9a0b88441ed..3982b6b49dc45673bf6dcf1cb984a2ff8fedf252 100755 (executable)
@@ -7,12 +7,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
-if test_have_prereq !PERL
-then
-       skip_all='skipping add -i (scripted) tests, perl not available'
-       test_done
-fi
-
 diff_cmp () {
        for x
        do
@@ -311,9 +305,11 @@ test_expect_success FILEMODE 'stage mode and hunk' '
        echo content >>file &&
        chmod +x file &&
        printf "y\\ny\\n" | git add -p &&
-       git diff --cached file | grep "new mode" &&
-       git diff --cached file | grep "+content" &&
-       test -z "$(git diff file)"
+       git diff --cached file >out &&
+       grep "new mode" out &&
+       grep "+content" out &&
+       git diff file >out &&
+       test_must_be_empty out
 '
 
 # end of tests disabled when filemode is not usable
@@ -1075,4 +1071,25 @@ test_expect_success 'show help from add--helper' '
        test_cmp expect actual
 '
 
+test_expect_success 'reset -p with unmerged files' '
+       test_when_finished "git checkout --force main" &&
+       test_commit one conflict &&
+       git checkout -B side HEAD^ &&
+       test_commit two conflict &&
+       test_must_fail git merge one &&
+
+       # this is a noop with only an unmerged entry
+       git reset -p &&
+
+       # add files that sort before and after unmerged entry
+       echo a >a &&
+       echo z >z &&
+       git add a z &&
+
+       # confirm that we can reset those files
+       printf "%s\n" y y | git reset -p &&
+       git diff-index --cached --diff-filter=u HEAD >staged &&
+       test_must_be_empty staged
+'
+
 test_done
index dfcf3a0aaae3e2a72f6f41023b01c639a99c2f44..5de1d190759f958f8c3c0319f7b4cca34f39d83c 100755 (executable)
@@ -616,4 +616,46 @@ test_expect_success 'diff -I<regex>: detect malformed regex' '
        test_i18ngrep "invalid regex given to -I: " error
 '
 
+# check_prefix <patch> <src> <dst>
+# check only lines with paths to avoid dependency on exact oid/contents
+check_prefix () {
+       grep -E '^(diff|---|\+\+\+) ' "$1" >actual.paths &&
+       cat >expect <<-EOF &&
+       diff --git $2 $3
+       --- $2
+       +++ $3
+       EOF
+       test_cmp expect actual.paths
+}
+
+test_expect_success 'diff-files does not respect diff.noprefix' '
+       git -c diff.noprefix diff-files -p >actual &&
+       check_prefix actual a/file0 b/file0
+'
+
+test_expect_success 'diff-files respects --no-prefix' '
+       git diff-files -p --no-prefix >actual &&
+       check_prefix actual file0 file0
+'
+
+test_expect_success 'diff respects diff.noprefix' '
+       git -c diff.noprefix diff >actual &&
+       check_prefix actual file0 file0
+'
+
+test_expect_success 'diff --default-prefix overrides diff.noprefix' '
+       git -c diff.noprefix diff --default-prefix >actual &&
+       check_prefix actual a/file0 b/file0
+'
+
+test_expect_success 'diff respects diff.mnemonicprefix' '
+       git -c diff.mnemonicprefix diff >actual &&
+       check_prefix actual i/file0 w/file0
+'
+
+test_expect_success 'diff --default-prefix overrides diff.mnemonicprefix' '
+       git -c diff.mnemonicprefix diff --default-prefix >actual &&
+       check_prefix actual a/file0 b/file0
+'
+
 test_done
index f3313b8c58feabb3cd2e52fb1147bd68c6f43862..8c3d06622ae29457bfc32c8ecee17e1cd2c2143c 100755 (executable)
@@ -59,6 +59,10 @@ test_expect_success setup '
        test_tick &&
        git commit -m "patchid 3" &&
 
+       git checkout -b empty main &&
+       test_tick &&
+       git commit --allow-empty -m "empty commit" &&
+
        git checkout main
 '
 
@@ -128,6 +132,12 @@ test_expect_success 'replay did not screw up the log message' '
        grep "^Side .* with .* backslash-n" actual
 '
 
+test_expect_success 'format-patch empty commit' '
+       git format-patch --stdout main..empty >empty &&
+       grep "^From " empty >from &&
+       test_line_count = 1 from
+'
+
 test_expect_success 'extra headers' '
        git config format.headers "To: R E Cipient <rcipient@example.com>
 " &&
@@ -2386,4 +2396,20 @@ test_expect_success 'interdiff: solo-patch' '
        test_cmp expect actual
 '
 
+test_expect_success 'format-patch does not respect diff.noprefix' '
+       git -c diff.noprefix format-patch -1 --stdout >actual &&
+       grep "^--- a/blorp" actual
+'
+
+test_expect_success 'format-patch respects format.noprefix' '
+       git -c format.noprefix format-patch -1 --stdout >actual &&
+       grep "^--- blorp" actual
+'
+
+test_expect_success 'format-patch --default-prefix overrides format.noprefix' '
+       git -c format.noprefix \
+               format-patch -1 --default-prefix --stdout >actual &&
+       grep "^--- a/blorp" actual
+'
+
 test_done
index 918a2fc7c69432c26e3135460d62f9b27f0e3dbd..f0bd70dbd6aa7468c7812f36d3af755b91ccb3fb 100755 (executable)
@@ -185,6 +185,7 @@ test_expect_success 'git archive' '
 '
 
 check_tar b
+check_mtime b a/a 1117231200
 
 test_expect_success 'git archive --mtime' '
        git archive --mtime=2002-02-02T02:02:02-0200 HEAD >with_mtime.tar
@@ -257,14 +258,6 @@ test_expect_success 'git archive --remote with configured remote' '
        test_cmp_bin b.tar b5-nick.tar
 '
 
-test_expect_success 'validate file modification time' '
-       mkdir extract &&
-       "$TAR" xf b.tar -C extract a/a &&
-       test-tool chmtime --get extract/a/a >b.mtime &&
-       echo "1117231200" >expected.mtime &&
-       test_cmp expected.mtime b.mtime
-'
-
 test_expect_success 'git get-tar-commit-id' '
        git get-tar-commit-id <b.tar >actual &&
        git rev-parse HEAD >expect &&
index 34a1261520c757053bfb64c8aa2104c407514091..dc44da9c7978ab37e503614cb7524e8c6ba81632 100755 (executable)
@@ -1171,6 +1171,15 @@ test_expect_success '--no-show-forced-updates' '
        )
 '
 
+for section in fetch transfer
+do
+       test_expect_success "$section.hideRefs affects connectivity check" '
+               GIT_TRACE="$PWD"/trace git -c $section.hideRefs=refs -c \
+                       $section.hideRefs="!refs/tags/" fetch &&
+               grep "git rev-list .*--exclude-hidden=fetch" trace
+       '
+done
+
 setup_negotiation_tip () {
        SERVER="$1"
        URL="$2"
index 54f422ced3241870a40da6714c34564abab7c119..98f034aa77bb243492ea1232549f7d1ec195a152 100755 (executable)
@@ -58,6 +58,13 @@ test_expect_success 'git fetch --all' '
         test_cmp expect output)
 '
 
+test_expect_success 'git fetch --all --no-write-fetch-head' '
+       (cd test &&
+       rm -f .git/FETCH_HEAD &&
+       git fetch --all --no-write-fetch-head &&
+       test_path_is_missing .git/FETCH_HEAD)
+'
+
 test_expect_success 'git fetch --all should continue if a remote has errors' '
        (git clone one test2 &&
         cd test2 &&
index 98a27a2948b5f6c1b1c318b43c5fab3505f1426e..19ebefa5aceb1afd3916f903971013e985836329 100755 (executable)
@@ -401,6 +401,11 @@ test_expect_success 'push with ambiguity' '
 
 '
 
+test_expect_success 'push with onelevel ref' '
+       mk_test testrepo heads/main &&
+       test_must_fail git push testrepo HEAD:refs/onelevel
+'
+
 test_expect_success 'push with colon-less refspec (1)' '
 
        mk_test testrepo heads/frotz tags/frotz &&
@@ -898,6 +903,13 @@ test_expect_success 'push --delete refuses empty string' '
        test_must_fail git push testrepo --delete ""
 '
 
+test_expect_success 'push --delete onelevel refspecs' '
+       mk_test testrepo heads/main &&
+       git -C testrepo update-ref refs/onelevel refs/heads/main &&
+       git push testrepo --delete refs/onelevel &&
+       test_must_fail git -C testrepo rev-parse --verify refs/onelevel
+'
+
 test_expect_success 'warn on push to HEAD of non-bare repository' '
        mk_test testrepo heads/main &&
        (
index 394bc60cb8eea153e534b9fc887ae37b0e2abf36..cc5496e28fd0bcbf32badb583272c464ec88fae8 100755 (executable)
@@ -79,7 +79,9 @@ test_expect_success SYMLINKS 'pushing from symlinked subdir' '
                git commit -m push ./file &&
                git push
        ) &&
-       test push = $(git show HEAD:subdir/file)
+       echo push >expect &&
+       git show HEAD:subdir/file >actual &&
+       test_cmp expect actual
 '
 
 test_done
index b9546ef8e5e5cd3a734228c4d65ffdb59f568684..dcdbe26a08e1e3db99338a740e10011981b292af 100755 (executable)
@@ -167,6 +167,19 @@ test_expect_success "fetch --recurse-submodules recurses into submodules" '
        verify_fetch_result actual.err
 '
 
+test_expect_success "fetch --recurse-submodules honors --no-write-fetch-head" '
+       (
+               cd downstream &&
+               git submodule foreach --recursive \
+               sh -c "cd \"\$(git rev-parse --git-dir)\" && rm -f FETCH_HEAD" &&
+
+               git fetch --recurse-submodules --no-write-fetch-head &&
+
+               git submodule foreach --recursive \
+               sh -c "cd \"\$(git rev-parse --git-dir)\" && ! test -f FETCH_HEAD"
+       )
+'
+
 test_expect_success "submodule.recurse option triggers recursive fetch" '
        add_submodule_commits &&
        (
diff --git a/t/t5563-simple-http-auth.sh b/t/t5563-simple-http-auth.sh
new file mode 100755 (executable)
index 0000000..f45a43b
--- /dev/null
@@ -0,0 +1,323 @@
+#!/bin/sh
+
+test_description='test http auth header and credential helper interop'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-httpd.sh
+
+start_httpd
+
+test_expect_success 'setup_credential_helper' '
+       mkdir "$TRASH_DIRECTORY/bin" &&
+       PATH=$PATH:"$TRASH_DIRECTORY/bin" &&
+       export PATH &&
+
+       CREDENTIAL_HELPER="$TRASH_DIRECTORY/bin/git-credential-test-helper" &&
+       write_script "$CREDENTIAL_HELPER" <<-\EOF
+       cmd=$1
+       teefile=$cmd-query.cred
+       catfile=$cmd-reply.cred
+       sed -n -e "/^$/q" -e "p" >>$teefile
+       if test "$cmd" = "get"
+       then
+               cat $catfile
+       fi
+       EOF
+'
+
+set_credential_reply () {
+       cat >"$TRASH_DIRECTORY/$1-reply.cred"
+}
+
+expect_credential_query () {
+       cat >"$TRASH_DIRECTORY/$1-expect.cred" &&
+       test_cmp "$TRASH_DIRECTORY/$1-expect.cred" \
+                "$TRASH_DIRECTORY/$1-query.cred"
+}
+
+per_test_cleanup () {
+       rm -f *.cred &&
+       rm -f "$HTTPD_ROOT_PATH"/custom-auth.valid \
+             "$HTTPD_ROOT_PATH"/custom-auth.challenge
+}
+
+test_expect_success 'setup repository' '
+       test_commit foo &&
+       git init --bare "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       git push --mirror "$HTTPD_DOCUMENT_ROOT_PATH/repo.git"
+'
+
+test_expect_success 'access using basic auth' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=alice
+       password=secret-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF &&
+       WWW-Authenticate: Basic realm="example.com"
+       EOF
+
+       test_config_global credential.helper test-helper &&
+       git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=Basic realm="example.com"
+       EOF
+
+       expect_credential_query store <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=alice
+       password=secret-passwd
+       EOF
+'
+
+test_expect_success 'access using basic auth invalid credentials' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=baduser
+       password=wrong-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF &&
+       WWW-Authenticate: Basic realm="example.com"
+       EOF
+
+       test_config_global credential.helper test-helper &&
+       test_must_fail git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=Basic realm="example.com"
+       EOF
+
+       expect_credential_query erase <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=baduser
+       password=wrong-passwd
+       wwwauth[]=Basic realm="example.com"
+       EOF
+'
+
+test_expect_success 'access using basic auth with extra challenges' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=alice
+       password=secret-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF &&
+       WWW-Authenticate: FooBar param1="value1" param2="value2"
+       WWW-Authenticate: Bearer authorize_uri="id.example.com" p=1 q=0
+       WWW-Authenticate: Basic realm="example.com"
+       EOF
+
+       test_config_global credential.helper test-helper &&
+       git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=FooBar param1="value1" param2="value2"
+       wwwauth[]=Bearer authorize_uri="id.example.com" p=1 q=0
+       wwwauth[]=Basic realm="example.com"
+       EOF
+
+       expect_credential_query store <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=alice
+       password=secret-passwd
+       EOF
+'
+
+test_expect_success 'access using basic auth mixed-case wwwauth header name' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=alice
+       password=secret-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF &&
+       www-authenticate: foobar param1="value1" param2="value2"
+       WWW-AUTHENTICATE: BEARER authorize_uri="id.example.com" p=1 q=0
+       WwW-aUtHeNtIcAtE: baSiC realm="example.com"
+       EOF
+
+       test_config_global credential.helper test-helper &&
+       git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=foobar param1="value1" param2="value2"
+       wwwauth[]=BEARER authorize_uri="id.example.com" p=1 q=0
+       wwwauth[]=baSiC realm="example.com"
+       EOF
+
+       expect_credential_query store <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=alice
+       password=secret-passwd
+       EOF
+'
+
+test_expect_success 'access using basic auth with wwwauth header continuations' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=alice
+       password=secret-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       # Note that leading and trailing whitespace is important to correctly
+       # simulate a continuation/folded header.
+       cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF &&
+       WWW-Authenticate: FooBar param1="value1"
+        param2="value2"
+       WWW-Authenticate: Bearer authorize_uri="id.example.com"
+        p=1
+        q=0
+       WWW-Authenticate: Basic realm="example.com"
+       EOF
+
+       test_config_global credential.helper test-helper &&
+       git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=FooBar param1="value1" param2="value2"
+       wwwauth[]=Bearer authorize_uri="id.example.com" p=1 q=0
+       wwwauth[]=Basic realm="example.com"
+       EOF
+
+       expect_credential_query store <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=alice
+       password=secret-passwd
+       EOF
+'
+
+test_expect_success 'access using basic auth with wwwauth header empty continuations' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=alice
+       password=secret-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       CHALLENGE="$HTTPD_ROOT_PATH/custom-auth.challenge" &&
+
+       # Note that leading and trailing whitespace is important to correctly
+       # simulate a continuation/folded header.
+       printf "WWW-Authenticate: FooBar param1=\"value1\"\r\n" >"$CHALLENGE" &&
+       printf " \r\n" >>"$CHALLENGE" &&
+       printf " param2=\"value2\"\r\n" >>"$CHALLENGE" &&
+       printf "WWW-Authenticate: Bearer authorize_uri=\"id.example.com\"\r\n" >>"$CHALLENGE" &&
+       printf " p=1\r\n" >>"$CHALLENGE" &&
+       printf " \r\n" >>"$CHALLENGE" &&
+       printf " q=0\r\n" >>"$CHALLENGE" &&
+       printf "WWW-Authenticate: Basic realm=\"example.com\"\r\n" >>"$CHALLENGE" &&
+
+       test_config_global credential.helper test-helper &&
+       git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=FooBar param1="value1" param2="value2"
+       wwwauth[]=Bearer authorize_uri="id.example.com" p=1 q=0
+       wwwauth[]=Basic realm="example.com"
+       EOF
+
+       expect_credential_query store <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=alice
+       password=secret-passwd
+       EOF
+'
+
+test_expect_success 'access using basic auth with wwwauth header mixed line-endings' '
+       test_when_finished "per_test_cleanup" &&
+
+       set_credential_reply get <<-EOF &&
+       username=alice
+       password=secret-passwd
+       EOF
+
+       # Basic base64(alice:secret-passwd)
+       cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF &&
+       Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA==
+       EOF
+
+       CHALLENGE="$HTTPD_ROOT_PATH/custom-auth.challenge" &&
+
+       # Note that leading and trailing whitespace is important to correctly
+       # simulate a continuation/folded header.
+       printf "WWW-Authenticate: FooBar param1=\"value1\"\r\n" >"$CHALLENGE" &&
+       printf " \r\n" >>"$CHALLENGE" &&
+       printf "\tparam2=\"value2\"\r\n" >>"$CHALLENGE" &&
+       printf "WWW-Authenticate: Basic realm=\"example.com\"" >>"$CHALLENGE" &&
+
+       test_config_global credential.helper test-helper &&
+       git ls-remote "$HTTPD_URL/custom_auth/repo.git" &&
+
+       expect_credential_query get <<-EOF &&
+       protocol=http
+       host=$HTTPD_DEST
+       wwwauth[]=FooBar param1="value1" param2="value2"
+       wwwauth[]=Basic realm="example.com"
+       EOF
+
+       expect_credential_query store <<-EOF
+       protocol=http
+       host=$HTTPD_DEST
+       username=alice
+       password=secret-passwd
+       EOF
+'
+
+test_done
index 38b850c10ef8cddeb790ed276209bb5019439eae..1d7b1abda1a4870971efb8408c11a4dde2e7564e 100755 (executable)
@@ -15,8 +15,12 @@ test_expect_success 'preparing origin repository' '
        : >file && git add . && git commit -m1 &&
        git clone --bare . a.git &&
        git clone --bare . x &&
-       test "$(cd a.git && git config --bool core.bare)" = true &&
-       test "$(cd x && git config --bool core.bare)" = true &&
+       echo true >expect &&
+       git -C a.git config --bool core.bare >actual &&
+       test_cmp expect actual &&
+       echo true >expect &&
+       git -C x config --bool core.bare >actual &&
+       test_cmp expect actual &&
        git bundle create b1.bundle --all &&
        git bundle create b2.bundle main &&
        mkdir dir &&
@@ -29,7 +33,9 @@ test_expect_success 'preparing origin repository' '
 test_expect_success 'local clone without .git suffix' '
        git clone -l -s a b &&
        (cd b &&
-       test "$(git config --bool core.bare)" = false &&
+       echo false >expect &&
+       git config --bool core.bare >actual &&
+       test_cmp expect actual &&
        git fetch)
 '
 
index e4db7513f42192895e33e7eec431c73bec0007d8..71aabe30b7d76a5663529fa050a5f99a7e580d73 100755 (executable)
@@ -728,6 +728,33 @@ test_expect_success 'file:// --negotiate-only with protocol v0' '
        test_i18ngrep "negotiate-only requires protocol v2" err
 '
 
+test_expect_success 'push with custom path does not request v2' '
+       rm -f env.trace &&
+       git -C client push \
+               --receive-pack="env >../env.trace; git-receive-pack" \
+               origin HEAD:refs/heads/custom-push-test &&
+       test_path_is_file env.trace &&
+       ! grep ^GIT_PROTOCOL env.trace
+'
+
+test_expect_success 'fetch with custom path does request v2' '
+       rm -f env.trace &&
+       git -C client fetch \
+               --upload-pack="env >../env.trace; git-upload-pack" \
+               origin HEAD &&
+       grep ^GIT_PROTOCOL=version=2 env.trace
+'
+
+test_expect_success 'archive with custom path does not request v2' '
+       rm -f env.trace &&
+       git -C client archive \
+               --exec="env >../env.trace; git-upload-archive" \
+               --remote=origin \
+               HEAD >/dev/null &&
+       test_path_is_file env.trace &&
+       ! grep ^GIT_PROTOCOL env.trace
+'
+
 # Test protocol v2 with 'http://' transport
 #
 . "$TEST_DIRECTORY"/lib-httpd.sh
index aabf590dda61d1ea1b7c70e79bbfa00819ea235e..67d523d40571b89b50cc5ca655ec77198c1a3ae3 100755 (executable)
@@ -187,7 +187,7 @@ test_expect_success 'rev-parse --exclude=ref with --remotes=glob' '
        compare rev-parse "--exclude=upstream/x --remotes=upstream/*" "upstream/one upstream/two"
 '
 
-for section in receive uploadpack
+for section in fetch receive uploadpack
 do
        test_expect_success "rev-parse --exclude-hidden=$section with --all" '
                compare "-c transfer.hideRefs=refs/remotes/ rev-parse" "--branches --tags" "--exclude-hidden=$section --all"
index 7d40994991e423a21ae384010c00b5eb71c64502..dface8bcfe2641ee07ee36309d1c333224879283 100755 (executable)
@@ -10,6 +10,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-bundle.sh
+. "$TEST_DIRECTORY"/lib-terminal.sh
 
 for cmd in create verify list-heads unbundle
 do
@@ -606,4 +607,42 @@ test_expect_success 'verify catches unreachable, broken prerequisites' '
        )
 '
 
+test_expect_success 'bundle progress includes write phase' '
+       GIT_PROGRESS_DELAY=0 \
+               git bundle create --progress out.bundle --all 2>err &&
+       grep 'Writing' err
+'
+
+test_expect_success TTY 'create --quiet disables all bundle progress' '
+       test_terminal env GIT_PROGRESS_DELAY=0 \
+               git bundle create --quiet out.bundle --all 2>err &&
+       test_must_be_empty err
+'
+
+test_expect_success 'read bundle over stdin' '
+       git bundle create some.bundle HEAD &&
+
+       git bundle verify - <some.bundle 2>err &&
+       grep "<stdin> is okay" err &&
+
+       git bundle list-heads some.bundle >expect &&
+       git bundle list-heads - <some.bundle >actual &&
+       test_cmp expect actual &&
+
+       git bundle unbundle some.bundle >expect &&
+       git bundle unbundle - <some.bundle >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'send a bundle to standard output' '
+       git bundle create - --all HEAD >bundle-one &&
+       mkdir -p down &&
+       git -C down bundle create - --all HEAD >bundle-two &&
+       git bundle verify bundle-one &&
+       git bundle verify bundle-two &&
+       git ls-remote bundle-one >expect &&
+       git ls-remote bundle-two >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 11c50b7c0dd85c629ef9687eb81d36543939bddd..1a9d37e63862f03877fe3d02b94ec8428e7ea01a 100755 (executable)
@@ -22,7 +22,7 @@ test_expect_success 'invalid section' '
        test_cmp expected err
 '
 
-for section in receive uploadpack
+for section in fetch receive uploadpack
 do
        test_expect_success "$section: passed multiple times" '
                echo "fatal: --exclude-hidden= passed more than once" >expected &&
index 3ba4fdf6153b69bce18bef335970742701b2dd34..fb01bd6abce2c815b6f50f75e27e2c8f567cf09c 100755 (executable)
@@ -122,6 +122,29 @@ test_expect_success 'bisect start without -- takes unknown arg as pathspec' '
        grep bar ".git/BISECT_NAMES"
 '
 
+test_expect_success 'bisect reset: back in a branch checked out also elsewhere' '
+       echo "shared" > branch.expect &&
+       test_bisect_reset() {
+               git -C $1 bisect start &&
+               git -C $1 bisect good $HASH1 &&
+               git -C $1 bisect bad $HASH3 &&
+               git -C $1 bisect reset &&
+               git -C $1 branch --show-current > branch.output &&
+               cmp branch.expect branch.output
+       } &&
+       test_when_finished "
+               git worktree remove wt1 &&
+               git worktree remove wt2 &&
+               git branch -d shared
+       " &&
+       git worktree add wt1 -b shared &&
+       git worktree add wt2 -f shared &&
+       # we test in both worktrees to ensure that works
+       # as expected with "first" and "next" worktrees
+       test_bisect_reset wt1 &&
+       test_bisect_reset wt2
+'
+
 test_expect_success 'bisect reset: back in the main branch' '
        git bisect reset &&
        echo "* main" > branch.expect &&
index 36eb86a4b19f3c758b2830fe5157a1667069321a..20913b371344264a6dc9c84b58c3b6de3b46e226 100755 (executable)
@@ -200,4 +200,14 @@ test_expect_success GPGSSH 'verifying a forged tag with --format should fail sil
        test_must_be_empty actual-forged
 '
 
+test_expect_success GPGSSH 'rev-list --format=%G' '
+       test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
+       git rev-list -1 --format="%G? %H" sixth-signed >actual &&
+       cat >expect <<-EOF &&
+       commit $(git rev-parse sixth-signed^0)
+       G $(git rev-parse sixth-signed^0)
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index b19792b326901bbb8c00c20f07dbb38b322a9e74..2b3c363078bc06219c8b5c16b02f331b447f5102 100755 (executable)
@@ -56,12 +56,15 @@ chmod a+x fake-editor.sh
 
 test_expect_success 'interactive rebase with a dirty submodule' '
 
-       test submodule = $(git diff --name-only) &&
+       echo submodule >expect &&
+       git diff --name-only >actual &&
+       test_cmp expect actual &&
        HEAD=$(git rev-parse HEAD) &&
        GIT_EDITOR="\"$(pwd)/fake-editor.sh\"" EDITOR_TEXT="pick $HEAD" \
                git rebase -i HEAD^ &&
-       test submodule = $(git diff --name-only)
-
+       echo submodule >expect &&
+       git diff --name-only >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'rebase with dirty file and submodule fails' '
@@ -83,11 +86,19 @@ test_expect_success 'stash with a dirty submodule' '
        CURRENT=$(cd submodule && git rev-parse HEAD) &&
        git stash &&
        test new != $(cat file) &&
-       test submodule = $(git diff --name-only) &&
-       test $CURRENT = $(cd submodule && git rev-parse HEAD) &&
+       echo submodule >expect &&
+       git diff --name-only >actual &&
+       test_cmp expect actual &&
+
+       echo "$CURRENT" >expect &&
+       git -C submodule rev-parse HEAD >actual &&
+       test_cmp expect actual &&
+
        git stash apply &&
        test new = $(cat file) &&
-       test $CURRENT = $(cd submodule && git rev-parse HEAD)
+       echo "$CURRENT" >expect &&
+       git -C submodule rev-parse HEAD >actual &&
+       test_cmp expect actual
 
 '
 
index 07ca46fb0d539c62c7dcbe066b8c95e550d0b3a3..d1255228d5ffaa2b7b7333000e3e39468ee94bb1 100755 (executable)
@@ -102,7 +102,9 @@ test_expect_success 'setup: commit-msg hook that always fails' '
 '
 
 commit_msg_is () {
-       test "$(git log --pretty=format:%s%b -1)" = "$1"
+       printf "%s" "$1" >expect &&
+       git log --pretty=format:%s%b -1 >actual &&
+       test_cmp expect actual
 }
 
 test_expect_success 'with failing hook' '
index f2ce14e9071c0a3b071f53186c2d311103883443..2d38a16480e82c0441075e0e54ffe8454b413cb2 100755 (executable)
@@ -10,7 +10,8 @@ test_expect_success 'race to create orphan commit' '
        test_must_fail env EDITOR=./hare-editor git commit --allow-empty -m tortoise -e &&
        git show -s --pretty=format:%s >subject &&
        grep hare subject &&
-       test -z "$(git show -s --pretty=format:%P)"
+       git show -s --pretty=format:%P >out &&
+       test_must_be_empty out
 '
 
 test_expect_success 'race to create non-orphan commit' '
index 4c0327b2bb27af53e24b4158a63f6d2aec9ae19e..0c241d6c148d7b5ebc9a9b3aaf44723fb1028e8b 100755 (executable)
@@ -995,4 +995,41 @@ test_expect_success !UNICODE_COMPOSITION_SENSITIVE 'Unicode nfc/nfd' '
        grep -E "^event: nfd/d_${utf8_nfc}/?$" ./unicode.trace
 '
 
+test_expect_success 'split-index and FSMonitor work well together' '
+       git init split-index &&
+       test_when_finished "git -C \"$PWD/split-index\" \
+               fsmonitor--daemon stop" &&
+       (
+               cd split-index &&
+               git config core.splitIndex true &&
+               # force split-index in most cases
+               git config splitIndex.maxPercentChange 99 &&
+               git config core.fsmonitor true &&
+
+               # Create the following commit topology:
+               #
+               # *   merge three
+               # |\
+               # | * three
+               # * | merge two
+               # |\|
+               # | * two
+               # * | one
+               # |/
+               # * 5a5efd7 initial
+
+               test_commit initial &&
+               test_commit two &&
+               test_commit three &&
+               git reset --hard initial &&
+               test_commit one &&
+               test_tick &&
+               git merge two &&
+               test_tick &&
+               git merge three &&
+
+               git rebase --force-rebase -r one
+       )
+'
+
 test_done
index 8eded6ab274fafe636151b7903bae3351a27df5c..39d6d713ecbe05e9638f8f6ee3f79ff49628b2cf 100755 (executable)
@@ -1001,7 +1001,9 @@ test_expect_success 'log --committer does not search in timestamp' '
 test_expect_success 'grep with CE_VALID file' '
        git update-index --assume-unchanged t/t &&
        rm t/t &&
-       test "$(git grep test)" = "t/t:test" &&
+       echo "t/t:test" >expect &&
+       git grep test >actual &&
+       test_cmp expect actual &&
        git update-index --no-assume-unchanged t/t &&
        git checkout t/t
 '
index 77047e250dc2c862182619f717b6b96206a38ec7..156a6474847cf6e5bc86df2212ce98211986e6d6 100755 (executable)
@@ -25,6 +25,7 @@ test_expect_success 'setup simple repo' '
 test_expect_success 'export anonymized stream' '
        git fast-export --anonymize --all \
                --anonymize-map=retain-me \
+               --anonymize-map=xyzzy:should-not-appear \
                --anonymize-map=xyzzy:custom-name \
                --anonymize-map=other \
                >stream
@@ -41,6 +42,7 @@ test_expect_success 'stream omits path names' '
 
 test_expect_success 'stream contains user-specified names' '
        grep retain-me stream &&
+       ! grep should-not-appear stream &&
        grep custom-name stream
 '
 
index d459fae6551bd7b5812f8b76a5faae8ebd4075df..d667dda654e2de7f32d5f7d065f6eac59ca9fdbf 100755 (executable)
@@ -13,10 +13,10 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 . "$GIT_BUILD_DIR/contrib/completion/git-prompt.sh"
 
 actual="$TRASH_DIRECTORY/actual"
-c_red='\\[\\e[31m\\]'
-c_green='\\[\\e[32m\\]'
-c_lblue='\\[\\e[1;34m\\]'
-c_clear='\\[\\e[0m\\]'
+c_red='\001\e[31m\002'
+c_green='\001\e[32m\002'
+c_lblue='\001\e[1;34m\002'
+c_clear='\001\e[0m\002'
 
 test_expect_success 'setup for prompt tests' '
        git init otherrepo &&
diff --git a/tag.c b/tag.c
index dfbcd7fcc244ac2500d41655afac3136758bb331..18b718cca666e1ecdd8520e6fc3e3e5ff9031df2 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -6,6 +6,7 @@
 #include "blob.h"
 #include "alloc.h"
 #include "gpg-interface.h"
+#include "hex.h"
 #include "packfile.h"
 
 const char *tag_type = "tag";
index 532984569132de11f6f05b561f817817523a3468..1f89ffab4c32bc02b5d955851401628a5b9a540e 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "thread-utils.h"
 
 #if defined(hpux) || defined(__hpux) || defined(_hpux)
diff --git a/trace.h b/trace.h
index b6e35b947005ff1aa57b27648653f51a0b3b2fec..d304d55aa1d706dc3f65bbf15c7b2506bc0e9499 100644 (file)
--- a/trace.h
+++ b/trace.h
@@ -1,7 +1,6 @@
 #ifndef TRACE_H
 #define TRACE_H
 
-#include "git-compat-util.h"
 #include "strbuf.h"
 
 /**
index 279bddf53b4804c9a8f51b453c59f184976cc31e..e8ba62c0c3dc8293bd973f7d5c39d024f5eb85f7 100644 (file)
--- a/trace2.c
+++ b/trace2.c
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "json-writer.h"
 #include "quote.h"
@@ -6,6 +6,7 @@
 #include "sigchain.h"
 #include "thread-utils.h"
 #include "version.h"
+#include "trace.h"
 #include "trace2/tr2_cfg.h"
 #include "trace2/tr2_cmd_name.h"
 #include "trace2/tr2_ctr.h"
index 483ca7c308fa216055c1a6de293a1bfbf9de0bb2..b342d3b1a3c033bf539037bb5035ae57af119d6d 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "thread-utils.h"
 #include "trace2/tr2_tgt.h"
 #include "trace2/tr2_tls.h"
index dc6e75ef13151fe011c738f8e3dbe706e24c4773..5f1ce6f85cf9cd748517f94f02ab47976febf50d 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "trace2/tr2_tbuf.h"
 #include "trace2/tr2_sid.h"
 
index a380dcf9105e8d7b0022b34508ca384923b2fcd6..069786cb9274f6ab25324386730962503b834525 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "dir.h"
 #include "tr2_sysenv.h"
index 2498482d9ad82a29b2e734b0d726599d594a20c6..c3b3822ed7e4af449adeb0af9b5e512cefdd4779 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "tr2_tbuf.h"
 
 void tr2_tbuf_local_time(struct tr2_tbuf *tb)
index 16f6332755e0d6497643a32d046459b262c01294..9e7aab6d510e1205a15ba6cccb552c670ea8b689 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "json-writer.h"
 #include "run-command.h"
index fbbef68dfc01a546240384fbf12582ccb9d64c54..8672c2c2d04c33d70a730119c196649534439446 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "run-command.h"
 #include "quote.h"
index adae8032639016a90cca56175e5cd59ea21d4e27..3f2b2d53118f0820db816d1350413a9f06e7e58d 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "config.h"
 #include "run-command.h"
 #include "quote.h"
index 04900bb4c3a88cb43e5a79f7d6554e2236e52db8..9f46ae12f50f3ac9530db2d53879b03742f769fe 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "thread-utils.h"
+#include "trace.h"
 #include "trace2/tr2_tls.h"
 
 /*
index 786762dfd26ffc477dec6317178a51435615ea05..31d0e4d1bd1220ea0c9d9b204223766235d81e07 100644 (file)
@@ -1,8 +1,9 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "thread-utils.h"
 #include "trace2/tr2_tgt.h"
 #include "trace2/tr2_tls.h"
 #include "trace2/tr2_tmr.h"
+#include "trace.h"
 
 #define MY_MAX(a, b) ((a) > (b) ? (a) : (b))
 #define MY_MIN(a, b) ((a) < (b) ? (a) : (b))
index 0fd5b142a377056d1e45f8dfd1ff6ae7a9c40097..72c3fed5c6e89c758c761eff4c9bb80158b88fa7 100644 (file)
--- a/trailer.c
+++ b/trailer.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "alloc.h"
 #include "config.h"
 #include "string-list.h"
 #include "run-command.h"
index 3ea7c2bb5ad8c462ae0f54c9466af210bc27d0c2..82ac63e260949fc518f358ccf70e69218dbee047 100644 (file)
@@ -4,6 +4,7 @@
 #include "run-command.h"
 #include "commit.h"
 #include "diff.h"
+#include "hex.h"
 #include "revision.h"
 #include "remote.h"
 #include "string-list.h"
index 77a61a9d7bb06a5cfc7992c6fc4f9f3aa8a8ada5..fa9bc3be0850648b28c4ede889d956326fc9fe45 100644 (file)
@@ -1,5 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
+#include "hex.h"
 #include "transport.h"
 #include "hook.h"
 #include "pkt-line.h"
@@ -10,6 +12,7 @@
 #include "walker.h"
 #include "bundle.h"
 #include "dir.h"
+#include "gettext.h"
 #include "refs.h"
 #include "refspec.h"
 #include "branch.h"
@@ -276,8 +279,12 @@ static int connect_setup(struct transport *transport, int for_push)
        }
 
        data->conn = git_connect(data->fd, transport->url,
-                                for_push ? data->options.receivepack :
-                                data->options.uploadpack,
+                                for_push ?
+                                       "git-receive-pack" :
+                                       "git-upload-pack",
+                                for_push ?
+                                       data->options.receivepack :
+                                       data->options.uploadpack,
                                 flags);
 
        return 0;
@@ -911,7 +918,7 @@ static int connect_git(struct transport *transport, const char *name,
 {
        struct git_transport_data *data = transport->data;
        data->conn = git_connect(data->fd, transport->url,
-                                executable, 0);
+                                name, executable, 0);
        fd[0] = data->fd[0];
        fd[1] = data->fd[1];
        return 0;
index 74f4d710e8f0f28410fae49a6b9c31bf1045e0ca..0e2f5ceb71db51ac846c500efe99ced9a5244855 100644 (file)
@@ -1,6 +1,8 @@
 #include "cache.h"
 #include "tree-walk.h"
+#include "alloc.h"
 #include "dir.h"
+#include "hex.h"
 #include "object-store.h"
 #include "tree.h"
 #include "pathspec.h"
index 6305d531503f25cd0b2632914d9aa7ddea55ff8e..25fe27e352961f3747ea5d4391cff1b242a127b6 100644 (file)
@@ -1,7 +1,9 @@
 #ifndef TREE_WALK_H
 #define TREE_WALK_H
 
-#include "cache.h"
+#include "hash.h"
+
+struct index_state;
 
 #define MAX_TRAVERSE_TREES 8
 
diff --git a/tree.c b/tree.c
index 410e3b477e557f55ad6843e1106567a3fd155557..76a6534f67841026c675a36a55bcb62889d187ca 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "cache-tree.h"
+#include "hex.h"
 #include "tree.h"
 #include "object-store.h"
 #include "blob.h"
index 97c851b27df4a7ea2bc33362a9d2f9dce38c0522..e15fb0455bbd9d6b5fa113ec9bb5cea4f6b6d375 100644 (file)
@@ -94,7 +94,7 @@ static const struct interval zero_width[] = {
 { 0x0E47, 0x0E4E },
 { 0x0EB1, 0x0EB1 },
 { 0x0EB4, 0x0EBC },
-{ 0x0EC8, 0x0ECD },
+{ 0x0EC8, 0x0ECE },
 { 0x0F18, 0x0F19 },
 { 0x0F35, 0x0F35 },
 { 0x0F37, 0x0F37 },
@@ -228,6 +228,7 @@ static const struct interval zero_width[] = {
 { 0x10AE5, 0x10AE6 },
 { 0x10D24, 0x10D27 },
 { 0x10EAB, 0x10EAC },
+{ 0x10EFD, 0x10EFF },
 { 0x10F46, 0x10F50 },
 { 0x10F82, 0x10F85 },
 { 0x11001, 0x11001 },
@@ -252,6 +253,7 @@ static const struct interval zero_width[] = {
 { 0x11234, 0x11234 },
 { 0x11236, 0x11237 },
 { 0x1123E, 0x1123E },
+{ 0x11241, 0x11241 },
 { 0x112DF, 0x112DF },
 { 0x112E3, 0x112EA },
 { 0x11300, 0x11301 },
@@ -313,7 +315,12 @@ static const struct interval zero_width[] = {
 { 0x11D95, 0x11D95 },
 { 0x11D97, 0x11D97 },
 { 0x11EF3, 0x11EF4 },
-{ 0x13430, 0x13438 },
+{ 0x11F00, 0x11F01 },
+{ 0x11F36, 0x11F3A },
+{ 0x11F40, 0x11F40 },
+{ 0x11F42, 0x11F42 },
+{ 0x13430, 0x13440 },
+{ 0x13447, 0x13455 },
 { 0x16AF0, 0x16AF4 },
 { 0x16B30, 0x16B36 },
 { 0x16F4F, 0x16F4F },
@@ -339,9 +346,11 @@ static const struct interval zero_width[] = {
 { 0x1E01B, 0x1E021 },
 { 0x1E023, 0x1E024 },
 { 0x1E026, 0x1E02A },
+{ 0x1E08F, 0x1E08F },
 { 0x1E130, 0x1E136 },
 { 0x1E2AE, 0x1E2AE },
 { 0x1E2EC, 0x1E2EF },
+{ 0x1E4EC, 0x1E4EF },
 { 0x1E8D0, 0x1E8D6 },
 { 0x1E944, 0x1E94A },
 { 0xE0001, 0xE0001 },
@@ -417,7 +426,9 @@ static const struct interval double_width[] = {
 { 0x1AFF5, 0x1AFFB },
 { 0x1AFFD, 0x1AFFE },
 { 0x1B000, 0x1B122 },
+{ 0x1B132, 0x1B132 },
 { 0x1B150, 0x1B152 },
+{ 0x1B155, 0x1B155 },
 { 0x1B164, 0x1B167 },
 { 0x1B170, 0x1B2FB },
 { 0x1F004, 0x1F004 },
@@ -451,7 +462,7 @@ static const struct interval double_width[] = {
 { 0x1F6CC, 0x1F6CC },
 { 0x1F6D0, 0x1F6D2 },
 { 0x1F6D5, 0x1F6D7 },
-{ 0x1F6DD, 0x1F6DF },
+{ 0x1F6DC, 0x1F6DF },
 { 0x1F6EB, 0x1F6EC },
 { 0x1F6F4, 0x1F6FC },
 { 0x1F7E0, 0x1F7EB },
@@ -459,15 +470,13 @@ static const struct interval double_width[] = {
 { 0x1F90C, 0x1F93A },
 { 0x1F93C, 0x1F945 },
 { 0x1F947, 0x1F9FF },
-{ 0x1FA70, 0x1FA74 },
-{ 0x1FA78, 0x1FA7C },
-{ 0x1FA80, 0x1FA86 },
-{ 0x1FA90, 0x1FAAC },
-{ 0x1FAB0, 0x1FABA },
-{ 0x1FAC0, 0x1FAC5 },
-{ 0x1FAD0, 0x1FAD9 },
-{ 0x1FAE0, 0x1FAE7 },
-{ 0x1FAF0, 0x1FAF6 },
+{ 0x1FA70, 0x1FA7C },
+{ 0x1FA80, 0x1FA88 },
+{ 0x1FA90, 0x1FABD },
+{ 0x1FABF, 0x1FAC5 },
+{ 0x1FACE, 0x1FADB },
+{ 0x1FAE0, 0x1FAE8 },
+{ 0x1FAF0, 0x1FAF8 },
 { 0x20000, 0x2FFFD },
 { 0x30000, 0x3FFFD }
 };
index e0be1badb58dee8af8e28c4a4486bf0fdba18a9c..79800d80636fc57fa8cc2696e33013c1c29e86b3 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "strbuf.h"
 #include "unix-socket.h"
 
 #define DEFAULT_UNIX_STREAM_LISTEN_BACKLOG (5)
index efa2a207abcd42021fcae682da1d7e5afbc856fa..22ac2373e0788d9a0c7f377b86a756e5ef4ee518 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "lockfile.h"
 #include "unix-socket.h"
 #include "unix-stream-server.h"
index 3d05e45a279b0b0231da5d9a5829c76818af18bd..09d96f8ba1ae57183060fff196cb7896f8ec5bbe 100644 (file)
@@ -3,6 +3,7 @@
 #include "repository.h"
 #include "config.h"
 #include "dir.h"
+#include "hex.h"
 #include "tree.h"
 #include "tree-walk.h"
 #include "cache-tree.h"
@@ -66,8 +67,8 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_WARNING_TYPES] = {
 };
 
 #define ERRORMSG(o,type) \
-       ( ((o) && (o)->msgs[(type)]) \
-         ? ((o)->msgs[(type)])      \
+       ( ((o) && (o)->internal.msgs[(type)]) \
+         ? ((o)->internal.msgs[(type)])      \
          : (unpack_plumbing_errors[(type)]) )
 
 static const char *super_prefixed(const char *path, const char *super_prefix)
@@ -108,10 +109,10 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                                  const char *cmd)
 {
        int i;
-       const char **msgs = opts->msgs;
+       const char **msgs = opts->internal.msgs;
        const char *msg;
 
-       strvec_init(&opts->msgs_to_free);
+       strvec_init(&opts->internal.msgs_to_free);
 
        if (!strcmp(cmd, "checkout"))
                msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE)
@@ -129,7 +130,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                          "Please commit your changes or stash them before you %s.")
                      : _("Your local changes to the following files would be overwritten by %s:\n%%s");
        msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] =
-               strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd);
+               strvec_pushf(&opts->internal.msgs_to_free, msg, cmd, cmd);
 
        msgs[ERROR_NOT_UPTODATE_DIR] =
                _("Updating the following directories would lose untracked files in them:\n%s");
@@ -153,7 +154,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                          "Please move or remove them before you %s.")
                      : _("The following untracked working tree files would be removed by %s:\n%%s");
        msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] =
-               strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd);
+               strvec_pushf(&opts->internal.msgs_to_free, msg, cmd, cmd);
 
        if (!strcmp(cmd, "checkout"))
                msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE)
@@ -171,7 +172,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                          "Please move or remove them before you %s.")
                      : _("The following untracked working tree files would be overwritten by %s:\n%%s");
        msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] =
-               strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd);
+               strvec_pushf(&opts->internal.msgs_to_free, msg, cmd, cmd);
 
        /*
         * Special case: ERROR_BIND_OVERLAP refers to a pair of paths, we
@@ -189,16 +190,16 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
        msgs[WARNING_SPARSE_ORPHANED_NOT_OVERWRITTEN] =
                _("The following paths were already present and thus not updated despite sparse patterns:\n%s");
 
-       opts->show_all_errors = 1;
+       opts->internal.show_all_errors = 1;
        /* rejected paths may not have a static buffer */
-       for (i = 0; i < ARRAY_SIZE(opts->unpack_rejects); i++)
-               opts->unpack_rejects[i].strdup_strings = 1;
+       for (i = 0; i < ARRAY_SIZE(opts->internal.unpack_rejects); i++)
+               opts->internal.unpack_rejects[i].strdup_strings = 1;
 }
 
 void clear_unpack_trees_porcelain(struct unpack_trees_options *opts)
 {
-       strvec_clear(&opts->msgs_to_free);
-       memset(opts->msgs, 0, sizeof(opts->msgs));
+       strvec_clear(&opts->internal.msgs_to_free);
+       memset(opts->internal.msgs, 0, sizeof(opts->internal.msgs));
 }
 
 static int do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce,
@@ -210,7 +211,7 @@ static int do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce,
                set |= CE_WT_REMOVE;
 
        ce->ce_flags = (ce->ce_flags & ~clear) | set;
-       return add_index_entry(&o->result, ce,
+       return add_index_entry(&o->internal.result, ce,
                               ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
 }
 
@@ -218,7 +219,7 @@ static void add_entry(struct unpack_trees_options *o,
                      const struct cache_entry *ce,
                      unsigned int set, unsigned int clear)
 {
-       do_add_entry(o, dup_cache_entry(ce, &o->result), set, clear);
+       do_add_entry(o, dup_cache_entry(ce, &o->internal.result), set, clear);
 }
 
 /*
@@ -233,7 +234,7 @@ static int add_rejected_path(struct unpack_trees_options *o,
        if (o->quiet)
                return -1;
 
-       if (!o->show_all_errors)
+       if (!o->internal.show_all_errors)
                return error(ERRORMSG(o, e), super_prefixed(path,
                                                            o->super_prefix));
 
@@ -241,7 +242,7 @@ static int add_rejected_path(struct unpack_trees_options *o,
         * Otherwise, insert in a list for future display by
         * display_(error|warning)_msgs()
         */
-       string_list_append(&o->unpack_rejects[e], path);
+       string_list_append(&o->internal.unpack_rejects[e], path);
        return -1;
 }
 
@@ -253,7 +254,7 @@ static void display_error_msgs(struct unpack_trees_options *o)
        int e;
        unsigned error_displayed = 0;
        for (e = 0; e < NB_UNPACK_TREES_ERROR_TYPES; e++) {
-               struct string_list *rejects = &o->unpack_rejects[e];
+               struct string_list *rejects = &o->internal.unpack_rejects[e];
 
                if (rejects->nr > 0) {
                        int i;
@@ -281,7 +282,7 @@ static void display_warning_msgs(struct unpack_trees_options *o)
        unsigned warning_displayed = 0;
        for (e = NB_UNPACK_TREES_ERROR_TYPES + 1;
             e < NB_UNPACK_TREES_WARNING_TYPES; e++) {
-               struct string_list *rejects = &o->unpack_rejects[e];
+               struct string_list *rejects = &o->internal.unpack_rejects[e];
 
                if (rejects->nr > 0) {
                        int i;
@@ -600,13 +601,14 @@ static void mark_ce_used(struct cache_entry *ce, struct unpack_trees_options *o)
 {
        ce->ce_flags |= CE_UNPACKED;
 
-       if (o->cache_bottom < o->src_index->cache_nr &&
-           o->src_index->cache[o->cache_bottom] == ce) {
-               int bottom = o->cache_bottom;
+       if (o->internal.cache_bottom < o->src_index->cache_nr &&
+           o->src_index->cache[o->internal.cache_bottom] == ce) {
+               int bottom = o->internal.cache_bottom;
+
                while (bottom < o->src_index->cache_nr &&
                       o->src_index->cache[bottom]->ce_flags & CE_UNPACKED)
                        bottom++;
-               o->cache_bottom = bottom;
+               o->internal.cache_bottom = bottom;
        }
 }
 
@@ -652,7 +654,7 @@ static void mark_ce_used_same_name(struct cache_entry *ce,
 static struct cache_entry *next_cache_entry(struct unpack_trees_options *o)
 {
        const struct index_state *index = o->src_index;
-       int pos = o->cache_bottom;
+       int pos = o->internal.cache_bottom;
 
        while (pos < index->cache_nr) {
                struct cache_entry *ce = index->cache[pos];
@@ -711,7 +713,7 @@ static void restore_cache_bottom(struct traverse_info *info, int bottom)
 
        if (o->diff_index_cached)
                return;
-       o->cache_bottom = bottom;
+       o->internal.cache_bottom = bottom;
 }
 
 static int switch_cache_bottom(struct traverse_info *info)
@@ -721,13 +723,13 @@ static int switch_cache_bottom(struct traverse_info *info)
 
        if (o->diff_index_cached)
                return 0;
-       ret = o->cache_bottom;
+       ret = o->internal.cache_bottom;
        pos = find_cache_pos(info->prev, info->name, info->namelen);
 
        if (pos < -1)
-               o->cache_bottom = -2 - pos;
+               o->internal.cache_bottom = -2 - pos;
        else if (pos < 0)
-               o->cache_bottom = o->src_index->cache_nr;
+               o->internal.cache_bottom = o->src_index->cache_nr;
        return ret;
 }
 
@@ -838,7 +840,7 @@ static int traverse_by_cache_tree(int pos, int nr_entries, int nr_names,
                mark_ce_used(src[0], o);
        }
        free(tree_ce);
-       if (o->debug_unpack)
+       if (o->internal.debug_unpack)
                printf("Unpacked %d entries from %s to %s using cache-tree\n",
                       nr_entries,
                       o->src_index->cache[pos]->name,
@@ -873,9 +875,9 @@ static int traverse_trees_recursive(int n, unsigned long dirmask,
                 * save and restore cache_bottom anyway to not miss
                 * unprocessed entries before 'pos'.
                 */
-               bottom = o->cache_bottom;
+               bottom = o->internal.cache_bottom;
                ret = traverse_by_cache_tree(pos, nr_entries, n, info);
-               o->cache_bottom = bottom;
+               o->internal.cache_bottom = bottom;
                return ret;
        }
 
@@ -1212,8 +1214,8 @@ static int unpack_single_entry(int n, unsigned long mask,
                 * cache entry from the index aware logic.
                 */
                src[i + o->merge] = create_ce_entry(info, names + i, stage,
-                                                   &o->result, o->merge,
-                                                   bit & dirmask);
+                                                   &o->internal.result,
+                                                   o->merge, bit & dirmask);
        }
 
        if (o->merge) {
@@ -1237,7 +1239,7 @@ static int unpack_single_entry(int n, unsigned long mask,
 
 static int unpack_failed(struct unpack_trees_options *o, const char *message)
 {
-       discard_index(&o->result);
+       discard_index(&o->internal.result);
        if (!o->quiet && !o->exiting_early) {
                if (message)
                        return error("%s", message);
@@ -1260,7 +1262,7 @@ static int find_cache_pos(struct traverse_info *info,
        struct index_state *index = o->src_index;
        int pfxlen = info->pathlen;
 
-       for (pos = o->cache_bottom; pos < index->cache_nr; pos++) {
+       for (pos = o->internal.cache_bottom; pos < index->cache_nr; pos++) {
                const struct cache_entry *ce = index->cache[pos];
                const char *ce_name, *ce_slash;
                int cmp, ce_len;
@@ -1271,8 +1273,8 @@ static int find_cache_pos(struct traverse_info *info,
                         * we can never match it; don't check it
                         * again.
                         */
-                       if (pos == o->cache_bottom)
-                               ++o->cache_bottom;
+                       if (pos == o->internal.cache_bottom)
+                               ++o->internal.cache_bottom;
                        continue;
                }
                if (!ce_in_traverse_path(ce, info)) {
@@ -1450,7 +1452,7 @@ static int unpack_sparse_callback(int n, unsigned long mask, unsigned long dirma
         */
        if (!is_null_oid(&names[0].oid)) {
                src[0] = create_ce_entry(info, &names[0], 0,
-                                       &o->result, 1,
+                                       &o->internal.result, 1,
                                        dirmask & (1ul << 0));
                src[0]->ce_flags |= (CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE);
        }
@@ -1487,7 +1489,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
        while (!p->mode)
                p++;
 
-       if (o->debug_unpack)
+       if (o->internal.debug_unpack)
                debug_unpack_callback(n, mask, dirmask, names, info);
 
        /* Are we supposed to look at the index too? */
@@ -1560,7 +1562,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
                                 * in 'mark_ce_used()'
                                 */
                                if (!src[0] || !S_ISSPARSEDIR(src[0]->ce_mode))
-                                       o->cache_bottom += matches;
+                                       o->internal.cache_bottom += matches;
                                return mask;
                        }
                }
@@ -1809,7 +1811,7 @@ static void populate_from_existing_patterns(struct unpack_trees_options *o,
        if (get_sparse_checkout_patterns(pl) < 0)
                o->skip_sparse_checkout = 1;
        else
-               o->pl = pl;
+               o->internal.pl = pl;
 }
 
 static void update_sparsity_for_prefix(const char *prefix,
@@ -1871,8 +1873,12 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 
        if (len > MAX_UNPACK_TREES)
                die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
-       if (o->dir)
-               BUG("o->dir is for internal use only");
+       if (o->internal.dir)
+               BUG("o->internal.dir is for internal use only");
+       if (o->internal.pl)
+               BUG("o->internal.pl is for internal use only");
+       if (o->df_conflict_entry)
+               BUG("o->df_conflict_entry is an output only field");
 
        trace_performance_enter();
        trace2_region_enter("unpack_trees", "unpack_trees", the_repository);
@@ -1889,9 +1895,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
                BUG("UNPACK_RESET_OVERWRITE_UNTRACKED incompatible with preserved ignored files");
 
        if (!o->preserve_ignored) {
-               o->dir = &dir;
-               o->dir->flags |= DIR_SHOW_IGNORED;
-               setup_standard_excludes(o->dir);
+               o->internal.dir = &dir;
+               o->internal.dir->flags |= DIR_SHOW_IGNORED;
+               setup_standard_excludes(o->internal.dir);
        }
 
        if (o->prefix)
@@ -1899,49 +1905,52 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 
        if (!core_apply_sparse_checkout || !o->update)
                o->skip_sparse_checkout = 1;
-       if (!o->skip_sparse_checkout && !o->pl) {
+       if (!o->skip_sparse_checkout) {
                memset(&pl, 0, sizeof(pl));
                free_pattern_list = 1;
                populate_from_existing_patterns(o, &pl);
        }
 
-       index_state_init(&o->result, o->src_index->repo);
-       o->result.initialized = 1;
-       o->result.timestamp.sec = o->src_index->timestamp.sec;
-       o->result.timestamp.nsec = o->src_index->timestamp.nsec;
-       o->result.version = o->src_index->version;
+       index_state_init(&o->internal.result, o->src_index->repo);
+       o->internal.result.initialized = 1;
+       o->internal.result.timestamp.sec = o->src_index->timestamp.sec;
+       o->internal.result.timestamp.nsec = o->src_index->timestamp.nsec;
+       o->internal.result.version = o->src_index->version;
        if (!o->src_index->split_index) {
-               o->result.split_index = NULL;
+               o->internal.result.split_index = NULL;
        } else if (o->src_index == o->dst_index) {
                /*
                 * o->dst_index (and thus o->src_index) will be discarded
-                * and overwritten with o->result at the end of this function,
-                * so just use src_index's split_index to avoid having to
-                * create a new one.
+                * and overwritten with o->internal.result at the end of
+                * this function, so just use src_index's split_index to
+                * avoid having to create a new one.
                 */
-               o->result.split_index = o->src_index->split_index;
-               o->result.split_index->refcount++;
+               o->internal.result.split_index = o->src_index->split_index;
+               if (o->src_index->cache_changed & SPLIT_INDEX_ORDERED)
+                       o->internal.result.cache_changed |= SPLIT_INDEX_ORDERED;
+               o->internal.result.split_index->refcount++;
        } else {
-               o->result.split_index = init_split_index(&o->result);
+               o->internal.result.split_index =
+                       init_split_index(&o->internal.result);
        }
-       oidcpy(&o->result.oid, &o->src_index->oid);
-       o->merge_size = len;
+       oidcpy(&o->internal.result.oid, &o->src_index->oid);
+       o->internal.merge_size = len;
        mark_all_ce_unused(o->src_index);
 
-       o->result.fsmonitor_last_update =
+       o->internal.result.fsmonitor_last_update =
                xstrdup_or_null(o->src_index->fsmonitor_last_update);
-       o->result.fsmonitor_has_run_once = o->src_index->fsmonitor_has_run_once;
+       o->internal.result.fsmonitor_has_run_once = o->src_index->fsmonitor_has_run_once;
 
        if (!o->src_index->initialized &&
            !repo->settings.command_requires_full_index &&
-           is_sparse_index_allowed(&o->result, 0))
-               o->result.sparse_index = 1;
+           is_sparse_index_allowed(&o->internal.result, 0))
+               o->internal.result.sparse_index = 1;
 
        /*
         * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries
         */
        if (!o->skip_sparse_checkout)
-               mark_new_skip_worktree(o->pl, o->src_index, 0,
+               mark_new_skip_worktree(o->internal.pl, o->src_index, 0,
                                       CE_NEW_SKIP_WORKTREE, o->verbose_update);
 
        if (!dfc)
@@ -1955,7 +1964,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
                setup_traverse_info(&info, prefix);
                info.fn = unpack_callback;
                info.data = o;
-               info.show_all_errors = o->show_all_errors;
+               info.show_all_errors = o->internal.show_all_errors;
                info.pathspec = o->pathspec;
 
                if (o->prefix) {
@@ -1996,7 +2005,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        }
        mark_all_ce_unused(o->src_index);
 
-       if (o->trivial_merges_only && o->nontrivial_merge) {
+       if (o->trivial_merges_only && o->internal.nontrivial_merge) {
                ret = unpack_failed(o, "Merge requires file-level merging");
                goto done;
        }
@@ -2007,13 +2016,13 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
                 * If they will have NEW_SKIP_WORKTREE, also set CE_SKIP_WORKTREE
                 * so apply_sparse_checkout() won't attempt to remove it from worktree
                 */
-               mark_new_skip_worktree(o->pl, &o->result,
+               mark_new_skip_worktree(o->internal.pl, &o->internal.result,
                                       CE_ADDED, CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE,
                                       o->verbose_update);
 
                ret = 0;
-               for (i = 0; i < o->result.cache_nr; i++) {
-                       struct cache_entry *ce = o->result.cache[i];
+               for (i = 0; i < o->internal.result.cache_nr; i++) {
+                       struct cache_entry *ce = o->internal.result.cache[i];
 
                        /*
                         * Entries marked with CE_ADDED in merged_entry() do not have
@@ -2027,7 +2036,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
                            verify_absent(ce, WARNING_SPARSE_ORPHANED_NOT_OVERWRITTEN, o))
                                ret = 1;
 
-                       if (apply_sparse_checkout(&o->result, ce, o))
+                       if (apply_sparse_checkout(&o->internal.result, ce, o))
                                ret = 1;
                }
                if (ret == 1) {
@@ -2035,46 +2044,47 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
                         * Inability to sparsify or de-sparsify individual
                         * paths is not an error, but just a warning.
                         */
-                       if (o->show_all_errors)
+                       if (o->internal.show_all_errors)
                                display_warning_msgs(o);
                        ret = 0;
                }
        }
 
-       ret = check_updates(o, &o->result) ? (-2) : 0;
+       ret = check_updates(o, &o->internal.result) ? (-2) : 0;
        if (o->dst_index) {
-               move_index_extensions(&o->result, o->src_index);
+               move_index_extensions(&o->internal.result, o->src_index);
                if (!ret) {
                        if (git_env_bool("GIT_TEST_CHECK_CACHE_TREE", 0))
-                               cache_tree_verify(the_repository, &o->result);
+                               cache_tree_verify(the_repository,
+                                                 &o->internal.result);
                        if (!o->skip_cache_tree_update &&
-                           !cache_tree_fully_valid(o->result.cache_tree))
-                               cache_tree_update(&o->result,
+                           !cache_tree_fully_valid(o->internal.result.cache_tree))
+                               cache_tree_update(&o->internal.result,
                                                  WRITE_TREE_SILENT |
                                                  WRITE_TREE_REPAIR);
                }
 
-               o->result.updated_workdir = 1;
+               o->internal.result.updated_workdir = 1;
                discard_index(o->dst_index);
-               *o->dst_index = o->result;
+               *o->dst_index = o->internal.result;
        } else {
-               discard_index(&o->result);
+               discard_index(&o->internal.result);
        }
        o->src_index = NULL;
 
 done:
        if (free_pattern_list)
                clear_pattern_list(&pl);
-       if (o->dir) {
-               dir_clear(o->dir);
-               o->dir = NULL;
+       if (o->internal.dir) {
+               dir_clear(o->internal.dir);
+               o->internal.dir = NULL;
        }
        trace2_region_leave("unpack_trees", "unpack_trees", the_repository);
        trace_performance_leave("unpack_trees");
        return ret;
 
 return_failed:
-       if (o->show_all_errors)
+       if (o->internal.show_all_errors)
                display_error_msgs(o);
        mark_all_ce_unused(o->src_index);
        ret = unpack_failed(o, NULL);
@@ -2089,16 +2099,17 @@ return_failed:
  *
  * CE_NEW_SKIP_WORKTREE is used internally.
  */
-enum update_sparsity_result update_sparsity(struct unpack_trees_options *o)
+enum update_sparsity_result update_sparsity(struct unpack_trees_options *o,
+                                           struct pattern_list *pl)
 {
        enum update_sparsity_result ret = UPDATE_SPARSITY_SUCCESS;
-       struct pattern_list pl;
        int i;
        unsigned old_show_all_errors;
        int free_pattern_list = 0;
 
-       old_show_all_errors = o->show_all_errors;
-       o->show_all_errors = 1;
+       old_show_all_errors = o->internal.show_all_errors;
+       o->internal.show_all_errors = 1;
+       index_state_init(&o->internal.result, o->src_index->repo);
 
        /* Sanity checks */
        if (!o->update || o->index_only || o->skip_sparse_checkout)
@@ -2109,20 +2120,19 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o)
        trace_performance_enter();
 
        /* If we weren't given patterns, use the recorded ones */
-       if (!o->pl) {
-               memset(&pl, 0, sizeof(pl));
+       if (!pl) {
                free_pattern_list = 1;
-               populate_from_existing_patterns(o, &pl);
-               if (o->skip_sparse_checkout)
-                       goto skip_sparse_checkout;
+               pl = xcalloc(1, sizeof(*pl));
+               populate_from_existing_patterns(o, pl);
        }
+       o->internal.pl = pl;
 
        /* Expand sparse directories as needed */
-       expand_index(o->src_index, o->pl);
+       expand_index(o->src_index, o->internal.pl);
 
        /* Set NEW_SKIP_WORKTREE on existing entries. */
        mark_all_ce_unused(o->src_index);
-       mark_new_skip_worktree(o->pl, o->src_index, 0,
+       mark_new_skip_worktree(o->internal.pl, o->src_index, 0,
                               CE_NEW_SKIP_WORKTREE, o->verbose_update);
 
        /* Then loop over entries and update/remove as needed */
@@ -2142,14 +2152,16 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o)
                        ret = UPDATE_SPARSITY_WARNINGS;
        }
 
-skip_sparse_checkout:
        if (check_updates(o, o->src_index))
                ret = UPDATE_SPARSITY_WORKTREE_UPDATE_FAILURES;
 
        display_warning_msgs(o);
-       o->show_all_errors = old_show_all_errors;
-       if (free_pattern_list)
-               clear_pattern_list(&pl);
+       o->internal.show_all_errors = old_show_all_errors;
+       if (free_pattern_list) {
+               clear_pattern_list(pl);
+               free(pl);
+               o->internal.pl = NULL;
+       }
        trace_performance_leave("update_sparsity");
        return ret;
 }
@@ -2244,15 +2256,15 @@ static int verify_uptodate_sparse(const struct cache_entry *ce,
 }
 
 /*
- * TODO: We should actually invalidate o->result, not src_index [1].
+ * TODO: We should actually invalidate o->internal.result, not src_index [1].
  * But since cache tree and untracked cache both are not copied to
- * o->result until unpacking is complete, we invalidate them on
+ * o->internal.result until unpacking is complete, we invalidate them on
  * src_index instead with the assumption that they will be copied to
  * dst_index at the end.
  *
  * [1] src_index->cache_tree is also used in unpack_callback() so if
- * we invalidate o->result, we need to update it to use
- * o->result.cache_tree as well.
+ * we invalidate o->internal.result, we need to update it to use
+ * o->internal.result.cache_tree as well.
  */
 static void invalidate_ce_path(const struct cache_entry *ce,
                               struct unpack_trees_options *o)
@@ -2336,8 +2348,8 @@ static int verify_clean_subdirectory(const struct cache_entry *ce,
        pathbuf = xstrfmt("%.*s/", namelen, ce->name);
 
        memset(&d, 0, sizeof(d));
-       if (o->dir)
-               d.exclude_per_dir = o->dir->exclude_per_dir;
+       if (o->internal.dir)
+               setup_standard_excludes(&d);
        i = read_directory(&d, o->src_index, pathbuf, namelen+1, NULL);
        dir_clear(&d);
        free(pathbuf);
@@ -2391,8 +2403,8 @@ static int check_ok_to_remove(const char *name, int len, int dtype,
        if (ignore_case && icase_exists(o, name, len, st))
                return 0;
 
-       if (o->dir &&
-           is_excluded(o->dir, o->src_index, name, &dtype))
+       if (o->internal.dir &&
+           is_excluded(o->internal.dir, o->src_index, name, &dtype))
                /*
                 * ce->name is explicitly excluded, so it is Ok to
                 * overwrite it.
@@ -2420,7 +2432,7 @@ static int check_ok_to_remove(const char *name, int len, int dtype,
         * delete this path, which is in a subdirectory that
         * is being replaced with a blob.
         */
-       result = index_file_exists(&o->result, name, len, 0);
+       result = index_file_exists(&o->internal.result, name, len, 0);
        if (result) {
                if (result->ce_flags & CE_REMOVE)
                        return 0;
@@ -2521,7 +2533,7 @@ static int merged_entry(const struct cache_entry *ce,
                        struct unpack_trees_options *o)
 {
        int update = CE_UPDATE;
-       struct cache_entry *merge = dup_cache_entry(ce, &o->result);
+       struct cache_entry *merge = dup_cache_entry(ce, &o->internal.result);
 
        if (!old) {
                /*
@@ -2616,7 +2628,7 @@ static int merged_sparse_dir(const struct cache_entry * const *src, int n,
        setup_traverse_info(&info, src[0]->name);
        info.fn = unpack_sparse_callback;
        info.data = o;
-       info.show_all_errors = o->show_all_errors;
+       info.show_all_errors = o->internal.show_all_errors;
        info.pathspec = o->pathspec;
 
        /* Get the tree descriptors of the sparse directory in each of the merging trees */
@@ -2834,7 +2846,7 @@ int threeway_merge(const struct cache_entry * const *stages,
                        return -1;
        }
 
-       o->nontrivial_merge = 1;
+       o->internal.nontrivial_merge = 1;
 
        /* #2, #3, #4, #6, #7, #9, #10, #11. */
        count = 0;
@@ -2875,9 +2887,9 @@ int twoway_merge(const struct cache_entry * const *src,
        const struct cache_entry *oldtree = src[1];
        const struct cache_entry *newtree = src[2];
 
-       if (o->merge_size != 2)
+       if (o->internal.merge_size != 2)
                return error("Cannot do a twoway merge of %d trees",
-                            o->merge_size);
+                            o->internal.merge_size);
 
        if (oldtree == o->df_conflict_entry)
                oldtree = NULL;
@@ -2957,9 +2969,9 @@ int bind_merge(const struct cache_entry * const *src,
        const struct cache_entry *old = src[0];
        const struct cache_entry *a = src[1];
 
-       if (o->merge_size != 1)
+       if (o->internal.merge_size != 1)
                return error("Cannot do a bind merge of %d trees",
-                            o->merge_size);
+                            o->internal.merge_size);
        if (a && old)
                return o->quiet ? -1 :
                        error(ERRORMSG(o, ERROR_BIND_OVERLAP),
@@ -2983,9 +2995,9 @@ int oneway_merge(const struct cache_entry * const *src,
        const struct cache_entry *old = src[0];
        const struct cache_entry *a = src[1];
 
-       if (o->merge_size != 1)
+       if (o->internal.merge_size != 1)
                return error("Cannot do a oneway merge of %d trees",
-                            o->merge_size);
+                            o->internal.merge_size);
 
        if (!a || a == o->df_conflict_entry)
                return deleted_entry(old, old, o);
@@ -3020,8 +3032,8 @@ int stash_worktree_untracked_merge(const struct cache_entry * const *src,
        const struct cache_entry *worktree = src[1];
        const struct cache_entry *untracked = src[2];
 
-       if (o->merge_size != 2)
-               BUG("invalid merge_size: %d", o->merge_size);
+       if (o->internal.merge_size != 2)
+               BUG("invalid merge_size: %d", o->internal.merge_size);
 
        if (worktree && untracked)
                return error(_("worktree and untracked commit have duplicate entries: %s"),
index 3a7b3e5f0077938f1e28de5f41a691191c098744..61c06eb7c506e7753fd291a8a32539d2fc21496b 100644 (file)
@@ -59,47 +59,54 @@ struct unpack_trees_options {
                     preserve_ignored,
                     clone,
                     index_only,
-                    nontrivial_merge,
                     trivial_merges_only,
                     verbose_update,
                     aggressive,
                     skip_unmerged,
                     initial_checkout,
                     diff_index_cached,
-                    debug_unpack,
                     skip_sparse_checkout,
                     quiet,
                     exiting_early,
-                    show_all_errors,
                     dry_run,
                     skip_cache_tree_update;
        enum unpack_trees_reset_type reset;
        const char *prefix;
        const char *super_prefix;
-       int cache_bottom;
        struct pathspec *pathspec;
        merge_fn_t fn;
-       const char *msgs[NB_UNPACK_TREES_WARNING_TYPES];
-       struct strvec msgs_to_free;
-       /*
-        * Store error messages in an array, each case
-        * corresponding to a error message type
-        */
-       struct string_list unpack_rejects[NB_UNPACK_TREES_WARNING_TYPES];
 
        int head_idx;
-       int merge_size;
 
-       struct cache_entry *df_conflict_entry;
+       struct cache_entry *df_conflict_entry; /* output only */
        void *unpack_data;
 
        struct index_state *dst_index;
        struct index_state *src_index;
-       struct index_state result;
 
-       struct pattern_list *pl; /* for internal use */
-       struct dir_struct *dir; /* for internal use only */
        struct checkout_metadata meta;
+
+       struct unpack_trees_options_internal {
+               unsigned int nontrivial_merge,
+                            show_all_errors,
+                            debug_unpack; /* used by read-tree debugging */
+
+               int merge_size; /* used by read-tree debugging */
+               int cache_bottom;
+               const char *msgs[NB_UNPACK_TREES_WARNING_TYPES];
+               struct strvec msgs_to_free;
+
+               /*
+                * Store error messages in an array, each case
+                * corresponding to a error message type
+                */
+               struct string_list unpack_rejects[NB_UNPACK_TREES_WARNING_TYPES];
+
+               struct index_state result;
+
+               struct pattern_list *pl;
+               struct dir_struct *dir;
+       } internal;
 };
 
 int unpack_trees(unsigned n, struct tree_desc *t,
@@ -112,7 +119,8 @@ enum update_sparsity_result {
        UPDATE_SPARSITY_WORKTREE_UPDATE_FAILURES = -2
 };
 
-enum update_sparsity_result update_sparsity(struct unpack_trees_options *options);
+enum update_sparsity_result update_sparsity(struct unpack_trees_options *options,
+                                           struct pattern_list *pl);
 
 int verify_uptodate(const struct cache_entry *ce,
                    struct unpack_trees_options *o);
index 551f22ffa5d63ceabbf5909ee1926b8471722920..41b9362cf1b2c69d33a6d96f64c02b85205404b0 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "refs.h"
 #include "pkt-line.h"
 #include "sideband.h"
@@ -1699,7 +1700,7 @@ enum fetch_state {
        FETCH_DONE,
 };
 
-int upload_pack_v2(struct repository *r, struct packet_reader *request)
+int upload_pack_v2(struct repository *r UNUSED, struct packet_reader *request)
 {
        enum fetch_state state = FETCH_PROCESS_ARGS;
        struct upload_pack_data data;
@@ -1775,26 +1776,26 @@ int upload_pack_advertise(struct repository *r,
 
                strbuf_addstr(value, "shallow wait-for-done");
 
-               if (!repo_config_get_bool(the_repository,
+               if (!repo_config_get_bool(r,
                                         "uploadpack.allowfilter",
                                         &allow_filter_value) &&
                    allow_filter_value)
                        strbuf_addstr(value, " filter");
 
-               if (!repo_config_get_bool(the_repository,
+               if (!repo_config_get_bool(r,
                                         "uploadpack.allowrefinwant",
                                         &allow_ref_in_want) &&
                    allow_ref_in_want)
                        strbuf_addstr(value, " ref-in-want");
 
                if (git_env_bool("GIT_TEST_SIDEBAND_ALL", 0) ||
-                   (!repo_config_get_bool(the_repository,
+                   (!repo_config_get_bool(r,
                                           "uploadpack.allowsidebandall",
                                           &allow_sideband_all_value) &&
                     allow_sideband_all_value))
                        strbuf_addstr(value, " sideband-all");
 
-               if (!repo_config_get_string(the_repository,
+               if (!repo_config_get_string(r,
                                            "uploadpack.blobpackfileuri",
                                            &str) &&
                    str) {
diff --git a/url.c b/url.c
index e04bd60b6bead493e3236949b5b4a837c729c146..2e1a9f6feec96b055a9415748eb721937461c07f 100644 (file)
--- a/url.c
+++ b/url.c
@@ -1,4 +1,6 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "hex.h"
+#include "strbuf.h"
 #include "url.h"
 
 int is_urlschemechar(int first_flag, int ch)
index 620a648efc5e81ac8b233153ae504ba145d6ee8f..eba0bdd77fe75bc4c0f836d88f9b7e8c4b91c995 100644 (file)
@@ -1,4 +1,7 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "gettext.h"
+#include "hex.h"
+#include "strbuf.h"
 #include "urlmatch.h"
 
 #define URL_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
index 58a3d59ef8f471b9c6ffc34cad10e56689c3354c..09203fbc35453e50836e82987dc6e73466aefb27 100644 (file)
@@ -1,7 +1,9 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "config.h"
 #include "userdiff.h"
 #include "attr.h"
+#include "strbuf.h"
 
 static struct userdiff_driver *drivers;
 static int ndrivers;
index 99d0e0eae047410660f0bf3b0d3f487d45c1134d..c046936378903fbc5f6cf31abb2c0cc0bcf41933 100644 (file)
--- a/walker.c
+++ b/walker.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "hex.h"
 #include "walker.h"
 #include "repository.h"
 #include "object-store.h"
index 7e5a7ea1eaa9d9d49219537b70256f1d947633ea..8ea29141bd7c5233a25c89aa55ceeafcf7e7529d 100644 (file)
@@ -9,11 +9,15 @@
 **  work differently than '*', and to fix the character-class code.
 */
 
-#include "cache.h"
+#include "git-compat-util.h"
 #include "wildmatch.h"
 
 typedef unsigned char uchar;
 
+/* Internal return values */
+#define WM_ABORT_ALL -1
+#define WM_ABORT_TO_STARSTAR -2
+
 /* What character marks an inverted character class? */
 #define NEGATE_CLASS   '!'
 #define NEGATE_CLASS2  '^'
@@ -83,12 +87,12 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                        continue;
                case '*':
                        if (*++p == '*') {
-                               const uchar *prev_p = p - 2;
+                               const uchar *prev_p = p;
                                while (*++p == '*') {}
                                if (!(flags & WM_PATHNAME))
                                        /* without WM_PATHNAME, '*' == '**' */
                                        match_slash = 1;
-                               else if ((prev_p < pattern || *prev_p == '/') &&
+                               else if ((prev_p - pattern < 2 || *(prev_p - 2) == '/') &&
                                    (*p == '\0' || *p == '/' ||
                                     (p[0] == '\\' && p[1] == '/'))) {
                                        /*
@@ -114,7 +118,7 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                 * only if there are no more slash characters. */
                                if (!match_slash) {
                                        if (strchr((char *)text, '/'))
-                                               return WM_NOMATCH;
+                                               return WM_ABORT_TO_STARSTAR;
                                }
                                return WM_MATCH;
                        } else if (!match_slash && *p == '/') {
@@ -125,7 +129,7 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                 */
                                const char *slash = strchr((char*)text, '/');
                                if (!slash)
-                                       return WM_NOMATCH;
+                                       return WM_ABORT_ALL;
                                text = (const uchar*)slash;
                                /* the slash is consumed by the top-level for loop */
                                break;
@@ -153,8 +157,12 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                                        break;
                                                text++;
                                        }
-                                       if (t_ch != p_ch)
-                                               return WM_NOMATCH;
+                                       if (t_ch != p_ch) {
+                                               if (match_slash)
+                                                       return WM_ABORT_ALL;
+                                               else
+                                                       return WM_ABORT_TO_STARSTAR;
+                                       }
                                }
                                if ((matched = dowild(p, text, flags)) != WM_NOMATCH) {
                                        if (!match_slash || matched != WM_ABORT_TO_STARSTAR)
@@ -274,5 +282,6 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
 /* Match the "pattern" against the "text" string. */
 int wildmatch(const char *pattern, const char *text, unsigned int flags)
 {
-       return dowild((const uchar*)pattern, (const uchar*)text, flags);
+       int res = dowild((const uchar*)pattern, (const uchar*)text, flags);
+       return res == WM_MATCH ? WM_MATCH : WM_NOMATCH;
 }
index 599369629824ec5f2bbb8e8affb19e8cc9058cc3..0c890cb56ba303db40a4c4f3244cc4a672303ac1 100644 (file)
@@ -6,8 +6,6 @@
 
 #define WM_NOMATCH 1
 #define WM_MATCH 0
-#define WM_ABORT_ALL -1
-#define WM_ABORT_TO_STARSTAR -2
 
 int wildmatch(const char *pattern, const char *text, unsigned int flags);
 #endif
index aa43c6411914308798a58e4e3a0a5c55d1eede8f..e10594ef3369ba420f61f1e51faa2a177233c77a 100644 (file)
@@ -1,4 +1,5 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "alloc.h"
 #include "repository.h"
 #include "refs.h"
 #include "strbuf.h"
@@ -403,44 +404,43 @@ int is_worktree_being_bisected(const struct worktree *wt,
  * bisect). New commands that do similar things should update this
  * function as well.
  */
-const struct worktree *find_shared_symref(struct worktree **worktrees,
-                                         const char *symref,
-                                         const char *target)
+int is_shared_symref(const struct worktree *wt, const char *symref,
+                    const char *target)
 {
-       const struct worktree *existing = NULL;
-       int i = 0;
+       const char *symref_target;
+       struct ref_store *refs;
+       int flags;
 
-       for (i = 0; worktrees[i]; i++) {
-               struct worktree *wt = worktrees[i];
-               const char *symref_target;
-               struct ref_store *refs;
-               int flags;
+       if (wt->is_bare)
+               return 0;
 
-               if (wt->is_bare)
-                       continue;
+       if (wt->is_detached && !strcmp(symref, "HEAD")) {
+               if (is_worktree_being_rebased(wt, target))
+                       return 1;
+               if (is_worktree_being_bisected(wt, target))
+                       return 1;
+       }
 
-               if (wt->is_detached && !strcmp(symref, "HEAD")) {
-                       if (is_worktree_being_rebased(wt, target)) {
-                               existing = wt;
-                               break;
-                       }
-                       if (is_worktree_being_bisected(wt, target)) {
-                               existing = wt;
-                               break;
-                       }
-               }
+       refs = get_worktree_ref_store(wt);
+       symref_target = refs_resolve_ref_unsafe(refs, symref, 0,
+                                               NULL, &flags);
+       if ((flags & REF_ISSYMREF) &&
+           symref_target && !strcmp(symref_target, target))
+               return 1;
 
-               refs = get_worktree_ref_store(wt);
-               symref_target = refs_resolve_ref_unsafe(refs, symref, 0,
-                                                       NULL, &flags);
-               if ((flags & REF_ISSYMREF) &&
-                   symref_target && !strcmp(symref_target, target)) {
-                       existing = wt;
-                       break;
-               }
-       }
+       return 0;
+}
 
-       return existing;
+const struct worktree *find_shared_symref(struct worktree **worktrees,
+                                         const char *symref,
+                                         const char *target)
+{
+
+       for (int i = 0; worktrees[i]; i++)
+               if (is_shared_symref(worktrees[i], symref, target))
+                       return worktrees[i];
+
+       return NULL;
 }
 
 int submodule_uses_worktrees(const char *path)
index 9dcea6fc8c1b4fcc387818967d2de99713bfb50b..ce45b66de9e82d4d619b6f74e0e77c8bd5ab3f53 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef WORKTREE_H
 #define WORKTREE_H
 
-#include "cache.h"
 #include "refs.h"
 
 struct strbuf;
@@ -149,6 +148,12 @@ const struct worktree *find_shared_symref(struct worktree **worktrees,
                                          const char *symref,
                                          const char *target);
 
+/*
+ * Returns true if a symref points to a ref in a worktree.
+ */
+int is_shared_symref(const struct worktree *wt,
+                    const char *symref, const char *target);
+
 /*
  * Similar to head_ref() for all HEADs _except_ one from the current
  * worktree, which is covered by head_ref().
index 3162241a570cb60393607f06a8a12963b71afb78..90525bd26fd954e52b4d138020388db7e6291956 100644 (file)
@@ -4,6 +4,7 @@
 #include "dir.h"
 #include "commit.h"
 #include "diff.h"
+#include "hex.h"
 #include "revision.h"
 #include "diffcore.h"
 #include "quote.h"
index e87950de32e5602765de26953ce7ec812ef30925..5baf6ceb9473887765dc709ff5ff54da00a26559 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "config.h"
+#include "hex.h"
 #include "object-store.h"
 #include "xdiff-interface.h"
 #include "xdiff/xtypes.h"
index 4301a7eef274bb7796ad758d686f61b7c5b35395..3750794afe90c8c7d7951cdd187945c895115781 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef XDIFF_INTERFACE_H
 #define XDIFF_INTERFACE_H
 
-#include "cache.h"
+#include "hash.h"
 #include "xdiff/xdiff.h"
 
 /*