clone: support cloning full bundles

The "humanish" part of a bundle is made removing the ".bundle" suffix.

Signed-off-by: Santi Béjar <sbejar@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Santi Béjar 2008-02-29 20:16:19 +01:00 коммит произвёл Junio C Hamano
Родитель 97b97c58e6
Коммит c6fef0bbea
2 изменённых файлов: 75 добавлений и 7 удалений

Просмотреть файл

@ -210,11 +210,28 @@ if base=$(get_repo_base "$repo"); then
then then
local=yes local=yes
fi fi
elif test -f "$repo"
then
case "$repo" in /*) ;; *) repo="$PWD/$repo" ;; esac
fi fi
# Decide the directory name of the new repository
if test -n "$2"
then
dir="$2" dir="$2"
else
# Derive one from the repository name
# Try using "humanish" part of source repo if user didn't specify one # Try using "humanish" part of source repo if user didn't specify one
[ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g') if test -f "$repo"
then
# Cloning from a bundle
dir=$(echo "$repo" | sed -e 's|/*\.bundle$||' -e 's|.*/||g')
else
dir=$(echo "$repo" |
sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
fi
fi
[ -e "$dir" ] && die "destination directory '$dir' already exists." [ -e "$dir" ] && die "destination directory '$dir' already exists."
[ yes = "$bare" ] && unset GIT_WORK_TREE [ yes = "$bare" ] && unset GIT_WORK_TREE
[ -n "$GIT_WORK_TREE" ] && [ -e "$GIT_WORK_TREE" ] && [ -n "$GIT_WORK_TREE" ] && [ -e "$GIT_WORK_TREE" ] &&
@ -364,11 +381,17 @@ yes)
fi fi
;; ;;
*) *)
if [ -f "$repo" ] ; then
git bundle unbundle "$repo" > "$GIT_DIR/CLONE_HEAD" ||
die "unbundle from '$repo' failed."
else
case "$upload_pack" in case "$upload_pack" in
'') git-fetch-pack --all -k $quiet $depth $no_progress "$repo";; '') git-fetch-pack --all -k $quiet $depth $no_progress "$repo";;
*) git-fetch-pack --all -k $quiet "$upload_pack" $depth $no_progress "$repo" ;; *) git-fetch-pack --all -k \
$quiet "$upload_pack" $depth $no_progress "$repo" ;;
esac >"$GIT_DIR/CLONE_HEAD" || esac >"$GIT_DIR/CLONE_HEAD" ||
die "fetch-pack from '$repo' failed." die "fetch-pack from '$repo' failed."
fi
;; ;;
esac esac
;; ;;

Просмотреть файл

@ -11,6 +11,11 @@ test_expect_success 'preparing origin repository' '
git clone --bare . x && git clone --bare . x &&
test "$(GIT_CONFIG=a.git/config git config --bool core.bare)" = true && test "$(GIT_CONFIG=a.git/config git config --bool core.bare)" = true &&
test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true
git bundle create b1.bundle --all HEAD &&
git bundle create b2.bundle --all &&
mkdir dir &&
cp b1.bundle dir/b3
cp b1.bundle b4
' '
test_expect_success 'local clone without .git suffix' ' test_expect_success 'local clone without .git suffix' '
@ -71,4 +76,44 @@ test_expect_success 'local clone of repo with nonexistent ref in HEAD' '
git fetch && git fetch &&
test ! -e .git/refs/remotes/origin/HEAD' test ! -e .git/refs/remotes/origin/HEAD'
test_expect_success 'bundle clone without .bundle suffix' '
cd "$D" &&
git clone dir/b3 &&
cd b3 &&
git fetch
'
test_expect_success 'bundle clone with .bundle suffix' '
cd "$D" &&
git clone b1.bundle &&
cd b1 &&
git fetch
'
test_expect_success 'bundle clone from b4' '
cd "$D" &&
git clone b4 bdl &&
cd bdl &&
git fetch
'
test_expect_success 'bundle clone from b4.bundle that does not exist' '
cd "$D" &&
if git clone b4.bundle bb
then
echo "Oops, should have failed"
false
else
echo happy
fi
'
test_expect_success 'bundle clone with nonexistent HEAD' '
cd "$D" &&
git clone b2.bundle b2 &&
cd b2 &&
git fetch
test ! -e .git/refs/heads/master
'
test_done test_done