Package: debhelper
Version: 7.2.6
Severity: wishlist
Tags: patch

Hello,

lets suppose there are 5 binary packages: foo, bar, abc, def, ghi.
Consider this debian/rules snippet:

override_dh_foo:
        dh_foo -pfoo --option1
        dh_foo -pbar --option2
    # The following is not resistant to the addition of new binary packages.
    # The call will get ugly if package list is long
    dh_foo -pabc -pdef -pghi
    # The same thing could be achieved with the following, but it will get
    # ugly if there are many packages like foo and bar.
    dh_foo -Nfoo -Nbar

Both of these solutions seem to be pretty incovenient and suffer from
information duplication. The patch attached adds the --exclude-logged
(--remaining-packages) option which allows to write the same thing as:

override_dh_foo:
        dh_foo -pfoo --option1
        dh_foo -pbar --option2
    dh_foo --remaining-packages

In my opinion, this is much cleaner. This option is similar what dh itself
does, but:

1) --remaining-packages can be useful without dh;
2) you cannot use dh --until dh_foo in place of --remaining-packages because:
  a) there is no way to know the sequence name in the override (which in itself
     could be a wish for dh exporting DH_SEQUENCE_NAME env. variable. Who knows,
     might be useful for somebody).
  b) dh --until dh_foo would call the override again -> endless loop.

The patch is against current debhelper master aka
ce53a5276c9f3a388dce10f442c3c1659e3bccdb.

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (101, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.28-1-amd64 (SMP w/1 CPU core)
Locale: LANG=lt_LT.UTF-8, LC_CTYPE=lt_LT.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages debhelper depends on:
ii  binutils                      2.19.1-1   The GNU assembler, linker and bina
ii  dpkg-dev                      1.15.0     Debian package development tools
ii  file                          4.26-2     Determines file type using "magic"
ii  html2text                     1.3.2a-13  advanced HTML to text converter
ii  man-db                        2.5.5-1    on-line manual pager
ii  perl                          5.10.0-19  Larry Wall's Practical Extraction 
ii  po-debconf                    1.0.15     manage translated Debconf template

debhelper recommends no packages.

Versions of packages debhelper suggests:
pn  dh-make                       <none>     (no description available)

-- no debconf information
>From 7bfd78f21579223231449449df29e5dd3b95b005 Mon Sep 17 00:00:00 2001
From: Modestas Vainius <modes...@vainius.eu>
Date: Sat, 21 Mar 2009 13:20:20 +0200
Subject: [PATCH] Add a global --exclude-logged (--remaining-packages) option.

Add a global --exclude-logged (--remaining-packages) option which allows to
skip the helper on the packages which it has already been run on (i.e. the
helper is already present in the package debhelper log). Useful for invoking
the helper on the packages remaining unprocessed after calling the helper with
special options on a few specific packages.

Signed-off-by: Modestas Vainius <modes...@vainius.eu>
---
 Debian/Debhelper/Dh_Getopt.pm |    6 ++++++
 Debian/Debhelper/Dh_Lib.pm    |   23 ++++++++++++++++++++++-
 debhelper.pod                 |    7 +++++++
 3 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/Debian/Debhelper/Dh_Getopt.pm b/Debian/Debhelper/Dh_Getopt.pm
index ef94e94..116e74d 100644
--- a/Debian/Debhelper/Dh_Getopt.pm
+++ b/Debian/Debhelper/Dh_Getopt.pm
@@ -91,6 +91,9 @@ sub getoptions {
                "N=s" => \&ExcludePackage,
                "no-package=s" => \&ExcludePackage,
        
+               "exclude-logged" => \$dh{EXCLUDE_LOGGED},
+               "remaining-packages" => \$dh{EXCLUDE_LOGGED},
+       
                "dbg-package=s" => \&AddDebugPackage,
                
                "s" => \&AddPackage,
@@ -222,6 +225,9 @@ sub parseopts {
        my $package;
        my %packages_seen;
        foreach $package (@{$dh{DOPACKAGES}}) {
+               if (defined($dh{EXCLUDE_LOGGED}) && is_in_log($package)) {
+                       $exclude_package{$package}=1;
+               }
                if (! $exclude_package{$package}) {
                        if (! exists $packages_seen{$package}) {
                                $packages_seen{$package}=1;
diff --git a/Debian/Debhelper/Dh_Lib.pm b/Debian/Debhelper/Dh_Lib.pm
index d481128..61510e2 100644
--- a/Debian/Debhelper/Dh_Lib.pm
+++ b/Debian/Debhelper/Dh_Lib.pm
@@ -15,7 +15,7 @@ use vars qw(@ISA @EXPORT %dh);
            &filedoublearray &getpackages &basename &dirname &xargs %dh
            &compat &addsubstvar &delsubstvar &excludefile &package_arch
            &is_udeb &udeb_filename &debhelper_script_subst &escape_shell
-           &inhibit_log);
+           &inhibit_log &is_helper_in_log &is_in_log);
 
 my $max_compat=7;
 
@@ -121,6 +121,27 @@ sub inhibit_log {
        $write_log=0;
 }
 
+sub is_helper_in_log {
+       my $cmd=shift;
+       my @packag...@_;
+
+       foreach my $package (@packages) {
+               my $ext=pkgext($package);
+               if ($ext && open(LOG, "debian/${ext}debhelper.log")) {
+                       if (grep /^\Q$cmd\E$/, <LOG>) {
+                               close LOG;
+                               return $package;
+                       }
+                       close LOG;
+               }
+       }
+       return undef;
+}
+
+sub is_in_log {
+       return is_helper_in_log(basename($0), @_);
+}
+
 # Pass it an array containing the arguments of a shell command like would
 # be run by exec(). It turns that into a line like you might enter at the
 # shell, escaping metacharacters and quoting arguments that contain spaces.
diff --git a/debhelper.pod b/debhelper.pod
index 77ace5c..7f16e6e 100644
--- a/debhelper.pod
+++ b/debhelper.pod
@@ -118,6 +118,13 @@ are not architecture independent.
 Do not act on the specified package even if an -a, -i, or -p option lists
 the package as one that should be acted on.
 
+=item B<--exclude-logged>, B<--remaining-packages>
+
+Do not act on the packages which have already been acted on by this helper
+earlier (i.e. the helper is present in the package debhelper log). Useful
+for invoking the helper on the packages remaining unprocessed after calling
+the helper with special options on a few specific packages.
+
 =item B<--ignore=>I<file>
 
 Ignore the specified file. This can be used if debian/ contains a debhelper
-- 
1.6.2.1

Reply via email to