Merge branch 'jk/alt-odb-cleanup' into jk/quote-env-path-list-component
authorJunio C Hamano <gitster@pobox.com>
Mon, 12 Dec 2016 23:09:57 +0000 (15:09 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Dec 2016 23:09:57 +0000 (15:09 -0800)
* 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 064651947dcab37b014309796aa32df0ed944750..fbafdbed94cfe810000fbf72dd5eaf54b1302d9c 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