Browse Source

Merge branch 'cf/submodule-progress-dissociate'

"git submodule update" and "git submodule add" supported the
"--reference" option to borrow objects from a neighbouring local
repository like "git clone" does, but lacked the more recent
invention "--dissociate".  Also "git submodule add" has been taught
to take the "--progress" option.

* cf/submodule-progress-dissociate:
  submodule: add --dissociate option to add/update commands
  submodule: add --progress option to add command
  submodule: clean up substitutions in script
maint
Junio C Hamano 7 years ago
parent
commit
2a98a8794e
  1. 17
      Documentation/git-submodule.txt
  2. 16
      builtin/submodule--helper.c
  3. 21
      git-submodule.sh
  4. 16
      t/t7400-submodule-basic.sh
  5. 17
      t/t7408-submodule-reference.sh

17
Documentation/git-submodule.txt

@ -239,6 +239,13 @@ OPTIONS
--quiet:: --quiet::
Only print error messages. Only print error messages.


--progress::
This option is only valid for add and update commands.
Progress status is reported on the standard error stream
by default when it is attached to a terminal, unless -q
is specified. This flag forces progress status even if the
standard error stream is not directed to a terminal.

--all:: --all::
This option is only valid for the deinit command. Unregister all This option is only valid for the deinit command. Unregister all
submodules in the working tree. submodules in the working tree.
@ -362,7 +369,15 @@ the submodule itself.
this option will be passed to the linkgit:git-clone[1] command. this option will be passed to the linkgit:git-clone[1] command.
+ +
*NOTE*: Do *not* use this option unless you have read the note *NOTE*: Do *not* use this option unless you have read the note
for linkgit:git-clone[1]'s `--reference` and `--shared` options carefully. for linkgit:git-clone[1]'s `--reference`, `--shared`, and `--dissociate`
options carefully.

--dissociate::
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*: see the NOTE for the `--reference` option.


--recursive:: --recursive::
This option is only valid for foreach, update, status and sync commands. This option is only valid for foreach, update, status and sync commands.

16
builtin/submodule--helper.c

@ -1065,7 +1065,7 @@ static int module_deinit(int argc, const char **argv, const char *prefix)
} }


static int clone_submodule(const char *path, const char *gitdir, const char *url, static int clone_submodule(const char *path, const char *gitdir, const char *url,
const char *depth, struct string_list *reference, const char *depth, struct string_list *reference, int dissociate,
int quiet, int progress) int quiet, int progress)
{ {
struct child_process cp = CHILD_PROCESS_INIT; struct child_process cp = CHILD_PROCESS_INIT;
@ -1084,6 +1084,8 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url
argv_array_pushl(&cp.args, "--reference", argv_array_pushl(&cp.args, "--reference",
item->string, NULL); item->string, NULL);
} }
if (dissociate)
argv_array_push(&cp.args, "--dissociate");
if (gitdir && *gitdir) if (gitdir && *gitdir)
argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL); argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL);


@ -1199,6 +1201,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
char *p, *path = NULL, *sm_gitdir; char *p, *path = NULL, *sm_gitdir;
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
struct string_list reference = STRING_LIST_INIT_NODUP; struct string_list reference = STRING_LIST_INIT_NODUP;
int dissociate = 0;
char *sm_alternate = NULL, *error_strategy = NULL; char *sm_alternate = NULL, *error_strategy = NULL;


struct option module_clone_options[] = { struct option module_clone_options[] = {
@ -1217,6 +1220,8 @@ static int module_clone(int argc, const char **argv, const char *prefix)
OPT_STRING_LIST(0, "reference", &reference, OPT_STRING_LIST(0, "reference", &reference,
N_("repo"), N_("repo"),
N_("reference repository")), N_("reference repository")),
OPT_BOOL(0, "dissociate", &dissociate,
N_("use --reference only while cloning")),
OPT_STRING(0, "depth", &depth, OPT_STRING(0, "depth", &depth,
N_("string"), N_("string"),
N_("depth for shallow clones")), N_("depth for shallow clones")),
@ -1256,7 +1261,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)


prepare_possible_alternates(name, &reference); prepare_possible_alternates(name, &reference);


if (clone_submodule(path, sm_gitdir, url, depth, &reference, if (clone_submodule(path, sm_gitdir, url, depth, &reference, dissociate,
quiet, progress)) quiet, progress))
die(_("clone of '%s' into submodule path '%s' failed"), die(_("clone of '%s' into submodule path '%s' failed"),
url, path); url, path);
@ -1308,6 +1313,7 @@ struct submodule_update_clone {
int quiet; int quiet;
int recommend_shallow; int recommend_shallow;
struct string_list references; struct string_list references;
int dissociate;
const char *depth; const char *depth;
const char *recursive_prefix; const char *recursive_prefix;
const char *prefix; const char *prefix;
@ -1323,7 +1329,7 @@ struct submodule_update_clone {
int failed_clones_nr, failed_clones_alloc; int failed_clones_nr, failed_clones_alloc;
}; };
#define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \ #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, \ SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, 0, \
NULL, NULL, NULL, \ NULL, NULL, NULL, \
STRING_LIST_INIT_DUP, 0, NULL, 0, 0} STRING_LIST_INIT_DUP, 0, NULL, 0, 0}


@ -1450,6 +1456,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
for_each_string_list_item(item, &suc->references) for_each_string_list_item(item, &suc->references)
argv_array_pushl(&child->args, "--reference", item->string, NULL); argv_array_pushl(&child->args, "--reference", item->string, NULL);
} }
if (suc->dissociate)
argv_array_push(&child->args, "--dissociate");
if (suc->depth) if (suc->depth)
argv_array_push(&child->args, suc->depth); argv_array_push(&child->args, suc->depth);


@ -1583,6 +1591,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
N_("rebase, merge, checkout or none")), N_("rebase, merge, checkout or none")),
OPT_STRING_LIST(0, "reference", &suc.references, N_("repo"), OPT_STRING_LIST(0, "reference", &suc.references, N_("repo"),
N_("reference repository")), N_("reference repository")),
OPT_BOOL(0, "dissociate", &suc.dissociate,
N_("use --reference only while cloning")),
OPT_STRING(0, "depth", &suc.depth, "<depth>", OPT_STRING(0, "depth", &suc.depth, "<depth>",
N_("Create a shallow clone truncated to the " N_("Create a shallow clone truncated to the "
"specified number of revisions")), "specified number of revisions")),

21
git-submodule.sh

@ -42,6 +42,7 @@ prefix=
custom_name= custom_name=
depth= depth=
progress= progress=
dissociate=


die_if_unmatched () die_if_unmatched ()
{ {
@ -117,6 +118,9 @@ cmd_add()
-q|--quiet) -q|--quiet)
GIT_QUIET=1 GIT_QUIET=1
;; ;;
--progress)
progress=1
;;
--reference) --reference)
case "$2" in '') usage ;; esac case "$2" in '') usage ;; esac
reference_path=$2 reference_path=$2
@ -125,6 +129,9 @@ cmd_add()
--reference=*) --reference=*)
reference_path="${1#--reference=}" reference_path="${1#--reference=}"
;; ;;
--dissociate)
dissociate=1
;;
--name) --name)
case "$2" in '') usage ;; esac case "$2" in '') usage ;; esac
custom_name=$2 custom_name=$2
@ -260,7 +267,7 @@ or you are unsure what this means choose another name with the '--name' option."
eval_gettextln "Reactivating local git directory for submodule '\$sm_name'." eval_gettextln "Reactivating local git directory for submodule '\$sm_name'."
fi fi
fi fi
git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${depth:+"$depth"} || exit git submodule--helper clone ${GIT_QUIET:+--quiet} ${progress:+"--progress"} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${dissociate:+"--dissociate"} ${depth:+"$depth"} || exit
( (
sanitize_submodule_env sanitize_submodule_env
cd "$sm_path" && cd "$sm_path" &&
@ -470,7 +477,7 @@ cmd_update()
GIT_QUIET=1 GIT_QUIET=1
;; ;;
--progress) --progress)
progress="--progress" progress=1
;; ;;
-i|--init) -i|--init)
init=1 init=1
@ -495,6 +502,9 @@ cmd_update()
--reference=*) --reference=*)
reference="$1" reference="$1"
;; ;;
--dissociate)
dissociate=1
;;
-m|--merge) -m|--merge)
update="merge" update="merge"
;; ;;
@ -547,14 +557,15 @@ cmd_update()


{ {
git submodule--helper update-clone ${GIT_QUIET:+--quiet} \ git submodule--helper update-clone ${GIT_QUIET:+--quiet} \
${progress:+"$progress"} \ ${progress:+"--progress"} \
${wt_prefix:+--prefix "$wt_prefix"} \ ${wt_prefix:+--prefix "$wt_prefix"} \
${prefix:+--recursive-prefix "$prefix"} \ ${prefix:+--recursive-prefix "$prefix"} \
${update:+--update "$update"} \ ${update:+--update "$update"} \
${reference:+"$reference"} \ ${reference:+"$reference"} \
${dissociate:+"--dissociate"} \
${depth:+--depth "$depth"} \ ${depth:+--depth "$depth"} \
${recommend_shallow:+"$recommend_shallow"} \ $recommend_shallow \
${jobs:+$jobs} \ $jobs \
"$@" || echo "#unmatched" $? "$@" || echo "#unmatched" $?
} | { } | {
err= err=

16
t/t7400-submodule-basic.sh

@ -126,6 +126,22 @@ test_expect_success 'submodule add' '
test_cmp empty untracked test_cmp empty untracked
' '


test_create_repo parent &&
test_commit -C parent one

test_expect_success 'redirected submodule add does not show progress' '
git -C addtest submodule add "file://$submodurl/parent" submod-redirected \
2>err &&
! grep % err &&
test_i18ngrep ! "Checking connectivity" err
'

test_expect_success 'redirected submodule add --progress does show progress' '
git -C addtest submodule add --progress "file://$submodurl/parent" \
submod-redirected-progress 2>err && \
grep % err
'

test_expect_success 'submodule add to .gitignored path fails' ' test_expect_success 'submodule add to .gitignored path fails' '
( (
cd addtest-ignore && cd addtest-ignore &&

17
t/t7408-submodule-reference.sh

@ -59,6 +59,16 @@ test_expect_success 'submodule add --reference uses alternates' '
test_alternate_is_used super/.git/modules/sub/objects/info/alternates super/sub test_alternate_is_used super/.git/modules/sub/objects/info/alternates super/sub
' '


test_expect_success 'submodule add --reference with --dissociate does not use alternates' '
(
cd super &&
git submodule add --reference ../B --dissociate "file://$base_dir/A" sub-dissociate &&
git commit -m B-super-added &&
git repack -ad
) &&
test_path_is_missing super/.git/modules/sub-dissociate/objects/info/alternates
'

test_expect_success 'that reference gets used with add' ' test_expect_success 'that reference gets used with add' '
( (
cd super/sub && cd super/sub &&
@ -82,6 +92,13 @@ test_expect_success 'updating superproject keeps alternates' '
test_alternate_is_used super-clone/.git/modules/sub/objects/info/alternates super-clone/sub test_alternate_is_used super-clone/.git/modules/sub/objects/info/alternates super-clone/sub
' '


test_expect_success 'updating superproject with --dissociate does not keep alternates' '
test_when_finished "rm -rf super-clone" &&
git clone super super-clone &&
git -C super-clone submodule update --init --reference ../B --dissociate &&
test_path_is_missing super-clone/.git/modules/sub/objects/info/alternates
'

test_expect_success 'submodules use alternates when cloning a superproject' ' test_expect_success 'submodules use alternates when cloning a superproject' '
test_when_finished "rm -rf super-clone" && test_when_finished "rm -rf super-clone" &&
git clone --reference super --recursive super super-clone && git clone --reference super --recursive super super-clone &&

Loading…
Cancel
Save