* [PATCH v2 1/7] fetch/pull: recurse into submodules when necessary
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
@ 2011-03-01 23:01 ` Jens Lehmann
2011-03-02 15:42 ` Marc Branchaud
2011-03-01 23:01 ` [PATCH v2 2/7] fetch/pull: Add the 'on-demand' value to the --recurse-submodules option Jens Lehmann
` (6 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:01 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
To be able to access all commits of populated submodules referenced by the
superproject it is sufficient to only then let "git fetch" recurse into a
submodule when the new commits fetched in the superproject record new
commits for it. Having these commits present is extremely useful when
using the "--submodule" option to "git diff" (which is what "git gui" and
"gitk" do since 1.6.6), as all submodule commits needed for creating a
descriptive output can be accessed. Also merging submodule commits (added
in 1.7.3) depends on the submodule commits in question being present to
work. Last but not least this enables disconnected operation when using
submodules, as all commits necessary for a successful "git submodule
update -N" will have been fetched automatically. So we choose this mode as
the default for fetch and pull.
Before a new or changed ref from upstream is updated in update_local_ref()
"git rev-list <new-sha1> --not --branches --remotes" is used to determine
all newly fetched commits. These are then walked and diffed against their
parent(s) to see if a submodule has been changed. If that is the case, its
path is stored to be fetched after the superproject fetch is completed.
Using the "--recurse-submodules" or the "--no-recurse-submodules" option
disables the examination of the fetched refs because the result will be
ignored anyway.
There is currently no infrastructure for storing deleted and new
submodules in the .git directory of the superproject. Thats why fetch and
pull for now only fetch submodules that are already checked out and are
not renamed.
In t7403 the "--no-recurse-submodules" argument had to be added to "git
pull" to avoid failure because of the moved upstream submodule repo.
Thanks-to: Jonathan Nieder <jrnieder@gmail.com>
Thanks-to: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
Documentation/fetch-options.txt | 11 ++++
builtin/fetch.c | 25 ++++++---
submodule.c | 106 +++++++++++++++++++++++++++++++++++---
submodule.h | 9 +++
t/t5526-fetch-submodules.sh | 109 +++++++++++++++++++++++++++++++++++++++
t/t7403-submodule-sync.sh | 2 +-
6 files changed, 245 insertions(+), 17 deletions(-)
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index f37276e..ae22f75 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -73,6 +73,17 @@ ifndef::git-pull[]
Prepend <path> to paths printed in informative messages
such as "Fetching submodule foo". This option is used
internally when recursing over submodules.
+
+--submodule-default=[yes|on-demand]::
+ This option is used internally to set the submodule recursion default
+ to either a boolean configuration value representing "true" (for
+ unconditonal recursion) or to "on-demand" (when only those submodules
+ should be fetched of which new commits have been fetched in its
+ superproject).
+ This option will be overridden by the 'fetch.recurseSubmodules' and
+ 'submodule.<name>.fetchRecurseSubmodules' settings in
+ linkgit:gitmodules[5] and linkgit:git-config[1] while all of them
+ are ignored when the "--[no-]recurse-submodules" option is given.
endif::git-pull[]
-u::
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 7efecfe..55d6b1a 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -28,12 +28,6 @@ enum {
TAGS_SET = 2
};
-enum {
- RECURSE_SUBMODULES_OFF = 0,
- RECURSE_SUBMODULES_DEFAULT = 1,
- RECURSE_SUBMODULES_ON = 2
-};
-
static int all, append, dry_run, force, keep, multiple, prune, update_head_ok, verbosity;
static int progress, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
static int tags = TAGS_DEFAULT;
@@ -42,6 +36,7 @@ static const char *upload_pack;
static struct strbuf default_rla = STRBUF_INIT;
static struct transport *transport;
static const char *submodule_prefix = "";
+static const char *submodule_default;
static struct option builtin_fetch_options[] = {
OPT__VERBOSITY(&verbosity),
@@ -73,6 +68,8 @@ static struct option builtin_fetch_options[] = {
"deepen history of shallow clone"),
{ OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, "dir",
"prepend this to submodule path output", PARSE_OPT_HIDDEN },
+ { OPTION_STRING, 0, "submodule-default", &submodule_default, NULL,
+ "default mode for recursion", PARSE_OPT_HIDDEN },
OPT_END()
};
@@ -284,6 +281,9 @@ static int update_local_ref(struct ref *ref,
else {
msg = "storing head";
what = "[new branch]";
+ if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
+ (recurse_submodules != RECURSE_SUBMODULES_ON))
+ check_for_new_submodule_commits(ref->new_sha1);
}
r = s_update_ref(msg, ref, 0);
@@ -299,6 +299,9 @@ static int update_local_ref(struct ref *ref,
strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
strcat(quickref, "..");
strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
+ if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
+ (recurse_submodules != RECURSE_SUBMODULES_ON))
+ check_for_new_submodule_commits(ref->new_sha1);
r = s_update_ref("fast-forward", ref, 1);
sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : ' ',
TRANSPORT_SUMMARY_WIDTH, quickref, REFCOL_WIDTH, remote,
@@ -310,6 +313,9 @@ static int update_local_ref(struct ref *ref,
strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
strcat(quickref, "...");
strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
+ if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
+ (recurse_submodules != RECURSE_SUBMODULES_ON))
+ check_for_new_submodule_commits(ref->new_sha1);
r = s_update_ref("forced-update", ref, 1);
sprintf(display, "%c %-*s %-*s -> %s (%s)", r ? '!' : '+',
TRANSPORT_SUMMARY_WIDTH, quickref, REFCOL_WIDTH, remote,
@@ -949,9 +955,10 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
if (!result && (recurse_submodules != RECURSE_SUBMODULES_OFF)) {
const char *options[10];
int num_options = 0;
- /* Set recursion as default when we already are recursing */
- if (submodule_prefix[0])
- set_config_fetch_recurse_submodules(1);
+ if (submodule_default) {
+ int arg = parse_fetch_recurse_submodules_arg("--submodule-default", submodule_default);
+ set_config_fetch_recurse_submodules(arg);
+ }
gitmodules_config();
git_config(submodule_config, NULL);
add_options_to_argv(&num_options, options);
diff --git a/submodule.c b/submodule.c
index 6f1c107..8f991ce 100644
--- a/submodule.c
+++ b/submodule.c
@@ -12,7 +12,8 @@
struct string_list config_name_for_path;
struct string_list config_fetch_recurse_submodules_for_name;
struct string_list config_ignore_for_name;
-static int config_fetch_recurse_submodules;
+static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
+struct string_list changed_submodule_paths;
static int add_submodule_odb(const char *path)
{
@@ -152,6 +153,20 @@ void handle_ignore_submodules_arg(struct diff_options *diffopt,
die("bad --ignore-submodules argument: %s", arg);
}
+int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg)
+{
+ switch (git_config_maybe_bool(opt, arg)) {
+ case 1:
+ return RECURSE_SUBMODULES_ON;
+ case 0:
+ return RECURSE_SUBMODULES_OFF;
+ default:
+ if (!strcmp(arg, "on-demand"))
+ return RECURSE_SUBMODULES_ON_DEMAND;
+ die("bad %s argument: %s", opt, arg);
+ }
+}
+
void show_submodule_summary(FILE *f, const char *path,
unsigned char one[20], unsigned char two[20],
unsigned dirty_submodule,
@@ -248,27 +263,95 @@ void set_config_fetch_recurse_submodules(int value)
config_fetch_recurse_submodules = value;
}
+static void submodule_collect_changed_cb(struct diff_queue_struct *q,
+ struct diff_options *options,
+ void *data)
+{
+ int i;
+ for (i = 0; i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ if (!S_ISGITLINK(p->two->mode))
+ continue;
+
+ if (S_ISGITLINK(p->one->mode)) {
+ /* NEEDSWORK: We should honor the name configured in
+ * the .gitmodules file of the commit we are examining
+ * here to be able to correctly follow submodules
+ * being moved around. */
+ struct string_list_item *path;
+ path = unsorted_string_list_lookup(&changed_submodule_paths, p->two->path);
+ if (!path)
+ string_list_append(&changed_submodule_paths, xstrdup(p->two->path));
+ } else {
+ /* Submodule is new or was moved here */
+ /* NEEDSWORK: When the .git directories of submodules
+ * live inside the superprojects .git directory some
+ * day we should fetch new submodules directly into
+ * that location too when config or options request
+ * that so they can be checked out from there. */
+ continue;
+ }
+ }
+}
+
+void check_for_new_submodule_commits(unsigned char new_sha1[20])
+{
+ struct rev_info rev;
+ struct commit *commit;
+ const char *argv[] = {NULL, NULL, "--not", "--all", NULL};
+ int argc = ARRAY_SIZE(argv) - 1;
+
+ init_revisions(&rev, NULL);
+ argv[1] = xstrdup(sha1_to_hex(new_sha1));
+ setup_revisions(argc, argv, &rev, NULL);
+ if (prepare_revision_walk(&rev))
+ die("revision walk setup failed");
+
+ /*
+ * Collect all submodules (whether checked out or not) for which new
+ * commits have been recorded upstream in "changed_submodule_paths".
+ */
+ while ((commit = get_revision(&rev))) {
+ struct commit_list *parent = commit->parents;
+ while (parent) {
+ struct diff_options diff_opts;
+ diff_setup(&diff_opts);
+ diff_opts.output_format |= DIFF_FORMAT_CALLBACK;
+ diff_opts.format_callback = submodule_collect_changed_cb;
+ if (diff_setup_done(&diff_opts) < 0)
+ die("diff_setup_done failed");
+ diff_tree_sha1(parent->item->object.sha1, commit->object.sha1, "", &diff_opts);
+ diffcore_std(&diff_opts);
+ diff_flush(&diff_opts);
+ parent = parent->next;
+ }
+ }
+ free((char *)argv[1]);
+}
+
int fetch_populated_submodules(int num_options, const char **options,
const char *prefix, int ignore_config,
int quiet)
{
- int i, result = 0, argc = 0;
+ int i, result = 0, argc = 0, default_argc;
struct child_process cp;
const char **argv;
struct string_list_item *name_for_path;
const char *work_tree = get_git_work_tree();
if (!work_tree)
- return 0;
+ goto out;
if (!the_index.initialized)
if (read_cache() < 0)
die("index file corrupt");
- /* 4: "fetch" (options) "--submodule-prefix" prefix NULL */
- argv = xcalloc(num_options + 4, sizeof(const char *));
+ /* 6: "fetch" (options) --submodule-default default "--submodule-prefix" prefix NULL */
+ argv = xcalloc(num_options + 6, sizeof(const char *));
argv[argc++] = "fetch";
for (i = 0; i < num_options; i++)
argv[argc++] = options[i];
+ argv[argc++] = "--submodule-default";
+ default_argc = argc++;
argv[argc++] = "--submodule-prefix";
memset(&cp, 0, sizeof(cp));
@@ -282,7 +365,7 @@ int fetch_populated_submodules(int num_options, const char **options,
struct strbuf submodule_git_dir = STRBUF_INIT;
struct strbuf submodule_prefix = STRBUF_INIT;
struct cache_entry *ce = active_cache[i];
- const char *git_dir, *name;
+ const char *git_dir, *name, *default_argv;
if (!S_ISGITLINK(ce->ce_mode))
continue;
@@ -292,6 +375,7 @@ int fetch_populated_submodules(int num_options, const char **options,
if (name_for_path)
name = name_for_path->util;
+ default_argv = "yes";
if (!ignore_config) {
struct string_list_item *fetch_recurse_submodules_option;
fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
@@ -299,8 +383,13 @@ int fetch_populated_submodules(int num_options, const char **options,
if (!fetch_recurse_submodules_option->util)
continue;
} else {
- if (!config_fetch_recurse_submodules)
+ if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF)
continue;
+ if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) {
+ if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
+ continue;
+ default_argv = "on-demand";
+ }
}
}
@@ -314,6 +403,7 @@ int fetch_populated_submodules(int num_options, const char **options,
if (!quiet)
printf("Fetching submodule %s%s\n", prefix, ce->name);
cp.dir = submodule_path.buf;
+ argv[default_argc] = default_argv;
argv[argc] = submodule_prefix.buf;
if (run_command(&cp))
result = 1;
@@ -323,6 +413,8 @@ int fetch_populated_submodules(int num_options, const char **options,
strbuf_release(&submodule_prefix);
}
free(argv);
+out:
+ string_list_clear(&changed_submodule_paths, 1);
return result;
}
diff --git a/submodule.h b/submodule.h
index 4729023..3434a8e 100644
--- a/submodule.h
+++ b/submodule.h
@@ -3,17 +3,26 @@
struct diff_options;
+enum {
+ RECURSE_SUBMODULES_ON_DEMAND = -1,
+ RECURSE_SUBMODULES_OFF = 0,
+ RECURSE_SUBMODULES_DEFAULT = 1,
+ RECURSE_SUBMODULES_ON = 2
+};
+
void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
const char *path);
int submodule_config(const char *var, const char *value, void *cb);
void gitmodules_config();
int parse_submodule_config_option(const char *var, const char *value);
void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *);
+int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
void show_submodule_summary(FILE *f, const char *path,
unsigned char one[20], unsigned char two[20],
unsigned dirty_submodule,
const char *del, const char *add, const char *reset);
void set_config_fetch_recurse_submodules(int value);
+void check_for_new_submodule_commits(unsigned char new_sha1[20]);
int fetch_populated_submodules(int num_options, const char **options,
const char *prefix, int ignore_config,
int quiet);
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index a5f4585..6d92f7a 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -192,4 +192,113 @@ test_expect_success "--no-recurse-submodules overrides config setting" '
! test -s actual.err
'
+test_expect_success "Recursion doesn't happen when no new commits are fetched in the superproject" '
+ (
+ cd downstream &&
+ (
+ cd submodule &&
+ git config --unset fetch.recurseSubmodules
+ ) &&
+ git config --unset fetch.recurseSubmodules
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ ! test -s actual.out &&
+ ! test -s actual.err
+'
+
+test_expect_success "Recursion stops when no new submodule commits are fetched" '
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "new submodule" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "Fetching submodule submodule" > expect.out.sub &&
+ echo "From $pwd/." > expect.err.sub &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.sub
+ head -2 expect.err >> expect.err.sub &&
+ (
+ cd downstream &&
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ test_cmp expect.err.sub actual.err &&
+ test_cmp expect.out.sub actual.out
+'
+
+test_expect_success "Recursion doesn't happen when new superproject commits don't change any submodules" '
+ add_upstream_commit &&
+ head1=$(git rev-parse --short HEAD) &&
+ echo a > file &&
+ git add file &&
+ git commit -m "new file" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err.file &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.file &&
+ (
+ cd downstream &&
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ ! test -s actual.out &&
+ test_cmp expect.err.file actual.err
+'
+
+test_expect_success "Recursion picks up config in submodule" '
+ (
+ cd downstream &&
+ git fetch --recurse-submodules &&
+ (
+ cd submodule &&
+ git config fetch.recurseSubmodules true
+ )
+ ) &&
+ add_upstream_commit &&
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "new submodule" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err.sub &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.sub &&
+ cat expect.err >> expect.err.sub &&
+ (
+ cd downstream &&
+ git fetch >../actual.out 2>../actual.err &&
+ (
+ cd submodule &&
+ git config --unset fetch.recurseSubmodules
+ )
+ ) &&
+ test_cmp expect.err.sub actual.err &&
+ test_cmp expect.out actual.out
+'
+
+test_expect_success "Recursion picks up all submodules when necessary" '
+ add_upstream_commit &&
+ (
+ cd submodule &&
+ (
+ cd deepsubmodule &&
+ git fetch &&
+ git checkout -q FETCH_HEAD
+ ) &&
+ head1=$(git rev-parse --short HEAD^) &&
+ git add deepsubmodule &&
+ git commit -m "new deepsubmodule"
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/submodule" > ../expect.err.sub &&
+ echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub
+ ) &&
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "new submodule" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err.2 &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.2 &&
+ cat expect.err.sub >> expect.err.2 &&
+ tail -2 expect.err >> expect.err.2 &&
+ (
+ cd downstream &&
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ test_cmp expect.err.2 actual.err &&
+ test_cmp expect.out actual.out
+'
+
test_done
diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh
index e5b1953..d600583 100755
--- a/t/t7403-submodule-sync.sh
+++ b/t/t7403-submodule-sync.sh
@@ -52,7 +52,7 @@ test_expect_success 'change submodule url' '
test_expect_success '"git submodule sync" should update submodule URLs' '
(cd super-clone &&
- git pull &&
+ git pull --no-recurse-submodules &&
git submodule sync
) &&
test -d "$(git config -f super-clone/submodule/.git/config \
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/7] fetch/pull: recurse into submodules when necessary
2011-03-01 23:01 ` [PATCH v2 1/7] fetch/pull: recurse into submodules when necessary Jens Lehmann
@ 2011-03-02 15:42 ` Marc Branchaud
0 siblings, 0 replies; 17+ messages in thread
From: Marc Branchaud @ 2011-03-02 15:42 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
On 11-03-01 06:01 PM, Jens Lehmann wrote:
> To be able to access all commits of populated submodules referenced by the
> superproject it is sufficient to only then let "git fetch" recurse into a
> submodule when the new commits fetched in the superproject record new
> commits for it. Having these commits present is extremely useful when
> using the "--submodule" option to "git diff" (which is what "git gui" and
> "gitk" do since 1.6.6), as all submodule commits needed for creating a
> descriptive output can be accessed. Also merging submodule commits (added
> in 1.7.3) depends on the submodule commits in question being present to
> work. Last but not least this enables disconnected operation when using
> submodules, as all commits necessary for a successful "git submodule
> update -N" will have been fetched automatically. So we choose this mode as
> the default for fetch and pull.
>
> Before a new or changed ref from upstream is updated in update_local_ref()
> "git rev-list <new-sha1> --not --branches --remotes" is used to determine
> all newly fetched commits. These are then walked and diffed against their
> parent(s) to see if a submodule has been changed. If that is the case, its
> path is stored to be fetched after the superproject fetch is completed.
>
> Using the "--recurse-submodules" or the "--no-recurse-submodules" option
> disables the examination of the fetched refs because the result will be
> ignored anyway.
>
> There is currently no infrastructure for storing deleted and new
> submodules in the .git directory of the superproject. Thats why fetch and
> pull for now only fetch submodules that are already checked out and are
> not renamed.
>
> In t7403 the "--no-recurse-submodules" argument had to be added to "git
> pull" to avoid failure because of the moved upstream submodule repo.
>
> Thanks-to: Jonathan Nieder <jrnieder@gmail.com>
> Thanks-to: Heiko Voigt <hvoigt@hvoigt.net>
> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
> ---
> Documentation/fetch-options.txt | 11 ++++
> builtin/fetch.c | 25 ++++++---
> submodule.c | 106 +++++++++++++++++++++++++++++++++++---
> submodule.h | 9 +++
> t/t5526-fetch-submodules.sh | 109 +++++++++++++++++++++++++++++++++++++++
> t/t7403-submodule-sync.sh | 2 +-
> 6 files changed, 245 insertions(+), 17 deletions(-)
>
> diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
> index f37276e..ae22f75 100644
> --- a/Documentation/fetch-options.txt
> +++ b/Documentation/fetch-options.txt
> @@ -73,6 +73,17 @@ ifndef::git-pull[]
> Prepend <path> to paths printed in informative messages
> such as "Fetching submodule foo". This option is used
> internally when recursing over submodules.
> +
> +--submodule-default=[yes|on-demand]::
> + This option is used internally to set the submodule recursion default
> + to either a boolean configuration value representing "true" (for
> + unconditonal recursion) or to "on-demand" (when only those submodules
> + should be fetched of which new commits have been fetched in its
> + superproject).
> + This option will be overridden by the 'fetch.recurseSubmodules' and
> + 'submodule.<name>.fetchRecurseSubmodules' settings in
> + linkgit:gitmodules[5] and linkgit:git-config[1] while all of them
> + are ignored when the "--[no-]recurse-submodules" option is given.
> endif::git-pull[]
Rolling out the bike...
I think the option name and it's explanation need to be a little clearer:
--recurse-submodules-default=[yes|on-demand]::
This option is used internally to temporarily provide a
non-negative default value for the --recurse-submodules
option. All other methods of configuring fetch's submodule
recursion (such as settings in linkgit:gitmodules[5] and
linkgit:git-config[1]) override this option, as does
specifying --[no-]recurse-submodules directly.
M.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 2/7] fetch/pull: Add the 'on-demand' value to the --recurse-submodules option
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
2011-03-01 23:01 ` [PATCH v2 1/7] fetch/pull: recurse into submodules when necessary Jens Lehmann
@ 2011-03-01 23:01 ` Jens Lehmann
2011-03-02 16:00 ` Marc Branchaud
2011-03-01 23:02 ` [PATCH v3 3/7] config: teach the fetch.recurseSubmodules option the 'on-demand' value Jens Lehmann
` (5 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:01 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
Until now the --recurse-submodules option could only be used to either
fetch all populated submodules recursively or to disable recursion
completely. As fetch and pull now by default just fetch those submodules
for which new commits have been fetched in the superproject, a command
line option to enforce that behavior is needed to be able to override
configuration settings.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
Documentation/fetch-options.txt | 16 +++++++--
Documentation/git-pull.txt | 2 +-
builtin/fetch.c | 22 ++++++++++--
git-pull.sh | 3 ++
submodule.c | 8 +++-
submodule.h | 2 +-
t/t5526-fetch-submodules.sh | 71 +++++++++++++++++++++++++++++++++++++++
7 files changed, 114 insertions(+), 10 deletions(-)
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index ae22f75..f28c0b1 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -65,9 +65,19 @@ ifndef::git-pull[]
specified with the remote.<name>.tagopt setting. See
linkgit:git-config[1].
---[no-]recurse-submodules::
- This option controls if new commits of all populated submodules should
- be fetched too (see linkgit:git-config[1] and linkgit:gitmodules[5]).
+--recurse-submodules[=yes|on-demand|no]::
+ This option controls if and under what conditions new commits of all
+ populated submodules should be fetched too. It can be used as a
+ boolean option to completely disable recursion when set to 'no' or to
+ unconditionally recurse into all populated submodules when set to
+ 'yes', which is the default when this option is used without any
+ value. If 'on-demand' is used, it will only recurse into those
+ submodules where new commits have been fetched in the superproject
+ (also see linkgit:git-config[1] and linkgit:gitmodules[5]).
+
+--no-recurse-submodules::
+ Disable recursive fetching of submodules (this has the same effect as
+ using the '--recurse-submodules=no' option).
--submodule-prefix=<path>::
Prepend <path> to paths printed in informative messages
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index b33e6be..c45efb3 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -84,7 +84,7 @@ must be given before the options meant for 'git fetch'.
--verbose::
Pass --verbose to git-fetch and git-merge.
---[no-]recurse-submodules::
+--[no-]recurse-submodules[=yes|on-demand|no]::
This option controls if new commits of all populated submodules should
be fetched too (see linkgit:git-config[1] and linkgit:gitmodules[5]).
That might be necessary to get the data needed for merging submodule
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 55d6b1a..7d24e47 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -38,6 +38,20 @@ static struct transport *transport;
static const char *submodule_prefix = "";
static const char *submodule_default;
+static int option_parse_recurse_submodules(const struct option *opt,
+ const char *arg, int unset)
+{
+ if (unset) {
+ recurse_submodules = RECURSE_SUBMODULES_OFF;
+ } else {
+ if (arg)
+ recurse_submodules = parse_fetch_recurse_submodules_arg(opt->long_name, arg);
+ else
+ recurse_submodules = RECURSE_SUBMODULES_ON;
+ }
+ return 0;
+}
+
static struct option builtin_fetch_options[] = {
OPT__VERBOSITY(&verbosity),
OPT_BOOLEAN(0, "all", &all,
@@ -55,9 +69,9 @@ static struct option builtin_fetch_options[] = {
"do not fetch all tags (--no-tags)", TAGS_UNSET),
OPT_BOOLEAN('p', "prune", &prune,
"prune remote-tracking branches no longer on remote"),
- OPT_SET_INT(0, "recurse-submodules", &recurse_submodules,
+ { OPTION_CALLBACK, 0, "recurse-submodules", NULL, "on-demand",
"control recursive fetching of submodules",
- RECURSE_SUBMODULES_ON),
+ PARSE_OPT_OPTARG, option_parse_recurse_submodules },
OPT_BOOLEAN(0, "dry-run", &dry_run,
"dry run"),
OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"),
@@ -816,6 +830,8 @@ static void add_options_to_argv(int *argc, const char **argv)
argv[(*argc)++] = "--keep";
if (recurse_submodules == RECURSE_SUBMODULES_ON)
argv[(*argc)++] = "--recurse-submodules";
+ else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
+ argv[(*argc)++] = "--recurse-submodules=on-demand";
if (verbosity >= 2)
argv[(*argc)++] = "-v";
if (verbosity >= 1)
@@ -964,7 +980,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
add_options_to_argv(&num_options, options);
result = fetch_populated_submodules(num_options, options,
submodule_prefix,
- recurse_submodules == RECURSE_SUBMODULES_ON,
+ recurse_submodules,
verbosity < 0);
}
diff --git a/git-pull.sh b/git-pull.sh
index 86517e9..7a97d8e 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -108,6 +108,9 @@ do
--recurse-submodules)
recurse_submodules=--recurse-submodules
;;
+ --recurse-submodules=*)
+ recurse_submodules="$1"
+ ;;
--no-recurse-submodules)
recurse_submodules=--no-recurse-submodules
;;
diff --git a/submodule.c b/submodule.c
index 8f991ce..86a99af 100644
--- a/submodule.c
+++ b/submodule.c
@@ -330,7 +330,7 @@ void check_for_new_submodule_commits(unsigned char new_sha1[20])
}
int fetch_populated_submodules(int num_options, const char **options,
- const char *prefix, int ignore_config,
+ const char *prefix, int command_line_option,
int quiet)
{
int i, result = 0, argc = 0, default_argc;
@@ -376,7 +376,7 @@ int fetch_populated_submodules(int num_options, const char **options,
name = name_for_path->util;
default_argv = "yes";
- if (!ignore_config) {
+ if (command_line_option == RECURSE_SUBMODULES_DEFAULT) {
struct string_list_item *fetch_recurse_submodules_option;
fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
if (fetch_recurse_submodules_option) {
@@ -391,6 +391,10 @@ int fetch_populated_submodules(int num_options, const char **options,
default_argv = "on-demand";
}
}
+ } else if (command_line_option == RECURSE_SUBMODULES_ON_DEMAND) {
+ if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
+ continue;
+ default_argv = "on-demand";
}
strbuf_addf(&submodule_path, "%s/%s", work_tree, ce->name);
diff --git a/submodule.h b/submodule.h
index 3434a8e..5350b0d 100644
--- a/submodule.h
+++ b/submodule.h
@@ -24,7 +24,7 @@ void show_submodule_summary(FILE *f, const char *path,
void set_config_fetch_recurse_submodules(int value);
void check_for_new_submodule_commits(unsigned char new_sha1[20]);
int fetch_populated_submodules(int num_options, const char **options,
- const char *prefix, int ignore_config,
+ const char *prefix, int command_line_option,
int quiet);
unsigned is_submodule_modified(const char *path, int ignore_untracked);
int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20],
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index 6d92f7a..4cd723c 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -301,4 +301,75 @@ test_expect_success "Recursion picks up all submodules when necessary" '
test_cmp expect.out actual.out
'
+test_expect_success "'--recurse-submodules=on-demand' doesn't recurse when no new commits are fetched in the superproject (and ignores config)" '
+ add_upstream_commit &&
+ (
+ cd submodule &&
+ (
+ cd deepsubmodule &&
+ git fetch &&
+ git checkout -q FETCH_HEAD
+ ) &&
+ head1=$(git rev-parse --short HEAD^) &&
+ git add deepsubmodule &&
+ git commit -m "new deepsubmodule"
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/submodule" > ../expect.err.sub &&
+ echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub
+ ) &&
+ (
+ cd downstream &&
+ git config fetch.recurseSubmodules true &&
+ git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&
+ git config --unset fetch.recurseSubmodules
+ ) &&
+ ! test -s actual.out &&
+ ! test -s actual.err
+'
+
+test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necessary (and ignores config)" '
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "new submodule" &&
+ head2=$(git rev-parse --short HEAD) &&
+ tail -2 expect.err > expect.err.deepsub &&
+ echo "From $pwd/." > expect.err &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err
+ cat expect.err.sub >> expect.err &&
+ cat expect.err.deepsub >> expect.err &&
+ (
+ cd downstream &&
+ git config fetch.recurseSubmodules false &&
+ (
+ cd submodule &&
+ git config -f .gitmodules submodule.deepsubmodule.fetchRecursive false
+ ) &&
+ git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&
+ git config --unset fetch.recurseSubmodules
+ (
+ cd submodule &&
+ git config --unset -f .gitmodules submodule.deepsubmodule.fetchRecursive
+ )
+ ) &&
+ test_cmp expect.out actual.out &&
+ test_cmp expect.err actual.err
+'
+
+test_expect_success "'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)" '
+ add_upstream_commit &&
+ head1=$(git rev-parse --short HEAD) &&
+ echo a >> file &&
+ git add file &&
+ git commit -m "new file" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err.file &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.file &&
+ (
+ cd downstream &&
+ git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err
+ ) &&
+ ! test -s actual.out &&
+ test_cmp expect.err.file actual.err
+'
+
test_done
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/7] fetch/pull: Add the 'on-demand' value to the --recurse-submodules option
2011-03-01 23:01 ` [PATCH v2 2/7] fetch/pull: Add the 'on-demand' value to the --recurse-submodules option Jens Lehmann
@ 2011-03-02 16:00 ` Marc Branchaud
2011-03-02 16:02 ` Marc Branchaud
0 siblings, 1 reply; 17+ messages in thread
From: Marc Branchaud @ 2011-03-02 16:00 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
On 11-03-01 06:01 PM, Jens Lehmann wrote:
> Until now the --recurse-submodules option could only be used to either
> fetch all populated submodules recursively or to disable recursion
> completely. As fetch and pull now by default just fetch those submodules
> for which new commits have been fetched in the superproject, a command
> line option to enforce that behavior is needed to be able to override
> configuration settings.
Strictly speaking, this patch should add the 'on-demand' value to the first
patch's --submodule-default option. Perhaps I'm being a bit too uptight
though...
> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
> ---
> Documentation/fetch-options.txt | 16 +++++++--
> Documentation/git-pull.txt | 2 +-
> builtin/fetch.c | 22 ++++++++++--
> git-pull.sh | 3 ++
> submodule.c | 8 +++-
> submodule.h | 2 +-
> t/t5526-fetch-submodules.sh | 71 +++++++++++++++++++++++++++++++++++++++
> 7 files changed, 114 insertions(+), 10 deletions(-)
>
> diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
> index ae22f75..f28c0b1 100644
> --- a/Documentation/fetch-options.txt
> +++ b/Documentation/fetch-options.txt
> @@ -65,9 +65,19 @@ ifndef::git-pull[]
> specified with the remote.<name>.tagopt setting. See
> linkgit:git-config[1].
>
> ---[no-]recurse-submodules::
> - This option controls if new commits of all populated submodules should
> - be fetched too (see linkgit:git-config[1] and linkgit:gitmodules[5]).
> +--recurse-submodules[=yes|on-demand|no]::
> + This option controls if and under what conditions new commits of all
Nit: Remove "all" from the above line.
> + populated submodules should be fetched too. It can be used as a
> + boolean option to completely disable recursion when set to 'no' or to
> + unconditionally recurse into all populated submodules when set to
> + 'yes', which is the default when this option is used without any
> + value. If 'on-demand' is used, it will only recurse into those
> + submodules where new commits have been fetched in the superproject
> + (also see linkgit:git-config[1] and linkgit:gitmodules[5]).
Nit: Replace that last sentence with
Use 'on-demand' to only recurse into a submodule when the
superproject retrieves a commit that updates the submodule's
reference.
Also, this has to change again with patch 5 (Don't recurse into a submodule
when commits are already present).
M.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/7] fetch/pull: Add the 'on-demand' value to the --recurse-submodules option
2011-03-02 16:00 ` Marc Branchaud
@ 2011-03-02 16:02 ` Marc Branchaud
0 siblings, 0 replies; 17+ messages in thread
From: Marc Branchaud @ 2011-03-02 16:02 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
On 11-03-02 11:00 AM, Marc Branchaud wrote:
> On 11-03-01 06:01 PM, Jens Lehmann wrote:
>> Until now the --recurse-submodules option could only be used to either
>> fetch all populated submodules recursively or to disable recursion
>> completely. As fetch and pull now by default just fetch those submodules
>> for which new commits have been fetched in the superproject, a command
>> line option to enforce that behavior is needed to be able to override
>> configuration settings.
>
> Strictly speaking, this patch should add the 'on-demand' value to the first
> patch's --submodule-default option. Perhaps I'm being a bit too uptight
> though...
>
>> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
>> ---
>> Documentation/fetch-options.txt | 16 +++++++--
>> Documentation/git-pull.txt | 2 +-
>> builtin/fetch.c | 22 ++++++++++--
>> git-pull.sh | 3 ++
>> submodule.c | 8 +++-
>> submodule.h | 2 +-
>> t/t5526-fetch-submodules.sh | 71 +++++++++++++++++++++++++++++++++++++++
>> 7 files changed, 114 insertions(+), 10 deletions(-)
>>
>> diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
>> index ae22f75..f28c0b1 100644
>> --- a/Documentation/fetch-options.txt
>> +++ b/Documentation/fetch-options.txt
>> @@ -65,9 +65,19 @@ ifndef::git-pull[]
>> specified with the remote.<name>.tagopt setting. See
>> linkgit:git-config[1].
>>
>> ---[no-]recurse-submodules::
>> - This option controls if new commits of all populated submodules should
>> - be fetched too (see linkgit:git-config[1] and linkgit:gitmodules[5]).
>> +--recurse-submodules[=yes|on-demand|no]::
>> + This option controls if and under what conditions new commits of all
>
> Nit: Remove "all" from the above line.
>
>> + populated submodules should be fetched too. It can be used as a
>> + boolean option to completely disable recursion when set to 'no' or to
>> + unconditionally recurse into all populated submodules when set to
>> + 'yes', which is the default when this option is used without any
>> + value. If 'on-demand' is used, it will only recurse into those
>> + submodules where new commits have been fetched in the superproject
>> + (also see linkgit:git-config[1] and linkgit:gitmodules[5]).
>
> Nit: Replace that last sentence with
>
> Use 'on-demand' to only recurse into a submodule when the
> superproject retrieves a commit that updates the submodule's
> reference.
Doh! That should read:
Use 'on-demand' to only recurse into a populated submodule when the
superproject retrieves a commit that updates the submodule's
reference.
M.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v3 3/7] config: teach the fetch.recurseSubmodules option the 'on-demand' value
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
2011-03-01 23:01 ` [PATCH v2 1/7] fetch/pull: recurse into submodules when necessary Jens Lehmann
2011-03-01 23:01 ` [PATCH v2 2/7] fetch/pull: Add the 'on-demand' value to the --recurse-submodules option Jens Lehmann
@ 2011-03-01 23:02 ` Jens Lehmann
2011-03-02 16:02 ` Marc Branchaud
2011-03-01 23:03 ` [PATCH v2 4/7] Submodules: Add 'on-demand' value for the 'fetchRecurseSubmodule' option Jens Lehmann
` (4 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:02 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
To enable the user to change the default behavior of "git fetch" and "git
pull" regarding submodule recursion add the new "on-demand" value which
has just been added to the "--recurse-submodules" command line option.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
Documentation/config.txt | 10 +++++++---
submodule.c | 2 +-
t/t5526-fetch-submodules.sh | 28 ++++++++++++++++++++++++++++
3 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 96ce272..7b06fe5 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -900,9 +900,13 @@ diff.wordRegex::
characters are *ignorable* whitespace.
fetch.recurseSubmodules::
- A boolean value which changes the behavior for fetch and pull, the
- default is to not recursively fetch populated submodules unless
- configured otherwise.
+ This option can be either set to a boolean value or to 'on-demand'.
+ Setting it to a boolean changes the behavior of fetch and pull to
+ unconditionally recurse into submodules when set to true or to not
+ recurse at all when set to false. When set to 'on-demand' (the default
+ value), it tells fetch and pull to recurse only into those submodules
+ where new commits are recorded in the commmits fetched for the
+ superproject.
fetch.unpackLimit::
If the number of objects fetched over the git native
diff --git a/submodule.c b/submodule.c
index 86a99af..a1753f0 100644
--- a/submodule.c
+++ b/submodule.c
@@ -71,7 +71,7 @@ int submodule_config(const char *var, const char *value, void *cb)
if (!prefixcmp(var, "submodule."))
return parse_submodule_config_option(var, value);
else if (!strcmp(var, "fetch.recursesubmodules")) {
- config_fetch_recurse_submodules = git_config_bool(var, value);
+ config_fetch_recurse_submodules = parse_fetch_recurse_submodules_arg(var, value);
return 0;
}
return 0;
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index 4cd723c..e6d873a 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -372,4 +372,32 @@ test_expect_success "'--recurse-submodules=on-demand' stops when no new submodul
test_cmp expect.err.file actual.err
'
+test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config" '
+ (
+ cd downstream &&
+ git fetch --recurse-submodules
+ ) &&
+ add_upstream_commit &&
+ git config --global fetch.recurseSubmodules false &&
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "new submodule" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err.2 &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.2
+ head -2 expect.err >> expect.err.2 &&
+ (
+ cd downstream &&
+ git config fetch.recurseSubmodules on-demand &&
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ git config --global --unset fetch.recurseSubmodules &&
+ (
+ cd downstream &&
+ git config --unset fetch.recurseSubmodules
+ ) &&
+ test_cmp expect.out.sub actual.out &&
+ test_cmp expect.err.2 actual.err
+'
+
test_done
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v3 3/7] config: teach the fetch.recurseSubmodules option the 'on-demand' value
2011-03-01 23:02 ` [PATCH v3 3/7] config: teach the fetch.recurseSubmodules option the 'on-demand' value Jens Lehmann
@ 2011-03-02 16:02 ` Marc Branchaud
0 siblings, 0 replies; 17+ messages in thread
From: Marc Branchaud @ 2011-03-02 16:02 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
On 11-03-01 06:02 PM, Jens Lehmann wrote:
> To enable the user to change the default behavior of "git fetch" and "git
> pull" regarding submodule recursion add the new "on-demand" value which
> has just been added to the "--recurse-submodules" command line option.
>
> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
> ---
> Documentation/config.txt | 10 +++++++---
> submodule.c | 2 +-
> t/t5526-fetch-submodules.sh | 28 ++++++++++++++++++++++++++++
> 3 files changed, 36 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index 96ce272..7b06fe5 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -900,9 +900,13 @@ diff.wordRegex::
> characters are *ignorable* whitespace.
>
> fetch.recurseSubmodules::
> - A boolean value which changes the behavior for fetch and pull, the
> - default is to not recursively fetch populated submodules unless
> - configured otherwise.
> + This option can be either set to a boolean value or to 'on-demand'.
> + Setting it to a boolean changes the behavior of fetch and pull to
> + unconditionally recurse into submodules when set to true or to not
> + recurse at all when set to false. When set to 'on-demand' (the default
> + value), it tells fetch and pull to recurse only into those submodules
> + where new commits are recorded in the commmits fetched for the
> + superproject.
Nit: Replace the last sentence with
When set to 'on-demand' (the default value), fetch and pull will
only recurse into a populated submodule when its superproject
retrieves a commit that updates the submodule's reference.
M.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 4/7] Submodules: Add 'on-demand' value for the 'fetchRecurseSubmodule' option
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
` (2 preceding siblings ...)
2011-03-01 23:02 ` [PATCH v3 3/7] config: teach the fetch.recurseSubmodules option the 'on-demand' value Jens Lehmann
@ 2011-03-01 23:03 ` Jens Lehmann
2011-03-01 23:03 ` [PATCH v2 5/7] fetch/pull: Don't recurse into a submodule when commits are already present Jens Lehmann
` (3 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:03 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
Now the behavior of fetch and pull can be configured to the recently added
'on-demand' mode separately for each submodule too.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
Documentation/config.txt | 2 +-
Documentation/gitmodules.txt | 4 ++--
submodule.c | 9 +++++++--
t/t5526-fetch-submodules.sh | 28 ++++++++++++++++++++++++++++
4 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 7b06fe5..d47a95d 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1824,7 +1824,7 @@ submodule.<name>.update::
linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
submodule.<name>.fetchRecurseSubmodules::
- This option can be used to enable/disable recursive fetching of this
+ This option can be used to control recursive fetching of this
submodule. It can be overridden by using the --[no-]recurse-submodules
command line option to "git fetch" and "git pull".
This setting will override that from in the linkgit:gitmodules[5]
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index 6897794..25daee2 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -45,12 +45,12 @@ submodule.<name>.update::
the '--merge' or '--rebase' options.
submodule.<name>.fetchRecurseSubmodules::
- This option can be used to enable/disable recursive fetching of this
+ This option can be used to control recursive fetching of this
submodule. If this option is also present in the submodules entry in
.git/config of the superproject, the setting there will override the
one found in .gitmodules.
Both settings can be overridden on the command line by using the
- "--[no-]recurse-submodules" option to "git fetch" and "git pull"..
+ "--[no-]recurse-submodules" option to "git fetch" and "git pull".
submodule.<name>.ignore::
Defines under what circumstances "git status" and the diff family show
diff --git a/submodule.c b/submodule.c
index a1753f0..3be6654 100644
--- a/submodule.c
+++ b/submodule.c
@@ -113,7 +113,7 @@ int parse_submodule_config_option(const char *var, const char *value)
if (!config)
config = string_list_append(&config_fetch_recurse_submodules_for_name,
strbuf_detach(&submodname, NULL));
- config->util = git_config_bool(var, value) ? (void *)1 : NULL;
+ config->util = (void *)(intptr_t)parse_fetch_recurse_submodules_arg(var, value);
strbuf_release(&submodname);
} else if ((len > 7) && !strcmp(var + len - 7, ".ignore")) {
if (strcmp(value, "untracked") && strcmp(value, "dirty") &&
@@ -380,8 +380,13 @@ int fetch_populated_submodules(int num_options, const char **options,
struct string_list_item *fetch_recurse_submodules_option;
fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
if (fetch_recurse_submodules_option) {
- if (!fetch_recurse_submodules_option->util)
+ if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_OFF)
continue;
+ if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_ON_DEMAND) {
+ if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
+ continue;
+ default_argv = "on-demand";
+ }
} else {
if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF)
continue;
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index e6d873a..09701aa 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -400,4 +400,32 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config
test_cmp expect.err.2 actual.err
'
+test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules" '
+ (
+ cd downstream &&
+ git fetch --recurse-submodules
+ ) &&
+ add_upstream_commit &&
+ git config fetch.recurseSubmodules false &&
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "new submodule" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err.2 &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err.2
+ head -2 expect.err >> expect.err.2 &&
+ (
+ cd downstream &&
+ git config submodule.submodule.fetchRecurseSubmodules on-demand &&
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ git config --unset fetch.recurseSubmodules &&
+ (
+ cd downstream &&
+ git config --unset submodule.submodule.fetchRecurseSubmodules
+ ) &&
+ test_cmp expect.out.sub actual.out &&
+ test_cmp expect.err.2 actual.err
+'
+
test_done
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 5/7] fetch/pull: Don't recurse into a submodule when commits are already present
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
` (3 preceding siblings ...)
2011-03-01 23:03 ` [PATCH v2 4/7] Submodules: Add 'on-demand' value for the 'fetchRecurseSubmodule' option Jens Lehmann
@ 2011-03-01 23:03 ` Jens Lehmann
2011-03-02 16:08 ` Marc Branchaud
2011-03-01 23:04 ` [PATCH v2 6/7] submodule update: Don't fetch when the submodule commit is " Jens Lehmann
` (2 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:03 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
When looking for submodules where new commits have been recorded in the
superproject ignore those cases where the submodules commits are already
present locally. This can happen e.g. when the submodule has been rewound
to an earlier state. Then there is no need to fetch the submodule again
as the commit recorded in the newly fetched superproject commit has
already been fetched earlier into the submodule.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
submodule.c | 29 ++++++++++++++++++++++++++++-
t/t5526-fetch-submodules.sh | 19 +++++++++++++++++++
2 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/submodule.c b/submodule.c
index 3be6654..11e0ef5 100644
--- a/submodule.c
+++ b/submodule.c
@@ -263,6 +263,33 @@ void set_config_fetch_recurse_submodules(int value)
config_fetch_recurse_submodules = value;
}
+static int is_submodule_commit_present(const char *path, unsigned char sha1[20])
+{
+ int is_present = 0;
+ if (!add_submodule_odb(path) && lookup_commit_reference(sha1)) {
+ /* Even if the submodule is checked out and the commit is
+ * present, make sure it is reachable from a ref. */
+ struct child_process cp;
+ const char *argv[] = {"rev-list", "-n", "1", NULL, "--not", "--all", NULL};
+ struct strbuf buf = STRBUF_INIT;
+
+ argv[3] = sha1_to_hex(sha1);
+ memset(&cp, 0, sizeof(cp));
+ cp.argv = argv;
+ cp.env = local_repo_env;
+ cp.git_cmd = 1;
+ cp.no_stdin = 1;
+ cp.out = -1;
+ cp.dir = path;
+ if (!run_command(&cp) && !strbuf_read(&buf, cp.out, 1024))
+ is_present = 1;
+
+ close(cp.out);
+ strbuf_release(&buf);
+ }
+ return is_present;
+}
+
static void submodule_collect_changed_cb(struct diff_queue_struct *q,
struct diff_options *options,
void *data)
@@ -280,7 +307,7 @@ static void submodule_collect_changed_cb(struct diff_queue_struct *q,
* being moved around. */
struct string_list_item *path;
path = unsorted_string_list_lookup(&changed_submodule_paths, p->two->path);
- if (!path)
+ if (!path && !is_submodule_commit_present(p->two->path, p->two->sha1))
string_list_append(&changed_submodule_paths, xstrdup(p->two->path));
} else {
/* Submodule is new or was moved here */
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index 09701aa..3decfae 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -428,4 +428,23 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override
test_cmp expect.err.2 actual.err
'
+test_expect_success "don't fetch submodule when newly recorded commits are already present" '
+ (
+ cd submodule &&
+ git checkout -q HEAD^^
+ ) &&
+ head1=$(git rev-parse --short HEAD) &&
+ git add submodule &&
+ git commit -m "submodule rewound" &&
+ head2=$(git rev-parse --short HEAD) &&
+ echo "From $pwd/." > expect.err &&
+ echo " $head1..$head2 master -> origin/master" >> expect.err &&
+ (
+ cd downstream &&
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ ! test -s actual.out &&
+ test_cmp expect.err actual.err
+'
+
test_done
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 5/7] fetch/pull: Don't recurse into a submodule when commits are already present
2011-03-01 23:03 ` [PATCH v2 5/7] fetch/pull: Don't recurse into a submodule when commits are already present Jens Lehmann
@ 2011-03-02 16:08 ` Marc Branchaud
0 siblings, 0 replies; 17+ messages in thread
From: Marc Branchaud @ 2011-03-02 16:08 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
As I said earlier, this patch should also tweak the documentation in
fetch-options.txt and config.txt.
In my suggested wording I used the phrase
... only recurse into a populated submodule when its superproject
retrieves a commit that updates the submodule's reference.
With this patch, that should now be
... only recurse into a populated submodule when its superproject
retrieves a commit that updates the submodule's reference to a
commit that isn't already in the local submodule clone.
M.
On 11-03-01 06:03 PM, Jens Lehmann wrote:
> When looking for submodules where new commits have been recorded in the
> superproject ignore those cases where the submodules commits are already
> present locally. This can happen e.g. when the submodule has been rewound
> to an earlier state. Then there is no need to fetch the submodule again
> as the commit recorded in the newly fetched superproject commit has
> already been fetched earlier into the submodule.
>
> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
> ---
> submodule.c | 29 ++++++++++++++++++++++++++++-
> t/t5526-fetch-submodules.sh | 19 +++++++++++++++++++
> 2 files changed, 47 insertions(+), 1 deletions(-)
>
> diff --git a/submodule.c b/submodule.c
> index 3be6654..11e0ef5 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -263,6 +263,33 @@ void set_config_fetch_recurse_submodules(int value)
> config_fetch_recurse_submodules = value;
> }
>
> +static int is_submodule_commit_present(const char *path, unsigned char sha1[20])
> +{
> + int is_present = 0;
> + if (!add_submodule_odb(path) && lookup_commit_reference(sha1)) {
> + /* Even if the submodule is checked out and the commit is
> + * present, make sure it is reachable from a ref. */
> + struct child_process cp;
> + const char *argv[] = {"rev-list", "-n", "1", NULL, "--not", "--all", NULL};
> + struct strbuf buf = STRBUF_INIT;
> +
> + argv[3] = sha1_to_hex(sha1);
> + memset(&cp, 0, sizeof(cp));
> + cp.argv = argv;
> + cp.env = local_repo_env;
> + cp.git_cmd = 1;
> + cp.no_stdin = 1;
> + cp.out = -1;
> + cp.dir = path;
> + if (!run_command(&cp) && !strbuf_read(&buf, cp.out, 1024))
> + is_present = 1;
> +
> + close(cp.out);
> + strbuf_release(&buf);
> + }
> + return is_present;
> +}
> +
> static void submodule_collect_changed_cb(struct diff_queue_struct *q,
> struct diff_options *options,
> void *data)
> @@ -280,7 +307,7 @@ static void submodule_collect_changed_cb(struct diff_queue_struct *q,
> * being moved around. */
> struct string_list_item *path;
> path = unsorted_string_list_lookup(&changed_submodule_paths, p->two->path);
> - if (!path)
> + if (!path && !is_submodule_commit_present(p->two->path, p->two->sha1))
> string_list_append(&changed_submodule_paths, xstrdup(p->two->path));
> } else {
> /* Submodule is new or was moved here */
> diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
> index 09701aa..3decfae 100755
> --- a/t/t5526-fetch-submodules.sh
> +++ b/t/t5526-fetch-submodules.sh
> @@ -428,4 +428,23 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override
> test_cmp expect.err.2 actual.err
> '
>
> +test_expect_success "don't fetch submodule when newly recorded commits are already present" '
> + (
> + cd submodule &&
> + git checkout -q HEAD^^
> + ) &&
> + head1=$(git rev-parse --short HEAD) &&
> + git add submodule &&
> + git commit -m "submodule rewound" &&
> + head2=$(git rev-parse --short HEAD) &&
> + echo "From $pwd/." > expect.err &&
> + echo " $head1..$head2 master -> origin/master" >> expect.err &&
> + (
> + cd downstream &&
> + git fetch >../actual.out 2>../actual.err
> + ) &&
> + ! test -s actual.out &&
> + test_cmp expect.err actual.err
> +'
> +
> test_done
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 6/7] submodule update: Don't fetch when the submodule commit is already present
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
` (4 preceding siblings ...)
2011-03-01 23:03 ` [PATCH v2 5/7] fetch/pull: Don't recurse into a submodule when commits are already present Jens Lehmann
@ 2011-03-01 23:04 ` Jens Lehmann
2011-03-01 23:04 ` [PATCH v2 7/7] fetch/pull: Describe --recurse-submodule restrictions in the BUGS section Jens Lehmann
2011-03-02 16:09 ` [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Marc Branchaud
7 siblings, 0 replies; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:04 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
If the commit to be checked out on "git submodule update" has already been
fetched in the submodule there is no need to run "git fetch" again. Since
"git fetch" recently learned recursion (and the new on-demand mode to
fetch commits recorded in the superproject is enabled by default) this
will happen pretty often, thereby making the unconditional fetch during
"git submodule update" unnecessary.
If the commit is not present in the submodule (e.g. the user disabled the
fetch on-demand mode) the fetch will be run as before.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
git-submodule.sh | 5 ++++-
t/t7406-submodule-update.sh | 20 ++++++++++++++++++++
2 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 3a13397..c16e275 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -466,8 +466,11 @@ cmd_update()
if test -z "$nofetch"
then
+ # Run fetch only if $sha1 isn't present or it
+ # is not reachable from a ref.
(clear_local_git_env; cd "$path" &&
- git-fetch) ||
+ ((rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
+ test -z "$rev") || git-fetch)) ||
die "Unable to fetch in submodule path '$path'"
fi
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index fa9d23a..bf7c788 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -74,6 +74,26 @@ test_expect_success 'submodule update detaching the HEAD ' '
)
'
+apos="'";
+test_expect_success 'submodule update does not fetch already present commits' '
+ (cd submodule &&
+ echo line3 >> file &&
+ git add file &&
+ test_tick &&
+ git commit -m "upstream line3"
+ ) &&
+ (cd super/submodule &&
+ head=$(git rev-parse --verify HEAD) &&
+ echo "Submodule path ${apos}submodule$apos: checked out $apos$head$apos" > ../../expected &&
+ git reset --hard HEAD~1
+ ) &&
+ (cd super &&
+ git submodule update > ../actual 2> ../actual.err
+ ) &&
+ test_cmp expected actual &&
+ ! test -s actual.err
+'
+
test_expect_success 'submodule update --rebase staying on master' '
(cd super/submodule &&
git checkout master
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 7/7] fetch/pull: Describe --recurse-submodule restrictions in the BUGS section
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
` (5 preceding siblings ...)
2011-03-01 23:04 ` [PATCH v2 6/7] submodule update: Don't fetch when the submodule commit is " Jens Lehmann
@ 2011-03-01 23:04 ` Jens Lehmann
2011-03-02 20:53 ` Jens Lehmann
2011-03-02 16:09 ` [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Marc Branchaud
7 siblings, 1 reply; 17+ messages in thread
From: Jens Lehmann @ 2011-03-01 23:04 UTC (permalink / raw)
To: Git Mailing List; +Cc: Junio C Hamano, Jonathan Nieder
Using the --recurse-submodules option with fetch and pull might not always
fetch all the submodule commits the user expects, as this will only work
when the submodule is already checked out. Document that and warn that
this is expected to change in the future.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
Documentation/git-fetch.txt | 9 +++++++++
Documentation/git-pull.txt | 9 +++++++++
2 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index c76e313..f907ef5 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -76,6 +76,15 @@ The `pu` branch will be updated even if it is does not fast-forward,
because it is prefixed with a plus sign; `tmp` will not be.
+BUGS
+----
+Using --recurse-submodules can only fetch new commits in alrady checked
+out submodules right now. When e.g. upstream added a new submodule in the
+just fetched commits of the superproject the submodule itself can not be
+fetched, making it impossible to check out that submodule later whithout
+having to do a fetch again. This is expected to be fixed in a future git
+version.
+
SEE ALSO
--------
linkgit:git-pull[1]
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index c45efb3..1596d2b 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -220,6 +220,15 @@ If you tried a pull which resulted in a complex conflicts and
would want to start over, you can recover with 'git reset'.
+BUGS
+----
+Using --recurse-submodules can only fetch new commits in alrady checked
+out submodules right now. When e.g. upstream added a new submodule in the
+just fetched commits of the superproject the submodule itself can not be
+fetched, making it impossible to check out that submodule later whithout
+having to do a fetch again. This is expected to be fixed in a future git
+version.
+
SEE ALSO
--------
linkgit:git-fetch[1], linkgit:git-merge[1], linkgit:git-config[1]
--
1.7.4.1.291.g6060
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 7/7] fetch/pull: Describe --recurse-submodule restrictions in the BUGS section
2011-03-01 23:04 ` [PATCH v2 7/7] fetch/pull: Describe --recurse-submodule restrictions in the BUGS section Jens Lehmann
@ 2011-03-02 20:53 ` Jens Lehmann
0 siblings, 0 replies; 17+ messages in thread
From: Jens Lehmann @ 2011-03-02 20:53 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
Am 02.03.2011 00:04, schrieb Jens Lehmann:
> Using the --recurse-submodules option with fetch and pull might not always
> fetch all the submodule commits the user expects, as this will only work
> when the submodule is already checked out. Document that and warn that
> this is expected to change in the future.
This patch needs the following diff to get rid of some typos. Will be
fixed in v3.
--------8<--------
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index f907ef5..8669227 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -78,10 +78,10 @@ because it is prefixed with a plus sign; `tmp` will not be.
BUGS
----
-Using --recurse-submodules can only fetch new commits in alrady checked
+Using --recurse-submodules can only fetch new commits in already checked
out submodules right now. When e.g. upstream added a new submodule in the
just fetched commits of the superproject the submodule itself can not be
-fetched, making it impossible to check out that submodule later whithout
+fetched, making it impossible to check out that submodule later without
having to do a fetch again. This is expected to be fixed in a future git
version.
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index 1596d2b..1aad8bf 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -222,10 +222,10 @@ would want to start over, you can recover with 'git reset'
BUGS
----
-Using --recurse-submodules can only fetch new commits in alrady checked
+Using --recurse-submodules can only fetch new commits in already checked
out submodules right now. When e.g. upstream added a new submodule in the
just fetched commits of the superproject the submodule itself can not be
-fetched, making it impossible to check out that submodule later whithout
+fetched, making it impossible to check out that submodule later without
having to do a fetch again. This is expected to be fixed in a future git
version.
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default
2011-03-01 22:59 [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Jens Lehmann
` (6 preceding siblings ...)
2011-03-01 23:04 ` [PATCH v2 7/7] fetch/pull: Describe --recurse-submodule restrictions in the BUGS section Jens Lehmann
@ 2011-03-02 16:09 ` Marc Branchaud
2011-03-02 23:35 ` Jens Lehmann
7 siblings, 1 reply; 17+ messages in thread
From: Marc Branchaud @ 2011-03-02 16:09 UTC (permalink / raw)
To: Jens Lehmann; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
On 11-03-01 05:59 PM, Jens Lehmann wrote:
> So here is version 2 of the on-demand recursive fetch for submodules.
>
> Changes since the last version:
>
> *) Add a name parameter to parse_fetch_recurse_submodules_arg()
> *) Enhance description of the "--submodule-default" fetch option
> *) Free the changed_submodule_paths string_list at the end of
> fetch_populated_submodules() to aid libification and to make
> valgrind happy
> *) Add a comment for the while loop in check_for_new_submodule_commits()
> *) Use "--all" instead of "--branches" and "--remotes" for rev-list to
> include tags too
> *) Compute the argc value properly instead of hard coding it in
> check_for_new_submodule_commits()
> *) Change size_t casts to intptr_t where appropriate
> *) Use "rev-list --not --all" when checking if a submodule commit exists
> instead of a simple lookup/rev-parse to make sure they are not only
> present but are reachable from a ref
> *) Describe that fetch and pull only work on populated submodules for
> now in the BUGS section of their man pages (done in a separate commit
> because this doesn't belong to a special commit in this series but
> also to the functionality that has already been merged)
>
> Thanks to Jonathan an Junio for the feedback that lead to these changes.
>
> Issues that were raised but not addressed yet:
>
> *) Should this option be called "on-demand" or "changed" or maybe even
> "updated"?
> I have no strong feelings about this, me just thinks the name should
> tell somehow that only submodules where new commits are recorded in
> the superproject which aren't already present locally will be fetched.
> Opinions?
First, thanks again for this work!
I have a slight preference for "updated" or "updated-only", but no really
strong feelings either way.
M.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default
2011-03-02 16:09 ` [PATCH v2 0/7] Teach fetch/pull the on-demand mode and make it the default Marc Branchaud
@ 2011-03-02 23:35 ` Jens Lehmann
0 siblings, 0 replies; 17+ messages in thread
From: Jens Lehmann @ 2011-03-02 23:35 UTC (permalink / raw)
To: Marc Branchaud; +Cc: Git Mailing List, Junio C Hamano, Jonathan Nieder
Am 02.03.2011 17:09, schrieb Marc Branchaud:
> On 11-03-01 05:59 PM, Jens Lehmann wrote:
>> *) Should this option be called "on-demand" or "changed" or maybe even
>> "updated"?
>> I have no strong feelings about this, me just thinks the name should
>> tell somehow that only submodules where new commits are recorded in
>> the superproject which aren't already present locally will be fetched.
>> Opinions?
>
> First, thanks again for this work!
Thanks for your feedback on this series, I'll include that in v3.
> I have a slight preference for "updated" or "updated-only", but no really
> strong feelings either way.
I'm looking forward to hear what others think ...
^ permalink raw reply [flat|nested] 17+ messages in thread