Merge branch 'jk/alt-odb-cleanup'
authorJunio C Hamano <gitster@pobox.com>
Thu, 10 Nov 2016 21:17:30 +0000 (13:17 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Nov 2016 21:17:30 +0000 (13:17 -0800)
Fix a corner-case regression in a topic that graduated during the
v2.11 cycle.

* jk/alt-odb-cleanup:
alternates: re-allow relative paths from environment

sha1_file.c
t/t5615-alternate-env.sh [new file with mode: 0755]
index 5457314e6aaaf1a30d33f68c8e1005f8db584564..9c86d1924a23e4c81369f34ec8e1058c2dd15c1f 100644 (file)
@@ -296,7 +296,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        }
        strbuf_addstr(&pathbuf, entry);
 
-       if (strbuf_normalize_path(&pathbuf) < 0) {
+       if (strbuf_normalize_path(&pathbuf) < 0 && relative_base) {
                error("unable to normalize alternate object path: %s",
                      pathbuf.buf);
                strbuf_release(&pathbuf);
diff --git a/t/t5615-alternate-env.sh b/t/t5615-alternate-env.sh
new file mode 100755 (executable)
index 0000000..22d9d81
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+test_description='handling of alternates in environment variables'
+. ./test-lib.sh
+
+check_obj () {
+       alt=$1; shift
+       while read obj expect
+       do
+               echo "$obj" >&3 &&
+               echo "$obj $expect" >&4
+       done 3>input 4>expect &&
+       GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \
+               git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \
+               <input >actual &&
+       test_cmp expect actual
+}
+
+test_expect_success 'create alternate repositories' '
+       git init --bare one.git &&
+       one=$(echo one | git -C one.git hash-object -w --stdin) &&
+       git init --bare two.git &&
+       two=$(echo two | git -C two.git hash-object -w --stdin)
+'
+
+test_expect_success 'objects inaccessible without alternates' '
+       check_obj "" <<-EOF
+       $one missing
+       $two missing
+       EOF
+'
+
+test_expect_success 'access alternate via absolute path' '
+       check_obj "$(pwd)/one.git/objects" <<-EOF
+       $one blob
+       $two missing
+       EOF
+'
+
+test_expect_success 'access multiple alternates' '
+       check_obj "$(pwd)/one.git/objects:$(pwd)/two.git/objects" <<-EOF
+       $one blob
+       $two blob
+       EOF
+'
+
+# bare paths are relative from $GIT_DIR
+test_expect_success 'access alternate via relative path (bare)' '
+       git init --bare bare.git &&
+       check_obj "../one.git/objects" -C bare.git <<-EOF
+       $one blob
+       EOF
+'
+
+# non-bare paths are relative to top of worktree
+test_expect_success 'access alternate via relative path (worktree)' '
+       git init worktree &&
+       check_obj "../one.git/objects" -C worktree <<-EOF
+       $one blob
+       EOF
+'
+
+# path is computed after moving to top-level of worktree
+test_expect_success 'access alternate via relative path (subdir)' '
+       mkdir subdir &&
+       check_obj "one.git/objects" -C subdir <<-EOF
+       $one blob
+       EOF
+'
+
+test_done