Skip to content

Commit

Permalink
clone: support cloning full bundles
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Santi Béjar authored and Junio C Hamano committed Mar 1, 2008
1 parent 97b97c5 commit c6fef0b
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 7 deletions.
37 changes: 30 additions & 7 deletions git-clone.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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" ] &&
Expand Down Expand Up @@ -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
;;
Expand Down
45 changes: 45 additions & 0 deletions t/t5701-clone-local.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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' '
Expand Down Expand Up @@ -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

0 comments on commit c6fef0b

Please sign in to comment.