changeset 34215:b2ba0843de10

bootstrap: preserve git whitelist item sorting 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.
author Eric Blake <eblake@redhat.com>
date Tue, 05 Apr 2011 13:53:20 -0600
parents 8e0176455a01
children 45f3ebd7a42d
files ChangeLog build-aux/bootstrap
diffstat 2 files changed, 24 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Apr 05 22:32:17 2011 +0200
+++ b/ChangeLog	Tue Apr 05 13:53:20 2011 -0600
@@ -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
--- a/build-aux/bootstrap	Tue Apr 05 22:32:17 2011 +0200
+++ b/build-aux/bootstrap	Tue Apr 05 13:53:20 2011 -0600
@@ -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 @@
   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
 }