Package: apt-listbugs
Version: 0.0.82
Severity: wishlist
Tags: patch

The feature to automaticaly pin packages is required when one needs to
do a safe batch upgrade.

I use this feature when I do an upgrade using cron-apt. In this case
two successive 'apt-get upgrade' will upgrade all "safe" packages.
The first will pin the erroneous packages and the second will do the
upgrade.

In an interactive environment this can be done with an option, for
example --force-pin, but apt-get, as it is called by cron-apt, does not
pass options to apt-listbugs, so I had to introduce an apt.conf option
in order to be able to supply to apt-listbugs the required option.

I would be thankfull if you incorporated the supplied patch to the next
appropriate release.

George Famelis


-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'stable')
Architecture: i386 (i686)

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

Versions of packages apt-listbugs depends on:
ii  apt                           0.7.6      Advanced front-end for dpkg
ii  libdpkg-ruby1.8               0.3.2      modules/classes for dpkg on ruby 1
ii  libhttp-access2-ruby1.8       2.0.6-3    HTTP accessing library for ruby
ii  libintl-gettext-ruby1.8       0.11-10    Gettext wrapper for Ruby 1.8
ii  libruby1.8 [libzlib-ruby1.8]  1.8.6.36-3 Libraries necessary to run Ruby 1.
ii  libxml-parser-ruby1.8         0.6.8-2    Interface of expat for the scripti
ii  ruby                          1.8.2-1    An interpreter of object-oriented 

apt-listbugs recommends no packages.

-- no debconf information
--- apt-listbugs-0.0.82/apt-listbugs    2007-09-10 22:21:13.000000000 +0300
+++ apt-listbugs-0.0.82/apt-listbugs.new        2007-09-10 22:31:24.000000000 
+0300
@@ -38,10 +38,6 @@
 be invoked before each upgrade by apt in order to check whether
 the upgrade/installation is safe. 
 
-== USAGE
-
-apt-listbugs [-h] [-s <severities>] [-S <stats>] [-D] [-H <hostname>] [-p 
<port>] [-R] <command> [arguments]
-
 == OPTIONS
 
 * -h | --help
@@ -94,6 +90,16 @@
 
   Specifies the apt configuration file to use.
 
+* -F <all|none> | --force-pin <all|none> 
+
+  When 'all' it is assumed that you select to pin all packages and exit when
+  any bug is found. When 'none' (actually any non-'all') it does not
+  automaticaly decide about pinning.
+  If not specified in the command line, apt.conf is consulted for the value
+  of LISTBUGS::Force-Pin. If not found then it defaults to 'none'
+  Command line 'none' is used when one needs to override an 'all' value
+  specified in apt.conf.
+
 * -y | --force-yes 
 
   Assumes that you select yes for all questions.
@@ -148,7 +154,10 @@
   HTTP Proxy setting, overrides the default HTTP Proxy setting. Useful
   for setting HTTP proxy for apt-listbugs.
 
+* LISTBUGS::Force-Pin
 
+  When set to 'all' it means that you select to pin any package found with a 
bug and exit.
+  This 'all' value can be overriden by a "--force-pin none" command line option
 
 == OUTPUT EXAMPLE
 
@@ -248,10 +257,12 @@
       sprintf($intl._(" -H <hostname>    : Hostname of Debian Bug Tracking 
System [%s].\n"), @hostname),
       sprintf($intl._(" -p <port>        : Port number of the server [%s]\n"), 
@port),
       sprintf($intl._(" --pin-priority   : Specifies Pin-Priority value 
[%s]\n"), @pin_priority),
-      $intl._(" --title          : Specifies the title of rss output.\n"),
+      $intl._(" --title <title>  : Specifies the title of rss output.\n"),
       $intl._(" -f               : Retrieve bug reports from BTS forcibly.\n"),
       $intl._(" -q               : Don't display progress bar.\n"),
       $intl._(" -C <apt.conf>    : Specify apt.conf.\n"),
+      $intl._(" --force-pin all  : Assume that you select to pin any package 
found with a bug and exit.\n"),
+      $intl._(" --force-pin none : Override 'all' config value for 
--force-pin.\n"),
       $intl._(" -y               : Assume that you select yes for all 
questions.\n"),
       $intl._(" -n               : Assume that you select no for all 
questions.\n"),
       $intl._(" -d               : Debug.\n"),
@@ -285,12 +296,13 @@
     @apt_conf = nil
 
     @yes = nil
+    @force_pin = nil
 
   end
 
   attr_accessor :severity, :stats, :quiet, :title
   attr_accessor :show_downgrade, :hostname, :tag
-  attr_accessor :frontend, :pin_priority, :yes
+  attr_accessor :frontend, :pin_priority, :yes, :force_pin
   attr_reader :command, :parser, :querybts, :ignore_bugs, :system_ignore_bugs, 
:browser
 
   def parse_options
@@ -307,6 +319,7 @@
                           ['--title', '-E', GetoptLong::REQUIRED_ARGUMENT],
                           ['--quiet', '-q', GetoptLong::NO_ARGUMENT],
                           ['--aptconf', '-C', GetoptLong::REQUIRED_ARGUMENT],
+                          ['--force-pin', '-F', GetoptLong::REQUIRED_ARGUMENT],
                           ['--force-yes', '-y', GetoptLong::NO_ARGUMENT],
                           ['--force-no', '-n', GetoptLong::NO_ARGUMENT],
                           ['--debug', '-d', GetoptLong::NO_ARGUMENT]
@@ -352,6 +365,13 @@
          @yes = true
        when '--force-no'
          @yes = false
+       when '--force-pin'
+          case optargs
+          when "all"
+           @force_pin = true
+          else
+           @force_pin = false
+          end
        end
       }
     rescue GetoptLong::AmbigousOption, GetoptLong::NeedlessArgument,
@@ -360,6 +380,15 @@
       exit 1
     end
 
+    if @force_pin.nil?
+      if /force_pin='(.*)'/ =~ `apt-config [EMAIL PROTECTED] shell force_pin 
LISTBUGS::Force-Pin` 
+        if $1 == 'all' 
+          @force_pin = true
+        end
+      end
+    end
+    @force_pin = false if @force_pin.nil?
+
     if ! $stdout.isatty
       @quiet = true
       @yes = false if @yes.nil?
@@ -510,22 +539,27 @@
       answer = "n"
       hold_pkgs = []
       while true
-       ask_str = $intl._("Are you sure you want to install/upgrade the above 
packages?")
-       if @config.querybts != nil || @config.browser != nil
-         if hold_pkgs.empty?
-           ask_str << " [Y/n/?/...] "
-         else
-           ask_str << "[N/?/...] "
-         end
-       else
-         ask_str << " [Y/n] "
-       end
-       if @config.yes.nil?
-          a = @config.frontend.ask ask_str
-        else
-          a = "y" if @config.yes
-          a = "n" if ! @config.yes
-        end
+       if @config.force_pin
+          @config.frontend.puts $intl._("Pinning all ackages at your request 
...")
+         a = "p"
+       elsif @config.yes.nil?
+         ask_str = $intl._("Are you sure you want to install/upgrade the above 
packages?")
+         if @config.querybts != nil || @config.browser != nil
+           if hold_pkgs.empty?
+             ask_str << " [Y/n/?/...] "
+           else
+             ask_str << "[N/?/...] "
+           end
+         else
+           ask_str << " [Y/n] "
+         end
+         a = @config.frontend.ask ask_str
+       elsif @config.yes
+         a = "y"
+       else
+         a = "n"
+       end
+
        if a == ""
          if hold_pkgs.empty?
            answer = "y"
@@ -605,7 +639,9 @@
             }
          end
          if pkgs.size != 0
-           if @config.frontend.yes_or_no? sprintf($intl._("The following %s 
packages will be pinned or on hold:\n %s\nAre you sure "), pkgs.size, 
pkgs.keys.join(', '))
+           if @config.force_pin
+              h = pinned(pkgs.keys, cur_pkgs, bugs)
+           elsif @config.frontend.yes_or_no? sprintf($intl._("The following %s 
packages will be pinned or on hold:\n %s\nAre you sure "), pkgs.size, 
pkgs.keys.join(', '))
              if key == "h"
                 h = on_hold(pkgs.keys)
               else
@@ -613,6 +649,9 @@
               end
             end
            hold_pkgs.concat(h) if h != nil
+           if @config.force_pin
+              return false;
+           end
          else
            @config.frontend.puts sprintf($intl._("Every packages already 
pinned or on hold. Ignoring %s command."), key)
          end

Reply via email to