Add --progress and --dissociate to git submodule
v4 cover Add --progress and --dissociate to git submodule
These patches add --progress and --dissociate options to git submodule.
The --progress option existed beforehand, but only for the update command and it was left undocumented.
Both add and update submodule commands supported --reference, but not its pair option --dissociate which allows for independent clones rather than depending on the reference.
This is a resubmission with comments from Stefan Beller, Eric Sunshine, and Junio C Hamano addressed.
Casey Fitzpatrick (3):
submodule: clean up subsititions in script
submodule: add --progress option to add command
submodule: add --dissociate option to add/update commands
Documentation/git-submodule.txt | 17 ++++++++++++++++- builtin/submodule--helper.c | 16 +++++++++++++--- git-submodule.sh | 21 ++++++++++++++++----- t/t7400-submodule-basic.sh | 16 ++++++++++++++++ t/t7408-submodule-reference.sh | 17 +++++++++++++++++ 5 files changed, 78 insertions(+), 9 deletions(-)
Signature · 1 line
2.17.0.1.ge0414f29c.dirty
PATCH v4 1/3 submodule: clean up subsititions in script
'recommend_shallow' and 'jobs' variables do not need quotes. They only hold a single token value, and even if they were multi-token it is likely we would want them split at IFS rather than pass a single string.
'progress' is a boolean value. Treat it like the other boolean values in the script by using a substitution.
--- git-submodule.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
git-submodule.sh +4 -4
@@ -465,7 +465,7 @@ cmd_update() GIT_QUIET=1 ;; --progress) - progress="--progress" + progress=1 ;; -i|--init) init=1
@@ -542,14 +542,14 @@ cmd_update() { git submodule--helper update-clone ${GIT_QUIET:+--quiet} \ - ${progress:+"$progress"} \ + ${progress:+"--progress"} \ ${wt_prefix:+--prefix "$wt_prefix"} \ ${prefix:+--recursive-prefix "$prefix"} \ ${update:+--update "$update"} \ ${reference:+"$reference"} \ ${depth:+--depth "$depth"} \ - ${recommend_shallow:+"$recommend_shallow"} \ - ${jobs:+$jobs} \ + $recommend_shallow \ + $jobs \ "$@" || echo "#unmatched" $? } | { err=
Signature · 1 line
2.17.0.1.ge0414f29c.dirty
PATCH v4 2/3 submodule: add --progress option to add command
In reply to Casey FitzpatrickThe '--progress' was introduced in 72c5f88311d (clone: pass --progress decision to recursive submodules, 2016-09-22) to fix the progress reporting of the clone command. Also add the progress option to the 'submodule add' command. The update command already supports the progress flag, but it is not documented.
--- Documentation/git-submodule.txt | 7 +++++++ git-submodule.sh | 5 ++++- t/t7400-submodule-basic.sh | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-)
Documentation/git-submodule.txt +7 -0
@@ -239,6 +239,13 @@ OPTIONS --quiet:: 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:: This option is only valid for the deinit command. Unregister all submodules in the working tree.
git-submodule.sh +4 -1
@@ -117,6 +117,9 @@ cmd_add() -q|--quiet) GIT_QUIET=1 ;; + --progress) + progress=1 + ;; --reference) case "$2" in '') usage ;; esac reference_path=$2
@@ -255,7 +258,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'." 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"} ${depth:+"$depth"} || exit ( sanitize_submodule_env cd "$sm_path" &&
t/t7400-submodule-basic.sh +16 -0
@@ -126,6 +126,22 @@ test_expect_success 'submodule add' ' 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' ' ( cd addtest-ignore &&
Signature · 1 line
2.17.0.1.ge0414f29c.dirty
PATCH v4 3/3 submodule: add --dissociate option to add/update commands
In reply to Casey FitzpatrickAdd --dissociate option to add and update commands, both clone helper commands that already have the --reference option --dissociate pairs with.
--- Documentation/git-submodule.txt | 10 +++++++++- builtin/submodule--helper.c | 16 +++++++++++++--- git-submodule.sh | 10 +++++++++- t/t7408-submodule-reference.sh | 17 +++++++++++++++++ 4 files changed, 48 insertions(+), 5 deletions(-)
Documentation/git-submodule.txt +9 -1
@@ -369,7 +369,15 @@ the submodule itself. 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. +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:: This option is only valid for foreach, update, status and sync commands.
builtin/submodule--helper.c +13 -3
@@ -1056,7 +1056,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, -const char *depth,struct string_list *reference, +const char *depth,struct string_list *reference,int dissociate,int quiet,int progress) {struct child_process cp =CHILD_PROCESS_INIT ;
@@ -1075,6 +1075,8 @@ static int clone_submodule(const char *path, const char *gitdir, const char *urlargv_array_pushl (&cp.args,"--reference" , item->string,NULL ); } +if (dissociate) +argv_array_push (&cp.args,"--dissociate" );if (gitdir && *gitdir)argv_array_pushl (&cp.args,"--separate-git-dir" , gitdir,NULL );
@@ -1190,6 +1192,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)char *p, *path =NULL , *sm_gitdir;struct strbuf sb =STRBUF_INIT ;struct string_list reference =STRING_LIST_INIT_NODUP ; +int dissociate =0 ;char *sm_alternate =NULL , *error_strategy =NULL ;struct option module_clone_options[] = {
@@ -1208,6 +1211,8 @@ static int module_clone(int argc, const char **argv, const char *prefix)OPT_STRING_LIST (0 ,"reference" , &reference,N_ ("repo" ),N_ ("reference repository" )), +OPT_BOOL (0 ,"dissociate" , &dissociate, +N_ ("use --reference only while cloning" )),OPT_STRING (0 ,"depth" , &depth,N_ ("string" ), N_("depth for shallow clones")),
@@ -1247,7 +1252,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)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))die (_ ("clone of '%s' into submodule path '%s' failed" ), url, path);
@@ -1300,6 +1305,7 @@ struct submodule_update_clone {int quiet;int recommend_shallow;struct string_list references; +int dissociate;const char *depth;const char *recursive_prefix;const char *prefix;
@@ -1315,7 +1321,7 @@ struct submodule_update_clone {int failed_clones_nr, failed_clones_alloc; };#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, \ STRING_LIST_INIT_DUP, 0, NULL, 0, 0}
@@ -1442,6 +1448,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,for_each_string_list_item (item, &suc->references)argv_array_pushl (&child->args,"--reference" , item->string,NULL ); } +if (suc->dissociate) +argv_array_push (&child->args,"--dissociate" );if (suc->depth)argv_array_push (&child->args, suc->depth);
@@ -1575,6 +1583,8 @@ static int update_clone(int argc, const char **argv, const char *prefix) N_("rebase, merge, checkout or none")),OPT_STRING_LIST (0 ,"reference" , &suc.references,N_ ("repo" ),N_ ("reference repository" )), +OPT_BOOL (0 ,"dissociate" , &suc.dissociate, +N_ ("use --reference only while cloning" )),OPT_STRING (0 ,"depth" , &suc.depth,"<depth>" ,N_ ("Create a shallow clone truncated to the " "specified number of revisions")),
git-submodule.sh +9 -1
@@ -42,6 +42,7 @@ prefix= custom_name= depth= progress= +dissociate= die_if_unmatched () {
@@ -128,6 +129,9 @@ cmd_add() --reference=*) reference_path="${1#--reference=}" ;; + --dissociate) + dissociate=1 + ;; --name) case "$2" in '') usage ;; esac custom_name=$2
@@ -258,7 +262,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'." fi fi - git submodule--helper clone ${GIT_QUIET:+--quiet} ${progress:+"--progress"} --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 cd "$sm_path" &&
@@ -493,6 +497,9 @@ cmd_update() --reference=*) reference="$1" ;; + --dissociate) + dissociate=1 + ;; -m|--merge) update="merge" ;;
@@ -550,6 +557,7 @@ cmd_update() ${prefix:+--recursive-prefix "$prefix"} \ ${update:+--update "$update"} \ ${reference:+"$reference"} \ + ${dissociate:+"--dissociate"} \ ${depth:+--depth "$depth"} \ $recommend_shallow \ $jobs \
t/t7408-submodule-reference.sh +17 -0
@@ -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_expect_success 'submodule add --reference with --dissociate doesnt 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' ' ( 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_expect_success 'updating superproject with --dissociate doesnt 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_when_finished "rm -rf super-clone" && git clone --reference super --recursive super super-clone &&
Signature · 1 line
2.17.0.1.ge0414f29c.dirty
Quoted 8 lines · Casey Fitzpatrick
These patches add --progress and --dissociate options to git submodule.
The --progress option existed beforehand, but only for the update command and it was left undocumented.
Both add and update submodule commands supported --reference, but not its pair option --dissociate which allows for independent clones rather than depending on the reference.
This round hasn't seen any further comment, and I think all the previously raised issues have been resolved in this version, so I am tempted to merge it to 'next'.
One thing that I noticed is that "git submodule -h" does not give any hint about --dissociate even though it talks about --reference with these patches applied, and I think it probably should [*1*].
We can make such an update as incremental patch on top of these, if people cared enough about this, without a further reroll of these three patches.
Thanks.
[Footnote]
*1* It's not like we must list each and every option available---it is perfectly fine to omit less common ones to keep the "-h" output manageably short. But I have a feeling that "--reference" and "--dissociate" should probably be at a similar level of importance, and if we list one we probably should show the other, too.