[Aptitude-devel] Bug#892983: please allow filtering on/displaying the release 'label'

Tomas Pospisek tpo_deb at sourcepole.ch
Thu Mar 15 07:41:50 UTC 2018


Package: aptitude
Version: 0.8.7-1
Severity: wishlist
Tags: patch

Hello,

this wishlist partly overlaps with bugreport #484011.

The attached patch implement filtering for the 'Label' field in the
"Release" file. I.e. it allows to filter packages according to the
'Label' of the release they belong to.

It adds a search expression/filter '?label()' to aptitude.

Also it allows to display the 'Label' for each package by using
-F '%l' in the format option.

Filtering for 'Label's is required for being able to find out whether
there's a security upgrade pending via the CLI interface of aptitude.
See f.ex. https://github.com/DE-IBH/apt-dater/issues/24. The check_apt
nagios plugin is in a similar situation as apt-dater - needing to be
able whether there's a security update pending.

The only special field (apart from the repository FQDN), that
distinguishes 'security upgrade' packages from 'non-security upgrades'
is the 'Label' of the release - in the case of Debian, the 'Label' for
security upgrades is 'Debian-Security'.

A few comments about the attached patch:

* it is tested and works:
  * filtering for package 'Label's works
  * displaying package 'Label's via -F "%l" works as well

* there are half a dozen tests that fail during after the build,
  I have not looked/fixed these. That remains to be done. Anybody
  who's interested in having this feature included is wellcome to
  fix the tests and submit a patch here.

* generic/apt/apt.cc:get_label retrieves the label via
  `((VerIterator&)ver).FileList().File().Label()`. I'm not
  entirely sure whether this is guaranteed to work under all
  cirumstances. The `get_uri()` method in the same source file
  achieves a similar thing, however going through far more
  involved procedures. Possibly `get_uri` could be shortened
  to a similar form as the `get_label` method. The reason why
  get_uri is so complicated could be due to history - i.e.
  at the time when aptitude was written, the required methods
  to aquire the URL were missing - I haven't investigated this.

*t


-- Package-specific info:
Terminal: xterm-256color
$DISPLAY is set.
which aptitude: /usr/bin/aptitude

aptitude version information:
aptitude 0.8.7
Compiler: g++ 6.3.0 20170406
Compiled against:
  apt version 5.0.1
  NCurses version 6.0
  libsigc++ version: 2.10.0
  Gtk+ support disabled.
  Qt support disabled.

Current library versions:
  NCurses version: ncurses 6.0.20161126
  cwidget version: 0.5.17
  Apt version: 5.0.1

aptitude linkage:
	linux-vdso.so.1 (0x00007ffc00b72000)
	libapt-pkg.so.5.0 => /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0 (0x00007f00da6e7000)
	libncursesw.so.5 => /lib/x86_64-linux-gnu/libncursesw.so.5 (0x00007f00da4b7000)
	libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f00da28d000)
	libsigc-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libsigc-2.0.so.0 (0x00007f00da086000)
	libcwidget.so.3 => /usr/lib/x86_64-linux-gnu/libcwidget.so.3 (0x00007f00d9d89000)
	libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f00d9a81000)
	libboost_iostreams.so.1.62.0 => /usr/lib/x86_64-linux-gnu/libboost_iostreams.so.1.62.0 (0x00007f00d9869000)
	libboost_filesystem.so.1.62.0 => /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.62.0 (0x00007f00d9650000)
	libboost_system.so.1.62.0 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.62.0 (0x00007f00d944c000)
	libxapian.so.30 => /usr/lib/x86_64-linux-gnu/libxapian.so.30 (0x00007f00d9038000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f00d8e1b000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f00d8a99000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f00d8795000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f00d857e000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f00d81df000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f00d7fdb000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f00d7dc4000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f00d7baa000)
	libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f00d799a000)
	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f00d7774000)
	liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f00d7562000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f00d735a000)
	libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f00d7155000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f00db0b0000)

-- System Information:
Debian Release: 9.4
  APT prefers stable-debug
  APT policy: (500, 'stable-debug'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.9.0-6-amd64 (SMP w/8 CPU cores)
Locale: LANG=de_CH.utf8, LC_CTYPE=de_CH.utf8 (charmap=UTF-8), LANGUAGE=de_CH:de (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages aptitude depends on:
ii  aptitude-common            0.8.7-1
ii  libapt-pkg5.0              1.4.8
ii  libboost-filesystem1.62.0  1.62.0+dfsg-4
ii  libboost-iostreams1.62.0   1.62.0+dfsg-4
ii  libboost-system1.62.0      1.62.0+dfsg-4
ii  libc6                      2.24-11+deb9u3
ii  libcwidget3v5              0.5.17-4+b1
ii  libgcc1                    1:6.3.0-18+deb9u1
ii  libncursesw5               6.0+20161126-1+deb9u2
ii  libsigc++-2.0-0v5          2.10.0-1
ii  libsqlite3-0               3.16.2-5+deb9u1
ii  libstdc++6                 6.3.0-18+deb9u1
ii  libtinfo5                  6.0+20161126-1+deb9u2
ii  libxapian30                1.4.3-2

Versions of packages aptitude recommends:
ii  libparse-debianchangelog-perl  1.2.0-12
ii  sensible-utils                 0.0.9+deb9u1

Versions of packages aptitude suggests:
pn  apt-xapian-index                <none>
ii  aptitude-doc-en [aptitude-doc]  0.8.7-1
pn  debtags                         <none>
ii  tasksel                         3.39

-- no debconf information
-------------- next part --------------
diff -ur aptitude-0.8.7/src/generic/apt/apt.cc aptitude-0.8.7.tpo/src/generic/apt/apt.cc
--- aptitude-0.8.7/src/generic/apt/apt.cc	2017-04-18 20:03:06.000000000 +0200
+++ aptitude-0.8.7.tpo/src/generic/apt/apt.cc	2018-03-15 08:18:11.482313148 +0100
@@ -1413,6 +1413,22 @@
   return string{};
 }
 
+std::string get_label(const pkgCache::VerIterator& ver,
+		       const pkgRecords* records)
+{
+  if (ver.end() || ver.FileList().end() || records == nullptr)
+    return string{};
+
+  if (ver.Downloadable())
+    {
+      return ver.FileList().File().Label();
+    }
+  else
+    {
+      return _("(installed locally)");
+    }
+}
+
 std::string get_origin(const pkgCache::VerIterator& ver,
 		       const pkgRecords* records)
 {
diff -ur aptitude-0.8.7/src/generic/apt/apt.h aptitude-0.8.7.tpo/src/generic/apt/apt.h
--- aptitude-0.8.7/src/generic/apt/apt.h	2017-04-18 20:02:57.000000000 +0200
+++ aptitude-0.8.7.tpo/src/generic/apt/apt.h	2018-03-13 20:04:24.907531414 +0100
@@ -240,6 +240,16 @@
 std::string get_uri(const pkgCache::VerIterator& ver,
 		    const pkgRecords* records);
 
+/** Get Label of a package version
+ *
+ * @param ver The package version
+ * @param records The package records
+ *
+ * @return The requested value
+ */
+std::string get_label(const pkgCache::VerIterator& ver,
+		      const pkgRecords* records);
+
 /** Get Origin of a package version
  *
  * @param ver The package version
diff -ur aptitude-0.8.7/src/generic/apt/matching/compare_patterns.cc aptitude-0.8.7.tpo/src/generic/apt/matching/compare_patterns.cc
--- aptitude-0.8.7/src/generic/apt/matching/compare_patterns.cc	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/generic/apt/matching/compare_patterns.cc	2018-03-13 20:16:48.352177201 +0100
@@ -195,6 +195,10 @@
 	  case pattern::installed:
 	    return 0;
 
+	  case pattern::label:
+	    return compare_regex_info(p1->get_label_regex_info(),
+				      p2->get_label_regex_info());
+
 	  case pattern::maintainer:
 	    return compare_regex_info(p1->get_maintainer_regex_info(),
 				      p2->get_maintainer_regex_info());
diff -ur aptitude-0.8.7/src/generic/apt/matching/match.cc aptitude-0.8.7.tpo/src/generic/apt/matching/match.cc
--- aptitude-0.8.7/src/generic/apt/matching/match.cc	2017-04-14 14:31:06.000000000 +0200
+++ aptitude-0.8.7.tpo/src/generic/apt/matching/match.cc	2018-03-13 20:26:00.426751550 +0100
@@ -1171,6 +1177,36 @@
 	      return NULL;
 	    break;
 
+	  case pattern::label:
+	    if(!target.get_has_version())
+	      return NULL;
+	    {
+	      pkgCache::PkgIterator pkg(target.get_package_iterator(cache));
+	      pkgCache::VerIterator ver(target.get_version_iterator(cache));
+
+	      for(pkgCache::VerFileIterator f = ver.FileList(); !f.end(); ++f)
+		{
+		  pkgCache::PkgFileIterator cur = f.File();
+		  const char *label = cur.Label();
+
+		  if(!cur.end() && label != NULL)
+		    {
+		      ref_ptr<match>
+			m(evaluate_regexp(p,
+					  p->get_label_regex_info(),
+					  label,
+					  debug));
+
+		      if(m.valid())
+			return m;
+		    }
+		}
+
+	      return NULL;
+	    }
+
+	    break;
+
 	  case pattern::maintainer:
 	    if(!target.get_has_version())
 	      return NULL;
@@ -2098,6 +2134,7 @@
 	  case pattern::garbage:
 	  case pattern::install_version:
 	  case pattern::installed:
+	  case pattern::label:
 	  case pattern::maintainer:
 	  case pattern::multiarch:
 	  case pattern::name:
@@ -2311,6 +2348,7 @@
 	  case pattern::garbage:
 	  case pattern::install_version:
 	  case pattern::installed:
+	  case pattern::label:
 	  case pattern::maintainer:
 	  case pattern::multiarch:
 	  case pattern::name:
@@ -2437,6 +2475,7 @@
 	  case pattern::garbage:
 	  case pattern::install_version:
 	  case pattern::installed:
+	  case pattern::label:
 	  case pattern::maintainer:
 	  case pattern::multiarch:
 	  case pattern::name:
@@ -2637,6 +2676,7 @@
 	  case pattern::garbage:
 	  case pattern::install_version:
 	  case pattern::installed:
+	  case pattern::label:
 	  case pattern::maintainer:
 	  case pattern::multiarch:
 	  case pattern::name:
@@ -2928,6 +2968,7 @@
 	  case pattern::garbage:
 	  case pattern::install_version:
 	  case pattern::installed:
+	  case pattern::label:
 	  case pattern::maintainer:
 	  case pattern::multiarch:
 	  case pattern::name:
diff -ur aptitude-0.8.7/src/generic/apt/matching/parse.cc aptitude-0.8.7.tpo/src/generic/apt/matching/parse.cc
--- aptitude-0.8.7/src/generic/apt/matching/parse.cc	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/generic/apt/matching/parse.cc	2018-03-13 20:08:09.510570287 +0100
@@ -121,6 +121,7 @@
       term_type_for,
       term_type_garbage,
       term_type_installed,
+      term_type_label,
       term_type_maintainer,
       term_type_multiarch,
       term_type_name,
@@ -177,6 +178,7 @@
     { "for", term_type_for },
     { "garbage", term_type_garbage },
     { "installed", term_type_installed },
+    { "label", term_type_label },
     { "maintainer", term_type_maintainer },
     { "multiarch", term_type_multiarch },
     { "name", term_type_name },
@@ -989,6 +991,8 @@
       return pattern::make_garbage();
     case term_type_installed:
       return pattern::make_installed();
+    case term_type_label:
+      return pattern::make_label(parse_string_match_args(start, end));
     case term_type_maintainer:
       return pattern::make_maintainer(parse_string_match_args(start, end));
     case term_type_multiarch:
@@ -1353,6 +1357,8 @@
 		      return pattern::make_source_package(substr);
 		    case 'G':
 		      return pattern::make_tag(substr);
+		    case 'l':
+		      return pattern::make_label(substr);
 		    case 'm':
 		      return pattern::make_maintainer(substr);
 		    case 'n':
diff -ur aptitude-0.8.7/src/generic/apt/matching/pattern.cc aptitude-0.8.7.tpo/src/generic/apt/matching/pattern.cc
--- aptitude-0.8.7/src/generic/apt/matching/pattern.cc	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/generic/apt/matching/pattern.cc	2018-03-13 20:09:34.756186662 +0100
@@ -131,6 +131,7 @@
   case pattern::garbage:
   case pattern::install_version:
   case pattern::installed:
+  case pattern::label:
   case pattern::maintainer:
   case pattern::multiarch:
   case pattern::name:
diff -ur aptitude-0.8.7/src/generic/apt/matching/pattern.h aptitude-0.8.7.tpo/src/generic/apt/matching/pattern.h
--- aptitude-0.8.7/src/generic/apt/matching/pattern.h	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/generic/apt/matching/pattern.h	2018-03-13 20:24:11.092386361 +0100
@@ -388,6 +388,13 @@
 	   *  Matches installed packages/versions.
 	   */
 	  installed,
+	  /** \brief ?label(PATTERN)
+	   *
+	   *  Matches packages by their label.
+	   *
+	   *  Fields: regex_info.
+	   */
+	  label,
 	  /** \brief ?maintainer(PATTERN)
 	   *
 	   *  Matches packages by their Maintainer field.
@@ -1378,6 +1385,30 @@
       }
 
       // @}
+
+      /** \name label term constructor and accessors */
+
+      // @{
+
+      /** \brief Create an ?label term.
+       *
+       *  \param s   The regular expression to match against
+       *             the package's label.
+       */
+      static cwidget::util::ref_ptr<pattern> make_label(const std::string &s)
+      {
+	return new pattern(label, regex_info(s));
+      }
+
+      /** \brief Retrieve the regex_info field of an ?label term. */
+      const regex_info &get_label_regex_info() const
+      {
+	eassert(tp == label);
+
+	return regex_information;
+      }
+
+      // @}
 
       /** \name maintainer term constructor and accessors */
 
diff -ur aptitude-0.8.7/src/generic/apt/matching/serialize.cc aptitude-0.8.7.tpo/src/generic/apt/matching/serialize.cc
--- aptitude-0.8.7/src/generic/apt/matching/serialize.cc	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/generic/apt/matching/serialize.cc	2018-03-13 20:11:40.499259648 +0100
@@ -358,6 +358,12 @@
 	    out << "?installed";
 	    break;
 
+	  case pattern::label:
+	    serialize_regexp_term("label",
+				  p->get_label_regex_info(),
+				  out);
+	    break;
+
 	  case pattern::maintainer:
 	    serialize_regexp_term("maintainer",
 				  p->get_maintainer_regex_info(),
diff -ur aptitude-0.8.7/src/pkg_columnizer.cc aptitude-0.8.7.tpo/src/pkg_columnizer.cc
--- aptitude-0.8.7/src/pkg_columnizer.cc	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/pkg_columnizer.cc	2018-03-13 20:19:27.605188924 +0100
@@ -67,6 +67,7 @@
   {30, false, false},   // tagged (also user-tags)
   {30, false, false},   // source
   {10, false, false},   // architecture
+  {30, false, false},   // label
   {30, false, false},   // origin
   {10, true, true},     // archive
   {9, false, false},    // sizechange
@@ -107,6 +108,7 @@
    N_("Tag/user-tags"),
    N_("Source"),
    N_("Architecture"),
+   N_("Label"),
    N_("Origin"),
 
    // These don't make sense with headers, but whatever:
@@ -531,6 +533,13 @@
       }
       break;
 
+    case label:
+      {
+	std::string label_str = get_label(visible_ver, apt_package_records);
+	return cw::column_disposition(label_str, 0);
+      }
+      break;
+
     case origin:
       {
 	std::string origin_str = get_origin(visible_ver, apt_package_records);
@@ -671,6 +680,8 @@
       return architecture;
     case 'e':
       return source;
+    case 'l':
+      return label;
     case 'O':
       return origin;
 
@@ -729,6 +740,7 @@
 	 &defaults[tagged].width,
 	 &defaults[source].width,
 	 &defaults[architecture].width,
+	 &defaults[label].width,
 	 &defaults[origin].width,
 	 &defaults[archive].width,
 	 &defaults[sizechange].width,
diff -ur aptitude-0.8.7/src/pkg_columnizer.h aptitude-0.8.7.tpo/src/pkg_columnizer.h
--- aptitude-0.8.7/src/pkg_columnizer.h	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/pkg_columnizer.h	2018-03-13 20:20:01.942163433 +0100
@@ -66,7 +66,7 @@
   enum types {name, installed_size, debsize, stateflag, actionflag,
 	      description, currver, candver, longstate, longaction,
 	      maintainer, priority, shortpriority, section, revdepcount,
-	      autoset, tagged, source, architecture, origin, archive, sizechange,
+	      autoset, tagged, source, architecture, label, origin, archive, sizechange,
 
               progname, progver, brokencount, diskusage, downloadsize,
 	      pin_priority, hostname, trust_state, numtypes};
diff -ur aptitude-0.8.7/src/pkg_info_screen.cc aptitude-0.8.7.tpo/src/pkg_info_screen.cc
--- aptitude-0.8.7/src/pkg_info_screen.cc	2017-03-07 19:52:49.000000000 +0100
+++ aptitude-0.8.7.tpo/src/pkg_info_screen.cc	2018-03-13 20:21:14.732124898 +0100
@@ -149,6 +149,11 @@
 					_("Source Package: "), source_package.c_str()
 				      )));
 
+      std::string label = get_label(ver, apt_package_records);
+      frags.push_back(clipbox(cw::fragf("%B%s%b%s%n",
+					_("Label: "), label.c_str()
+					)));
+
       std::string origin = get_origin(ver, apt_package_records);
       frags.push_back(clipbox(cw::fragf("%B%s%b%s%n",
 					_("Origin: "), origin.c_str()
diff -ur aptitude-0.8.7/src/pkg_ver_item.cc aptitude-0.8.7.tpo/src/pkg_ver_item.cc
--- aptitude-0.8.7/src/pkg_ver_item.cc	2017-04-14 01:32:05.000000000 +0200
+++ aptitude-0.8.7.tpo/src/pkg_ver_item.cc	2018-03-13 20:20:13.294478395 +0100
@@ -379,6 +379,7 @@
     case shortpriority:
     case source:
     case architecture:
+    case label:
     case origin:
       // fall through
     default:


More information about the Aptitude-devel mailing list