Add --reference option to git submodule.

This adds --reference option to git submodule add and
git submodule update commands, which is passed to git clone.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael S. Tsirkin 2009-05-04 22:30:01 +03:00 committed by Junio C Hamano
parent f01f1099f4
commit d92a39590d
3 changed files with 127 additions and 6 deletions

View File

@ -9,10 +9,12 @@ git-submodule - Initialize, update or inspect submodules
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git submodule' [--quiet] add [-b branch] [--] <repository> <path> 'git submodule' [--quiet] add [-b branch]
[--reference <repository>] [--] <repository> <path>
'git submodule' [--quiet] status [--cached] [--] [<path>...] 'git submodule' [--quiet] status [--cached] [--] [<path>...]
'git submodule' [--quiet] init [--] [<path>...] 'git submodule' [--quiet] init [--] [<path>...]
'git submodule' [--quiet] update [--init] [-N|--no-fetch] [--] [<path>...] 'git submodule' [--quiet] update [--init] [-N|--no-fetch]
[--reference <repository>] [--] [<path>...]
'git submodule' [--quiet] summary [--summary-limit <n>] [commit] [--] [<path>...] 'git submodule' [--quiet] summary [--summary-limit <n>] [commit] [--] [<path>...]
'git submodule' [--quiet] foreach <command> 'git submodule' [--quiet] foreach <command>
'git submodule' [--quiet] sync [--] [<path>...] 'git submodule' [--quiet] sync [--] [<path>...]
@ -177,6 +179,14 @@ OPTIONS
This option is only valid for the update command. This option is only valid for the update command.
Don't fetch new objects from the remote site. Don't fetch new objects from the remote site.
--reference <repository>::
This option is only valid for add and update commands. These
commands sometimes need to clone a remote repository. In this case,
this option will be passed to the linkgit:git-clone[1] command.
+
*NOTE*: Do *not* use this option unless you have read the note
for linkgit:git-clone[1]'s --reference and --shared options carefully.
<path>...:: <path>...::
Paths to submodule(s). When specified this will restrict the command Paths to submodule(s). When specified this will restrict the command
to only operate on the submodules found at the specified paths. to only operate on the submodules found at the specified paths.

View File

@ -15,6 +15,7 @@ require_work_tree
command= command=
branch= branch=
quiet= quiet=
reference=
cached= cached=
nofetch= nofetch=
@ -91,6 +92,7 @@ module_clone()
{ {
path=$1 path=$1
url=$2 url=$2
reference="$3"
# If there already is a directory at the submodule path, # If there already is a directory at the submodule path,
# expect it to be empty (since that is the default checkout # expect it to be empty (since that is the default checkout
@ -106,7 +108,12 @@ module_clone()
test -e "$path" && test -e "$path" &&
die "A file already exist at path '$path'" die "A file already exist at path '$path'"
git-clone -n "$url" "$path" || if test -n "$reference"
then
git-clone "$reference" -n "$url" "$path"
else
git-clone -n "$url" "$path"
fi ||
die "Clone of '$url' into submodule path '$path' failed" die "Clone of '$url' into submodule path '$path' failed"
} }
@ -131,6 +138,15 @@ cmd_add()
-q|--quiet) -q|--quiet)
quiet=1 quiet=1
;; ;;
--reference)
case "$2" in '') usage ;; esac
reference="--reference=$2"
shift
;;
--reference=*)
reference="$1"
shift
;;
--) --)
shift shift
break break
@ -203,7 +219,7 @@ cmd_add()
git config submodule."$path".url "$url" git config submodule."$path".url "$url"
else else
module_clone "$path" "$realrepo" || exit module_clone "$path" "$realrepo" "$reference" || exit
( (
unset GIT_DIR unset GIT_DIR
cd "$path" && cd "$path" &&
@ -314,13 +330,22 @@ cmd_update()
quiet=1 quiet=1
;; ;;
-i|--init) -i|--init)
init=1
shift shift
cmd_init "$@" || return
;; ;;
-N|--no-fetch) -N|--no-fetch)
shift shift
nofetch=1 nofetch=1
;; ;;
--reference)
case "$2" in '') usage ;; esac
reference="--reference=$2"
shift 2
;;
--reference=*)
reference="$1"
shift
;;
--) --)
shift shift
break break
@ -334,6 +359,11 @@ cmd_update()
esac esac
done done
if test -n "$init"
then
cmd_init "--" "$@" || return
fi
module_list "$@" | module_list "$@" |
while read mode sha1 stage path while read mode sha1 stage path
do do
@ -351,7 +381,7 @@ cmd_update()
if ! test -d "$path"/.git -o -f "$path"/.git if ! test -d "$path"/.git -o -f "$path"/.git
then then
module_clone "$path" "$url" || exit module_clone "$path" "$url" "$reference"|| exit
subsha1= subsha1=
else else
subsha1=$(unset GIT_DIR; cd "$path" && subsha1=$(unset GIT_DIR; cd "$path" &&

81
t/t7406-submodule-reference.sh Executable file
View File

@ -0,0 +1,81 @@
#!/bin/sh
#
# Copyright (c) 2009, Red Hat Inc, Author: Michael S. Tsirkin (mst@redhat.com)
#
test_description='test clone --reference'
. ./test-lib.sh
base_dir=`pwd`
U=$base_dir/UPLOAD_LOG
test_expect_success 'preparing first repository' \
'test_create_repo A && cd A &&
echo first > file1 &&
git add file1 &&
git commit -m A-initial'
cd "$base_dir"
test_expect_success 'preparing second repository' \
'git clone A B && cd B &&
echo second > file2 &&
git add file2 &&
git commit -m B-addition &&
git repack -a -d &&
git prune'
cd "$base_dir"
test_expect_success 'preparing supermodule' \
'test_create_repo super && cd super &&
echo file > file &&
git add file &&
git commit -m B-super-initial'
cd "$base_dir"
test_expect_success 'submodule add --reference' \
'cd super && git submodule add --reference ../B "file://$base_dir/A" sub &&
git commit -m B-super-added'
cd "$base_dir"
test_expect_success 'after add: existence of info/alternates' \
'test `wc -l <super/sub/.git/objects/info/alternates` = 1'
cd "$base_dir"
test_expect_success 'that reference gets used with add' \
'cd super/sub &&
echo "0 objects, 0 kilobytes" > expected &&
git count-objects > current &&
diff expected current'
cd "$base_dir"
test_expect_success 'cloning supermodule' \
'git clone super super-clone'
cd "$base_dir"
test_expect_success 'update with reference' \
'cd super-clone && git submodule update --init --reference ../B'
cd "$base_dir"
test_expect_success 'after update: existence of info/alternates' \
'test `wc -l <super-clone/sub/.git/objects/info/alternates` = 1'
cd "$base_dir"
test_expect_success 'that reference gets used with update' \
'cd super-clone/sub &&
echo "0 objects, 0 kilobytes" > expected &&
git count-objects > current &&
diff expected current'
cd "$base_dir"
test_done