git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [GSoC][PATCH 09/13] submodule foreach: correct '$path' in nested submodules from a subdirectory

From
BWBrandon Williams <bmwill@google.com>
Date
Jul 25, 2017, 00:13 UTC
Message-ID
<20170725001340.GF92874@google.com>
In-Reply-To
<20170724203454.13947-10-pc44800@gmail.com>
On 07/25, Prathamesh Chavan wrote:
Show 43 quoted lines
> When running 'git submodule foreach' from a subdirectory of your
> repository, nested submodules get a bogus value for $sm_path:
> For a submodule 'sub' that contains a nested submodule 'nested',
> running 'git -C dir submodule foreach echo $path' would report
> path='../nested' for the nested submodule. The first part '../' is
> derived from the logic computing the relative path from $pwd to the
> root of the superproject. The second part is the submodule path inside
> the submodule. This value is of little use and is hard to document.
> 
> There are two different possible solutions that have more value:
> (a) The path value is documented as the path from the toplevel of the
>     superproject to the mount point of the submodule.
>     In this case we would want to have path='sub/nested'.
> 
> (b) As Ramsay noticed the documented value is wrong. For the non-nested
>     case the path is equal to the relative path from $pwd to the
>     submodules working directory. When following this model,
>     the expected value would be path='../sub/nested'.
> 
> The behavior for (b) was introduced in 091a6eb0fe (submodule: drop the
> top-level requirement, 2013-06-16) the intent for $path seemed to be
> relative to $cwd to the submodule worktree, but that did not work for
> nested submodules, as the intermittent submodules were not included in
> the path.
> 
> If we were to fix the meaning of the $path using (a) such that "path"
> is "the path from the toplevel of the superproject to the mount point
> of the submodule", we would break any existing submodule user that runs
> foreach from non-root of the superproject as the non-nested submodule
> '../sub' would change its path to 'sub'.
> 
> If we would fix the meaning of the $path using (b), such that "path"
> is "the relative path from $pwd to the submodule", then we would break
> any user that uses nested submodules (even from the root directory) as
> the 'nested' would become 'sub/nested'.
> 
> Both groups can be found in the wild.  The author has no data if one group
> outweighs the other by large margin, and offending each one seems equally
> bad at first.  However in the authors imagination it is better to go with
> (a) as running from a sub directory sounds like it is carried out
> by a human rather than by some automation task.  With a human on
> the keyboard the feedback loop is short and the changed behavior can be
> adapted to quickly unlike some automation that can break silently.
Great explanation, and I agree with going with choice (a).
Show 79 quoted lines
> 
> Discussed-with: Ramsay Jones <ramsay@ramsayjones.plus.com>
> Signed-off-by: Prathamesh Chavan <pc44800@gmail.com>
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  git-submodule.sh             |  1 -
>  t/t7407-submodule-foreach.sh | 36 ++++++++++++++++++++++++++++++++++--
>  2 files changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/git-submodule.sh b/git-submodule.sh
> index a427ddafd..493a64372 100755
> --- a/git-submodule.sh
> +++ b/git-submodule.sh
> @@ -320,7 +320,6 @@ cmd_foreach()
>  				prefix="$prefix$sm_path/"
>  				sanitize_submodule_env
>  				cd "$sm_path" &&
> -				sm_path=$(git submodule--helper relative-path "$sm_path" "$wt_prefix") &&
>  				# we make $path available to scripts ...
>  				path=$sm_path &&
>  				if test $# -eq 1
> diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh
> index 6ba5daf42..0663622a4 100755
> --- a/t/t7407-submodule-foreach.sh
> +++ b/t/t7407-submodule-foreach.sh
> @@ -82,9 +82,9 @@ test_expect_success 'test basic "submodule foreach" usage' '
>  
>  cat >expect <<EOF
>  Entering '../sub1'
> -$pwd/clone-foo1-../sub1-$sub1sha1
> +$pwd/clone-foo1-sub1-$sub1sha1
>  Entering '../sub3'
> -$pwd/clone-foo3-../sub3-$sub3sha1
> +$pwd/clone-foo3-sub3-$sub3sha1
>  EOF
>  
>  test_expect_success 'test "submodule foreach" from subdirectory' '
> @@ -196,6 +196,38 @@ test_expect_success 'test messages from "foreach --recursive" from subdirectory'
>  	) &&
>  	test_i18ncmp expect actual
>  '
> +sub1sha1=$(cd clone2/sub1 && git rev-parse HEAD)
> +sub2sha1=$(cd clone2/sub2 && git rev-parse HEAD)
> +sub3sha1=$(cd clone2/sub3 && git rev-parse HEAD)
> +nested1sha1=$(cd clone2/nested1 && git rev-parse HEAD)
> +nested2sha1=$(cd clone2/nested1/nested2 && git rev-parse HEAD)
> +nested3sha1=$(cd clone2/nested1/nested2/nested3 && git rev-parse HEAD)
> +submodulesha1=$(cd clone2/nested1/nested2/nested3/submodule && git rev-parse HEAD)
> +
> +cat >expect <<EOF
> +Entering '../nested1'
> +$pwd/clone2-nested1-nested1-$nested1sha1
> +Entering '../nested1/nested2'
> +$pwd/clone2/nested1-nested2-nested2-$nested2sha1
> +Entering '../nested1/nested2/nested3'
> +$pwd/clone2/nested1/nested2-nested3-nested3-$nested3sha1
> +Entering '../nested1/nested2/nested3/submodule'
> +$pwd/clone2/nested1/nested2/nested3-submodule-submodule-$submodulesha1
> +Entering '../sub1'
> +$pwd/clone2-foo1-sub1-$sub1sha1
> +Entering '../sub2'
> +$pwd/clone2-foo2-sub2-$sub2sha1
> +Entering '../sub3'
> +$pwd/clone2-foo3-sub3-$sub3sha1
> +EOF
> +
> +test_expect_success 'test "submodule foreach --recursive" from subdirectory' '
> +	(
> +		cd clone2/untracked &&
> +		git submodule foreach --recursive "echo \$toplevel-\$name-\$sm_path-\$sha1" >../../actual
> +	) &&
> +	test_i18ncmp expect actual
> +'
>  
>  cat > expect <<EOF
>  nested1-nested1
> -- 
> 2.13.0
> 
-- 
Brandon Williams
Previous: Prathamesh ChavanNext: Prathamesh Chavan
Message 16 of 41 in “Update: Week 10”
  1. Prathamesh ChavanJul 24, 2017
  2. [GSoC][PATCH 01/13] submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Jul 24, 2017
  3. [GSoC][PATCH 02/13] submodule--helper: introduce for_each_submodule_list()Prathamesh Chavan, Jul 24, 2017
  4. [GSoC][PATCH 03/13] submodule: port set_name_rev() from shell to CPrathamesh Chavan, Jul 24, 2017
  5. Brandon WilliamsJul 24, 2017
  6. [GSoC][PATCH 04/13] submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Jul 24, 2017
  7. Brandon WilliamsJul 24, 2017
  8. [GSoC][PATCH 05/13] submodule: port submodule subcommand 'sync' from shell to CPrathamesh Chavan, Jul 24, 2017
  9. Brandon WilliamsJul 24, 2017
  10. [GSoC][PATCH 06/13] submodule: port submodule subcommand 'deinit' from shell to CPrathamesh Chavan, Jul 24, 2017
  11. Brandon WilliamsJul 24, 2017
  12. [GSoC][PATCH 07/13] diff: change scope of the function count_lines()Prathamesh Chavan, Jul 24, 2017
  13. [GSoC][PATCH 08/13] submodule: port submodule subcommand 'summary' from shell to CPrathamesh Chavan, Jul 24, 2017
  14. Brandon WilliamsJul 25, 2017
  15. [GSoC][PATCH 09/13] submodule foreach: correct '$path' in nested submodules from a subdirectoryPrathamesh Chavan, Jul 24, 2017
  16. Brandon WilliamsJul 25, 2017
  17. [GSoC][PATCH 10/13] submodule foreach: document '$sm_path' instead of '$path'Prathamesh Chavan, Jul 24, 2017
  18. Brandon WilliamsJul 25, 2017
  19. [GSoC][PATCH 11/13] submodule foreach: clarify the '$toplevel' variable documentationPrathamesh Chavan, Jul 24, 2017
  20. [GSoC][PATCH 12/13] submodule foreach: document variable '$displaypath'Prathamesh Chavan, Jul 24, 2017
  21. Brandon WilliamsJul 25, 2017
  22. [GSoC][PATCH 13/13] submodule: port submodule subcommand 'foreach' from shell to CPrathamesh Chavan, Jul 24, 2017
  23. Brandon WilliamsJul 25, 2017
  24. [GSoC][PATCH v2 00/13] Update: Week 10Prathamesh Chavan, Jul 29, 2017
  25. [GSoC][PATCH v2 01/13] submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Jul 29, 2017
  26. [GSoC][PATCH v2 02/13] submodule--helper: introduce for_each_submodule_list()Prathamesh Chavan, Jul 29, 2017
  27. [GSoC][PATCH v2 03/13] submodule: port set_name_rev() from shell to CPrathamesh Chavan, Jul 29, 2017
  28. [GSoC][PATCH v2 04/13] submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Jul 29, 2017
  29. Christian CouderJul 30, 2017
  30. [GSoC][PATCH v2 05/13] submodule: port submodule subcommand 'sync' from shell to CPrathamesh Chavan, Jul 29, 2017
  31. [GSoC][PATCH v2 06/13] submodule: port submodule subcommand 'deinit' from shell to CPrathamesh Chavan, Jul 29, 2017
  32. [GSoC][PATCH v2 07/13] diff: change scope of the function count_lines()Prathamesh Chavan, Jul 29, 2017
  33. [GSoC][PATCH v2 08/13] submodule: port submodule subcommand 'summary' from shell to CPrathamesh Chavan, Jul 29, 2017
  34. Christian CouderJul 30, 2017
  35. Prathamesh ChavanJul 30, 2017
  36. [GSoC][PATCH v2 09/13] submodule foreach: correct '$path' in nested submodules from a subdirectoryPrathamesh Chavan, Jul 29, 2017
  37. [GSoC][PATCH v2 10/13] submodule foreach: document '$sm_path' instead of '$path'Prathamesh Chavan, Jul 29, 2017
  38. [GSoC][PATCH v2 11/13] submodule foreach: clarify the '$toplevel' variable documentationPrathamesh Chavan, Jul 29, 2017
  39. [GSoC][PATCH v2 12/13] submodule foreach: document variable '$displaypath'Prathamesh Chavan, Jul 29, 2017
  40. [GSoC][PATCH v2 13/13] submodule: port submodule subcommand 'foreach' from shell to CPrathamesh Chavan, Jul 29, 2017
  41. Brandon WilliamsJul 31, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.