Browse Source

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>
maint
Santi Béjar 17 years ago committed by Junio C Hamano
parent
commit
c6fef0bbea
  1. 37
      git-clone.sh
  2. 45
      t/t5701-clone-local.sh

37
git-clone.sh

@ -210,11 +210,28 @@ if base=$(get_repo_base "$repo"); then @@ -210,11 +210,28 @@ if base=$(get_repo_base "$repo"); then
then
local=yes
fi
elif test -f "$repo"
then
case "$repo" in /*) ;; *) repo="$PWD/$repo" ;; esac
fi

# Decide the directory name of the new repository
if test -n "$2"
then
dir="$2"
else
# Derive one from the repository name
# Try using "humanish" part of source repo if user didn't specify one
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

dir="$2"
# 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')
[ -e "$dir" ] && die "destination directory '$dir' already exists."
[ yes = "$bare" ] && unset GIT_WORK_TREE
[ -n "$GIT_WORK_TREE" ] && [ -e "$GIT_WORK_TREE" ] &&
@ -364,11 +381,17 @@ yes) @@ -364,11 +381,17 @@ yes)
fi
;;
*)
case "$upload_pack" in
'') git-fetch-pack --all -k $quiet $depth $no_progress "$repo";;
*) git-fetch-pack --all -k $quiet "$upload_pack" $depth $no_progress "$repo" ;;
esac >"$GIT_DIR/CLONE_HEAD" ||
if [ -f "$repo" ] ; then
git bundle unbundle "$repo" > "$GIT_DIR/CLONE_HEAD" ||
die "unbundle from '$repo' failed."
else
case "$upload_pack" in
'') git-fetch-pack --all -k $quiet $depth $no_progress "$repo";;
*) git-fetch-pack --all -k \
$quiet "$upload_pack" $depth $no_progress "$repo" ;;
esac >"$GIT_DIR/CLONE_HEAD" ||
die "fetch-pack from '$repo' failed."
fi
;;
esac
;;

45
t/t5701-clone-local.sh

@ -11,6 +11,11 @@ test_expect_success 'preparing origin repository' ' @@ -11,6 +11,11 @@ test_expect_success 'preparing origin repository' '
git clone --bare . x &&
test "$(GIT_CONFIG=a.git/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' '
@ -71,4 +76,44 @@ test_expect_success 'local clone of repo with nonexistent ref in HEAD' ' @@ -71,4 +76,44 @@ test_expect_success 'local clone of repo with nonexistent ref in HEAD' '
git fetch &&
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

Loading…
Cancel
Save