Merge branch 'jc/log-mailmap-flip-defaults'
authorJunio C Hamano <gitster@pobox.com>
Fri, 2 Aug 2019 20:12:02 +0000 (13:12 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 2 Aug 2019 20:12:02 +0000 (13:12 -0700)
Hotfix for making "git log" use the mailmap by default.

* jc/log-mailmap-flip-defaults:
log: really flip the --mailmap default
log: flip the --mailmap default unconditionally

23 files changed:
Documentation/RelNotes/2.22.1.txt
Documentation/RelNotes/2.23.0.txt
builtin/pack-objects.c
builtin/repack.c
config.c
t/helper/test-dir-iterator.c
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/t5000-tar-tree.sh
t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a [deleted file]
t/t5000/huge-object [new file with mode: 0644]
t/t6030-bisect-porcelain.sh
t/t7700-repack.sh
t/test-lib-functions.sh
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 6ef8f21b5629eef478017dceb610ae21db703eb9..65c8c0e58cdd8c8b46b97b77862f90c4f663d8bb 100644 (file)
@@ -55,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
@@ -71,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.
 
@@ -104,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
@@ -119,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
@@ -179,7 +179,7 @@ Fixes since v2.22
    the same repository was corrupt, which has been corrected.
 
  * 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.
 
  * A "merge -c" instruction during "git rebase --rebase-merges" should
@@ -304,7 +304,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.
 
  * The "git clone" documentation refers to command line options in its
@@ -337,7 +337,7 @@ Fixes since v2.22
    having to consult the other end, which has been corrected.
 
  * 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).
 
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 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 a5b96cb0dcfd0e5b493638bc5d6a310ffbf87db3..c7c30664dad2a027c4cf6b0bac7ecb78080cbcf1 100644 (file)
@@ -4,6 +4,15 @@
 #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
@@ -31,7 +40,7 @@ int cmd__dir_iterator(int argc, const char **argv)
        diter = dir_iterator_begin(path.buf, 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 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 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 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 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..48bd3b467d3f32b7a8fda26a7ff04114afde5aa4 100644 (file)
@@ -1430,6 +1430,12 @@ 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 () {
+       echo "${1%${1#??}}/${1#??}"
+}
+
 # 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 () {