diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-12-12 15:09:57 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-12-12 15:09:57 -0800 |
commit | 9b519609a625386f517545ab31de147ad6f433cb (patch) | |
tree | bb1ab1d5e115b2447ed5d245f1180c3550b7dd94 | |
parent | 62fe0eb4804c297486a1d421a4f893865fcbc911 (diff) | |
parent | 37a95862c625e1d2ed2609e01b03950253ad4ff9 (diff) | |
download | git-9b519609a625386f517545ab31de147ad6f433cb.tar.gz |
Merge branch 'jk/alt-odb-cleanup' into jk/quote-env-path-list-component
* jk/alt-odb-cleanup:
alternates: re-allow relative paths from environment
-rw-r--r-- | sha1_file.c | 2 | ||||
-rwxr-xr-x | t/t5615-alternate-env.sh | 71 |
2 files changed, 72 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c index 064651947d..fbafdbed94 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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 index 0000000000..22d9d8178b --- /dev/null +++ b/t/t5615-alternate-env.sh @@ -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 |