From: William Hatfield <whatfield.git@gmail.com>
To: git@vger.kernel.org
Cc: glencbz@gmail.com, avarab@gmail.com, gitster@pobox.com,
ps@pks.im, William Hatfield <whatfield.git@gmail.com>
Subject: [PATCH 4/5] submodule: introduce reversive shorthand mode
Date: Sat, 31 Jan 2026 16:43:08 -0500 [thread overview]
Message-ID: <20260131214309.1899376-5-whatfield.git@gmail.com> (raw)
In-Reply-To: <20260131214309.1899376-1-whatfield.git@gmail.com>
Add --reversive as a convenience shorthand that combines:
- --recursive: process all nested submodules
- --reverse-traversal: visit children before parents (post-order)
- --append-superproject: run command in superproject after all submodules
This enables a single flag to achieve full post-order traversal from
the deepest submodules up to the superproject, which is useful for
build systems, cleanup scripts, or any operation that needs to process
dependencies before dependents.
Signed-off-by: William Hatfield <whatfield.git@gmail.com>
---
builtin/submodule--helper.c | 11 ++++++++++-
git-submodule.sh | 5 +++++
t/t7425-submodule-reversion.sh | 6 +++---
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index f6cba87a05..26365b397b 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -432,6 +432,7 @@ static int module_foreach(int argc, const char **argv, const char *prefix,
struct foreach_cb info = FOREACH_CB_INIT;
struct pathspec pathspec = { 0 };
struct module_list list = MODULE_LIST_INIT;
+ int reversive = 0;
struct option module_foreach_options[] = {
OPT__SUPER_PREFIX(&info.super_prefix),
OPT__QUIET(&info.quiet, N_("suppress output of entering each submodule command")),
@@ -441,10 +442,12 @@ static int module_foreach(int argc, const char **argv, const char *prefix,
N_("traverse submodules in reverse order (post-order)")),
OPT_BOOL(0, "append-superproject", &info.append_superproject,
N_("also run command in superproject after submodules")),
+ OPT_BOOL(0, "reversive", &reversive,
+ N_("shorthand for --recursive --reverse-traversal --append-superproject")),
OPT_END()
};
const char *const git_submodule_helper_usage[] = {
- N_("git submodule foreach [--quiet] [--recursive] [--reverse-traversal] [--append-superproject] [--] <command>"),
+ N_("git submodule foreach [--quiet] [--recursive] [--reverse-traversal] [--append-superproject] [--reversive] [--] <command>"),
NULL
};
int ret = 1;
@@ -452,6 +455,12 @@ static int module_foreach(int argc, const char **argv, const char *prefix,
argc = parse_options(argc, argv, prefix, module_foreach_options,
git_submodule_helper_usage, 0);
+ if (reversive) {
+ info.recursive = 1;
+ info.reverse_traversal = 1;
+ info.append_superproject = 1;
+ }
+
if (module_list_compute(NULL, prefix, &pathspec, &list) < 0)
goto cleanup;
diff --git a/git-submodule.sh b/git-submodule.sh
index 58682a287d..e1b81344f6 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -179,6 +179,11 @@ cmd_foreach()
--append-superproject)
append_superproject=$1
;;
+ --reversive)
+ recursive=--recursive
+ reverse_traversal=--reverse-traversal
+ append_superproject=--append-superproject
+ ;;
-*)
usage
;;
diff --git a/t/t7425-submodule-reversion.sh b/t/t7425-submodule-reversion.sh
index 7a6a54de15..88f61b0f06 100755
--- a/t/t7425-submodule-reversion.sh
+++ b/t/t7425-submodule-reversion.sh
@@ -231,14 +231,14 @@ EOF
test_cmp expect actual
'
-test_expect_failure '--reversive parses' '
+test_expect_success '--reversive parses' '
(
cd reversive/top &&
git submodule foreach --reversive "true"
)
'
-test_expect_failure '--reversive runs' '
+test_expect_success '--reversive runs' '
(
cd reversive/top &&
git submodule --quiet foreach --reversive "echo \$displaypath"
@@ -261,7 +261,7 @@ EOF
test_cmp expect actual
'
-test_expect_failure '--reversive stops on command failure' '
+test_expect_success '--reversive stops on command failure' '
(
cd reversive/top &&
git submodule foreach --reversive "true" &&
--
2.53.0-rc0
next prev parent reply other threads:[~2026-01-31 21:43 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-31 21:43 [PATCH 0/5] submodule: add 'reversive' traversal options to foreach William Hatfield
2026-01-31 21:43 ` [PATCH 1/5] t7425: add tests for reversive submodule traversal William Hatfield
2026-01-31 21:43 ` [PATCH 2/5] submodule: teach and plumb reverse-traversal behavior William Hatfield
2026-01-31 21:43 ` [PATCH 3/5] submodule: teach and plumb append-superproject behavior William Hatfield
2026-01-31 21:43 ` William Hatfield [this message]
2026-01-31 21:43 ` [PATCH 5/5] doc: document reversive traversal and related modes William Hatfield
2026-02-01 9:03 ` Jean-Noël AVILA
2026-02-02 21:10 ` William Hatfield
2026-02-02 18:52 ` [PATCH 0/5] submodule: add 'reversive' traversal options to foreach Junio C Hamano
2026-02-02 21:02 ` William Hatfield
2026-02-02 21:25 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260131214309.1899376-5-whatfield.git@gmail.com \
--to=whatfield.git@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=glencbz@gmail.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox