Parcourir la source

update-alternatives: new option --set-selections

The option --set-selections is the counterpart of --get-selections,
it reads configuration on standard input and reconfigures alternatives
accordingly.
Raphael Hertzog il y a 17 ans
Parent
commit
50652b69c1

+ 10 - 0
ChangeLog

@@ -1,3 +1,13 @@
+2009-02-22  Raphael Hertzog  <hertzog@debian.org>
+
+	* scripts/update-alternatives.pl: Implement --set-selections.
+	It's the the counterpart of --get-selections, it reads
+	configuration on standard input and reconfigures alternatives
+	accordingly.
+	* man/update-alternatives.8: Document this option.
+	* scripts/t/900_update_alternatives.t: Add corresponding tests in
+	the test suite.
+
 2009-02-22  Raphael Hertzog  <hertzog@debian.org>
 
 	* scripts/update-alternatives.pl: Implement --get-selections.

+ 2 - 0
debian/changelog

@@ -166,6 +166,8 @@ dpkg (1.15.0) UNRELEASED; urgency=low
     - new option --get-selections to export the configuration of all
       alternatives. It's a simple way to discover the name of all available
       alternatives. Closes: #273406, #392429
+    - new option --set-selections to reconfigure a set of alternatives in
+      a single command.
 
   [ Pierre Habouzit ]
   * Add a --query option to update-alternatives. Closes: #336091, #441904

+ 5 - 0
man/update-alternatives.8

@@ -295,6 +295,11 @@ one is the status (either "auto" or "manual"), and the last one contains
 the current choice in the alternative (beware: it's a filename and thus
 might contain spaces).
 .TP
+\fB\-\-set\-selections\fR
+Read configuration of alternatives on standard input in the format
+generated by \fBupdate-alternatives \-\-get\-selections\fR and reconfigure
+them accordingly.
+.TP
 \fB\-\-query\fR \fIname\fR
 Display information about the link group
 like \-\-display does, but in a machine parseable way

+ 12 - 3
scripts/t/900_update_alternatives.t

@@ -52,8 +52,8 @@ my @choices = (
     },
 );
 my $nb_slaves = 2;
-plan tests => (4 * ($nb_slaves + 1) + 2) * 21 # number of check_choices
-		+ 54;			      # rest
+plan tests => (4 * ($nb_slaves + 1) + 2) * 23 # number of check_choices
+		+ 56;			      # rest
 
 sub cleanup {
     system("rm -rf $srcdir/t.tmp/ua && mkdir -p $admindir && mkdir -p $altdir");
@@ -110,7 +110,6 @@ sub config_choice {
     $opts{to_string} = \$output;
     my @params = ("--config", $main_name);
     call_ua(\@params, %opts);
-    #print STDERR "Output of @params for choice $input $output\n";
 }
 
 sub get_slaves_status {
@@ -195,6 +194,16 @@ install_choice(2); # 2 is lower prio, stays at 1
 check_choice(1, "auto", "initial install 2");
 install_choice(0); # 0 is higher priority
 check_choice(0, "auto", "initial install 3");
+# manual change with --set-selections
+my $input = "doesntexist auto /bin/date\ngeneric-test manual /bin/false\n";
+my $output = "";
+call_ua(["--set-selections"], from_string => \$input,
+        to_string => \$output);
+check_choice(1, "manual", "manual update with --set-selections");
+$input = "generic-test auto /bin/true\n";
+call_ua(["--set-selections"], from_string => \$input,
+        to_string => \$output);
+check_choice(0, "auto", "auto update with --set-selections");
 # manual change with set
 set_choice(2);
 check_choice(2, "manual", "manual update with --set"); # test #388313

+ 42 - 3
scripts/update-alternatives.pl

@@ -25,6 +25,7 @@ my $inst_alt;         # Alternative to install
 my $fileset;          # Set of files to install in the alternative
 my $path;             # Path of alternative we are offering
 my $verbosemode = 0;
+my @pass_opts;
 
 $| = 1;
 
@@ -46,8 +47,10 @@ while (@ARGV) {
         exit(0);
     } elsif (m/^--verbose$/) {
         $verbosemode= +1;
+        push @pass_opts, $_;
     } elsif (m/^--quiet$/) {
         $verbosemode= -1;
+        push @pass_opts, $_;
     } elsif (m/^--install$/) {
 	set_action("install");
         @ARGV >= 4 || badusage(_g("--install needs <link> <name> <path> <priority>"));
@@ -70,7 +73,7 @@ while (@ARGV) {
 	set_action($1);
         @ARGV || badusage(_g("--%s needs <name>"), $1);
         $alternative = Alternative->new(shift(@ARGV));
-    } elsif (m/^--(all|get-selections)$/) {
+    } elsif (m/^--(all|get-selections|set-selections)$/) {
 	set_action($1);
     } elsif (m/^--slave$/) {
         badusage(_g("--slave only allowed with --install"))
@@ -95,18 +98,22 @@ while (@ARGV) {
     } elsif (m/^--altdir$/) {
         @ARGV || badusage(_g("--%s needs a <directory> argument"), "altdir");
         $altdir = shift @ARGV;
+        push @pass_opts, $_, $altdir;
     } elsif (m/^--admindir$/) {
         @ARGV || badusage(_g("--%s needs a <directory> argument"), "admindir");
         $admdir = shift @ARGV;
+        push @pass_opts, $_, $admdir;
     } elsif (m/^--skip-auto$/) {
 	$skip_auto = 1;
+        push @pass_opts, $_;
     } else {
         badusage(_g("unknown option \`%s'"), $_);
     }
 }
 
 badusage(_g("need --display, --query, --list, --get-selections, --config," .
-            "--set, --install, --remove, --all, --remove-all or --auto"))
+            "--set, --set-selections, --install, --remove, --all, " .
+            "--remove-all or --auto"))
     unless $action;
 
 # Load infos about all alternatives to be able to check for mistakes
@@ -175,8 +182,40 @@ if ($action eq 'all') {
         printf "%-30s %-8s %s\n", $alt_name, $obj->status(), $obj->current() || "";
     }
     exit 0;
+} elsif ($action eq 'set-selections') {
+    log_msg("run with @COPY_ARGV");
+    my $line;
+    while (defined($line = <STDIN>)) {
+        chomp($line);
+        my ($alt_name, $status, $choice) = split(/\s+/, $line, 3);
+        if (exists $ALL{objects}{$alt_name}) {
+            my $obj = $ALL{objects}{$alt_name};
+            if ($status eq "auto") {
+                pr("[$progname --set-selections] " . _g("Call %s."),
+                   "$0 --auto $alt_name");
+                system($0, @pass_opts, "--auto", $alt_name);
+                exit $? if $?;
+            } else {
+                if ($obj->has_choice($choice)) {
+                    pr("[$progname --set-selections] " . _g("Call %s."),
+                       "$0 --set $alt_name $choice");
+                    system($0, @pass_opts, "--set", $alt_name, $choice);
+                    exit $? if $?;
+                } else {
+                    pr("[$progname --set-selections] " .  _g("Alternative %s" .
+                       " unchanged because choice %s is not available."),
+                       $alt_name, $choice);
+                }
+            }
+        } else {
+            pr("[$progname --set-selections] " . _g("Skip unknown alternative %s."),
+               $alt_name);
+        }
+    }
+    exit 0;
 }
 
+
 # Load the alternative info, stop on failure except for --install
 if (not $alternative->load("$admdir/" . $alternative->name())
     and $action ne "install")
@@ -451,7 +490,7 @@ sub get_all_alternatives {
 
 sub config_all {
     foreach my $name (get_all_alternatives()) {
-        system "$0 $skip --config $name";
+        system($0, @pass_opts, "--config", $name);
         exit $? if $?;
         print "\n";
     }