[Pkg-ocaml-maint-commits] [SCM] dose3 packaging branch, master, updated. debian/2.9.4-2-13-gc77a550

Stefano Zacchiroli zack at upsilon.cc
Sat Jun 11 08:58:51 UTC 2011


The following commit has been merged in the master branch:
commit eb42b0ee24762b83e1655006f7504f8a02eacdf0
Author: Stefano Zacchiroli <zack at upsilon.cc>
Date:   Sat Jun 11 10:47:39 2011 +0200

    update-cudf-solvers: support for --remove and documentation
    
    - major changes (getopt, pod, etc.)
    - substantial code refactoring for reuse and future extensions

diff --git a/debian/update-cudf-solvers b/debian/update-cudf-solvers
index 4f88067..1d149f7 100755
--- a/debian/update-cudf-solvers
+++ b/debian/update-cudf-solvers
@@ -2,17 +2,24 @@
 #
 # update-cudf-solvers: register available CUDF solvers and bind them to APT
 #
-# Copyright (C) Stefano Zacchiroli 2011 <zack at debian.org>
+# Copyright: © Stefano Zacchiroli 2011 <zack at debian.org>
 # License: GNU Lesser General Public License, version 3 or above
 
 use strict;
+
 use File::Basename;
+use Getopt::Long;
+use Pod::Usage;
 
+# configuration
 my $cudf_dir = "/usr/share/cudf/solvers";
 my $edsp_dir = "/usr/lib/apt/solvers";
 my $apt_cudf = "/usr/bin/apt-cudf";
 
+# globals
 my $debug = 0;
+my $help_action = 0;
+my $remove_action = 0;
 
 sub shallow_find($$) {
     my ($dir, $pred) = @_;
@@ -27,16 +34,24 @@ sub shallow_find($$) {
 sub warning($) { my ($msg) = @_; print STDERR "update-cudf-solvers: W: $msg\n"; }
 sub debug($) { my ($msg) = @_; print STDERR "update-cudf-solvers: I: $msg\n" if $debug; }
 
-my @cudf_solvers = shallow_find($cudf_dir, "-type f");	# current CUDF solvers
-my @edsp_solvers = shallow_find($edsp_dir, "-type l");	# current EDSP solvers
+sub die_usage() {
+    my %podflags = ( "verbose" => 1,
+		     "exitval" => 2 );
+    pod2usage(%podflags);
+}
 
-foreach my $s (@cudf_solvers) { debug "found cudf solver: $s"; }
-foreach my $s (@edsp_solvers) { debug "found edsp solver: $s"; }
+# check whether a given EDSP solver path originates from a CUDF solver
+sub is_cudf_solver($) {
+    my ($path) = @_;
+    return (-l $path && readlink($path) eq $apt_cudf);
+}
 
 # install: act on new CUDF solvers; make them available as EDSP solvers
-foreach my $cudf_name (@cudf_solvers) {
-    my $edsp_solver = "$edsp_dir/$cudf_name";
-    unless (-l $edsp_solver && readlink($edsp_solver) eq $apt_cudf) {
+sub install_new($$) {
+    my ($cudf_solvers, $edsp_solvers) = @_;
+    foreach my $cudf_name (@$cudf_solvers) {
+	my $edsp_solver = "$edsp_dir/$cudf_name";
+	next if is_cudf_solver($edsp_solver);
 	if (-e $edsp_solver || -l $edsp_solver) {
 	    # either existing non CUDF solver or dangling symlink
 	    warning "refuse to overwrite $edsp_solver with a symlink to $apt_cudf, skipping";
@@ -49,10 +64,12 @@ foreach my $cudf_name (@cudf_solvers) {
 }
 
 # garbage collection: act on old EDSP solvers; get rid of them
-foreach my $edsp_name (@edsp_solvers) {
-    my $edsp_solver = "$edsp_dir/$edsp_name";
-    if (-l $edsp_solver && readlink($edsp_solver) eq $apt_cudf) {
-	if (! grep {"$_" eq "$edsp_name"} @cudf_solvers) {	
+sub remove_old($$) {
+    my ($cudf_solvers, $edsp_solvers) = @_;
+    foreach my $edsp_name (@$edsp_solvers) {
+	my $edsp_solver = "$edsp_dir/$edsp_name";
+	next unless is_cudf_solver($edsp_solver);
+	if (! grep {"$_" eq "$edsp_name"} @$cudf_solvers) {	
 	    # EDSP && CUDF solver, no longer existing
 	    debug "unlink (gone) $edsp_solver";
 	    unlink $edsp_solver
@@ -60,3 +77,113 @@ foreach my $edsp_name (@edsp_solvers) {
 	}
     }
 }
+
+# remove all EDSP solvers originating from CUDF solvers
+sub remove_all($$) {
+    my ($cudf_solvers, $edsp_solvers) = @_;
+    foreach my $edsp_name (@$edsp_solvers) {
+	my $edsp_solver = "$edsp_dir/$edsp_name";
+	if (is_cudf_solver($edsp_solver)) {
+	    unlink $edsp_solver
+		or warning "cannot unlink $edsp_solver, skipping";
+	}
+    }
+}
+
+sub main() {
+    my $getopt = GetOptions(
+	"debug" => \$debug,
+	"h|help" => \$help_action,
+	"remove" => \$remove_action,
+	);
+    die_usage if (! $getopt || $help_action);
+
+    my @cudf_solvers = shallow_find($cudf_dir, "-type f");
+    my @edsp_solvers = shallow_find($edsp_dir, "-type l");
+    foreach my $s (@cudf_solvers) { debug "found cudf solver: $s"; }
+    foreach my $s (@edsp_solvers) { debug "found edsp solver: $s"; }
+
+    if ($remove_action) {
+	remove_all(\@cudf_solvers, \@edsp_solvers);
+    } else {
+	install_new(\@cudf_solvers, \@edsp_solvers);
+	remove_old(\@cudf_solvers, \@edsp_solvers);
+    }
+    exit 0;
+}
+
+main();
+
+__END__
+
+=head1 NAME
+
+update-cudf-solvers - register available CUDF solvers as APT external solvers
+
+=head1 SYNOPSIS
+
+=over
+
+=item B<update-cudf-solvers> [I<OPTION>]...
+
+=item B<update-cudf-solvers> [I<OPTION>]... --remove
+
+=back
+
+=head1 DESCRIPTION
+
+update-cudf-solvers maintain the list of installed CUDF solvers and register
+them as external solvers for APT.
+
+The first form (without mandatory options) should be invoked each time a new
+CUDF solver specification file is added to or removed from the CUDF solver
+specification directory (by default F</usr/share/cudf/solvers>).
+update-cudf-solvers will synchronize the differences with APT external solvers,
+by installing suitable symlinks to the F</usr/bin/apt-cudf> wrapper under
+F</usr/lib/apt/solvers>.
+
+The second form (with the mandatory C<--remove> option) will remove all
+installed external APT solvers that originated from CUDF solvers. It's a
+cleanup operation meant to be used only upon removal of the apt-cudf package.
+
+Note that other, non-CUDF based, APT external solvers might be present under
+F</usr/lib/apt/solvers>. update-cudf-solvers leaves the untouched and act only
+on (present or past) APT solvers corresponding to CUDF solvers.
+
+=head1 TRIGGER-BASED OPERATION
+
+The directory F</usr/share/cudf/solvers> is monitored by a dpkg trigger that
+invokes update-cudf-solvers as needed. In all but exceptional circumstances,
+you should not be required to opearte update-cudf-solvers manually.
+
+=head1 OPTIONS
+
+=over 4
+
+=item --debug
+
+Print debugging information during operation.
+
+=item -h
+
+=item --help
+
+Show usage information and exit.
+
+=item --remove
+
+Unregister all CUDF solvers (see DESCRIPTION above).
+
+=back
+
+=head1 SEE ALSO
+
+apt-get(8), L<README.cudf-solvers|file:///usr/share/doc/apt-cudf/README.cudf-solvers>, L<README.Debian|file:///usr/share/doc/apt-cudf/README.Debian>
+
+=head1 AUTHOR
+
+Copyright: (C) 2011 Stefano Zacchiroli <zack at debian.org>
+
+License: GNU Lesser General Public License (GPL), version 3 or above
+
+=cut

-- 
dose3 packaging



More information about the Pkg-ocaml-maint-commits mailing list