]> Zhao Yanbai Git Server - minix.git/commitdiff
Upgrade releasetools/sort_set 15/3215/4
authorLionel Sambuc <lionel.sambuc@gmail.com>
Fri, 9 Oct 2015 12:36:26 +0000 (14:36 +0200)
committerLionel Sambuc <lionel.sambuc@gmail.com>
Sat, 10 Oct 2015 21:58:31 +0000 (23:58 +0200)
 - retire the old shell script
 - import perl script

The perl scripts has the following advantages:
 - The sorting should be more stable, even accross different OSes.
 - The sorted output is automatically formatted into columns
 - It is much faster, even on large inputs.

Change-Id: I1068b21fda981b4cf9eeea4af83165ec2968280b

releasetools/sort_set.pl [new file with mode: 0755]
releasetools/sort_set.sh [deleted file]

diff --git a/releasetools/sort_set.pl b/releasetools/sort_set.pl
new file mode 100755 (executable)
index 0000000..81ac4ea
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -T -t -w -W
+
+# Sort each line of the input, ignoring any line beginning with a #.
+# Also format the output so that it is properly aligned, with exceptions
+# for values which are too long for their respective field.
+
+print <<HEADER;
+#
+# Sorted using sort_set.pl in releasetools.
+# to add an entry simply add it at the end of the
+# file and run
+# ../../../../releasetools/sort_set.pl < mi > out
+# mv out mi
+#
+HEADER
+
+while(<STDIN>) {
+       # Ignore any line starting with a '#'
+       if ($_ =~ m/#.*/) {
+               next;
+       }
+
+       # Entry with a condition field, one or more whitespace characters
+       # separate each column. Example:
+       # ./etc/X11     minix-base      xorg
+       if ($_ =~ m/(\S+)\s+(\S+)\s+(\S+)/) {
+               my ($f, $s, $c) = ($1, $2, $3);
+               $k = "$f.$c";
+               $files{$k} = $f;
+               $sets{$k} = $s;
+               $conditions{$k} = $c;
+               next;
+       }
+
+       # Entry without a condition field. Example:
+       # ./bin         minix-base
+       if ($_ =~ m/(\S+)\s+(\S+)/) {
+               my ($f, $s) = ($1, $2);
+               $k = "$f.";
+               $files{$k} = $f;
+               $sets{$k} = $s;
+       }
+}
+
+# Sort by file/directory name.
+foreach $key (sort keys %sets) {
+       $file = $files{$key};
+       $set = $sets{$key};
+
+       if (length($file) < 56) {
+               printf("%-55s ", $file);
+       } else {
+               printf("%s ", $file);
+       }
+
+       $last = $set;
+       if (exists($conditions{$key})) {
+               # A condition is present, so make sure it is printed with
+               # the required alignment, by adding the necessary padding
+               # after the set column. Otherwise do not add trailing
+               # spaces.
+               $last = $conditions{$key};
+               if (length($set) < 16) {
+                       printf("%-15s ", $set);
+               } else {
+                       printf("%s ", $set);
+               }
+       }
+
+       printf("%s\n", $last);
+}
diff --git a/releasetools/sort_set.sh b/releasetools/sort_set.sh
deleted file mode 100755 (executable)
index 6da4240..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-#
-# kinda natural sorting for sets
-# prepend every line with a modified path where
-# slashes are replaced by "1" and "0" is added
-# at the end of the string.
-# 
-# entry
-#  ./bin/cat minix-sys 
-# becomes
-#.1bin1cat0 ./bin/cat minix-sys 
-#
-# This entry gets sorted after wich the key is removed using
-# cut
-#
-# Additionally all lines starting with "#" are put on
-# top in the order they where put in the file. this is done
-# by creating a "key" with the value COUNTER
-# 
-COUNTER=10000
-while read i 
-do
-       A=$(echo $i | cut -f 1 -d ' ' | sed "s,^#,00$COUNTER,g" | sed 's,/,1,g' )
-       echo "${A}0 $i"
-       COUNTER=$(($COUNTER +1))
-done  | sort | cut -d ' ' -f 2-