I didn't put too many thoughts when adding support for multiple files
to the "patches" command. The nested loop approach turns out to be
very inefficient for unapplied patches.

Get rid of the innermost loop by building a single pattern matching
all filenames at once. That way, performance no longer depends on the
number of files (as far as unapplied patches are concerned.)
---
Changes since v1:
 * Dropped the optimized path for the single file case. The performance
   gain doesn't justify having separate code paths.
 * Optimized the array_join helper function.

 quilt/patches.in          |   22 +++++++++-------------
 quilt/scripts/patchfns.in |   14 ++++++++++++++
 2 files changed, 23 insertions(+), 13 deletions(-)

--- quilt.orig/quilt/patches.in
+++ quilt/quilt/patches.in
@@ -88,7 +88,7 @@ scan_unapplied()
 {
        local color=$1 prefix=$2 strip
        shift 2
-       local patch file match
+       local patch file
        local -a files_bre
 
        # Quote each file name only once
@@ -97,23 +97,19 @@ scan_unapplied()
                files_bre[${#files_bre[@]}]=$(quote_bre "$file")
        done
 
+       # "Or" all files in a single pattern
+       file=\\\($(array_join \\\| "${files_bre[@]}")\\\)
+
        for patch in "$@"
        do
                strip=$(patch_strip_level $patch)
                [ "$strip" = ab ] && strip=1
 
-               match=
-               for file in "${files_bre[@]}"
-               do
-                       if touched_by_patch $strip $patch \
-                          | grep -q "^$file\$"
-                       then
-                               match=1
-                               break
-                       fi
-               done
-
-               [ -z "$match" ] || echo "$color$prefix$(print_patch 
$patch)$color_clear"
+               if touched_by_patch $strip "$patch" \
+                  | grep -q "^$file\$"
+               then
+                       echo "$color$prefix$(print_patch $patch)$color_clear"
+               fi
        done
 }
 
--- quilt.orig/quilt/scripts/patchfns.in
+++ quilt/quilt/scripts/patchfns.in
@@ -76,6 +76,20 @@ trap run_exit_handlers EXIT
 
 # ========================================================
 
+# Join multiple stings using the given separator.
+array_join()
+{
+       local sep=$1 str=$2
+       shift 2
+
+       printf %s "$str"
+
+       for str in "$@"
+       do
+               printf %s%s "$sep" "$str"
+       done
+}
+
 # Quote a string for use in a basic regular expression.
 quote_bre()
 {

-- 
Jean Delvare
Suse L3 Support


_______________________________________________
Quilt-dev mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/quilt-dev

Reply via email to