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

Re: [PATCH 2/3] submodule deinit: lose requirement for giving '.'

From
Junio C Hamano <gitster@pobox.com>
Date
May 3, 2016, 17:21 UTC
Message-ID
<xmqqoa8nnjld.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<1462227844-10624-3-git-send-email-sbeller@google.com>
Stefan Beller <sbeller@google.com> writes:
Show 23 quoted lines
> The discussion in [1] realized that '.' is a faulty suggestion as
> there is a corner case where it fails:
>
>> "submodule deinit ." may have "worked" in the sense that you would
>> have at least one path in your tree and avoided this "nothing
>> matches" most of the time.  It would have still failed with the
>> exactly same error if run in an empty repository, i.e.
>>
>>        $ E=/var/tmp/x/empty && rm -fr "$E" && mkdir -p "$E" && cd "$E"
>>        $ git init
>>        $ rungit v2.6.6 submodule deinit .
>>        error: pathspec '.' did not match any file(s) known to git.
>>        Did you forget to 'git add'?
>>        $ >file && git add file
>>        $ rungit v2.6.6 submodule deinit .
>>        $ echo $?
>>        0
>
> Allow no argument for `submodule deinit` to mean all submodules
> and add a test to check for the corner case of an empty repository.
>
> There is no need to update the documentation as it did not describe the
> special case '.' to remove all submodules.

OK, and the reason why there is no need to update the actual code, other than the "do not allow" gate, is because "submodule--helper list" aka module_list already knows to list everything if no pathspec is given. Am I reading the code (not in the patch) correctly?

> [1] http://news.gmane.org/gmane.comp.version-control.git/289535

The old discussion thread raises a good point. The refusal to accept no-pathspec form for a potentially destructive "deinit" may have been a safety measure, even though the suggested way to tell the command "Yes, I know I want to deinit everything" was not a good one (i.e. it resulted in an error if your project did not have any files tracked yet).

So possible ways forward may be
 - to remove the safety altogether; or
 - keep the safety, but give a better suggestion to say "Yes, deinit
   everything".
And this patch decides to take the former approach?

I am wondering if this can be solved in a cleaner way to teach "deinit" take a new "--all" option instead, e.g. something like...

diff --git a/git-submodule.sh b/git-submodule.sh
index 82e95a9..4b84116 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -405,6 +405,7 @@ cmd_init()
 cmd_deinit()
 {
 	# parse $args after "submodule ... deinit".
+	deinit_all=
 	while test $# -ne 0
 	do
 		case "$1" in
@@ -414,6 +415,9 @@ cmd_deinit()
 		-q|--quiet)
 			GIT_QUIET=1
 			;;
+		-a|--all)
+			deinit_all=t
+			;;
 		--)
 			shift
 			break
@@ -428,9 +432,9 @@ cmd_deinit()
 		shift
 	done
 
-	if test $# = 0
+	if test $# = 0 && test -z "$deinit_all"
 	then
-		die "$(eval_gettext "Use '.' if you really want to deinitialize all submodules")"
+		die "$(eval_gettext "Use '--all' if you really want to deinitialize all submodules")"
 	fi
 
 	git submodule--helper list --prefix "$wt_prefix" "$@" |


That would work even in the pathological "empty directory that has
nothing to match even '.'" case without losing the safety, no?
Previous: Stefan BellerNext: Stefan Beller
Message 6 of 17 in “preparatory patches for the submodule groups”
  1. 0/3 preparatory patches for the submodule groupsStefan Beller, May 2, 2016
  2. 1/3 submodule deinit test: fix broken && chain in subshellStefan Beller, May 2, 2016
  3. Junio C HamanoMay 3, 2016
  4. Stefan BellerMay 3, 2016
  5. 2/3 submodule deinit: lose requirement for giving '.'Stefan Beller, May 2, 2016
  6. Junio C HamanoMay 3, 2016
  7. Stefan BellerMay 3, 2016
  8. Junio C HamanoMay 3, 2016
  9. Stefan BellerMay 3, 2016
  10. 3/3 submodule init: redirect stdout to stderrStefan Beller, May 2, 2016
  11. Junio C HamanoMay 3, 2016
  12. Stefan BellerMay 3, 2016
  13. Junio C HamanoMay 3, 2016
  14. Stefan BellerMay 3, 2016
  15. Junio C HamanoMay 3, 2016
  16. Stefan BellerMay 3, 2016
  17. Junio C HamanoMay 3, 2016

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.