Re: [PATCH v2] Let submodule command exit with error status if path does not exist
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:54:28
Subsystem:
the rest · Maintainer:
Linus Torvalds
Possibly related (same subject, not in this thread)
- 2016-06-15 · [PATCH v2] Let submodule command exit with error status if path does not exist · Heiko Voigt <hidden>
- 2016-06-15 · Re: [PATCH v2] Let submodule command exit with error status if path does not exist · Junio C Hamano <hidden>
Heiko Voigt [off-list ref] writes:
I did not know that you prefer a space after the function name. I simply imitated the style from C and there we do not have spaces. It makes the style rules a bit more complicated. Wouldn't it be nicer to have the same as in C so we have less rules?
I do not think so, as they are different languages. The call site of C functions have name and opening parenthesis without a SP in between. The call site of shell functions do not even have parentheses. In any case, personal preferences (including mine) do not matter much, as there is no "this is scientificly superiour" in styles.
quoted hunk
diff --git a/git-submodule.sh b/git-submodule.sh index aac575e..48014f2 100755 --- a/git-submodule.sh +++ b/git-submodule.sh@@ -109,7 +109,8 @@ resolve_relative_url () # module_list() { - git ls-files --error-unmatch --stage -- "$@" | + (git ls-files --error-unmatch --stage -- "$@" || + echo '160000 0000000000000000000000000000000000000000 0 ') |
Is there a reason why the sentinel has to have the same mode pattern
as a GITLINK entry, NULL SHA-1, stage #0? Or is the "path" being
empty all that matters?
Ah, OK, you did not want to touch the perl script downstream. I
would have preferred a comment to document that, i.e.
(
git ls-files --error-unmatch --stage -- "$@" ||
# an entry with an empty $path used as a signal
echo '160000 0.... 0 '
) |
perl -e '...
or
(
git ls-files --error-unmatch --stage -- "$@" ||
echo 'unmatched pathspec exists'
) |
perl -e '
...
while (<STDIN>) {
if (/^unmatched pathspec/) {
print;
next;
}
chomp;
my ($mode, $sha1, $stage, $path) = ...
Either way, the reader of the code would not have to scratch her
head that way.
quoted hunk
perl -e ' my %unmerged = (); my ($null_sha1) = ("0" x 40);@@ -385,6 +386,10 @@ cmd_foreach() module_list | while read mode sha1 stage sm_path do + if test -z "$sm_path"; then + exit 1
Style: if test -z "$sm_path" then exit 1 I know module_list would have said "error: pathspec 'no-such' did not match any file(s) known to git. Did you forget to git add" already, but because that comes at the very end of the input to the filter written in perl (and with the way the filter is coded, it will stay at the end), I am not sure if the user would notice it if we exit like this. By the time we hit this exit, we would have seen "Entering $sm_path..." followed by whatever message given while in the submodule for all the submodules that comes out of module_list, no? How about doing it this way to avoid that issue, to make sure we die immediately after the typo is diagnosed without touching anything? git-submodule.sh | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 3aa7644..3f99d71 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh@@ -109,26 +109,47 @@ resolve_relative_url () # module_list() { - git ls-files --error-unmatch --stage -- "$@" | + ( + git ls-files --error-unmatch --stage -- "$@" || + echo "unmatched pathspec exists" + ) | perl -e ' my %unmerged = (); my ($null_sha1) = ("0" x 40); + my @out = (); + my $unmatched = 0; while (<STDIN>) { + if (/^unmatched pathspec/) { + $unmatched = 1; + next; + } chomp; my ($mode, $sha1, $stage, $path) = /^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/; next unless $mode eq "160000"; if ($stage ne "0") { if (!$unmerged{$path}++) { - print "$mode $null_sha1 U\t$path\n"; + push @out, "$mode $null_sha1 U\t$path\n"; } next; } - print "$_\n"; + push @out, "$_\n"; + } + if ($unmatched) { + unshift @out, "#unmatched\n"; } + print for (@out); ' } +check_unmatched () +{ + if test "$1" = "#unmatched" + then + exit 1 + fi +} + # # Map submodule path to submodule name #
@@ -385,6 +406,7 @@ cmd_foreach() module_list | while read mode sha1 stage sm_path do + check_unmatched "$mode" if test -e "$sm_path"/.git then say "$(eval_gettext "Entering '\$prefix\$sm_path'")"
@@ -437,6 +459,7 @@ cmd_init() module_list "$@" | while read mode sha1 stage sm_path do + check_unmatched "$mode" name=$(module_name "$sm_path") || exit # Copy url setting when it is not set yet
@@ -537,6 +560,7 @@ cmd_update() err= while read mode sha1 stage sm_path do + check_unmatched "$mode" if test "$stage" = U then echo >&2 "Skipping unmerged submodule $sm_path"
@@ -932,6 +956,7 @@ cmd_status() module_list "$@" | while read mode sha1 stage sm_path do + check_unmatched "$mode" name=$(module_name "$sm_path") || exit url=$(git config submodule."$name".url) displaypath="$prefix$sm_path"
@@ -1000,6 +1025,7 @@ cmd_sync() module_list "$@" | while read mode sha1 stage sm_path do + check_unmatched "$mode" name=$(module_name "$sm_path") url=$(git config -f .gitmodules --get submodule."$name".url)