This is a work built on http://thread.gmane.org/gmane.comp.version-control.git/198873/focus=198930 Basically git-submodule.sh needs to use something else than sh to handle newline in filenames (and therefore needs to use a language that accepts \0 in strings). However, since we're not there yet. I've thrown out the only perl-dependency for git-submodule.sh. It decreases the number of lines of code and uses the same solution as the rest of the script already do. This would lead to less forks and faster code. A simple testrun of t7400-submodule-basic.sh before this patch resulted in: real 0m8.359s user 0m8.921s sys 0m3.888s real 0m9.062s user 0m9.025s sys 0m3.784s real 0m8.490s user 0m9.065s sys 0m3.740s After this patch was applied: real 0m7.417s user 0m8.717s sys 0m3.804s real 0m7.873s user 0m8.821s sys 0m3.692s real 0m8.950s user 0m8.765s sys 0m3.760s Signed-off-by: Fredrik Gustafsson <iveqy@xxxxxxxxx> --- git-submodule.sh | 52 +++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index 31524d3..1652781 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -112,39 +112,33 @@ resolve_relative_url () # module_list() { + null_sha1=0000000000000000000000000000000000000000 + unmerged= ( git ls-files --error-unmatch --stage -z -- "$@" || - echo "unmatched pathspec exists" + echo "#unmatched" ) | sed -e 's/\x00/\n/g' | - 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}++) { - push @out, "$mode $null_sha1 U\t$path\n"; - } - next; - } - push @out, "$_\n"; - } - if ($unmatched) { - print "#unmatched\n"; - } else { - print for (@out); - } - ' + while read mode sha1 stage path + do + if test $mode = "#unmatched" + then + echo "#unmatched" + fi + if test $mode = "160000" + then + if test $stage != "0" + then + if test "$unmerged" != "$path" + then + echo "$mode $null_sha1 U $path" + fi + unmerged="$path" + else + echo "$mode $sha1 $stage $path" + fi + fi + done } die_if_unmatched () -- 1.8.3.253.g20b40b5.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html