cp "$path" "$path2"
}
+# On Windows, `pwd` returns a path like 'D:/foo/bar'. Prepend '/' to turn
+# it into '/D:/foo/bar', which is what git expects in file:// URLs on Windows.
+# On Unix, the path already starts with '/', so this is a no-op.
+pwd_path=$(pwd)
+case "$pwd_path" in
+[a-zA-Z]:*) pwd_path="/$pwd_path" ;;
+esac
+
+# Allowed characters: alphanumeric, standard path/URI (_ . ~ / : -),
+# and those percent-encoded below (% space = , ;)
+rest=$(printf "%s" "$pwd_path" | tr -d 'a-zA-Z0-9_.~/:% =,;-')
+if test -n "$rest"
+then
+ skip_all="PWD contains unsupported special characters"
+ test_done
+fi
+
+TRASH_DIRECTORY_URL="file://$pwd_path"
+
+encoded_path=$(printf "%s" "$pwd_path" |
+ sed -e 's/%/%25/g' -e 's/ /%20/g' -e 's/=/%3D/g' \
+ -e 's/;/%3B/g' -e 's/,/%2C/g')
+
+ENCODED_TRASH_DIRECTORY_URL="file://$encoded_path"
+
test_expect_success "setup for testing promisor remote advertisement" '
# Create another bare repo called "lop" (for Large Object Promisor)
git init --bare lop &&
initialize_server 1 "$oid" &&
# Configure lop as promisor remote for server
- git -C server remote add lop "file://$(pwd)/lop" &&
+ git -C server remote add lop "$TRASH_DIRECTORY_URL/lop" &&
git -C server config remote.lop.promisor true &&
git -C lop config uploadpack.allowFilter true &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=All \
--no-local --filter="blob:limit=5k" server client &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=All \
--no-local --filter="blob:limit=5k" server client &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=None \
--no-local --filter="blob:limit=5k" server client &&
git -C client init &&
git -C client config remote.lop.promisor true &&
git -C client config remote.lop.fetch "+refs/heads/*:refs/remotes/lop/*" &&
- git -C client config remote.lop.url "file://$(pwd)/lop" &&
- git -C client config remote.server.url "file://$(pwd)/server" &&
+ git -C client config remote.lop.url "$TRASH_DIRECTORY_URL/lop" &&
+ git -C client config remote.server.url "$TRASH_DIRECTORY_URL/server" &&
git -C client config remote.server.fetch "+refs/heads/*:refs/remotes/server/*" &&
git -C client config promisor.acceptfromserver All &&
GIT_NO_LAZY_FETCH=0 git -C client fetch --filter="blob:limit=5k" server &&
GIT_TRACE="$(pwd)/trace" GIT_NO_LAZY_FETCH=0 git clone \
-c remote.unused_lop.promisor=true \
-c remote.unused_lop.fetch="+refs/heads/*:refs/remotes/unused_lop/*" \
- -c remote.unused_lop.url="file://$(pwd)/unused_lop" \
+ -c remote.unused_lop.url="$TRASH_DIRECTORY_URL/unused_lop" \
-c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=All \
--no-local --filter="blob:limit=5k" server client &&
git -C client init &&
git -C client config remote.unused_lop.promisor true &&
git -C client config remote.unused_lop.fetch "+refs/heads/*:refs/remotes/unused_lop/*" &&
- git -C client config remote.unused_lop.url "file://$(pwd)/unused_lop" &&
+ git -C client config remote.unused_lop.url "$TRASH_DIRECTORY_URL/unused_lop" &&
git -C client config remote.lop.promisor true &&
git -C client config remote.lop.fetch "+refs/heads/*:refs/remotes/lop/*" &&
- git -C client config remote.lop.url "file://$(pwd)/lop" &&
- git -C client config remote.server.url "file://$(pwd)/server" &&
+ git -C client config remote.lop.url "$TRASH_DIRECTORY_URL/lop" &&
+ git -C client config remote.server.url "$TRASH_DIRECTORY_URL/server" &&
git -C client config remote.server.fetch "+refs/heads/*:refs/remotes/server/*" &&
git -C client config promisor.acceptfromserver All &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=KnownName \
--no-local --filter="blob:limit=5k" server client &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.serverTwo.promisor=true \
-c remote.serverTwo.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.serverTwo.url="file://$(pwd)/lop" \
+ -c remote.serverTwo.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=KnownName \
--no-local --filter="blob:limit=5k" server client &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=KnownUrl \
--no-local --filter="blob:limit=5k" server client &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/serverTwo" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/serverTwo" \
-c promisor.acceptfromserver=KnownUrl \
--no-local --filter="blob:limit=5k" server client &&
git -C server config promisor.advertise true &&
test_when_finished "rm -rf client" &&
- test_when_finished "git -C server config set remote.lop.url \"file://$(pwd)/lop\"" &&
+ test_when_finished "git -C server config set remote.lop.url \"$TRASH_DIRECTORY_URL/lop\"" &&
git -C server config unset remote.lop.url &&
# Clone from server to create a client
# missing, so the remote name will be used instead which will fail.
test_must_fail env GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=KnownUrl \
--no-local --filter="blob:limit=5k" server client &&
git -C server config promisor.advertise true &&
test_when_finished "rm -rf client" &&
- test_when_finished "git -C server config set remote.lop.url \"file://$(pwd)/lop\"" &&
+ test_when_finished "git -C server config set remote.lop.url \"$TRASH_DIRECTORY_URL/lop\"" &&
git -C server config set remote.lop.url "" &&
# Clone from server to create a client
# so the remote name will be used instead which will fail.
test_must_fail env GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=KnownUrl \
--no-local --filter="blob:limit=5k" server client &&
GIT_TRACE_PACKET="$(pwd)/trace" GIT_NO_LAZY_FETCH=0 git clone \
-c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=All \
--no-local --filter="blob:limit=5k" server client &&
# Check that fields are properly transmitted
- ENCODED_URL=$(echo "file://$(pwd)/lop" | sed -e "s/ /%20/g") &&
- PR1="name=lop,url=$ENCODED_URL,partialCloneFilter=blob:none" &&
+ PR1="name=lop,url=$ENCODED_TRASH_DIRECTORY_URL/lop,partialCloneFilter=blob:none" &&
PR2="name=otherLop,url=https://invalid.invalid,partialCloneFilter=blob:limit=10k,token=fooBar" &&
test_grep "clone< promisor-remote=$PR1;$PR2" trace &&
test_grep "clone> promisor-remote=lop;otherLop" trace &&
GIT_TRACE_PACKET="$(pwd)/trace" GIT_NO_LAZY_FETCH=0 git clone \
-c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c remote.lop.partialCloneFilter="blob:none" \
-c promisor.acceptfromserver=All \
-c promisor.checkFields=partialcloneFilter \
--no-local --filter="blob:limit=5k" server client &&
# Check that fields are properly transmitted
- ENCODED_URL=$(echo "file://$(pwd)/lop" | sed -e "s/ /%20/g") &&
- PR1="name=lop,url=$ENCODED_URL,partialCloneFilter=blob:none" &&
+ PR1="name=lop,url=$ENCODED_TRASH_DIRECTORY_URL/lop,partialCloneFilter=blob:none" &&
PR2="name=otherLop,url=https://invalid.invalid,partialCloneFilter=blob:limit=10k,token=fooBar" &&
test_grep "clone< promisor-remote=$PR1;$PR2" trace &&
test_grep "clone> promisor-remote=lop" trace &&
GIT_TRACE_PACKET="$(pwd)/trace" GIT_NO_LAZY_FETCH=0 git clone \
-c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c remote.lop.token="fooYYY" \
-c remote.lop.partialCloneFilter="blob:none" \
-c promisor.acceptfromserver=All \
GIT_TRACE_PACKET="$(pwd)/trace" GIT_NO_LAZY_FETCH=0 git clone \
-c remote.lop.promisor=true \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=All \
--no-local --filter=auto server client 2>err &&
# Clone from server to create a client
GIT_NO_LAZY_FETCH=0 git clone -c remote.lop.promisor=true \
-c remote.lop.fetch="+refs/heads/*:refs/remotes/lop/*" \
- -c remote.lop.url="file://$(pwd)/lop" \
+ -c remote.lop.url="$TRASH_DIRECTORY_URL/lop" \
-c promisor.acceptfromserver=All \
--no-local --filter="blob:limit=5k" server client &&