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
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:
_______________________________________________ Aptitude-devel mailing list Aptitude-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/aptitude-devel