]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[util] Support reversed sort ordering when generating NIC list
authorRobin Smidsrød <robin@smidsrod.no>
Wed, 21 Mar 2018 15:08:58 +0000 (17:08 +0200)
committerMichael Brown <mcb30@ipxe.org>
Wed, 21 Mar 2018 15:09:25 +0000 (17:09 +0200)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/util/niclist.pl

index 0600c82322d76ce738838bd0d4bd6d9cabdb25cc..2668a1c03ca7335ff9f6a91da92da1fc8be589c3 100755 (executable)
@@ -19,7 +19,7 @@ use Getopt::Long qw(GetOptions);
 GetOptions(
     'help'       => \( my $help     = 0      ),
     'format=s'   => \( my $format   = 'text' ),
-    'sort=s'     => \( my $sort     = 'bus,ipxe_driver,ipxe_name' ),
+    'sort=s'     => \( my $sort     = 'bus-,ipxe_driver,ipxe_name' ),
     'columns=s'  => \( my $columns  = 'bus,vendor_id,device_id,'
                                     . 'vendor_name,device_name,ipxe_driver,'
                                     . 'ipxe_name,ipxe_description,file,legacy_api'
@@ -47,26 +47,26 @@ Output formats:
 Column names (default order):
     bus, vendor_id, device_id, vendor_name, device_name,
     ipxe_driver, ipxe_name, ipxe_description, file, legacy_api
+
+Default sort order (minus at the end means reverse sort):
+    bus-, ipxe_driver, ipxe_name
 EOM
 
 # Only load runtime requirements if actually in use
-given($format) {
-    when( /csv/  ) {
-                       eval { require Text::CSV; };
-                       die("Please install Text::CSV CPAN module to use this feature.\n")
-                           if $@;
-                   }
-    when( /json/ ) {
-                       eval { require JSON; };
-                       die("Please install JSON CPAN module to use this feature.\n")
-                           if $@;
-                   }
-    when( /html/ ) {
-                       eval { require HTML::Entities; };
-                       die("Please install HTML::Entities CPAN module to use this feature.\n")
-                           if $@;
-                   }
-    default        { }
+if ( $format =~ /csv/ ) {
+    eval { require Text::CSV; };
+    die("Please install Text::CSV CPAN module to use this feature.\n")
+        if $@;
+}
+if ( $format =~ /json/ ) {
+    eval { require JSON; };
+    die("Please install JSON CPAN module to use this feature.\n")
+        if $@;
+}
+if ( $format =~ /html/ ) {
+    eval { require HTML::Entities; };
+    die("Please install HTML::Entities CPAN module to use this feature.\n")
+        if $@;
 }
 
 # Scan source dir and build NIC list
@@ -339,8 +339,16 @@ sub sort_ipxe_nic_list {
     my @sorted_list = @{ $ipxe_nic_list };
     while(@sort_column_names) {
         my $column_name = pop @sort_column_names;
-        @sorted_list = sort { ( $a->{$column_name} || "" ) cmp ( $b->{$column_name} || "" ) }
-                       @sorted_list;
+        my $reverse = substr($column_name, -1) eq '-' ? 1 : 0;  # use reverse order if last character is minus
+        $column_name = substr($column_name, 0, -1) if $reverse; # chop of the minus
+        if ( $reverse ) {
+            @sorted_list = sort { ( $b->{$column_name} || "" ) cmp ( $a->{$column_name} || "" ) }
+                           @sorted_list;
+        }
+        else {
+            @sorted_list = sort { ( $a->{$column_name} || "" ) cmp ( $b->{$column_name} || "" ) }
+                           @sorted_list;
+        }
     }
     return \@sorted_list;
 }
@@ -359,7 +367,7 @@ sub parse_columns_param {
 sub is_valid_column {
     my ($name) = @_;
     my $valid_column_map = {
-        map { $_ => 1 }
+        map { $_ => 1, $_ . "-" => 1 } # also supports keyword with a - suffix
         qw(
            bus file legacy_api
            ipxe_driver ipxe_name ipxe_description