Merge tag 'v2.23.0-rc2' of git://git.kernel.org/pub/scm/git/git
authorJiang Xin <worldhello.net@gmail.com>
Sat, 10 Aug 2019 12:11:17 +0000 (20:11 +0800)
committerJiang Xin <worldhello.net@gmail.com>
Sat, 10 Aug 2019 12:11:17 +0000 (20:11 +0800)
Git 2.23-rc2

* tag 'v2.23.0-rc2' of git://git.kernel.org/pub/scm/git/git: (63 commits)
Git 2.23-rc2
t0000: reword comments for "local" test
t: decrease nesting in test_oid_to_path
sha1-file: release strbuf after use
test-dir-iterator: use path argument directly
dir-iterator: release strbuf after use
commit-graph: release strbufs after use
l10n: reformat some localized strings for v2.23.0
merge-recursive: avoid directory rename detection in recursive case
commit-graph: fix bug around octopus merges
restore: fix typo in docs
doc: typo: s/can not/cannot/ and s/is does/does/
Git 2.23-rc1
log: really flip the --mailmap default
RelNotes/2.23.0: fix a few typos and other minor issues
RelNotes/2.21.1: typofix
log: flip the --mailmap default unconditionally
config: work around bug with includeif:onbranch and early config
A few more last-minute fixes
repack: simplify handling of auto-bitmaps and .keep files
...

60 files changed:
.gitignore
Documentation/RelNotes/2.22.1.txt
Documentation/RelNotes/2.23.0.txt
Documentation/config/log.txt
Documentation/config/transfer.txt
Documentation/git-cvsserver.txt
Documentation/git-fetch.txt
Documentation/git-fsck.txt
Documentation/git-pull.txt
Documentation/git-restore.txt
Documentation/glossary-content.txt
Documentation/technical/api-ref-iteration.txt
GIT-VERSION-GEN
Makefile
builtin/checkout.c
builtin/fetch.c
builtin/log.c
builtin/pack-objects.c
builtin/repack.c
builtin/verify-commit.c
builtin/verify-tag.c
commit-graph.c
compat/vcbuild/README
config.c
config.mak.uname
contrib/buildsystems/Generators.pm
contrib/buildsystems/Generators/Vcproj.pm
contrib/buildsystems/Generators/Vcxproj.pm [new file with mode: 0644]
contrib/buildsystems/engine.pl
git.c
merge-recursive.c
refs/files-backend.c
sha1-file.c
t/helper/test-dir-iterator.c
t/t0000-basic.sh
t/t0011-hashmap.sh
t/t0016-oidmap.sh
t/t0027-auto-crlf.sh
t/t0066-dir-iterator.sh
t/t0090-cache-tree.sh
t/t1007-hash-object.sh
t/t1309-early-config.sh
t/t1410-reflog.sh
t/t1450-fsck.sh
t/t1700-split-index.sh
t/t2203-add-intent.sh
t/t4203-mailmap.sh
t/t5000-tar-tree.sh
t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a [deleted file]
t/t5000/huge-object [new file with mode: 0644]
t/t5324-split-commit-graph.sh
t/t6030-bisect-porcelain.sh
t/t6043-merge-rename-directories.sh
t/t7006-pager.sh
t/t7700-repack.sh
t/test-lib-functions.sh
wt-status.h
xdiff/xhistogram.c
xdiff/xpatience.c
xdiff/xutils.c
index 069c190ba078a7fe4ac3b42db67c6d1221939249..521d8f4fb421c25e5f733242796fddfa47f39f93 100644 (file)
 *.ipdb
 *.dll
 .vs/
-/Debug/
-/Release/
+*.manifest
+Debug/
+Release/
+/UpgradeLog*.htm
+/git.VC.VC.opendb
+/git.VC.db
 *.dSYM
index 78b2c5ea8ad51cdff9bcd68e53a12269ba723d29..76dd8fb578b54ab66044518bad521b0c53a8a61c 100644 (file)
@@ -94,7 +94,7 @@ Fixes since v2.22
 
  * The configuration variable rebase.rescheduleFailedExec should be
    effective only while running an interactive rebase and should not
-   affect anything when running an non-interactive one, which was not
+   affect anything when running a non-interactive one, which was not
    the case.  This has been corrected.
 
  * "git submodule foreach" did not protect command line options passed
index 9896599b2f3a4bb559dd3db52bfdea461ac3a69b..e3c4e7826510da28d0a60b6d278077e68ac1d528 100644 (file)
@@ -10,6 +10,9 @@ Backward compatibility note
    prerequisite patches in an unstable way, which has been updated to
    compute in a way that is compatible with "git patch-id --stable".
 
+ * The "git log" command by default behaves as if the --mailmap option
+   was given.
+
 
 UI, Workflows & Features
 
@@ -52,7 +55,7 @@ UI, Workflows & Features
 
  * "git fetch" and "git pull" reports when a fetch results in
    non-fast-forward updates to let the user notice unusual situation.
-   The commands learned "--no-shown-forced-updates" option to disable
+   The commands learned "--no-show-forced-updates" option to disable
    this safety feature.
 
  * Two new commands "git switch" and "git restore" are introduced to
@@ -68,7 +71,7 @@ UI, Workflows & Features
  * The conditional inclusion mechanism learned to base the choice on
    the branch the HEAD currently is on.
 
- * "git rev-list --objects" learned with "--no-object-names" option to
+ * "git rev-list --objects" learned the "--no-object-names" option to
    squelch the path to the object that is used as a grouping hint for
    pack-objects.
 
@@ -91,11 +94,6 @@ UI, Workflows & Features
    commit-graph files now, which allows the commit-graph files to be
    updated incrementally.
 
- * The "git log" command learns to issue a warning when log.mailmap
-   configuration is not set and --[no-]mailmap option is not used, to
-   prepare users for future versions of Git that uses the mailmap by
-   default.
-
  * "git range-diff" output has been tweaked for easier identification
    of which part of what file the patch shown is about.
 
@@ -106,7 +104,7 @@ Performance, Internal Implementation, Development Support etc.
    no longer be used.
 
  * Developer support to emulate unsatisfied prerequisites in tests to
-   ensure that the remainer of the tests still succeeds when tests
+   ensure that the remainder of the tests still succeeds when tests
    with prerequisites are skipped.
 
  * "git update-server-info" learned not to rewrite the file with the
@@ -121,7 +119,7 @@ Performance, Internal Implementation, Development Support etc.
  * Prepare use of reachability index in topological walker that works
    on a range (A..B).
 
- * A new tutorial targetting specifically aspiring git-core
+ * A new tutorial targeting specifically aspiring git-core
    developers has been added.
 
  * Auto-detect how to tell HP-UX aCC where to use dynamically linked
@@ -163,7 +161,6 @@ Performance, Internal Implementation, Development Support etc.
  * We have been trying out a few language features outside c89; the
    coding guidelines document did not talk about them and instead had
    a blanket ban against them.
-   (merge cc0c42975a jc/post-c89-rules-doc later to maint).
 
  * A test helper has been introduced to optimize preparation of test
    repositories with many simple commits, and a handful of test
@@ -177,16 +174,13 @@ Fixes since v2.22
    ought to be relative to the directory "git init" gets invoked in,
    but it instead was made relative to the repository, which has been
    corrected.
-   (merge e1df7fe43f nd/init-relative-template-fix later to maint).
 
  * "git worktree add" used to fail when another worktree connected to
    the same repository was corrupt, which has been corrected.
-   (merge 105df73e71 nd/corrupt-worktrees later to maint).
 
  * The ownership rule for the file descriptor to fast-import remote
-   backend was mixed up, leading to unrelated file descriptor getting
+   backend was mixed up, leading to an unrelated file descriptor getting
    closed, which has been fixed.
-   (merge 3203566a71 mh/import-transport-fd-fix later to maint).
 
  * A "merge -c" instruction during "git rebase --rebase-merges" should
    give the user a chance to edit the log message, even when there is
@@ -195,82 +189,65 @@ Fixes since v2.22
    corrected.
 
  * Code cleanup and futureproof.
-   (merge 31f5256c82 ds/object-info-for-prefetch-fix later to maint).
 
  * More parameter validation.
-   (merge de99eb0c24 es/grep-require-name-when-needed later to maint).
 
  * "git update-server-info" used to leave stale packfiles in its
    output, which has been corrected.
-   (merge e941c48d49 ew/server-info-remove-crufts later to maint).
 
  * The server side support for "git fetch" used to show incorrect
    value for the HEAD symbolic ref when the namespace feature is in
    use, which has been corrected.
-   (merge 533e088250 jk/HEAD-symref-in-xfer-namespaces later to maint).
 
  * "git am -i --resolved" segfaulted after trying to see a commit as
    if it were a tree, which has been corrected.
-   (merge 7663e438c5 jk/am-i-resolved-fix later to maint).
 
  * "git bundle verify" needs to see if prerequisite objects exist in
    the receiving repository, but the command did not check if we are
    in a repository upfront, which has been corrected.
-   (merge 3bbbe467f2 js/bundle-verify-require-object-store later to maint).
 
  * "git merge --squash" is designed to update the working tree and the
    index without creating the commit, and this cannot be countermanded
    by adding the "--commit" option; the command now refuses to work
    when both options are given.
-   (merge 1d14d0c994 vv/merge-squash-with-explicit-commit later to maint).
 
  * The data collected by fsmonitor was not properly written back to
    the on-disk index file, breaking t7519 tests occasionally, which
    has been corrected.
-   (merge b5a8169752 js/fsmonitor-unflake later to maint).
 
  * Update to Unicode 12.1 width table.
-   (merge 5817f9caa3 bb/unicode-12.1-reiwa later to maint).
 
  * The command line to invoke a "git cat-file" command from inside
    "git p4" was not properly quoted to protect a caret and running a
    broken command on Windows, which has been corrected.
-   (merge c3f2358de3 mm/p4-unshelve-windows-fix later to maint).
 
  * "git request-pull" learned to warn when the ref we ask them to pull
    from in the local repository and in the published repository are
    different.
-   (merge 0454220d66 pb/request-pull-verify-remote-ref later to maint).
 
  * When creating a partial clone, the object filtering criteria is
    recorded for the origin of the clone, but this incorrectly used a
    hardcoded name "origin" to name that remote; it has been corrected
    to honor the "--origin <name>" option.
-   (merge 1c4a9f9114 xl/record-partial-clone-origin later to maint).
 
  * "git fetch" into a lazy clone forgot to fetch base objects that are
    necessary to complete delta in a thin packfile, which has been
    corrected.
-   (merge 810e19322d jt/partial-clone-missing-ref-delta-base later to maint).
 
  * The filter_data used in the list-objects-filter (which manages a
    lazily sparse clone repository) did not use the dynamic array API
    correctly---'nr' is supposed to point at one past the last element
    of the array in use.  This has been corrected.
-   (merge 7140600e2e md/list-objects-filter-memfix later to maint).
 
  * The description about slashes in gitignore patterns (used to
    indicate things like "anchored to this level only" and "only
    matches directories") has been revamped.
-   (merge 1a58bad014 an/ignore-doc-update later to maint).
 
  * The URL decoding code has been updated to avoid going past the end
    of the string while parsing %-<hex>-<hex> sequence.
-   (merge d37dc239a4 md/url-parse-harden later to maint).
 
  * The list of for-each like macros used by clang-format has been
    updated.
-   (merge fc7e03aace mo/clang-format-for-each-update later to maint).
 
  * "git branch --list" learned to show branches that are checked out
    in other worktrees connected to the same repository prefixed with
@@ -280,48 +257,38 @@ Fixes since v2.22
 
  * Code restructuring during 2.20 period broke fetching tags via
    "import" based transports.
-   (merge f80d922355 fc/fetch-with-import-fix later to maint).
 
  * The commit-graph file is now part of the "files that the runtime
    may keep open file descriptors on, all of which would need to be
    closed when done with the object store", and the file descriptor to
    an existing commit-graph file now is closed before "gc" finalizes a
    new instance to replace it.
-   (merge 2d511cfc0b ds/close-object-store later to maint).
 
  * "git checkout -p" needs to selectively apply a patch in reverse,
    which did not work well.
-   (merge 2bd69b9024 pw/add-p-recount later to maint).
 
  * Code clean-up to avoid signed integer wraparounds during binary search.
-   (merge 568a05c5ec rs/avoid-overflow-in-midpoint-computation later to maint).
 
  * "git interpret-trailers" always treated '#' as the comment
    character, regardless of core.commentChar setting, which has been
    corrected.
-   (merge 29c83fc23f jk/trailers-use-config later to maint).
 
  * "git stash show 23" used to work, but no more after getting
    rewritten in C; this regression has been corrected.
-   (merge 63b50c8ffe tg/stash-ref-by-index-fix later to maint).
 
  * "git rebase --abort" used to leave refs/rewritten/ when concluding
    "git rebase -r", which has been corrected.
-   (merge d559f502c5 pw/rebase-abort-clean-rewritten later to maint).
 
  * An incorrect list of options was cached after command line
    completion failed (e.g. trying to complete a command that requires
    a repository outside one), which has been corrected.
-   (merge 69702523af nd/completion-no-cache-failure later to maint).
 
  * The code to parse scaled numbers out of configuration files has
    been made more robust and also easier to follow.
-   (merge 39c575c969 rs/config-unit-parsing later to maint).
 
  * The codepath to compute delta islands used to spew progress output
    without giving the callers any way to squelch it, which has been
    fixed.
-   (merge bdbdf42f8a jk/delta-islands-progress-fix later to maint).
 
  * Protocol capabilities that go over wire should never be translated,
    but it was incorrectly marked for translation, which has been
@@ -330,23 +297,19 @@ Fixes since v2.22
 
  * Use "Erase in Line" CSI sequence that is already used in the editor
    support to clear cruft in the progress output.
-   (merge 5b12e3123b sg/rebase-progress later to maint).
 
  * "git submodule foreach" did not protect command line options passed
    to the command to be run in each submodule correctly, when the
    "--recursive" option was in use.
-   (merge 30db18b148 ms/submodule-foreach-fix later to maint).
 
  * The configuration variable rebase.rescheduleFailedExec should be
    effective only while running an interactive rebase and should not
-   affect anything when running an non-interactive one, which was not
+   affect anything when running a non-interactive one, which was not
    the case.  This has been corrected.
-   (merge 906b63942a js/rebase-reschedule-applies-only-to-interactive later to maint).
 
  * The "git clone" documentation refers to command line options in its
    description in the short form; they have been replaced with long
    forms to make them more recognisable.
-   (merge bfc8c84ed5 qn/clone-doc-use-long-form later to maint).
 
  * Generation of pack bitmaps are now disabled when .keep files exist,
    as these are mutually exclusive features.
@@ -355,56 +318,31 @@ Fixes since v2.22
  * "git rm" to resolve a conflicted path leaked an internal message
    "needs merge" before actually removing the path, which was
    confusing.  This has been corrected.
-   (merge b2b1f615ce jc/denoise-rm-to-resolve later to maint).
 
  * "git stash --keep-index" did not work correctly on paths that have
    been removed, which has been fixed.
    (merge b932f6a5e8 tg/stash-keep-index-with-removed-paths later to maint).
 
  * Window 7 update ;-)
-   (merge eb7c786314 js/mingw-spawn-with-spaces-in-path later to maint).
 
  * A codepath that reads from GPG for signed object verification read
    past the end of allocated buffer, which has been fixed.
-   (merge 64c45dc72e sr/gpg-interface-stop-at-the-end later to maint).
 
  * "git clean" silently skipped a path when it cannot lstat() it; now
    it gives a warning.
-   (merge b09364c47a js/clean-report-too-long-a-path later to maint).
 
  * "git push --atomic" that goes over the transport-helper (namely,
    the smart http transport) failed to prevent refs to be pushed when
    it can locally tell that one of the ref update will fail without
    having to consult the other end, which has been corrected.
-   (merge 2581ea3d31 es/local-atomic-push-failure-with-http later to maint).
 
  * The internal diff machinery can be made to read out of bounds while
-   looking for --funcion-context line in a corner case, which has been
+   looking for --function-context line in a corner case, which has been
    corrected.
    (merge b777f3fd61 jk/xdiff-clamp-funcname-context-index later to maint).
 
  * Other code cleanup, docfix, build fix, etc.
-   (merge f547101b26 es/git-debugger-doc later to maint).
-   (merge 7877ac3d7b js/bisect-helper-check-get-oid-return-value later to maint).
-   (merge 0108f47eb3 sw/git-p4-unshelve-branched-files later to maint).
-   (merge 9df8f734fd cm/send-email-document-req-modules later to maint).
-   (merge afc3bf6eb1 ab/hash-object-doc later to maint).
-   (merge 1fde99cfc7 po/doc-branch later to maint).
-   (merge 459842e1c2 dl/config-alias-doc later to maint).
-   (merge 5d137fc2c7 cb/fsmonitor-intfix later to maint).
-   (merge 921d49be86 rs/copy-array later to maint).
-   (merge cc8d872e69 js/t3404-typofix later to maint).
-   (merge 729a9b558b cb/mkstemps-uint-type-fix later to maint).
-   (merge 9dae4fe79f js/gcc-8-and-9 later to maint).
-   (merge ed33bd8f30 js/t0001-case-insensitive later to maint).
-   (merge dfa880e336 jw/gitweb-sample-update later to maint).
-   (merge e532a90a9f sg/t5551-fetch-smart-error-is-translated later to maint).
-   (merge 8d45ad8c29 jt/t5551-test-chunked later to maint).
-   (merge 1a64e07d23 sg/git-C-empty-doc later to maint).
-   (merge 37a2e35395 sg/ci-brew-gcc-workaround later to maint).
-   (merge 24df0d49c4 js/trace2-signo-typofix later to maint).
    (merge fbec05c210 cc/test-oidmap later to maint).
-   (merge 7926cee904 di/readme-markup-fix later to maint).
-   (merge 02638d1e11 vn/xmmap-gently later to maint).
-   (merge f7bf24d4dd rm/gpg-program-doc-fix later to maint).
-   (merge 3aef54e8b8 js/unmap-before-ext-diff later to maint).
+   (merge 7a06fb038c jk/no-system-includes-in-dot-c later to maint).
+   (merge 81ed2b405c cb/xdiff-no-system-includes-in-dot-c later to maint).
+   (merge d61e6ce1dd sg/fsck-config-in-doc later to maint).
index 7798e10cb0ac5e4360ad50eae0a8a5a852a8f271..e9e1e397f3fd154511931f8c88e66c728b3cc07a 100644 (file)
@@ -41,4 +41,4 @@ log.showSignature::
 log.mailmap::
        If true, makes linkgit:git-log[1], linkgit:git-show[1], and
        linkgit:git-whatchanged[1] assume `--use-mailmap`, otherwise
-       assume `--no-use-mailmap`. False by default.
+       assume `--no-use-mailmap`. True by default.
index 4a5dfe2fc1670346485838522ad42a6cc22fabc8..f5b6245270e0e8ddd029eb1f520b3e27210792f4 100644 (file)
@@ -17,7 +17,7 @@ linkgit:git-receive-pack[1]. On the fetch side, malformed objects will
 instead be left unreferenced in the repository.
 +
 Due to the non-quarantine nature of the `fetch.fsckObjects`
-implementation it can not be relied upon to leave the object store
+implementation it cannot be relied upon to leave the object store
 clean like `receive.fsckObjects` can.
 +
 As objects are unpacked they're written to the object store, so there
index f98b7c6ed7c0fe4df8a0e3211eaa53ea7c95d5d9..79e22b1f3a131ea5301a1c11fb558ec16e6c16e6 100644 (file)
@@ -232,7 +232,7 @@ write so it might not be enough to grant the users using
 'git-cvsserver' write access to the database file without granting
 them write access to the directory, too.
 
-The database can not be reliably regenerated in a
+The database cannot be reliably regenerated in a
 consistent form after the branch it is tracking has changed.
 Example: For merged branches, 'git-cvsserver' only tracks
 one branch of development, and after a 'git merge' an
index 266d63cf111c8a73420c5fa945543384e9825b55..5b1909fdf4ffcf00d52997eb1a1c2b42385689a7 100644 (file)
@@ -262,7 +262,7 @@ This updates (or creates, as necessary) branches `pu` and `tmp` in
 the local repository by fetching from the branches (respectively)
 `pu` and `maint` from the remote repository.
 +
-The `pu` branch will be updated even if it is does not fast-forward,
+The `pu` branch will be updated even if it does not fast-forward,
 because it is prefixed with a plus sign; `tmp` will not be.
 
 * Peek at a remote's branch, without configuring the remote in your local
@@ -285,7 +285,7 @@ BUGS
 ----
 Using --recurse-submodules can only fetch new commits in already checked
 out submodules right now. When e.g. upstream added a new submodule in the
-just fetched commits of the superproject the submodule itself can not be
+just fetched commits of the superproject the submodule itself cannot be
 fetched, making it impossible to check out that submodule later without
 having to do a fetch again. This is expected to be fixed in a future Git
 version.
index e0eae642c10f75cff57c0a9d07420e3218235423..d72d15be5babb2a108cf37e8ae396ae587baf1cf 100644 (file)
@@ -104,6 +104,11 @@ care about this output and want to speed it up further.
        progress status even if the standard error stream is not
        directed to a terminal.
 
+CONFIGURATION
+-------------
+
+include::config/fsck.txt[]
+
 DISCUSSION
 ----------
 
index a5e9501a0aa6503eaab62190253afa750dd76eef..dfb901f8b8358ea309e6403079e3c87fb82fee6f 100644 (file)
@@ -249,7 +249,7 @@ BUGS
 ----
 Using --recurse-submodules can only fetch new commits in already checked
 out submodules right now. When e.g. upstream added a new submodule in the
-just fetched commits of the superproject the submodule itself can not be
+just fetched commits of the superproject the submodule itself cannot be
 fetched, making it impossible to check out that submodule later without
 having to do a fetch again. This is expected to be fixed in a future Git
 version.
index d90093f195bc6a9b2b3d2d20be89c59e4d708739..1ab2e40ea938195aa8f1bd45f5bf3ae711b7055a 100644 (file)
@@ -39,7 +39,7 @@ OPTIONS
        commit, branch or tag associated with it.
 +
 If not specified, the default restore source for the working tree is
-the index, and the default restore source for the index index is
+the index, and the default restore source for the index is
 `HEAD`. When both `--staged` and `--worktree` are specified,
 `--source` must also be specified.
 
index 8d38ae6010866a157dfdb7d52b58605d1cd2f3b6..090c888335d3292331d012a5e9074f970035d83e 100644 (file)
@@ -255,7 +255,7 @@ This commit is referred to as a "merge commit", or sometimes just a
 [[def_object]]object::
        The unit of storage in Git. It is uniquely identified by the
        <<def_SHA1,SHA-1>> of its contents. Consequently, an
-       object can not be changed.
+       object cannot be changed.
 
 [[def_object_database]]object database::
        Stores a set of "objects", and an individual <<def_object,object>> is
index 46c3d5c3550a1ba7c83b6937fe68538c3c12074e..ad9d019ff9b4602a72f9542dd15b17a324f95758 100644 (file)
@@ -54,7 +54,7 @@ this:
 do not do this you will get an error for each ref that it does not point
 to a valid object.
 
-Note: As a side-effect of this you can not safely assume that all
+Note: As a side-effect of this you cannot safely assume that all
 objects you lookup are available in superproject. All submodule objects
 will be available the same way as the superprojects objects.
 
index a0766f64edab484347dfe6b2627a3d35493c0928..551e607e731fc525db2618a2cf00b82ee0335028 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.23.0-rc0
+DEF_VER=v2.23.0-rc2
 
 LF='
 '
index bd246f2989575a72758fd3765659f61a8aa58c8c..f9255344ae5009a192ab83a332be749632d94531 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2720,7 +2720,7 @@ bin-wrappers/%: wrap-for-bin.sh
        @mkdir -p bin-wrappers
        $(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
             -e 's|@@BUILD_DIR@@|$(shell pwd)|' \
-            -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
+            -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%$(X),$(@F))$(patsubst git%,$(X),$(filter $(@F),$(BINDIR_PROGRAMS_NEED_X)))|' < $< > $@ && \
        chmod +x $@
 
 # GNU make supports exporting all variables by "export" without parameters.
index 91f8509f85396cb957ee87d1b0e8ba1284c8c800..6123f732a2c84f975c576e7077a0c6da369e6b31 100644 (file)
@@ -1769,7 +1769,7 @@ int cmd_restore(int argc, const char **argv, const char *prefix)
        struct option *options;
        struct option restore_options[] = {
                OPT_STRING('s', "source", &opts.from_treeish, "<tree-ish>",
-                          N_("where the checkout from")),
+                          N_("which tree-ish to checkout from")),
                OPT_BOOL('S', "staged", &opts.checkout_index,
                           N_("restore the index")),
                OPT_BOOL('W', "worktree", &opts.checkout_worktree,
index 53ce99d2bbc4efd0a37ad45feaad546ae2db7e13..717dd14e896117c56101f7f56df0261576c323d0 100644 (file)
@@ -850,6 +850,15 @@ static int iterate_ref_map(void *cb_data, struct object_id *oid)
        return 0;
 }
 
+static const char warn_show_forced_updates[] =
+N_("Fetch normally indicates which branches had a forced update,\n"
+   "but that check has been disabled. To re-enable, use '--show-forced-updates'\n"
+   "flag or run 'git config fetch.showForcedUpdates true'.");
+static const char warn_time_show_forced_updates[] =
+N_("It took %.2f seconds to check forced updates. You can use\n"
+   "'--no-show-forced-updates' or run 'git config fetch.showForcedUpdates false'\n"
+   " to avoid this check.\n");
+
 static int store_updated_refs(const char *raw_url, const char *remote_name,
                              int connectivity_checked, struct ref *ref_map)
 {
@@ -1005,12 +1014,10 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 
        if (advice_fetch_show_forced_updates) {
                if (!fetch_show_forced_updates) {
-                       warning(_("Fetch normally indicates which branches had a forced update, but that check has been disabled."));
-                       warning(_("To re-enable, use '--show-forced-updates' flag or run 'git config fetch.showForcedUpdates true'."));
+                       warning(_(warn_show_forced_updates));
                } else if (forced_updates_ms > FORCED_UPDATES_DELAY_WARNING_IN_MS) {
-                       warning(_("It took %.2f seconds to check forced updates. You can use '--no-show-forced-updates'\n"),
+                       warning(_(warn_time_show_forced_updates),
                                forced_updates_ms / 1000.0);
-                       warning(_("or run 'git config fetch.showForcedUpdates false' to avoid this check.\n"));
                }
        }
 
index 1cf9e37736a65d85c2b095469253ed0c400be44d..44b10b3415414c0723ace29d9defb62c1354e9d6 100644 (file)
@@ -47,7 +47,7 @@ static int default_follow;
 static int default_show_signature;
 static int decoration_style;
 static int decoration_given;
-static int use_mailmap_config = -1;
+static int use_mailmap_config = 1;
 static const char *fmt_patch_subject_prefix = "PATCH";
 static const char *fmt_pretty;
 
@@ -156,21 +156,11 @@ static void cmd_log_init_defaults(struct rev_info *rev)
                parse_date_format(default_date_mode, &rev->date_mode);
 }
 
-static char warn_unspecified_mailmap_msg[] =
-N_("log.mailmap is not set; its implicit value will change in an\n"
-   "upcoming release. To squelch this message and preserve current\n"
-   "behaviour, set the log.mailmap configuration value to false.\n"
-   "\n"
-   "To squelch this message and adopt the new behaviour now, set the\n"
-   "log.mailmap configuration value to true.\n"
-   "\n"
-   "See 'git help config' and search for 'log.mailmap' for further information.");
-
 static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
                         struct rev_info *rev, struct setup_revision_opt *opt)
 {
        struct userformat_want w;
-       int quiet = 0, source = 0, mailmap = 0;
+       int quiet = 0, source = 0, mailmap;
        static struct line_opt_callback_data line_cb = {NULL, NULL, STRING_LIST_INIT_DUP};
        static struct string_list decorate_refs_exclude = STRING_LIST_INIT_NODUP;
        static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
@@ -214,13 +204,6 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
        memset(&w, 0, sizeof(w));
        userformat_find_requirements(NULL, &w);
 
-       if (mailmap < 0) {
-               if (session_is_interactive() && !rev->pretty_given)
-                       warning("%s\n", _(warn_unspecified_mailmap_msg));
-
-               mailmap = 0;
-       }
-
        if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
                rev->show_notes = 1;
        if (rev->show_notes)
index 267c562b1f81dad2c42e2392a76ff0a269d38f65..76ce9069467e06545652a70040b79316f0a87fb9 100644 (file)
@@ -96,7 +96,11 @@ static off_t reuse_packfile_offset;
 
 static int use_bitmap_index_default = 1;
 static int use_bitmap_index = -1;
-static int write_bitmap_index;
+static enum {
+       WRITE_BITMAP_FALSE = 0,
+       WRITE_BITMAP_QUIET,
+       WRITE_BITMAP_TRUE,
+} write_bitmap_index;
 static uint16_t write_bitmap_options = BITMAP_OPT_HASH_CACHE;
 
 static int exclude_promisor_objects;
@@ -892,7 +896,8 @@ static void write_pack_file(void)
                                                 nr_written, oid.hash, offset);
                        close(fd);
                        if (write_bitmap_index) {
-                               warning(_(no_split_warning));
+                               if (write_bitmap_index != WRITE_BITMAP_QUIET)
+                                       warning(_(no_split_warning));
                                write_bitmap_index = 0;
                        }
                }
@@ -1176,7 +1181,8 @@ static int add_object_entry(const struct object_id *oid, enum object_type type,
        if (!want_object_in_pack(oid, exclude, &found_pack, &found_offset)) {
                /* The pack is missing an object, so it will not have closure */
                if (write_bitmap_index) {
-                       warning(_(no_closure_warning));
+                       if (write_bitmap_index != WRITE_BITMAP_QUIET)
+                               warning(_(no_closure_warning));
                        write_bitmap_index = 0;
                }
                return 0;
@@ -3313,8 +3319,13 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
                            N_("do not hide commits by grafts"), 0),
                OPT_BOOL(0, "use-bitmap-index", &use_bitmap_index,
                         N_("use a bitmap index if available to speed up counting objects")),
-               OPT_BOOL(0, "write-bitmap-index", &write_bitmap_index,
-                        N_("write a bitmap index together with the pack index")),
+               OPT_SET_INT(0, "write-bitmap-index", &write_bitmap_index,
+                           N_("write a bitmap index together with the pack index"),
+                           WRITE_BITMAP_TRUE),
+               OPT_SET_INT_F(0, "write-bitmap-index-quiet",
+                             &write_bitmap_index,
+                             N_("write a bitmap index if possible"),
+                             WRITE_BITMAP_QUIET, PARSE_OPT_HIDDEN),
                OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
                { OPTION_CALLBACK, 0, "missing", NULL, N_("action"),
                  N_("handling for missing objects"), PARSE_OPT_NONEG,
index 30982ed2a2aa750b68f1613e8f14b049708b70c4..632c0c0a79422a229d52c83665331501e8c54e29 100644 (file)
@@ -89,17 +89,6 @@ static void remove_pack_on_signal(int signo)
        raise(signo);
 }
 
-static int has_pack_keep_file(void)
-{
-       struct packed_git *p;
-
-       for (p = get_all_packs(the_repository); p; p = p->next) {
-               if (p->pack_keep)
-                       return 1;
-       }
-       return 0;
-}
-
 /*
  * Adds all packs hex strings to the fname list, which do not
  * have a corresponding .keep file. These packs are not to
@@ -345,13 +334,12 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                die(_("--keep-unreachable and -A are incompatible"));
 
        if (write_bitmaps < 0) {
-               write_bitmaps = (pack_everything & ALL_INTO_ONE) &&
-                                is_bare_repository() &&
-                                keep_pack_list.nr == 0 &&
-                                !has_pack_keep_file();
+               if (!(pack_everything & ALL_INTO_ONE) ||
+                   !is_bare_repository())
+                       write_bitmaps = 0;
        }
        if (pack_kept_objects < 0)
-               pack_kept_objects = write_bitmaps;
+               pack_kept_objects = write_bitmaps > 0;
 
        if (write_bitmaps && !(pack_everything & ALL_INTO_ONE))
                die(_(incremental_bitmap_conflict_error));
@@ -375,8 +363,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        argv_array_push(&cmd.args, "--indexed-objects");
        if (repository_format_partial_clone)
                argv_array_push(&cmd.args, "--exclude-promisor-objects");
-       if (write_bitmaps)
+       if (write_bitmaps > 0)
                argv_array_push(&cmd.args, "--write-bitmap-index");
+       else if (write_bitmaps < 0)
+               argv_array_push(&cmd.args, "--write-bitmap-index-quiet");
        if (use_delta_islands)
                argv_array_push(&cmd.args, "--delta-islands");
 
index 4b9e823f8f9656b686f22ac4bb531f7d63f325ee..40c69a0bedde5be02af557fd0c92efc1d2c857e5 100644 (file)
@@ -12,7 +12,6 @@
 #include "repository.h"
 #include "commit.h"
 #include "run-command.h"
-#include <signal.h>
 #include "parse-options.h"
 #include "gpg-interface.h"
 
index 6fa04b751ac1d6ae18b8a42e700e2cefa6427a41..f45136a06ba76077891d9e5fae545ee8c297ddff 100644 (file)
@@ -10,7 +10,6 @@
 #include "builtin.h"
 #include "tag.h"
 #include "run-command.h"
-#include <signal.h>
 #include "parse-options.h"
 #include "gpg-interface.h"
 #include "ref-filter.h"
index b3c4de79b6da4502726dbec5e21b11734d76e28e..fe954ab5f845e65bc5cad987308aeb6598f2fd24 100644 (file)
@@ -434,6 +434,7 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r, const
 
        free(oids);
        fclose(fp);
+       strbuf_release(&line);
 
        return graph_chain;
 }
@@ -1186,7 +1187,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
        }
 
        stop_progress(&ctx->progress);
-       strbuf_reset(&progress_title);
+       strbuf_release(&progress_title);
        strbuf_release(&packname);
 
        return 0;
@@ -1636,7 +1637,7 @@ static void sort_and_scan_merged_commits(struct write_commit_graph_context *ctx)
                                num_parents++;
 
                        if (num_parents > 2)
-                               ctx->num_extra_edges += num_parents - 2;
+                               ctx->num_extra_edges += num_parents - 1;
                }
        }
 
@@ -1713,10 +1714,8 @@ static void expire_commit_graphs(struct write_commit_graph_context *ctx)
        strbuf_addstr(&path, "/info/commit-graphs");
        dir = opendir(path.buf);
 
-       if (!dir) {
-               strbuf_release(&path);
-               return;
-       }
+       if (!dir)
+               goto out;
 
        strbuf_addch(&path, '/');
        dirnamelen = path.len;
@@ -1745,6 +1744,9 @@ static void expire_commit_graphs(struct write_commit_graph_context *ctx)
                if (!found)
                        unlink(path.buf);
        }
+
+out:
+       strbuf_release(&path);
 }
 
 int write_commit_graph(const char *obj_dir,
index b633e7db983d5095d8a1b9ecfb7a66dbdb4d9c3b..1b6dabf5a2310ffe25ebd1646f9a9fd3602ed839 100644 (file)
@@ -37,6 +37,29 @@ The Steps to Build Git with VS2015 or VS2017 from the command line.
 
 ================================================================
 
+Alternatively, run `make vcxproj` and then load the generated `git.sln` in
+Visual Studio. The initial build will install the vcpkg system and build the
+dependencies automatically. This will take a while.
+
+Instead of generating the `git.sln` file yourself (which requires a full Git
+for Windows SDK), you may want to consider fetching the `vs/master` branch of
+https://github.com/git-for-windows/git instead (which is updated automatically
+via CI running `make vcxproj`). The `vs/master` branch does not require a Git
+for Windows to build, but you can run the test scripts in a regular Git Bash.
+
+Note that `make vcxproj` will automatically add and commit the generated `.sln`
+and `.vcxproj` files to the repo. This is necessary to allow building a
+fully-testable Git in Visual Studio, where a regular Git Bash can be used to
+run the test scripts (as opposed to a full Git for Windows SDK): a number of
+build targets, such as Git commands implemented as Unix shell scripts (where
+`@@SHELL_PATH@@` and other placeholders are interpolated) require a full-blown
+Git for Windows SDK (which is about 10x the size of a regular Git for Windows
+installation).
+
+If your plan is to open a Pull Request with Git for Windows, it is a good idea
+to drop this commit before submitting.
+
+================================================================
 The Steps of Build Git with VS2008
 
 1. You need the build environment, which contains the Git dependencies
index ed7f58e0fcf221733165f3dd6a9d095d727a0a5e..3900e4947be92b916ed9b531eb455e8f856105dc 100644 (file)
--- a/config.c
+++ b/config.c
@@ -275,7 +275,8 @@ static int include_by_branch(const char *cond, size_t cond_len)
        int flags;
        int ret;
        struct strbuf pattern = STRBUF_INIT;
-       const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, &flags);
+       const char *refname = !the_repository || !the_repository->gitdir ?
+               NULL : resolve_ref_unsafe("HEAD", 0, NULL, &flags);
        const char *shortname;
 
        if (!refname || !(flags & REF_ISSYMREF) ||
index 48a6723222dfb7c4cedb49d4523faa6c3003a803..db7f06b95fda4ea8de9f409e11f594c163220463 100644 (file)
@@ -25,10 +25,12 @@ include compat/vcbuild/MSVC-DEFS-GEN
        # See if vcpkg and the vcpkg-build versions of the third-party
        # libraries that we use are installed.  We include the result
        # to get $(vcpkg_*) variables defined for the Makefile.
+ifeq (,$(SKIP_VCPKG))
 compat/vcbuild/VCPKG-DEFS: compat/vcbuild/vcpkg_install.bat
        @"$<"
 include compat/vcbuild/VCPKG-DEFS
 endif
+endif
 
 # We choose to avoid "if .. else if .. else .. endif endif"
 # because maintaining the nesting to match is a pain.  If
@@ -689,3 +691,77 @@ ifeq ($(uname_S),QNX)
        NO_STRCASESTR = YesPlease
        NO_STRLCPY = YesPlease
 endif
+
+vcxproj:
+       # Require clean work tree
+       git update-index -q --refresh && \
+       git diff-files --quiet && \
+       git diff-index --cached --quiet HEAD --
+
+       # Make .vcxproj files and add them
+       unset QUIET_GEN QUIET_BUILT_IN; \
+       perl contrib/buildsystems/generate -g Vcxproj
+       git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj
+
+       # Generate the LinkOrCopyBuiltins.targets file
+       (echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
+        echo '  <Target Name="CopyBuiltins_AfterBuild" AfterTargets="AfterBuild">' && \
+        for name in $(BUILT_INS);\
+        do \
+          echo '    <Copy SourceFiles="$$(OutDir)\git.exe" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
+        done && \
+        for name in $(REMOTE_CURL_ALIASES); \
+        do \
+          echo '    <Copy SourceFiles="$$(OutDir)\'"$(REMOTE_CURL_PRIMARY)"'" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
+        done && \
+        echo '  </Target>' && \
+        echo '</Project>') >git/LinkOrCopyBuiltins.targets
+       git add -f git/LinkOrCopyBuiltins.targets
+
+       # Add command-list.h
+       $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 command-list.h
+       git add -f command-list.h
+
+       # Add scripts
+       rm -f perl/perl.mak
+       $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 \
+               $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN)
+       # Strip out the sane tool path, needed only for building
+       sed -i '/^git_broken_path_fix ".*/d' git-sh-setup
+       git add -f $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN)
+
+       # Add Perl module
+       $(MAKE) $(LIB_PERL_GEN)
+       git add -f perl/build
+
+       # Add bin-wrappers, for testing
+       rm -rf bin-wrappers/
+       $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(test_bindir_programs)
+       # Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute
+       # path of the repository is not hard-coded (GIT_EXEC_PATH will be set
+       # by test-lib.sh according to the current setup)
+       sed -i -e 's/^\(GIT_EXEC_PATH\)=.*/test -n "$${\1##*:*}" ||\
+                       \1="$$(cygpath -u "$$\1")"/' \
+               -e "s|'$$(pwd)|\"\$$GIT_EXEC_PATH\"'|g" bin-wrappers/*
+       # Ensure that test-* helpers find the .dll files copied to top-level
+       sed -i 's|^PATH=.*|&:"$$GIT_EXEC_PATH"|' bin-wrappers/test-*
+       # We do not want to force hard-linking builtins
+       sed -i 's|\(git\)-\([-a-z]*\)\.exe"|\1.exe" \2|g' \
+               bin-wrappers/git-{receive-pack,upload-archive}
+       git add -f $(test_bindir_programs)
+       # remote-ext is a builtin, but invoked as if it were external
+       sed 's|receive-pack|remote-ext|g' \
+               <bin-wrappers/git-receive-pack >bin-wrappers/git-remote-ext
+       git add -f bin-wrappers/git-remote-ext
+
+       # Add templates
+       $(MAKE) -C templates
+       git add -f templates/boilerplates.made templates/blt/
+
+       # Add build options
+       $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 GIT-BUILD-OPTIONS
+       git add -f GIT-BUILD-OPTIONS
+
+       # Commit the whole shebang
+       git commit -m "Generate Visual Studio solution" \
+               -m "Auto-generated by \`$(MAKE)$(MAKEFLAGS) $@\`"
index 408ef714b8f0dcd0328dcef0055cc92f7737babb..aa4cbaa2adacb12616a3150b5735ad4634c93124 100644 (file)
@@ -17,7 +17,7 @@ BEGIN
     $me = dirname($me);
     if (opendir(D,"$me/Generators")) {
         foreach my $gen (readdir(D)) {
-            next if ($gen  =~ /^\.\.?$/);
+            next unless ($gen  =~ /\.pm$/);
             require "${me}/Generators/$gen";
             $gen =~ s,\.pm,,;
             push(@AVAILABLE, $gen);
index cfa74adcc23881f229c84c29a78d7bfd4aa2f2a4..737647e76afd423817143e197c86c97dfa46ad8d 100644 (file)
@@ -3,6 +3,7 @@ package Generators::Vcproj;
 
 use strict;
 use vars qw($VERSION);
+use Digest::SHA qw(sha256_hex);
 
 our $VERSION = '1.00';
 our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
@@ -12,59 +13,12 @@ BEGIN
     push @EXPORT_OK, qw(generate);
 }
 
-my $guid_index = 0;
-my @GUIDS = (
-    "{E07B9989-2BF7-4F21-8918-BE22BA467AC3}",
-    "{278FFB51-0296-4A44-A81A-22B87B7C3592}",
-    "{7346A2C4-F0FD-444F-9EBE-1AF23B2B5650}",
-    "{67F421AC-EB34-4D49-820B-3196807B423F}",
-    "{385DCFE1-CC8C-4211-A451-80FCFC31CA51}",
-    "{97CC46C5-D2CC-4D26-B634-E75792B79916}",
-    "{C7CE21FE-6EF8-4012-A5C7-A22BCEDFBA11}",
-    "{51575134-3FDF-42D1-BABD-3FB12669C6C9}",
-    "{0AE195E4-9823-4B87-8E6F-20C5614AF2FF}",
-    "{4B918255-67CA-43BB-A46C-26704B666E6B}",
-    "{18CCFEEF-C8EE-4CC1-A265-26F95C9F4649}",
-    "{5D5D90FA-01B7-4973-AFE5-CA88C53AC197}",
-    "{1F054320-036D-49E1-B384-FB5DF0BC8AC0}",
-    "{7CED65EE-F2D9-4171-825B-C7D561FE5786}",
-    "{8D341679-0F07-4664-9A56-3BA0DE88B9BC}",
-    "{C189FEDC-2957-4BD7-9FA4-7622241EA145}",
-    "{66844203-1B9F-4C53-9274-164FFF95B847}",
-    "{E4FEA145-DECC-440D-AEEA-598CF381FD43}",
-    "{73300A8E-C8AC-41B0-B555-4F596B681BA7}",
-    "{873FDEB1-D01D-40BF-A1BF-8BBC58EC0F51}",
-    "{7922C8BE-76C5-4AC6-8BF7-885C0F93B782}",
-    "{E245D370-308B-4A49-BFC1-1E527827975F}",
-    "{F6FA957B-66FC-4ED7-B260-E59BBE4FE813}",
-    "{E6055070-0198-431A-BC49-8DB6CEE770AE}",
-    "{54159234-C3EB-43DA-906B-CE5DA5C74654}",
-    "{594CFC35-0B60-46F6-B8EF-9983ACC1187D}",
-    "{D93FCAB7-1F01-48D2-B832-F761B83231A5}",
-    "{DBA5E6AC-E7BE-42D3-8703-4E787141526E}",
-    "{6171953F-DD26-44C7-A3BE-CC45F86FC11F}",
-    "{9E19DDBE-F5E4-4A26-A2FE-0616E04879B8}",
-    "{AE81A615-99E3-4885-9CE0-D9CAA193E867}",
-    "{FBF4067E-1855-4F6C-8BCD-4D62E801A04D}",
-    "{17007948-6593-4AEB-8106-F7884B4F2C19}",
-    "{199D4C8D-8639-4DA6-82EF-08668C35DEE0}",
-    "{E085E50E-C140-4CF3-BE4B-094B14F0DDD6}",
-    "{00785268-A9CC-4E40-AC29-BAC0019159CE}",
-    "{4C06F56A-DCDB-46A6-B67C-02339935CF12}",
-    "{3A62D3FD-519E-4EC9-8171-D2C1BFEA022F}",
-    "{3A62D3FD-519E-4EC9-8171-D2C1BFEA022F}",
-    "{9392EB58-D7BA-410B-B1F0-B2FAA6BC89A7}",
-    "{2ACAB2D5-E0CE-4027-BCA0-D78B2D7A6C66}",
-    "{86E216C3-43CE-481A-BCB2-BE5E62850635}",
-    "{FB631291-7923-4B91-9A57-7B18FDBB7A42}",
-    "{0A176EC9-E934-45B8-B87F-16C7F4C80039}",
-    "{DF55CA80-46E8-4C53-B65B-4990A23DD444}",
-    "{3A0F9895-55D2-4710-BE5E-AD7498B5BF44}",
-    "{294BDC5A-F448-48B6-8110-DD0A81820F8C}",
-    "{4B9F66E9-FAC9-47AB-B1EF-C16756FBFD06}",
-    "{72EA49C6-2806-48BD-B81B-D4905102E19C}",
-    "{5728EB7E-8929-486C-8CD5-3238D060E768}"
-);
+sub generate_guid ($) {
+    my $hex = sha256_hex($_[0]);
+    $hex =~ s/^(.{8})(.{4})(.{4})(.{4})(.{12}).*/{$1-$2-$3-$4-$5}/;
+    $hex =~ tr/a-z/A-Z/;
+    return $hex;
+}
 
 sub generate {
     my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
@@ -92,9 +46,8 @@ sub createLibProject {
     $target =~ s/\//_/g;
     $target =~ s/\.a//;
 
-    my $uuid = $GUIDS[$guid_index];
+    my $uuid = generate_guid($libname);
     $$build_structure{"LIBS_${target}_GUID"} = $uuid;
-    $guid_index += 1;
 
     my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"LIBS_${libname}_SOURCES"}}));
     my @sources;
@@ -106,6 +59,8 @@ sub createLibProject {
     my $includes= join(";", sort(map("&quot;$rel_dir\\$_&quot;", @{$$build_structure{"LIBS_${libname}_INCLUDES"}})));
     my $cflags  = join(" ", sort(@{$$build_structure{"LIBS_${libname}_CFLAGS"}}));
     $cflags =~ s/\"/&quot;/g;
+    $cflags =~ s/</&lt;/g;
+    $cflags =~ s/>/&gt;/g;
 
     my $cflags_debug = $cflags;
     $cflags_debug =~ s/-MT/-MTd/;
@@ -127,6 +82,8 @@ sub createLibProject {
 
     $defines =~ s/-D//g;
     $defines =~ s/\"/\\&quot;/g;
+    $defines =~ s/</&lt;/g;
+    $defines =~ s/>/&gt;/g;
     $defines =~ s/\'//g;
     $includes =~ s/-I//g;
     mkdir "$target" || die "Could not create the directory $target for lib project!\n";
@@ -162,9 +119,6 @@ sub createLibProject {
                        <Tool
                                Name="VCXMLDataGeneratorTool"
                        />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
                        <Tool
                                Name="VCMIDLTool"
                        />
@@ -228,9 +182,6 @@ sub createLibProject {
                        <Tool
                                Name="VCXMLDataGeneratorTool"
                        />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
                        <Tool
                                Name="VCMIDLTool"
                        />
@@ -311,9 +262,8 @@ sub createAppProject {
     $target =~ s/\//_/g;
     $target =~ s/\.exe//;
 
-    my $uuid = $GUIDS[$guid_index];
+    my $uuid = generate_guid($appname);
     $$build_structure{"APPS_${target}_GUID"} = $uuid;
-    $guid_index += 1;
 
     my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"APPS_${appname}_SOURCES"}}));
     my @sources;
@@ -325,6 +275,8 @@ sub createAppProject {
     my $includes= join(";", sort(map("&quot;$rel_dir\\$_&quot;", @{$$build_structure{"APPS_${appname}_INCLUDES"}})));
     my $cflags  = join(" ", sort(@{$$build_structure{"APPS_${appname}_CFLAGS"}}));
     $cflags =~ s/\"/&quot;/g;
+    $cflags =~ s/</&lt;/g;
+    $cflags =~ s/>/&gt;/g;
 
     my $cflags_debug = $cflags;
     $cflags_debug =~ s/-MT/-MTd/;
@@ -351,6 +303,8 @@ sub createAppProject {
 
     $defines =~ s/-D//g;
     $defines =~ s/\"/\\&quot;/g;
+    $defines =~ s/</&lt;/g;
+    $defines =~ s/>/&gt;/g;
     $defines =~ s/\'//g;
     $defines =~ s/\\\\/\\/g;
     $includes =~ s/-I//g;
@@ -387,9 +341,6 @@ sub createAppProject {
                        <Tool
                                Name="VCXMLDataGeneratorTool"
                        />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
                        <Tool
                                Name="VCMIDLTool"
                        />
@@ -458,9 +409,6 @@ sub createAppProject {
                        <Tool
                                Name="VCXMLDataGeneratorTool"
                        />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
                        <Tool
                                Name="VCMIDLTool"
                        />
@@ -561,20 +509,18 @@ sub createGlueProject {
     foreach (@apps) {
         $_ =~ s/\//_/g;
         $_ =~ s/\.exe//;
-        push(@tmp, $_);
+        if ($_ eq "git" ) {
+            unshift(@tmp, $_);
+        } else {
+            push(@tmp, $_);
+        }
     }
     @apps = @tmp;
 
     open F, ">git.sln" || die "Could not open git.sln for writing!\n";
     binmode F, ":crlf";
     print F "$SLN_HEAD";
-    foreach (@libs) {
-        my $libname = $_;
-        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
-        print F "$SLN_PRE";
-        print F "\"${libname}\", \"${libname}\\${libname}.vcproj\", \"${uuid}\"";
-        print F "$SLN_POST";
-    }
+
     my $uuid_libgit = $build_structure{"LIBS_libgit_GUID"};
     my $uuid_xdiff_lib = $build_structure{"LIBS_xdiff_lib_GUID"};
     foreach (@apps) {
@@ -588,6 +534,13 @@ sub createGlueProject {
         print F "      EndProjectSection";
         print F "$SLN_POST";
     }
+    foreach (@libs) {
+        my $libname = $_;
+        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
+        print F "$SLN_PRE";
+        print F "\"${libname}\", \"${libname}\\${libname}.vcproj\", \"${uuid}\"";
+        print F "$SLN_POST";
+    }
 
     print F << "EOM";
 Global
@@ -599,17 +552,17 @@ sub createGlueProject {
     print F << "EOM";
        GlobalSection(ProjectConfigurationPlatforms) = postSolution
 EOM
-    foreach (@libs) {
-        my $libname = $_;
-        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
+    foreach (@apps) {
+        my $appname = $_;
+        my $uuid = $build_structure{"APPS_${appname}_GUID"};
         print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
         print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
         print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
         print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
     }
-    foreach (@apps) {
-        my $appname = $_;
-        my $uuid = $build_structure{"APPS_${appname}_GUID"};
+    foreach (@libs) {
+        my $libname = $_;
+        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
         print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
         print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
         print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/contrib/buildsystems/Generators/Vcxproj.pm
new file mode 100644 (file)
index 0000000..576ccab
--- /dev/null
@@ -0,0 +1,388 @@
+package Generators::Vcxproj;
+require Exporter;
+
+use strict;
+use vars qw($VERSION);
+use Digest::SHA qw(sha256_hex);
+
+our $VERSION = '1.00';
+our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
+@ISA = qw(Exporter);
+
+BEGIN {
+    push @EXPORT_OK, qw(generate);
+}
+
+sub generate_guid ($) {
+       my $hex = sha256_hex($_[0]);
+       $hex =~ s/^(.{8})(.{4})(.{4})(.{4})(.{12}).*/{$1-$2-$3-$4-$5}/;
+       $hex =~ tr/a-z/A-Z/;
+       return $hex;
+}
+
+sub generate {
+    my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
+    my @libs = @{$build_structure{"LIBS"}};
+    foreach (@libs) {
+        createProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure, 1);
+    }
+
+    my @apps = @{$build_structure{"APPS"}};
+    foreach (@apps) {
+        createProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure, 0);
+    }
+
+    createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
+    return 0;
+}
+
+sub createProject {
+    my ($name, $git_dir, $out_dir, $rel_dir, $build_structure, $static_library) = @_;
+    my $label = $static_library ? "lib" : "app";
+    my $prefix = $static_library ? "LIBS_" : "APPS_";
+    my $config_type = $static_library ? "StaticLibrary" : "Application";
+    print "Generate $name vcxproj $label project\n";
+    my $cdup = $name;
+    $cdup =~ s/[^\/]+/../g;
+    $cdup =~ s/\//\\/g;
+    $rel_dir = $rel_dir eq "." ? $cdup : "$cdup\\$rel_dir";
+    $rel_dir =~ s/\//\\/g;
+
+    my $target = $name;
+    if ($static_library) {
+      $target =~ s/\.a//;
+    } else {
+      $target =~ s/\.exe//;
+    }
+
+    my $uuid = generate_guid($name);
+    $$build_structure{"$prefix${target}_GUID"} = $uuid;
+    my $vcxproj = $target;
+    $vcxproj =~ s/(.*\/)?(.*)/$&\/$2.vcxproj/;
+    $vcxproj =~ s/([^\/]*)(\/lib)\/(lib.vcxproj)/$1$2\/$1_$3/;
+    $$build_structure{"$prefix${target}_VCXPROJ"} = $vcxproj;
+
+    my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"$prefix${name}_SOURCES"}}));
+    my @sources;
+    foreach (@srcs) {
+        $_ =~ s/\//\\/g;
+        push(@sources, $_);
+    }
+    my $defines = join(";", sort(@{$$build_structure{"$prefix${name}_DEFINES"}}));
+    my $includes= join(";", sort(map { s/^-I//; s/\//\\/g; File::Spec->file_name_is_absolute($_) ? $_ : "$rel_dir\\$_" } @{$$build_structure{"$prefix${name}_INCLUDES"}}));
+    my $cflags = join(" ", sort(map { s/^-[GLMOWZ].*//; s/.* .*/"$&"/; $_; } @{$$build_structure{"$prefix${name}_CFLAGS"}}));
+    $cflags =~ s/</&lt;/g;
+    $cflags =~ s/>/&gt;/g;
+
+    my $libs_release = "\n    ";
+    my $libs_debug = "\n    ";
+    if (!$static_library) {
+      $libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
+      $libs_debug = $libs_release;
+      $libs_debug =~ s/zlib\.lib/zlibd\.lib/;
+    }
+
+    $defines =~ s/-D//g;
+    $defines =~ s/</&lt;/g;
+    $defines =~ s/>/&gt;/g;
+    $defines =~ s/\'//g;
+
+    die "Could not create the directory $target for $label project!\n" unless (-d "$target" || mkdir "$target");
+
+    open F, ">$vcxproj" or die "Could not open $vcxproj for writing!\n";
+    binmode F, ":crlf :utf8";
+    print F chr(0xFEFF);
+    print F << "EOM";
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>$uuid</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <VCPKGArch Condition="'\$(Platform)'=='Win32'">x86-windows</VCPKGArch>
+    <VCPKGArch Condition="'\$(Platform)'!='Win32'">x64-windows</VCPKGArch>
+    <VCPKGArchDirectory>$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)</VCPKGArchDirectory>
+    <VCPKGBinDirectory Condition="'\(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\bin</VCPKGBinDirectory>
+    <VCPKGLibDirectory Condition="'\(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\lib</VCPKGLibDirectory>
+    <VCPKGBinDirectory Condition="'\(Configuration)'!='Debug'">\$(VCPKGArchDirectory)\\bin</VCPKGBinDirectory>
+    <VCPKGLibDirectory Condition="'\(Configuration)'!='Debug'">\$(VCPKGArchDirectory)\\lib</VCPKGLibDirectory>
+    <VCPKGIncludeDirectory>\$(VCPKGArchDirectory)\\include</VCPKGIncludeDirectory>
+    <VCPKGLibs Condition="'\(Configuration)'=='Debug'">$libs_debug</VCPKGLibs>
+    <VCPKGLibs Condition="'\(Configuration)'!='Debug'">$libs_release</VCPKGLibs>
+  </PropertyGroup>
+  <Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'\$(Configuration)'=='Debug'" Label="Configuration">
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'\$(Configuration)'=='Release'" Label="Configuration">
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ConfigurationType>$config_type</ConfigurationType>
+    <PlatformToolset>v140</PlatformToolset>
+    <!-- <CharacterSet>UTF-8</CharacterSet> -->
+    <OutDir>..\\</OutDir>
+    <!-- <IntDir>\$(ProjectDir)\$(Configuration)\\</IntDir> -->
+  </PropertyGroup>
+  <Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets">
+    <Import Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <GenerateManifest>false</GenerateManifest>
+    <EnableManagedIncrementalBuild>true</EnableManagedIncrementalBuild>
+  </PropertyGroup>
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalOptions>$cflags %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalIncludeDirectories>$cdup;$cdup\\compat;$cdup\\compat\\regex;$cdup\\compat\\win32;$cdup\\compat\\poll;$cdup\\compat\\vcbuild\\include;\$(VCPKGIncludeDirectory);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <EnableParallelCodeGeneration />
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <PrecompiledHeader />
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Lib>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+    </Lib>
+    <Link>
+      <AdditionalLibraryDirectories>\$(VCPKGLibDirectory);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>\$(VCPKGLibs);\$(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalOptions>invalidcontinue.obj %(AdditionalOptions)</AdditionalOptions>
+      <EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
+      <ManifestFile>$cdup\\compat\\win32\\git.manifest</ManifestFile>
+      <SubSystem>Console</SubSystem>
+    </Link>
+EOM
+    if ($target eq 'libgit') {
+        print F << "EOM";
+    <PreBuildEvent Condition="!Exists('$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)\\include\\openssl\\ssl.h')">
+      <Message>Initialize VCPKG</Message>
+      <Command>del "$cdup\\compat\\vcbuild\\vcpkg"</Command>
+      <Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat"</Command>
+    </PreBuildEvent>
+EOM
+    }
+    print F << "EOM";
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'\$(Platform)'=='Win32'">
+    <Link>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'\$(Configuration)'=='Debug'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;$defines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'\$(Configuration)'=='Release'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;$defines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+EOM
+    foreach(@sources) {
+        print F << "EOM";
+    <ClCompile Include="$_" />
+EOM
+    }
+    print F << "EOM";
+  </ItemGroup>
+EOM
+    if (!$static_library || $target =~ 'vcs-svn' || $target =~ 'xdiff') {
+      my $uuid_libgit = $$build_structure{"LIBS_libgit_GUID"};
+      my $uuid_xdiff_lib = $$build_structure{"LIBS_xdiff/lib_GUID"};
+
+      print F << "EOM";
+  <ItemGroup>
+    <ProjectReference Include="$cdup\\libgit\\libgit.vcxproj">
+      <Project>$uuid_libgit</Project>
+      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+    </ProjectReference>
+EOM
+      if (!($name =~ 'xdiff')) {
+        print F << "EOM";
+    <ProjectReference Include="$cdup\\xdiff\\lib\\xdiff_lib.vcxproj">
+      <Project>$uuid_xdiff_lib</Project>
+      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+    </ProjectReference>
+EOM
+      }
+      if ($name =~ /(test-(line-buffer|svn-fe)|^git-remote-testsvn)\.exe$/) {
+        my $uuid_vcs_svn_lib = $$build_structure{"LIBS_vcs-svn/lib_GUID"};
+        print F << "EOM";
+    <ProjectReference Include="$cdup\\vcs-svn\\lib\\vcs-svn_lib.vcxproj">
+      <Project>$uuid_vcs_svn_lib</Project>
+      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+    </ProjectReference>
+EOM
+      }
+      print F << "EOM";
+  </ItemGroup>
+EOM
+    }
+    print F << "EOM";
+  <Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets" />
+EOM
+    if (!$static_library) {
+      print F << "EOM";
+  <Target Name="${target}_AfterBuild" AfterTargets="AfterBuild">
+    <ItemGroup>
+      <DLLsAndPDBs Include="\$(VCPKGBinDirectory)\\*.dll;\$(VCPKGBinDirectory)\\*.pdb" />
+    </ItemGroup>
+    <Copy SourceFiles="@(DLLsAndPDBs)" DestinationFolder="\$(OutDir)" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />
+    <MakeDir Directories="..\\templates\\blt\\branches" />
+  </Target>
+EOM
+    }
+    if ($target eq 'git') {
+      print F "  <Import Project=\"LinkOrCopyBuiltins.targets\" />\n";
+    }
+    print F << "EOM";
+</Project>
+EOM
+    close F;
+}
+
+sub createGlueProject {
+    my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
+    print "Generate solutions file\n";
+    $rel_dir = "..\\$rel_dir";
+    $rel_dir =~ s/\//\\/g;
+    my $SLN_HEAD = "Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2010\n";
+    my $SLN_PRE  = "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = ";
+    my $SLN_POST = "\nEndProject\n";
+
+    my @libs = @{$build_structure{"LIBS"}};
+    my @tmp;
+    foreach (@libs) {
+        $_ =~ s/\.a//;
+        push(@tmp, $_);
+    }
+    @libs = @tmp;
+
+    my @apps = @{$build_structure{"APPS"}};
+    @tmp = ();
+    foreach (@apps) {
+        $_ =~ s/\.exe//;
+        if ($_ eq "git" ) {
+            unshift(@tmp, $_);
+        } else {
+            push(@tmp, $_);
+        }
+    }
+    @apps = @tmp;
+
+    open F, ">git.sln" || die "Could not open git.sln for writing!\n";
+    binmode F, ":crlf :utf8";
+    print F chr(0xFEFF);
+    print F "$SLN_HEAD";
+
+    foreach (@apps) {
+        my $appname = $_;
+        my $uuid = $build_structure{"APPS_${appname}_GUID"};
+        print F "$SLN_PRE";
+       my $vcxproj = $build_structure{"APPS_${appname}_VCXPROJ"};
+       $vcxproj =~ s/\//\\/g;
+        $appname =~ s/.*\///;
+        print F "\"${appname}\", \"${vcxproj}\", \"${uuid}\"";
+        print F "$SLN_POST";
+    }
+    foreach (@libs) {
+        my $libname = $_;
+        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
+        print F "$SLN_PRE";
+        my $vcxproj = $build_structure{"LIBS_${libname}_VCXPROJ"};
+       $vcxproj =~ s/\//\\/g;
+        $libname =~ s/\//_/g;
+        print F "\"${libname}\", \"${vcxproj}\", \"${uuid}\"";
+        print F "$SLN_POST";
+    }
+
+    print F << "EOM";
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|x64 = Debug|x64
+               Debug|x86 = Debug|x86
+               Release|x64 = Release|x64
+               Release|x86 = Release|x86
+       EndGlobalSection
+EOM
+    print F << "EOM";
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+EOM
+    foreach (@apps) {
+        my $appname = $_;
+        my $uuid = $build_structure{"APPS_${appname}_GUID"};
+        print F "\t\t${uuid}.Debug|x64.ActiveCfg = Debug|x64\n";
+        print F "\t\t${uuid}.Debug|x64.Build.0 = Debug|x64\n";
+        print F "\t\t${uuid}.Debug|x86.ActiveCfg = Debug|Win32\n";
+        print F "\t\t${uuid}.Debug|x86.Build.0 = Debug|Win32\n";
+        print F "\t\t${uuid}.Release|x64.ActiveCfg = Release|x64\n";
+        print F "\t\t${uuid}.Release|x64.Build.0 = Release|x64\n";
+        print F "\t\t${uuid}.Release|x86.ActiveCfg = Release|Win32\n";
+        print F "\t\t${uuid}.Release|x86.Build.0 = Release|Win32\n";
+    }
+    foreach (@libs) {
+        my $libname = $_;
+        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
+        print F "\t\t${uuid}.Debug|x64.ActiveCfg = Debug|x64\n";
+        print F "\t\t${uuid}.Debug|x64.Build.0 = Debug|x64\n";
+        print F "\t\t${uuid}.Debug|x86.ActiveCfg = Debug|Win32\n";
+        print F "\t\t${uuid}.Debug|x86.Build.0 = Debug|Win32\n";
+        print F "\t\t${uuid}.Release|x64.ActiveCfg = Release|x64\n";
+        print F "\t\t${uuid}.Release|x64.Build.0 = Release|x64\n";
+        print F "\t\t${uuid}.Release|x86.ActiveCfg = Release|Win32\n";
+        print F "\t\t${uuid}.Release|x86.Build.0 = Release|Win32\n";
+    }
+
+    print F << "EOM";
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
+EOM
+    close F;
+}
+
+1;
index 23da787dc5565193dd93fa7406cd86f39651bb52..fba8a3f056a0e16591496f77a8b505ec01d01964 100755 (executable)
@@ -12,6 +12,7 @@
 use File::Spec;
 use Cwd;
 use Generators;
+use Text::ParseWords;
 
 my (%build_structure, %compile_options, @makedry);
 my $out_dir = getcwd();
@@ -31,6 +32,7 @@ sub showUsage
   -g <GENERATOR>  --gen <GENERATOR> Specify the buildsystem generator    (default: $gen)
                                     Available: $genlist
   -o <PATH>       --out <PATH>      Specify output directory generation  (default: .)
+                  --make-out <PATH> Write the output of GNU Make into a file
   -i <FILE>       --in <FILE>       Specify input file, instead of running GNU Make
   -h,-?           --help            This help
 EOM
@@ -38,6 +40,7 @@ sub showUsage
 }
 
 # Parse command-line options
+my $make_out;
 while (@ARGV) {
     my $arg = shift @ARGV;
     if ("$arg" eq "-h" || "$arg" eq "--help" || "$arg" eq "-?") {
@@ -45,6 +48,8 @@ sub showUsage
        exit(0);
     } elsif("$arg" eq "--out" || "$arg" eq "-o") {
        $out_dir = shift @ARGV;
+    } elsif("$arg" eq "--make-out") {
+       $make_out = shift @ARGV;
     } elsif("$arg" eq "--gen" || "$arg" eq "-g") {
        $gen = shift @ARGV;
     } elsif("$arg" eq "--in" || "$arg" eq "-i") {
@@ -52,6 +57,8 @@ sub showUsage
         open(F, "<$infile") || die "Couldn't open file $infile";
         @makedry = <F>;
         close(F);
+    } else {
+        die "Unknown option: " . $arg;
     }
 }
 
@@ -72,7 +79,19 @@ sub showUsage
 EOM
 
 # Pipe a make --dry-run into a variable, if not already loaded from file
-@makedry = `cd $git_dir && make -n MSVC=1 V=1 2>/dev/null` if !@makedry;
+# Capture the make dry stderr to file for review (will be empty for a release build).
+
+my $ErrsFile = "msvc-build-makedryerrors.txt";
+@makedry = `make -C $git_dir -n MSVC=1 SKIP_VCPKG=1 V=1 2>$ErrsFile`
+if !@makedry;
+# test for an empty Errors file and remove it
+unlink $ErrsFile if -f -z $ErrsFile;
+
+if (defined $make_out) {
+    open OUT, ">" . $make_out;
+    print OUT @makedry;
+    close OUT;
+}
 
 # Parse the make output into usable info
 parseMakeOutput();
@@ -140,6 +159,12 @@ sub parseMakeOutput
             next;
         }
 
+        if ($text =~ /^(mkdir|msgfmt) /) {
+            # options to the Portable Object translations
+            # the line "mkdir ... && msgfmt ..." contains no linker options
+            next;
+        }
+
         if($text =~ / -c /) {
             # compilation
             handleCompileLine($text, $line);
@@ -231,7 +256,7 @@ sub removeDuplicates
 sub handleCompileLine
 {
     my ($line, $lineno) = @_;
-    my @parts = split(' ', $line);
+    my @parts = shellwords($line);
     my $sourcefile;
     shift(@parts); # ignore cmd
     while (my $part = shift @parts) {
@@ -265,7 +290,7 @@ sub handleLibLine
     my (@objfiles, @lflags, $libout, $part);
     # kill cmd and rm 'prefix'
     $line =~ s/^rm -f .* && .* rcs //;
-    my @parts = split(' ', $line);
+    my @parts = shellwords($line);
     while ($part = shift @parts) {
         if ($part =~ /^-/) {
             push(@lflags, $part);
@@ -282,7 +307,7 @@ sub handleLibLine
 #    exit(1);
     foreach (@objfiles) {
         my $sourcefile = $_;
-        $sourcefile =~ s/\.o/.c/;
+        $sourcefile =~ s/\.o$/.c/;
         push(@sources, $sourcefile);
         push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
         push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
@@ -306,7 +331,7 @@ sub handleLinkLine
 {
     my ($line, $lineno) = @_;
     my (@objfiles, @lflags, @libs, $appout, $part);
-    my @parts = split(' ', $line);
+    my @parts = shellwords($line);
     shift(@parts); # ignore cmd
     while ($part = shift @parts) {
         if ($part =~ /^-IGNORE/) {
@@ -317,26 +342,36 @@ sub handleLinkLine
             $appout = shift @parts;
         } elsif ("$part" eq "-lz") {
             push(@libs, "zlib.lib");
-       } elsif ("$part" eq "-lcrypto") {
+        } elsif ("$part" eq "-lcrypto") {
             push(@libs, "libeay32.lib");
         } elsif ("$part" eq "-lssl") {
             push(@libs, "ssleay32.lib");
-        } elsif ($part =~ /^-/) {
+        } elsif ("$part" eq "-lcurl") {
+            push(@libs, "libcurl.lib");
+        } elsif ("$part" eq "-lexpat") {
+            push(@libs, "expat.lib");
+        } elsif ("$part" eq "-liconv") {
+            push(@libs, "libiconv.lib");
+        } elsif ($part =~ /^[-\/]/) {
             push(@lflags, $part);
         } elsif ($part =~ /\.(a|lib)$/) {
             $part =~ s/\.a$/.lib/;
             push(@libs, $part);
-        } elsif ($part =~ /\.(o|obj)$/) {
+        } elsif ($part eq 'invalidcontinue.obj') {
+            # ignore - known to MSVC
+        } elsif ($part =~ /\.o$/) {
             push(@objfiles, $part);
+        } elsif ($part =~ /\.obj$/) {
+            # do nothing, 'make' should not be producing .obj, only .o files
         } else {
-            die "Unhandled lib option @ line $lineno: $part";
+            die "Unhandled link option @ line $lineno: $part";
         }
     }
 #    print "AppOut: '$appout'\nLFlags: @lflags\nLibs  : @libs\nOfiles: @objfiles\n";
 #    exit(1);
     foreach (@objfiles) {
         my $sourcefile = $_;
-        $sourcefile =~ s/\.o/.c/;
+        $sourcefile =~ s/\.o$/.c/;
         push(@sources, $sourcefile);
         push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
         push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
diff --git a/git.c b/git.c
index 74ad85535696939db14e77e12da5bffdce77f525..c1ee7124edcfb0417539134d50212e997dc71c1f 100644 (file)
--- a/git.c
+++ b/git.c
@@ -739,8 +739,6 @@ static int run_argv(int *argcp, const char ***argv)
                 */
                if (!done_alias)
                        handle_builtin(*argcp, *argv);
-
-#if 0 // TODO In GFW, need to amend a7924b655e940b06cb547c235d6bed9767929673 to include trace2_ and _tr2 lines.
                else if (get_builtin(**argv)) {
                        struct argv_array args = ARGV_ARRAY_INIT;
                        int i;
@@ -775,7 +773,6 @@ static int run_argv(int *argcp, const char ***argv)
                                exit(i);
                        die("could not execute builtin %s", **argv);
                }
-#endif // a7924b655e940b06cb547c235d6bed9767929673
 
                /* .. then try the external ones */
                execv_dashed_external(*argv);
index 12300131fc12b15fbc9514e90ca45d76113d7267..6b812d67e3ecd54ece21c2465ede3e28d6fba325 100644 (file)
@@ -2863,7 +2863,8 @@ static int detect_and_process_renames(struct merge_options *opt,
        head_pairs = get_diffpairs(opt, common, head);
        merge_pairs = get_diffpairs(opt, common, merge);
 
-       if (opt->detect_directory_renames) {
+       if ((opt->detect_directory_renames == 2) ||
+           (opt->detect_directory_renames == 1 && !opt->call_depth)) {
                dir_re_head = get_directory_renames(head_pairs);
                dir_re_merge = get_directory_renames(merge_pairs);
 
index b1f8f53a098da3525fdff5011b93f39138df3df2..d60767ab739f0e20e45c700368f7f9f24a52c3f8 100644 (file)
@@ -2151,8 +2151,10 @@ static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store,
        strbuf_addf(&sb, "%s/logs", gitdir);
 
        diter = dir_iterator_begin(sb.buf, 0);
-       if(!diter)
+       if (!diter) {
+               strbuf_release(&sb);
                return empty_ref_iterator_begin();
+       }
 
        iter = xcalloc(1, sizeof(*iter));
        ref_iterator = &iter->base;
index 84fd02f107602411f3ceb460e4fe5b41c212bdec..487ea35d2d398434d2a907188d8f7ede17721fe3 100644 (file)
@@ -799,6 +799,7 @@ static void read_alternate_refs(const char *path,
 
        fclose(fh);
        finish_command(&cmd);
+       strbuf_release(&line);
 }
 
 struct alternate_refs_data {
index a5b96cb0dcfd0e5b493638bc5d6a310ffbf87db3..659b6bfa81df6d0bcffb8d0a975492d54d79d6bc 100644 (file)
@@ -4,13 +4,21 @@
 #include "iterator.h"
 #include "dir-iterator.h"
 
+static const char *error_name(int error_number)
+{
+       switch (error_number) {
+       case ENOENT: return "ENOENT";
+       case ENOTDIR: return "ENOTDIR";
+       default: return "ESOMETHINGELSE";
+       }
+}
+
 /*
  * usage:
  * tool-test dir-iterator [--follow-symlinks] [--pedantic] directory_path
  */
 int cmd__dir_iterator(int argc, const char **argv)
 {
-       struct strbuf path = STRBUF_INIT;
        struct dir_iterator *diter;
        unsigned int flags = 0;
        int iter_status;
@@ -27,11 +35,10 @@ int cmd__dir_iterator(int argc, const char **argv)
        if (!*argv || argc != 1)
                die("dir-iterator needs exactly one non-option argument");
 
-       strbuf_add(&path, *argv, strlen(*argv));
-       diter = dir_iterator_begin(path.buf, flags);
+       diter = dir_iterator_begin(*argv, flags);
 
        if (!diter) {
-               printf("dir_iterator_begin failure: %d\n", errno);
+               printf("dir_iterator_begin failure: %s\n", error_name(errno));
                exit(EXIT_FAILURE);
        }
 
index e89438e619b010d8eb36bcfa54de8d49cd373180..9ca0818cbe4c1fb7f7d4c4558f00c5dabc0ae778 100755 (executable)
@@ -25,16 +25,14 @@ try_local_x () {
        echo "$x"
 }
 
-# This test is an experiment to check whether any Git users are using
-# Shells that don't support the "local" keyword. "local" is not
+# Check whether the shell supports the "local" keyword. "local" is not
 # POSIX-standard, but it is very widely supported by POSIX-compliant
-# shells, and if it doesn't cause problems for people, we would like
-# to be able to use it in Git code.
+# shells, and we rely on it within Git's test framework.
 #
-# For now, this is the only test that requires "local". If your shell
-# fails this test, you can ignore the failure, but please report the
-# problem to the Git mailing list <git@vger.kernel.org>, as it might
-# convince us to continue avoiding the use of "local".
+# If your shell fails this test, the results of other tests may be
+# unreliable. You may wish to report the problem to the Git mailing
+# list <git@vger.kernel.org>, as it could cause us to reconsider
+# relying on "local".
 test_expect_success 'verify that the running shell supports "local"' '
        x="notlocal" &&
        echo "local" >expected1 &&
index 9c96b3e3b10a99c20a1e6f5d4d0349c4fbcb0a10..5343ffd3f92c1637bb60719d812a01e0ab6d4064 100755 (executable)
@@ -170,31 +170,45 @@ NULL
 '
 
 test_expect_success 'iterate' '
-
-test_hashmap "put key1 value1
-put key2 value2
-put fooBarFrotz value3
-iterate" "NULL
-NULL
-NULL
-key2 value2
-key1 value1
-fooBarFrotz value3"
-
+       test-tool hashmap >actual.raw <<-\EOF &&
+       put key1 value1
+       put key2 value2
+       put fooBarFrotz value3
+       iterate
+       EOF
+
+       cat >expect <<-\EOF &&
+       NULL
+       NULL
+       NULL
+       fooBarFrotz value3
+       key1 value1
+       key2 value2
+       EOF
+
+       sort <actual.raw >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'iterate (case insensitive)' '
-
-test_hashmap "put key1 value1
-put key2 value2
-put fooBarFrotz value3
-iterate" "NULL
-NULL
-NULL
-fooBarFrotz value3
-key2 value2
-key1 value1" ignorecase
-
+       test-tool hashmap ignorecase >actual.raw <<-\EOF &&
+       put key1 value1
+       put key2 value2
+       put fooBarFrotz value3
+       iterate
+       EOF
+
+       cat >expect <<-\EOF &&
+       NULL
+       NULL
+       NULL
+       fooBarFrotz value3
+       key1 value1
+       key2 value2
+       EOF
+
+       sort <actual.raw >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'grow / shrink' '
index bbe719e9509689e38dd1d524d5d4b57de934a757..31f8276ba82bad3129c4a3cfa92f2d0ba798073c 100755 (executable)
@@ -86,17 +86,25 @@ NULL"
 '
 
 test_expect_success 'iterate' '
-
-test_oidmap "put one 1
-put two 2
-put three 3
-iterate" "NULL
-NULL
-NULL
-$(git rev-parse two) 2
-$(git rev-parse one) 1
-$(git rev-parse three) 3"
-
+       test-tool oidmap >actual.raw <<-\EOF &&
+       put one 1
+       put two 2
+       put three 3
+       iterate
+       EOF
+
+       # sort "expect" too so we do not rely on the order of particular oids
+       sort >expect <<-EOF &&
+       NULL
+       NULL
+       NULL
+       $(git rev-parse one) 1
+       $(git rev-parse two) 2
+       $(git rev-parse three) 3
+       EOF
+
+       sort <actual.raw >actual &&
+       test_cmp expect actual
 '
 
 test_done
index 3587e454f19d9bf71f2b02c9189d4715ed216fd9..959b6da449004c526d6f5d106d9061d9763108e9 100755 (executable)
@@ -15,8 +15,10 @@ compare_ws_file () {
        pfx=$1
        exp=$2.expect
        act=$pfx.actual.$3
-       tr '\015\000abcdef0123456789' QN00000000000000000 <"$2" >"$exp" &&
-       tr '\015\000abcdef0123456789' QN00000000000000000 <"$3" >"$act" &&
+       tr '\015\000abcdef0123456789' QN00000000000000000 <"$2" |
+               sed -e "s/0000*/$ZERO_OID/" >"$exp" &&
+       tr '\015\000abcdef0123456789' QN00000000000000000 <"$3" |
+               sed -e "s/0000*/$ZERO_OID/" >"$act" &&
        test_cmp "$exp" "$act" &&
        rm "$exp" "$act"
 }
index 9354d3f1ed42aef99f6f7c3d27c572903c3617da..92910e4e6c13ce381dddefcf197dea26a07efd88 100755 (executable)
@@ -55,13 +55,13 @@ test_expect_success 'dir-iterator should list files in the correct order' '
 test_expect_success 'begin should fail upon inexistent paths' '
        test_must_fail test-tool dir-iterator ./inexistent-path \
                >actual-inexistent-path-output &&
-       echo "dir_iterator_begin failure: 2" >expected-inexistent-path-output &&
+       echo "dir_iterator_begin failure: ENOENT" >expected-inexistent-path-output &&
        test_cmp expected-inexistent-path-output actual-inexistent-path-output
 '
 
 test_expect_success 'begin should fail upon non directory paths' '
        test_must_fail test-tool dir-iterator ./dir/b >actual-non-dir-output &&
-       echo "dir_iterator_begin failure: 20" >expected-non-dir-output &&
+       echo "dir_iterator_begin failure: ENOTDIR" >expected-non-dir-output &&
        test_cmp expected-non-dir-output actual-non-dir-output
 '
 
index 504334e552251ed0c1f74536f6fd09ffccda615d..ce9a4a5f324b74d61d8f0c8abcaee866cbe874e9 100755 (executable)
@@ -162,8 +162,8 @@ test_expect_success PERL 'commit --interactive gives cache-tree on partial commi
 '
 
 test_expect_success PERL 'commit -p with shrinking cache-tree' '
-       mkdir -p deep/subdir &&
-       echo content >deep/subdir/file &&
+       mkdir -p deep/very-long-subdir &&
+       echo content >deep/very-long-subdir/file &&
        git add deep &&
        git commit -m add &&
        git rm -r deep &&
index 7099d33508a0571cd8f960fcd80c46e4364f1766..64b340f227274c28f00a564a682f2369a7b85d8d 100755 (executable)
@@ -9,22 +9,19 @@ echo_without_newline() {
 }
 
 test_blob_does_not_exist() {
-       test_expect_success SHA1 'blob does not exist in database' "
+       test_expect_success 'blob does not exist in database' "
                test_must_fail git cat-file blob $1
        "
 }
 
 test_blob_exists() {
-       test_expect_success SHA1 'blob exists in database' "
+       test_expect_success 'blob exists in database' "
                git cat-file blob $1
        "
 }
 
 hello_content="Hello World"
-hello_sha1=5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689
-
 example_content="This is an example"
-example_sha1=ddd3f836d3e3fbb7ae289aa9ae83536f76956399
 
 setup_repo() {
        echo_without_newline "$hello_content" > hello
@@ -44,7 +41,16 @@ pop_repo() {
        rm -rf $test_repo
 }
 
-setup_repo
+test_expect_success 'setup' '
+       setup_repo &&
+       test_oid_cache <<-EOF
+       hello sha1:5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689
+       hello sha256:1e3b6c04d2eeb2b3e45c8a330445404c0b7cc7b257e2b097167d26f5230090c4
+
+       example sha1:ddd3f836d3e3fbb7ae289aa9ae83536f76956399
+       example sha256:b44fe1fe65589848253737db859bd490453510719d7424daab03daf0767b85ae
+       EOF
+'
 
 # Argument checking
 
@@ -73,23 +79,23 @@ test_expect_success "Can't use --path with --no-filters" '
 
 push_repo
 
-test_expect_success SHA1 'hash a file' '
-       test $hello_sha1 = $(git hash-object hello)
+test_expect_success 'hash a file' '
+       test "$(test_oid hello)" = $(git hash-object hello)
 '
 
-test_blob_does_not_exist $hello_sha1
+test_blob_does_not_exist "$(test_oid hello)"
 
-test_expect_success SHA1 'hash from stdin' '
-       test $example_sha1 = $(git hash-object --stdin < example)
+test_expect_success 'hash from stdin' '
+       test "$(test_oid example)" = $(git hash-object --stdin < example)
 '
 
-test_blob_does_not_exist $example_sha1
+test_blob_does_not_exist "$(test_oid example)"
 
-test_expect_success SHA1 'hash a file and write to database' '
-       test $hello_sha1 = $(git hash-object -w hello)
+test_expect_success 'hash a file and write to database' '
+       test "$(test_oid hello)" = $(git hash-object -w hello)
 '
 
-test_blob_exists $hello_sha1
+test_blob_exists "$(test_oid hello)"
 
 test_expect_success 'git hash-object --stdin file1 <file0 first operates on file0, then file1' '
        echo foo > file1 &&
@@ -161,11 +167,11 @@ pop_repo
 for args in "-w --stdin" "--stdin -w"; do
        push_repo
 
-       test_expect_success SHA1 "hash from stdin and write to database ($args)" '
-               test $example_sha1 = $(git hash-object $args < example)
+       test_expect_success "hash from stdin and write to database ($args)" '
+               test "$(test_oid example)" = $(git hash-object $args < example)
        '
 
-       test_blob_exists $example_sha1
+       test_blob_exists "$(test_oid example)"
 
        pop_repo
 done
@@ -173,22 +179,22 @@ done
 filenames="hello
 example"
 
-sha1s="$hello_sha1
-$example_sha1"
+oids="$(test_oid hello)
+$(test_oid example)"
 
-test_expect_success SHA1 "hash two files with names on stdin" '
-       test "$sha1s" = "$(echo_without_newline "$filenames" | git hash-object --stdin-paths)"
+test_expect_success "hash two files with names on stdin" '
+       test "$oids" = "$(echo_without_newline "$filenames" | git hash-object --stdin-paths)"
 '
 
 for args in "-w --stdin-paths" "--stdin-paths -w"; do
        push_repo
 
-       test_expect_success SHA1 "hash two files with names on stdin and write to database ($args)" '
-               test "$sha1s" = "$(echo_without_newline "$filenames" | git hash-object $args)"
+       test_expect_success "hash two files with names on stdin and write to database ($args)" '
+               test "$oids" = "$(echo_without_newline "$filenames" | git hash-object $args)"
        '
 
-       test_blob_exists $hello_sha1
-       test_blob_exists $example_sha1
+       test_blob_exists "$(test_oid hello)"
+       test_blob_exists "$(test_oid example)"
 
        pop_repo
 done
index 413642aa5672800d1b7be448bc97d175add07ee4..0c37e7180d1cde57d49c12deb28239c509d9207d 100755 (executable)
@@ -89,4 +89,9 @@ test_expect_failure 'ignore .git/ with invalid config' '
        test_with_config "["
 '
 
+test_expect_success 'early config and onbranch' '
+       echo "[broken" >broken &&
+       test_with_config "[includeif \"onbranch:refs/heads/master\"]path=../broken"
+'
+
 test_done
index 79f731db37cfa1a9e44fe4b966cbe6a72706ee94..82950c02825cf13322203697da81afa8b3ecee6f 100755 (executable)
@@ -30,14 +30,13 @@ check_fsck () {
 }
 
 corrupt () {
-       aa=${1%??????????????????????????????????????} zz=${1#??}
-       mv .git/objects/$aa/$zz .git/$aa$zz
+       mv .git/objects/$(test_oid_to_path $1) .git/$1
 }
 
 recover () {
-       aa=${1%??????????????????????????????????????} zz=${1#??}
+       aa=$(echo $1 | cut -c 1-2)
        mkdir -p .git/objects/$aa
-       mv .git/$aa$zz .git/objects/$aa/$zz
+       mv .git/$1 .git/objects/$(test_oid_to_path $1)
 }
 
 check_dont_have () {
@@ -55,6 +54,7 @@ check_dont_have () {
 }
 
 test_expect_success setup '
+       test_oid_init &&
        mkdir -p A/B &&
        echo rat >C &&
        echo ox >A/D &&
@@ -313,12 +313,12 @@ test_expect_success 'stale dirs do not cause d/f conflicts (reflogs off)' '
 # Each line is 114 characters, so we need 75 to still have a few before the
 # last 8K. The 89-character padding on the final entry lines up our
 # newline exactly.
-test_expect_success 'parsing reverse reflogs at BUFSIZ boundaries' '
+test_expect_success SHA1 'parsing reverse reflogs at BUFSIZ boundaries' '
        git checkout -b reflogskip &&
-       z38=00000000000000000000000000000000000000 &&
+       zf=$(test_oid zero_2) &&
        ident="abc <xyz> 0000000001 +0000" &&
        for i in $(test_seq 1 75); do
-               printf "$z38%02d $z38%02d %s\t" $i $(($i+1)) "$ident" &&
+               printf "$zf%02d $zf%02d %s\t" $i $(($i+1)) "$ident" &&
                if test $i = 75; then
                        for j in $(test_seq 1 89); do
                                printf X
@@ -329,7 +329,7 @@ test_expect_success 'parsing reverse reflogs at BUFSIZ boundaries' '
                printf "\n"
        done >.git/logs/refs/heads/reflogskip &&
        git rev-parse reflogskip@{73} >actual &&
-       echo ${z38}03 >expect &&
+       echo ${zf}03 >expect &&
        test_cmp expect actual
 '
 
index 0f268a36642760906b59bc9a8db28a29fcb962fa..b36e0528d07b0e50677c4e487d7b6bd64f79b4fe 100755 (executable)
@@ -9,6 +9,7 @@ test_description='git fsck random collection of tests
 . ./test-lib.sh
 
 test_expect_success setup '
+       test_oid_init &&
        git config gc.auto 0 &&
        git config i18n.commitencoding ISO-8859-1 &&
        test_commit A fileA one &&
@@ -54,8 +55,8 @@ test_expect_success 'setup: helpers for corruption tests' '
 
 test_expect_success 'object with bad sha1' '
        sha=$(echo blob | git hash-object -w --stdin) &&
-       old=$(echo $sha | sed "s+^..+&/+") &&
-       new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
+       old=$(test_oid_to_path "$sha") &&
+       new=$(dirname $old)/$(test_oid ff_2) &&
        sha="$(dirname $new)$(basename $new)" &&
        mv .git/objects/$old .git/objects/$new &&
        test_when_finished "remove_object $sha" &&
@@ -84,7 +85,7 @@ test_expect_success 'branch pointing to non-commit' '
 test_expect_success 'HEAD link pointing at a funny object' '
        test_when_finished "mv .git/SAVED_HEAD .git/HEAD" &&
        mv .git/HEAD .git/SAVED_HEAD &&
-       echo 0000000000000000000000000000000000000000 >.git/HEAD &&
+       echo $ZERO_OID >.git/HEAD &&
        # avoid corrupt/broken HEAD from interfering with repo discovery
        test_must_fail env GIT_DIR=.git git fsck 2>out &&
        cat out &&
@@ -244,10 +245,16 @@ test_expect_success 'tree object with duplicate entries' '
 '
 
 test_expect_success 'unparseable tree object' '
+       test_oid_cache <<-\EOF &&
+       junk sha1:twenty-bytes-of-junk
+       junk sha256:twenty-bytes-of-junk-twelve-more
+       EOF
+
        test_when_finished "git update-ref -d refs/heads/wrong" &&
        test_when_finished "remove_object \$tree_sha1" &&
        test_when_finished "remove_object \$commit_sha1" &&
-       tree_sha1=$(printf "100644 \0twenty-bytes-of-junk" | git hash-object -t tree --stdin -w --literally) &&
+       junk=$(test_oid junk) &&
+       tree_sha1=$(printf "100644 \0$junk" | git hash-object -t tree --stdin -w --literally) &&
        commit_sha1=$(git commit-tree $tree_sha1) &&
        git update-ref refs/heads/wrong $commit_sha1 &&
        test_must_fail git fsck 2>out &&
@@ -275,8 +282,9 @@ test_expect_success 'tree entry with type mismatch' '
 '
 
 test_expect_success 'tag pointing to nonexistent' '
-       cat >invalid-tag <<-\EOF &&
-       object ffffffffffffffffffffffffffffffffffffffff
+       badoid=$(test_oid deadbeef) &&
+       cat >invalid-tag <<-EOF &&
+       object $badoid
        type commit
        tag invalid
        tagger T A Gger <tagger@example.com> 1234567890 -0000
@@ -386,8 +394,8 @@ test_expect_success 'rev-list --verify-objects' '
 
 test_expect_success 'rev-list --verify-objects with bad sha1' '
        sha=$(echo blob | git hash-object -w --stdin) &&
-       old=$(echo $sha | sed "s+^..+&/+") &&
-       new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
+       old=$(test_oid_to_path $sha) &&
+       new=$(dirname $old)/$(test_oid ff_2) &&
        sha="$(dirname $new)$(basename $new)" &&
        mv .git/objects/$old .git/objects/$new &&
        test_when_finished "remove_object $sha" &&
@@ -402,7 +410,7 @@ test_expect_success 'rev-list --verify-objects with bad sha1' '
 
        test_might_fail git rev-list --verify-objects refs/heads/bogus >/dev/null 2>out &&
        cat out &&
-       test_i18ngrep -q "error: hash mismatch 63ffffffffffffffffffffffffffffffffffffff" out
+       test_i18ngrep -q "error: hash mismatch $(dirname $new)$(test_oid ff_2)" out
 '
 
 test_expect_success 'force fsck to ignore double author' '
@@ -417,13 +425,12 @@ test_expect_success 'force fsck to ignore double author' '
 '
 
 _bz='\0'
-_bz5="$_bz$_bz$_bz$_bz$_bz"
-_bz20="$_bz5$_bz5$_bz5$_bz5"
+_bzoid=$(printf $ZERO_OID | sed -e 's/00/\\0/g')
 
 test_expect_success 'fsck notices blob entry pointing to null sha1' '
        (git init null-blob &&
         cd null-blob &&
-        sha=$(printf "100644 file$_bz$_bz20" |
+        sha=$(printf "100644 file$_bz$_bzoid" |
               git hash-object -w --stdin -t tree) &&
          git fsck 2>out &&
          cat out &&
@@ -434,7 +441,7 @@ test_expect_success 'fsck notices blob entry pointing to null sha1' '
 test_expect_success 'fsck notices submodule entry pointing to null sha1' '
        (git init null-commit &&
         cd null-commit &&
-        sha=$(printf "160000 submodule$_bz$_bz20" |
+        sha=$(printf "160000 submodule$_bz$_bzoid" |
               git hash-object -w --stdin -t tree) &&
          git fsck 2>out &&
          cat out &&
@@ -586,7 +593,7 @@ test_expect_success 'fsck --connectivity-only' '
                # its type. That lets us see that --connectivity-only is
                # not actually looking at the contents, but leaves it
                # free to examine the type if it chooses.
-               empty=.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 &&
+               empty=.git/objects/$(test_oid_to_path $EMPTY_BLOB) &&
                blob=$(echo unrelated | git hash-object -w --stdin) &&
                mv -f $(sha1_file $blob) $empty &&
 
@@ -631,10 +638,12 @@ test_expect_success 'fsck --name-objects' '
 
 test_expect_success 'alternate objects are correctly blamed' '
        test_when_finished "rm -rf alt.git .git/objects/info/alternates" &&
+       name=$(test_oid numeric) &&
+       path=$(test_oid_to_path "$name") &&
        git init --bare alt.git &&
        echo "../../alt.git/objects" >.git/objects/info/alternates &&
-       mkdir alt.git/objects/12 &&
-       >alt.git/objects/12/34567890123456789012345678901234567890 &&
+       mkdir alt.git/objects/$(dirname $path) &&
+       >alt.git/objects/$(dirname $path)/$(basename $path) &&
        test_must_fail git fsck >out 2>&1 &&
        test_i18ngrep alt.git out
 '
index 4f2f84f309cfdfed82f1ec60ed036e22885a69aa..12a556884427b87e8f3d6784ba638a446f6bf7c2 100755 (executable)
@@ -20,6 +20,22 @@ create_non_racy_file () {
        test-tool chmtime =-5 "$1"
 }
 
+test_expect_success 'setup' '
+       test_oid_cache <<-EOF
+       own_v3 sha1:8299b0bcd1ac364e5f1d7768efb62fa2da79a339
+       own_v3 sha256:38a6d2925e3eceec33ad7b34cbff4e0086caa0daf28f31e51f5bd94b4a7af86b
+
+       base_v3 sha1:39d890139ee5356c7ef572216cebcd27aa41f9df
+       base_v3 sha256:c9baeadf905112bf6c17aefbd7d02267afd70ded613c30cafed2d40cb506e1ed
+
+       own_v4 sha1:432ef4b63f32193984f339431fd50ca796493569
+       own_v4 sha256:6738ac6319c25b694afa7bcc313deb182d1a59b68bf7a47b4296de83478c0420
+
+       base_v4 sha1:508851a7f0dfa8691e9f69c7f055865389012491
+       base_v4 sha256:3177d4adfdd4b6904f7e921d91d715a471c0dde7cf6a4bba574927f02b699508
+       EOF
+'
+
 test_expect_success 'enable split index' '
        git config splitIndex.maxPercentChange 100 &&
        git update-index --split-index &&
@@ -29,11 +45,11 @@ test_expect_success 'enable split index' '
        # NEEDSWORK: Stop hard-coding checksums.
        if test "$indexversion" = "4"
        then
-               own=432ef4b63f32193984f339431fd50ca796493569
-               base=508851a7f0dfa8691e9f69c7f055865389012491
+               own=$(test_oid own_v4)
+               base=$(test_oid base_v4)
        else
-               own=8299b0bcd1ac364e5f1d7768efb62fa2da79a339
-               base=39d890139ee5356c7ef572216cebcd27aa41f9df
+               own=$(test_oid own_v3)
+               base=$(test_oid base_v3)
        fi &&
 
        cat >expect <<-EOF &&
@@ -99,17 +115,18 @@ test_expect_success 'enable split index again, "one" now belongs to base index"'
 
 test_expect_success 'modify original file, base index untouched' '
        echo modified | create_non_racy_file one &&
+       file1_blob=$(git hash-object one) &&
        git update-index one &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $file1_blob 0    one
        EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        q_to_tab >expect <<-EOF &&
        $BASE
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $file1_blob 0Q
        replacements: 0
        deletions:
        EOF
@@ -121,7 +138,7 @@ test_expect_success 'add another file, which stays index' '
        git update-index --add two &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $file1_blob 0    one
        100644 $EMPTY_BLOB 0    two
        EOF
        test_cmp ls-files.expect ls-files.actual &&
@@ -129,7 +146,7 @@ test_expect_success 'add another file, which stays index' '
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        q_to_tab >expect <<-EOF &&
        $BASE
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $file1_blob 0Q
        100644 $EMPTY_BLOB 0    two
        replacements: 0
        deletions:
@@ -141,14 +158,14 @@ test_expect_success 'remove file not in base index' '
        git update-index --force-remove two &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $file1_blob 0    one
        EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        q_to_tab >expect <<-EOF &&
        $BASE
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $file1_blob 0Q
        replacements: 0
        deletions:
        EOF
@@ -237,9 +254,9 @@ test_expect_success 'set core.splitIndex config variable to true' '
        git update-index --add three &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       one
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       three
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       two
+       100644 $EMPTY_BLOB 0    one
+       100644 $EMPTY_BLOB 0    three
+       100644 $EMPTY_BLOB 0    two
        EOF
        test_cmp ls-files.expect ls-files.actual &&
        BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
@@ -257,8 +274,8 @@ test_expect_success 'set core.splitIndex config variable to false' '
        git update-index --force-remove three &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       one
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       two
+       100644 $EMPTY_BLOB 0    one
+       100644 $EMPTY_BLOB 0    two
        EOF
        test_cmp ls-files.expect ls-files.actual &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
@@ -285,7 +302,7 @@ test_expect_success 'set core.splitIndex config variable back to true' '
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        cat >expect <<-EOF &&
        $BASE
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       four
+       100644 $EMPTY_BLOB 0    four
        replacements:
        deletions:
        EOF
@@ -309,7 +326,7 @@ test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        cat >expect <<-EOF &&
        $BASE
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       six
+       100644 $EMPTY_BLOB 0    six
        replacements:
        deletions:
        EOF
index 68e54d5c4420092e481ae1324d419f5e5ec0c8ab..5bbe8dcce40160af8ad1d4c5b0d61a404be7552c 100755 (executable)
@@ -247,12 +247,14 @@ test_expect_success 'diff-files/diff-cached shows ita as new/not-new files' '
 test_expect_success '"diff HEAD" includes ita as new files' '
        git reset --hard &&
        echo new >new-ita &&
+       oid=$(git hash-object new-ita) &&
+       oid=$(git rev-parse --short $oid) &&
        git add -N new-ita &&
        git diff HEAD >actual &&
-       cat >expected <<-\EOF &&
+       cat >expected <<-EOF &&
        diff --git a/new-ita b/new-ita
        new file mode 100644
-       index 0000000..3e75765
+       index 0000000..$oid
        --- /dev/null
        +++ b/new-ita
        @@ -0,0 +1 @@
index 43b1522ea21a9c531c64fdba3b6f3bcde680063a..918ada69eb96662a2814a7f44c4eb0c3714bd0da 100755 (executable)
@@ -442,6 +442,34 @@ test_expect_success 'Log output with log.mailmap' '
        test_cmp expect actual
 '
 
+test_expect_success 'log.mailmap=false disables mailmap' '
+       cat >expect <<-\EOF &&
+       Author: CTO <cto@coompany.xx>
+       Author: claus <me@company.xx>
+       Author: santa <me@company.xx>
+       Author: nick2 <nick2@company.xx>
+       Author: nick2 <bugs@company.xx>
+       Author: nick1 <bugs@company.xx>
+       Author: A U Thor <author@example.com>
+       EOF
+       git -c log.mailmap=False log | grep Author > actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--no-use-mailmap disables mailmap' '
+       cat >expect <<-\EOF &&
+       Author: CTO <cto@coompany.xx>
+       Author: claus <me@company.xx>
+       Author: santa <me@company.xx>
+       Author: nick2 <nick2@company.xx>
+       Author: nick2 <bugs@company.xx>
+       Author: nick1 <bugs@company.xx>
+       Author: A U Thor <author@example.com>
+       EOF
+       git log --no-use-mailmap | grep Author > actual &&
+       test_cmp expect actual
+'
+
 cat >expect <<\EOF
 Author: Santa Claus <santa.claus@northpole.xx>
 Author: Santa Claus <santa.claus@northpole.xx>
@@ -461,6 +489,11 @@ test_expect_success 'Grep author with log.mailmap' '
        test_cmp expect actual
 '
 
+test_expect_success 'log.mailmap is true by default these days' '
+       git log --author Santa | grep Author >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'Only grep replaced author with --use-mailmap' '
        git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
        test_must_be_empty actual
index 602bfd9574350ae7f851d6aa26d978cc919f5c58..37655a237cb783142400364be845bf7279cc2758 100755 (executable)
@@ -94,6 +94,13 @@ check_tar() {
        '
 }
 
+test_expect_success 'setup' '
+       test_oid_cache <<-EOF
+       obj sha1:19f9c8273ec45a8938e6999cb59b3ff66739902a
+       obj sha256:3c666f798798601571f5cec0adb57ce4aba8546875e7693177e0535f34d2c49b
+       EOF
+'
+
 test_expect_success \
     'populate workdir' \
     'mkdir a &&
@@ -369,11 +376,10 @@ test_lazy_prereq TAR_HUGE '
 '
 
 test_expect_success LONG_IS_64BIT 'set up repository with huge blob' '
-       obj_d=19 &&
-       obj_f=f9c8273ec45a8938e6999cb59b3ff66739902a &&
-       obj=${obj_d}${obj_f} &&
-       mkdir -p .git/objects/$obj_d &&
-       cp "$TEST_DIRECTORY"/t5000/$obj .git/objects/$obj_d/$obj_f &&
+       obj=$(test_oid obj) &&
+       path=$(test_oid_to_path $obj) &&
+       mkdir -p .git/objects/$(dirname $path) &&
+       cp "$TEST_DIRECTORY"/t5000/huge-object .git/objects/$path &&
        rm -f .git/index &&
        git update-index --add --cacheinfo 100644,$obj,huge &&
        git commit -m huge
diff --git a/t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a b/t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a
deleted file mode 100644 (file)
index 5cbe9ec..0000000
Binary files a/t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a and /dev/null differ
diff --git a/t/t5000/huge-object b/t/t5000/huge-object
new file mode 100644 (file)
index 0000000..5cbe9ec
Binary files /dev/null and b/t/t5000/huge-object differ
index 03f45a1ed9023c2b3371bdac70f7abadd14b4202..99f4ef4c19dff028facac6da810c973b3a82a4fc 100755 (executable)
@@ -319,7 +319,9 @@ test_expect_success 'add octopus merge' '
        git merge commits/3 commits/4 &&
        git branch merge/octopus &&
        git commit-graph write --reachable --split &&
-       git commit-graph verify &&
+       git commit-graph verify 2>err &&
+       test_line_count = 3 err &&
+       test_i18ngrep ! warning err &&
        test_line_count = 3 $graphdir/commit-graph-chain
 '
 
index 49a394bd75dde817700850187966c3d31ae03f17..bdc42e9440cb6c2a37bd2109942f7fe0431d0970 100755 (executable)
@@ -615,6 +615,7 @@ test_expect_success 'broken branch creation' '
        git add missing/MISSING &&
        git commit -m "6(broken): Added file that will be deleted" &&
        git tag BROKEN_HASH6 &&
+       deleted=$(git rev-parse --verify HEAD:missing) &&
        add_line_into_file "7(broken): second line on a broken branch" hello2 &&
        git tag BROKEN_HASH7 &&
        add_line_into_file "8(broken): third line on a broken branch" hello2 &&
@@ -622,12 +623,12 @@ test_expect_success 'broken branch creation' '
        git rm missing/MISSING &&
        git commit -m "9(broken): Remove missing file" &&
        git tag BROKEN_HASH9 &&
-       rm .git/objects/39/f7e61a724187ab767d2e08442d9b6b9dab587d
+       rm .git/objects/$(test_oid_to_path $deleted)
 '
 
 echo "" > expected.ok
 cat > expected.missing-tree.default <<EOF
-fatal: unable to read tree 39f7e61a724187ab767d2e08442d9b6b9dab587d
+fatal: unable to read tree $deleted
 EOF
 
 test_expect_success 'bisect fails if tree is broken on start commit' '
@@ -713,12 +714,12 @@ test_expect_success 'bisect: demonstrate identification of damage boundary' "
 "
 
 cat > expected.bisect-log <<EOF
-# bad: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.
-# good: [7b7f204a749c3125d5224ed61ea2ae1187ad046f] Add <2: A new day for git> into <hello>.
-git bisect start '32a594a3fdac2d57cf6d02987e30eec68511498c' '7b7f204a749c3125d5224ed61ea2ae1187ad046f'
-# good: [3de952f2416b6084f557ec417709eac740c6818c] Add <3: Another new day for git> into <hello>.
-git bisect good 3de952f2416b6084f557ec417709eac740c6818c
-# first bad commit: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.
+# bad: [$HASH4] Add <4: Ciao for now> into <hello>.
+# good: [$HASH2] Add <2: A new day for git> into <hello>.
+git bisect start '$HASH4' '$HASH2'
+# good: [$HASH3] Add <3: Another new day for git> into <hello>.
+git bisect good $HASH3
+# first bad commit: [$HASH4] Add <4: Ciao for now> into <hello>.
 EOF
 
 test_expect_success 'bisect log: successful result' '
@@ -731,14 +732,14 @@ test_expect_success 'bisect log: successful result' '
 '
 
 cat > expected.bisect-skip-log <<EOF
-# bad: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.
-# good: [7b7f204a749c3125d5224ed61ea2ae1187ad046f] Add <2: A new day for git> into <hello>.
-git bisect start '32a594a3fdac2d57cf6d02987e30eec68511498c' '7b7f204a749c3125d5224ed61ea2ae1187ad046f'
-# skip: [3de952f2416b6084f557ec417709eac740c6818c] Add <3: Another new day for git> into <hello>.
-git bisect skip 3de952f2416b6084f557ec417709eac740c6818c
+# bad: [$HASH4] Add <4: Ciao for now> into <hello>.
+# good: [$HASH2] Add <2: A new day for git> into <hello>.
+git bisect start '$HASH4' '$HASH2'
+# skip: [$HASH3] Add <3: Another new day for git> into <hello>.
+git bisect skip $HASH3
 # only skipped commits left to test
-# possible first bad commit: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.
-# possible first bad commit: [3de952f2416b6084f557ec417709eac740c6818c] Add <3: Another new day for git> into <hello>.
+# possible first bad commit: [$HASH4] Add <4: Ciao for now> into <hello>.
+# possible first bad commit: [$HASH3] Add <3: Another new day for git> into <hello>.
 EOF
 
 test_expect_success 'bisect log: only skip commits left' '
index 50b7543483e9988f3a97d7782e11504f82558af4..c966147d5d73ee669321f3efcf57e32a80259076 100755 (executable)
@@ -4403,4 +4403,115 @@ test_expect_success '13d-check(info): messages for rename/rename(1to1) via dual
        )
 '
 
+# Testcase 13e, directory rename in virtual merge base
+#
+# This testcase has a slightly different setup than all the above cases, in
+# order to include a recursive case:
+#
+#      A   C
+#      o - o
+#     / \ / \
+#  O o   X   ?
+#     \ / \ /
+#      o   o
+#      B   D
+#
+#   Commit O: a/{z,y}
+#   Commit A: b/{z,y}
+#   Commit B: a/{z,y,x}
+#   Commit C: b/{z,y,x}
+#   Commit D: b/{z,y}, a/x
+#   Expected: b/{z,y,x}  (sort of; see below for why this might not be expected)
+#
+#   NOTES: 'X' represents a virtual merge base.  With the default of
+#          directory rename detection yielding conflicts, merging A and B
+#          results in a conflict complaining about whether 'x' should be
+#          under 'a/' or 'b/'.  However, when creating the virtual merge
+#          base 'X', since virtual merge bases need to be written out as a
+#          tree, we cannot have a conflict, so some resolution has to be
+#          picked.
+#
+#          In choosing the right resolution, it's worth noting here that
+#          commits C & D are merges of A & B that choose different
+#          locations for 'x' (i.e. they resolve the conflict differently),
+#          and so it would be nice when merging C & D if git could detect
+#          this difference of opinion and report a conflict.  But the only
+#          way to do so that I can think of would be to have the virtual
+#          merge base place 'x' in some directory other than either 'a/' or
+#          'b/', which seems a little weird -- especially since it'd result
+#          in a rename/rename(1to2) conflict with a source path that never
+#          existed in any version.
+#
+#          So, for now, when directory rename detection is set to
+#          'conflict' just avoid doing directory rename detection at all in
+#          the recursive case.  This will not allow us to detect a conflict
+#          in the outer merge for this special kind of setup, but it at
+#          least avoids hitting a BUG().
+#
+test_expect_success '13e-setup: directory rename detection in recursive case' '
+       test_create_repo 13e &&
+       (
+               cd 13e &&
+
+               mkdir a &&
+               echo z >a/z &&
+               echo y >a/y &&
+               git add a &&
+               test_tick &&
+               git commit -m "O" &&
+
+               git branch O &&
+               git branch A &&
+               git branch B &&
+
+               git checkout A &&
+               git mv a/ b/ &&
+               test_tick &&
+               git commit -m "A" &&
+
+               git checkout B &&
+               echo x >a/x &&
+               git add a &&
+               test_tick &&
+               git commit -m "B" &&
+
+               git branch C A &&
+               git branch D B &&
+
+               git checkout C &&
+               test_must_fail git -c merge.directoryRenames=conflict merge B &&
+               git add b/x &&
+               test_tick &&
+               git commit -m "C" &&
+
+
+               git checkout D &&
+               test_must_fail git -c merge.directoryRenames=conflict merge A &&
+               git add b/x &&
+               mkdir a &&
+               git mv b/x a/x &&
+               test_tick &&
+               git commit -m "D"
+       )
+'
+
+test_expect_success '13e-check: directory rename detection in recursive case' '
+       (
+               cd 13e &&
+
+               git checkout --quiet D^0 &&
+
+               git -c merge.directoryRenames=conflict merge -s recursive C^0 >out 2>err &&
+
+               test_i18ngrep ! CONFLICT out &&
+               test_i18ngrep ! BUG: err &&
+               test_i18ngrep ! core.dumped err &&
+               test_must_be_empty err &&
+
+               git ls-files >paths &&
+               ! grep a/x paths &&
+               grep b/x paths
+       )
+'
+
 test_done
index 7976fa7bcce8ed11c403a4923d9ce3e7155765a0..00e09a375c2e6e3bfce2c2f8ce93493513082b2d 100755 (executable)
@@ -7,8 +7,6 @@ test_description='Test automatic use of a pager.'
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
 test_expect_success 'setup' '
-       : squelch advice messages during the transition &&
-       git config --global log.mailmap false &&
        sane_unset GIT_PAGER GIT_PAGER_IN_USE &&
        test_unconfig core.pager &&
 
index 0e9af832c9790f3e329fc59d61b8bc177c151b48..4e855bc21b45c47a2646f7524b66bbdda87698c8 100755 (executable)
@@ -243,10 +243,23 @@ test_expect_success 'no bitmaps created if .keep files present' '
        pack=$(ls bare.git/objects/pack/*.pack) &&
        test_path_is_file "$pack" &&
        keep=${pack%.pack}.keep &&
+       test_when_finished "rm -f \"\$keep\"" &&
        >"$keep" &&
-       git -C bare.git repack -ad &&
+       git -C bare.git repack -ad 2>stderr &&
+       test_must_be_empty stderr &&
        find bare.git/objects/pack/ -type f -name "*.bitmap" >actual &&
        test_must_be_empty actual
 '
 
+test_expect_success 'auto-bitmaps do not complain if unavailable' '
+       test_config -C bare.git pack.packSizeLimit 1M &&
+       blob=$(test-tool genrandom big $((1024*1024)) |
+              git -C bare.git hash-object -w --stdin) &&
+       git -C bare.git update-ref refs/tags/big $blob &&
+       git -C bare.git repack -ad 2>stderr &&
+       test_must_be_empty stderr &&
+       find bare.git/objects/pack -type f -name "*.bitmap" >actual &&
+       test_must_be_empty actual
+'
+
 test_done
index d4f199391f1abe839e55d5abab8a9476fbfc1d35..e0b3f28d3a96e1b937f4c31e0a3d2e8fb3e6fed5 100644 (file)
@@ -1430,6 +1430,13 @@ test_oid () {
        eval "printf '%s' \"\${$var}\""
 }
 
+# Insert a slash into an object ID so it can be used to reference a location
+# under ".git/objects".  For example, "deadbeef..." becomes "de/adbeef..".
+test_oid_to_path () {
+       local basename=${1#??}
+       echo "${1%$basename}/$basename"
+}
+
 # Choose a port number based on the test script's number and store it in
 # the given variable name, unless that variable already contains a number.
 test_set_port () {
index b0cfdc8011c3cf06db89f1fa19c9c2586fcfe4df..77dad5b92048851c622a35d8b34d802fbd0ecac6 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef STATUS_H
 #define STATUS_H
 
-#include <stdio.h>
 #include "string-list.h"
 #include "color.h"
 #include "pathspec.h"
index ec85f5992bd2c5148382eaba73b6c4c51c74dbf2..c7b35a9667f322c151bc8de276654ecd38974aef 100644 (file)
@@ -42,8 +42,6 @@
  */
 
 #include "xinclude.h"
-#include "xtypes.h"
-#include "xdiff.h"
 
 #define MAX_PTR        UINT_MAX
 #define MAX_CNT        UINT_MAX
index f3573d9f00e77ab551b7f109f29356721165ff47..3c5601b602a24cb6cd6e063466369b1a90a14f9f 100644 (file)
@@ -20,8 +20,6 @@
  *
  */
 #include "xinclude.h"
-#include "xtypes.h"
-#include "xdiff.h"
 
 /*
  * The basic idea of patience diff is to find lines that are unique in
index 963e1c58b9049f1b9ee94537171bd3c6cd21680f..cfa6e2220ffd0461ce3293911c86366f6ccb1b05 100644 (file)
  *
  */
 
-#include <limits.h>
-#include <assert.h>
 #include "xinclude.h"
 
 
-
-
 long xdl_bogosqrt(long n) {
        long i;