bootstrap: preserve git whitelist item sorting
authorEric Blake <eblake@redhat.com>
Tue, 5 Apr 2011 19:53:20 +0000 (13:53 -0600)
committerEric Blake <eblake@redhat.com>
Tue, 5 Apr 2011 20:47:43 +0000 (14:47 -0600)
In .gitignore, it is handy to do:

/m4/*
!/m4/file.m4

to whitelist just file.m4 while ignoring all other files.  But
! sorts too early.

* build-aux/bootstrap (sort_patterns): New function.
(insert_sorted_if_absent): Use it to sink ! lines to the bottom.

ChangeLog
build-aux/bootstrap

index 6fc0ef34d74531c583ebc9d889ce567fb856f054..f932690401934f880e4971b2494abcb7d9424aa9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-04-05  Eric Blake  <eblake@redhat.com>
+
+       bootstrap: preserve git whitelist item sorting
+       * build-aux/bootstrap (sort_patterns): New function.
+       (insert_sorted_if_absent): Use it to sink ! lines to the bottom.
+
 2011-04-05  Simon Josefsson  <simon@josefsson.org>
 
        * top/maint.mk (sc_prohibit_empty_lines_at_EOF): Don't trigger
index f004ad326005988e01985192accdbb8a3816b200..707b4914123e37bc12f57139f1f96b41c4eed025 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Print a version string.
-scriptversion=2011-03-03.12; # UTC
+scriptversion=2011-04-05.18; # UTC
 
 # Bootstrap this package from checked-out sources.
 
@@ -278,14 +278,29 @@ if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
   exit 1
 fi
 
+# Ensure that lines starting with ! sort last, per gitignore conventions
+# for whitelisting exceptions after a more generic blacklist pattern.
+sort_patterns() {
+  sort -u "$@" | sed '/^!/ {
+    H
+    d
+  }
+  $ {
+    P
+    x
+    s/^\n//
+  }'
+}
+
 # If $STR is not already on a line by itself in $FILE, insert it,
 # sorting the new contents of the file and replacing $FILE with the result.
 insert_sorted_if_absent() {
   file=$1
   str=$2
   test -f $file || touch $file
-  echo "$str" | sort -u - $file | cmp - $file > /dev/null \
-    || echo "$str" | sort -u - $file -o $file \
+  echo "$str" | sort_patterns - $file | cmp - $file > /dev/null \
+    || { echo "$str" | sort_patterns - $file > $file.bak \
+      && mv $file.bak $file; } \
     || exit 1
 }