* [PATCH 0/4] Smart/RPM related fixes
@ 2013-07-25 17:09 Paul Eggleton
2013-07-25 17:09 ` [PATCH 1/4] python-smartpm: fix sometimes reporting no provider instead of conflict Paul Eggleton
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Paul Eggleton @ 2013-07-25 17:09 UTC (permalink / raw)
To: openembedded-core
Note: there is one patch in here that affects BAD_RECOMMENDATIONS
behaviour for ipk.
The following changes since commit ac5d20f4adac69ea1702694fb50849c9e465b443:
systemd: Remove systemd_unitdir if systemd is not in distro features (2013-07-23 07:49:54 -0700)
are available in the git repository at:
git://git.openembedded.org/openembedded-core-contrib paule/smart
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=paule/smart
Paul Eggleton (4):
python-smartpm: fix sometimes reporting no provider instead of conflict
python-smartpm: add ignore-recommends package flag
classes/image: ensure BAD_RECOMMENDATIONS supports pre-renamed package names
classes/rootfs_rpm: implement BAD_RECOMMENDATIONS for RPM
meta/classes/image.bbclass | 1 +
meta/classes/package_rpm.bbclass | 11 +-
meta/classes/rootfs_ipk.bbclass | 2 -
meta/classes/rootfs_rpm.bbclass | 3 +-
meta/conf/bitbake.conf | 2 +
.../python-smartpm/smart-conflict-provider.patch | 196 +++++++++++++++++++++
.../smart-flag-ignore-recommends.patch | 60 +++++++
.../python/python-smartpm_1.4.1.bb | 2 +
8 files changed, 271 insertions(+), 6 deletions(-)
create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-conflict-provider.patch
create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-flag-ignore-recommends.patch
--
1.8.1.2
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 1/4] python-smartpm: fix sometimes reporting no provider instead of conflict 2013-07-25 17:09 [PATCH 0/4] Smart/RPM related fixes Paul Eggleton @ 2013-07-25 17:09 ` Paul Eggleton 2013-07-25 17:09 ` [PATCH 2/4] python-smartpm: add ignore-recommends package flag Paul Eggleton ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: Paul Eggleton @ 2013-07-25 17:09 UTC (permalink / raw) To: openembedded-core If a requirement of a package is conflicted, depending on how the solution is reached, Smart's transaction code may eliminate all providers of the requirement and then error out because nothing provides them without saying why. To work around this, store a reason and report that back if we need to, so for example instead of: error: Can't install packagegroup-core-ssh-dropbear-1.0-r1@all: no package provides dropbear we will now get: error: Can't install packagegroup-core-ssh-dropbear-1.0-r1@all: unable to install provider for dropbear: error: dropbear-2013.58-r1.0@armv5te is conflicted by openssh-sshd-6.2p2-r0@armv5te Fixes [YOCTO #4305]. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> --- .../python-smartpm/smart-conflict-provider.patch | 196 +++++++++++++++++++++ .../python/python-smartpm_1.4.1.bb | 1 + 2 files changed, 197 insertions(+) create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-conflict-provider.patch diff --git a/meta/recipes-devtools/python/python-smartpm/smart-conflict-provider.patch b/meta/recipes-devtools/python/python-smartpm/smart-conflict-provider.patch new file mode 100644 index 0000000..10a7447 --- /dev/null +++ b/meta/recipes-devtools/python/python-smartpm/smart-conflict-provider.patch @@ -0,0 +1,196 @@ +Report a reason when a dependency could not be installed because it is locked + +If a requirement of a package is conflicted, depending on how the +solution is reached, the transaction code may eliminate all providers +of the requirement and then error out because nothing provides them. To +work around this, store a reason in the locked dict and report that back +if we need to, so for example instead of: + + error: Can't install packagegroup-core-ssh-dropbear-1.0-r1@all: no package provides dropbear + +we now get: + + error: Can't install packagegroup-core-ssh-dropbear-1.0-r1@all: unable to install provider for dropbear: + error: dropbear-2013.58-r1.0@armv5te is conflicted by openssh-sshd-6.2p2-r0@armv5te + +Upstream-Status: Pending + +Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> +--- + smart/const.py | 7 +++++++ + smart/transaction.py | 58 +++++++++++++++++++++++++++++++++++++++++----------- + 2 files changed, 53 insertions(+), 12 deletions(-) + +diff --git a/smart/const.py b/smart/const.py +index 4d8e5cb..67c1ac5 100644 +--- a/smart/const.py ++++ b/smart/const.py +@@ -70,4 +70,11 @@ DATADIR = "/var/lib/smart/" + USERDATADIR = "~/.smart/" + CONFFILE = "config" + ++LOCKED_INSTALL = Enum('LOCKED_INSTALL') ++LOCKED_REMOVE = Enum('LOCKED_REMOVE') ++LOCKED_CONFLICT = Enum('LOCKED_CONFLICT') ++LOCKED_CONFLICT_BY = Enum('LOCKED_CONFLICT_BY') ++LOCKED_NO_COEXIST = Enum('LOCKED_NO_COEXIST') ++LOCKED_SYSCONF = Enum('LOCKED_SYSCONF') ++ + # vim:ts=4:sw=4:et +diff --git a/smart/transaction.py b/smart/transaction.py +index 300b9cc..dd9aa38 100644 +--- a/smart/transaction.py ++++ b/smart/transaction.py +@@ -19,10 +19,31 @@ + # along with Smart Package Manager; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + # +-from smart.const import INSTALL, REMOVE, UPGRADE, FIX, REINSTALL, KEEP ++from smart.const import INSTALL, REMOVE, UPGRADE, FIX, REINSTALL, KEEP, LOCKED_INSTALL, LOCKED_CONFLICT, LOCKED_CONFLICT_BY, LOCKED_NO_COEXIST, LOCKED_SYSCONF, LOCKED_REMOVE + from smart.cache import PreRequires, Package + from smart import * + ++def lock_reason(pkg, lockvalue): ++ try: ++ (reason, otherpkg) = lockvalue ++ except TypeError: ++ reason = None ++ lockvalue = None ++ if reason == LOCKED_INSTALL: ++ return _("%s is to be installed") % pkg ++ elif reason == LOCKED_CONFLICT: ++ return _("%s conflicts with %s") % (pkg, otherpkg) ++ elif reason == LOCKED_CONFLICT_BY: ++ return _("%s is conflicted by %s") % (pkg, otherpkg) ++ elif reason == LOCKED_NO_COEXIST: ++ return _("%s cannot coexist with %s") % (pkg, otherpkg) ++ elif reason == LOCKED_SYSCONF: ++ return _("%s is locked in system configuration") % pkg ++ elif reason == LOCKED_REMOVE: ++ return _("%s is to be removed") % pkg ++ else: ++ return _("%s is locked (unknown reason)") % pkg ++ + class ChangeSet(dict): + + def __init__(self, cache, state=None, requested=None): +@@ -187,7 +208,7 @@ class Policy(object): + for pkg in pkgconf.filterByFlag("lock", cache.getPackages()): + if pkg not in self._locked: + self._sysconflocked.append(pkg) +- self._locked[pkg] = True ++ self._locked[pkg] = (LOCKED_SYSCONF, None) + + def runFinished(self): + self._priorities.clear() +@@ -524,7 +545,7 @@ class Transaction(object): + if ownpending: + pending = [] + +- locked[pkg] = True ++ locked[pkg] = (LOCKED_INSTALL, None) + changeset.set(pkg, INSTALL) + isinst = changeset.installed + +@@ -535,7 +556,7 @@ class Transaction(object): + if prvpkg is pkg: + continue + if not isinst(prvpkg): +- locked[prvpkg] = True ++ locked[prvpkg] = (LOCKED_CONFLICT_BY, pkg) + continue + if prvpkg in locked: + raise Failed, _("Can't install %s: conflicted package " +@@ -550,7 +571,7 @@ class Transaction(object): + if cnfpkg is pkg: + continue + if not isinst(cnfpkg): +- locked[cnfpkg] = True ++ locked[cnfpkg] = (LOCKED_CONFLICT, pkg) + continue + if cnfpkg in locked: + raise Failed, _("Can't install %s: it's conflicted by " +@@ -565,7 +586,7 @@ class Transaction(object): + for namepkg in namepkgs: + if namepkg is not pkg and not pkg.coexists(namepkg): + if not isinst(namepkg): +- locked[namepkg] = True ++ locked[namepkg] = (LOCKED_NO_COEXIST, pkg) + continue + if namepkg in locked: + raise Failed, _("Can't install %s: it can't coexist " +@@ -577,6 +598,7 @@ class Transaction(object): + + # Check if someone is already providing it. + prvpkgs = {} ++ lockedpkgs = {} + found = False + for prv in req.providedby: + for prvpkg in prv.packages: +@@ -585,6 +607,8 @@ class Transaction(object): + break + if prvpkg not in locked: + prvpkgs[prvpkg] = True ++ else: ++ lockedpkgs[prvpkg] = locked[prvpkg] + else: + continue + break +@@ -597,7 +621,17 @@ class Transaction(object): + if not prvpkgs: + # No packages provide it at all. Give up. + if req in pkg.requires: +- raise Failed, _("Can't install %s: no package provides %s") % \ ++ reasons = [] ++ for prv in req.providedby: ++ for prvpkg in prv.packages: ++ lockedres = lockedpkgs.get(prvpkg, None) ++ if lockedres: ++ reasons.append(lock_reason(prvpkg, lockedres)) ++ if reasons: ++ raise Failed, _("Can't install %s: unable to install provider for %s:\n %s") % \ ++ (pkg, req, '\n '.join(reasons)) ++ else: ++ raise Failed, _("Can't install %s: no package provides %s") % \ + (pkg, req) + else: + # It's only a recommend, skip +@@ -627,7 +661,7 @@ class Transaction(object): + if ownpending: + pending = [] + +- locked[pkg] = True ++ locked[pkg] = (LOCKED_REMOVE, None) + changeset.set(pkg, REMOVE) + isinst = changeset.installed + +@@ -1140,22 +1174,22 @@ class Transaction(object): + if op is KEEP: + if pkg in changeset: + del changeset[pkg] +- locked[pkg] = True ++ locked[pkg] = (LOCKED_KEEP, None) + elif op is INSTALL: + if not isinst(pkg) and pkg in locked: + raise Failed, _("Can't install %s: it's locked") % pkg + changeset.set(pkg, INSTALL) +- locked[pkg] = True ++ locked[pkg] = (LOCKED_INSTALL, None) + elif op is REMOVE: + if isinst(pkg) and pkg in locked: + raise Failed, _("Can't remove %s: it's locked") % pkg + changeset.set(pkg, REMOVE) +- locked[pkg] = True ++ locked[pkg] = (LOCKED_REMOVE, None) + elif op is REINSTALL: + if pkg in locked: + raise Failed, _("Can't reinstall %s: it's locked")%pkg + changeset.set(pkg, INSTALL, force=True) +- locked[pkg] = True ++ locked[pkg] = (LOCKED_INSTALL, None) + elif op is UPGRADE: + pass + +-- +1.8.1.2 + diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb index 0cf3847..3e39231 100644 --- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb +++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb @@ -26,6 +26,7 @@ SRC_URI = "\ file://smart-multilib-fixes.patch \ file://smart-yaml-error.patch \ file://smart-channelsdir.patch \ + file://smart-conflict-provider.patch \ " SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6" -- 1.8.1.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] python-smartpm: add ignore-recommends package flag 2013-07-25 17:09 [PATCH 0/4] Smart/RPM related fixes Paul Eggleton 2013-07-25 17:09 ` [PATCH 1/4] python-smartpm: fix sometimes reporting no provider instead of conflict Paul Eggleton @ 2013-07-25 17:09 ` Paul Eggleton 2013-07-25 17:09 ` [PATCH 3/4] classes/image: ensure BAD_RECOMMENDATIONS supports pre-renamed package names Paul Eggleton 2013-07-25 17:09 ` [PATCH 4/4] classes/rootfs_rpm: implement BAD_RECOMMENDATIONS for RPM Paul Eggleton 3 siblings, 0 replies; 5+ messages in thread From: Paul Eggleton @ 2013-07-25 17:09 UTC (permalink / raw) To: openembedded-core Adds support for a flag that is saved into Smart's configuration against a package that says it should not be installed if it is only recommended by a package being installed rather than required. This will enable us to add BAD_RECOMMENDATIONS support for RPM. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> --- .../smart-flag-ignore-recommends.patch | 60 ++++++++++++++++++++++ .../python/python-smartpm_1.4.1.bb | 1 + 2 files changed, 61 insertions(+) create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-flag-ignore-recommends.patch diff --git a/meta/recipes-devtools/python/python-smartpm/smart-flag-ignore-recommends.patch b/meta/recipes-devtools/python/python-smartpm/smart-flag-ignore-recommends.patch new file mode 100644 index 0000000..5d5c6f4 --- /dev/null +++ b/meta/recipes-devtools/python/python-smartpm/smart-flag-ignore-recommends.patch @@ -0,0 +1,60 @@ +Add ignore-recommends flag support + +Allow configuring recommends on specific packages to be ignored. + +Upstream-Status: Pending + +Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> +--- + smart/commands/flag.py | 3 +++ + smart/transaction.py | 7 ++++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/smart/commands/flag.py b/smart/commands/flag.py +index 8b90496..191bb11 100644 +--- a/smart/commands/flag.py ++++ b/smart/commands/flag.py +@@ -47,6 +47,9 @@ Currently known flags are: + multi-version - Flagged packages may have more than one version + installed in the system at the same time + (backend dependent). ++ ignore-recommends - Flagged packages will not be installed, if ++ they are only recommended by a package to be ++ installed rather than required. + + security - Flagged packages are updates for security errata. + bugfix - Flagged packages are updates for bugfix errata. +diff --git a/smart/transaction.py b/smart/transaction.py +index dd9aa38..38eabae 100644 +--- a/smart/transaction.py ++++ b/smart/transaction.py +@@ -596,12 +596,17 @@ class Transaction(object): + # Install packages required by this one. + for req in pkg.requires + pkg.recommends: + ++ reqrequired = req in pkg.requires ++ + # Check if someone is already providing it. + prvpkgs = {} + lockedpkgs = {} + found = False + for prv in req.providedby: + for prvpkg in prv.packages: ++ if not reqrequired: ++ if pkgconf.testFlag("ignore-recommends", prvpkg): ++ continue + if isinst(prvpkg): + found = True + break +@@ -620,7 +625,7 @@ class Transaction(object): + + if not prvpkgs: + # No packages provide it at all. Give up. +- if req in pkg.requires: ++ if reqrequired: + reasons = [] + for prv in req.providedby: + for prvpkg in prv.packages: +-- +1.8.1.2 + diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb index 3e39231..70ac8bf 100644 --- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb +++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb @@ -27,6 +27,7 @@ SRC_URI = "\ file://smart-yaml-error.patch \ file://smart-channelsdir.patch \ file://smart-conflict-provider.patch \ + file://smart-flag-ignore-recommends.patch \ " SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6" -- 1.8.1.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] classes/image: ensure BAD_RECOMMENDATIONS supports pre-renamed package names 2013-07-25 17:09 [PATCH 0/4] Smart/RPM related fixes Paul Eggleton 2013-07-25 17:09 ` [PATCH 1/4] python-smartpm: fix sometimes reporting no provider instead of conflict Paul Eggleton 2013-07-25 17:09 ` [PATCH 2/4] python-smartpm: add ignore-recommends package flag Paul Eggleton @ 2013-07-25 17:09 ` Paul Eggleton 2013-07-25 17:09 ` [PATCH 4/4] classes/rootfs_rpm: implement BAD_RECOMMENDATIONS for RPM Paul Eggleton 3 siblings, 0 replies; 5+ messages in thread From: Paul Eggleton @ 2013-07-25 17:09 UTC (permalink / raw) To: openembedded-core Use runtime remapping on BAD_RECOMMENDATIONS just as we do with variables such as IMAGE_INSTALL, so that we're specifying the name prior to any renaming e.g. that done by debian.bbclass. Note that this is a change in behaviour for renamed packages, however this is the correct thing to be doing; a search of existing layers suggests this shouldn't cause widespread incompatibilities. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> --- meta/classes/image.bbclass | 1 + 1 file changed, 1 insertion(+) diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index 380ed8e..cf02f88 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass @@ -132,6 +132,7 @@ python () { pn = d.getVar('PN', True) runtime_mapping_rename("PACKAGE_INSTALL", pn, d) runtime_mapping_rename("PACKAGE_INSTALL_ATTEMPTONLY", pn, d) + runtime_mapping_rename("BAD_RECOMMENDATIONS", pn, d) # Ensure we have the vendor list for complementary package handling ml_vendor_list = "" -- 1.8.1.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] classes/rootfs_rpm: implement BAD_RECOMMENDATIONS for RPM 2013-07-25 17:09 [PATCH 0/4] Smart/RPM related fixes Paul Eggleton ` (2 preceding siblings ...) 2013-07-25 17:09 ` [PATCH 3/4] classes/image: ensure BAD_RECOMMENDATIONS supports pre-renamed package names Paul Eggleton @ 2013-07-25 17:09 ` Paul Eggleton 3 siblings, 0 replies; 5+ messages in thread From: Paul Eggleton @ 2013-07-25 17:09 UTC (permalink / raw) To: openembedded-core Add support for the BAD_RECOMMENDATIONS variable that can be used to prevent specific packages from being installed via an RRECOMMENDS relationship when using the RPM backend. (Previously this functionality was only available when using ipk packaging.) In the process this moves the defaulting of BAD_RECOMMENDATIONS (as empty) to bitbake.conf since it is no longer specific to the ipk backend, as well as unifying some of the code that creates the configuration for smart for use on the host and target. Fixes [YOCTO #3916]. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> --- meta/classes/package_rpm.bbclass | 11 +++++++++-- meta/classes/rootfs_ipk.bbclass | 2 -- meta/classes/rootfs_rpm.bbclass | 3 +-- meta/conf/bitbake.conf | 2 ++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass index 1537079..324d83f 100644 --- a/meta/classes/package_rpm.bbclass +++ b/meta/classes/package_rpm.bbclass @@ -224,6 +224,14 @@ translate_oe_to_smart() { export pkgs_to_install } +package_write_smart_config() { + # Write common configuration for host and target usage + smart --data-dir=$1/var/lib/smart config --set rpm-nolinktos=1 + smart --data-dir=$1/var/lib/smart config --set rpm-noparentdirs=1 + for i in ${BAD_RECOMMENDATIONS}; do + smart --data-dir=$1/var/lib/smart flag --set ignore-recommends $i + done +} # # Install a bunch of packages using rpm. @@ -345,10 +353,9 @@ EOF rm -rf ${target_rootfs}/var/lib/smart smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-root=${target_rootfs} smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-dbpath=${rpmlibdir} - smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-nolinktos=1 - smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-noparentdirs=1 smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-extra-macros._var=${localstatedir} smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-extra-macros._tmppath=/install/tmp + package_write_smart_config ${target_rootfs} # Optional debugging #smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-log-level=debug #smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-log-file=/tmp/smart-debug-logfile diff --git a/meta/classes/rootfs_ipk.bbclass b/meta/classes/rootfs_ipk.bbclass index 1403422..c9650cb 100644 --- a/meta/classes/rootfs_ipk.bbclass +++ b/meta/classes/rootfs_ipk.bbclass @@ -21,8 +21,6 @@ OPKG_POSTPROCESS_COMMANDS = "ipk_insert_feed_uris; " OPKGLIBDIR = "${localstatedir}/lib" -# Which packages to not install on the basis of a recommendation -BAD_RECOMMENDATIONS ?= "" MULTILIBRE_ALLOW_REP = "${OPKGLIBDIR}/opkg" fakeroot rootfs_ipk_do_rootfs () { diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass index 1b09c8d..30b52d4 100644 --- a/meta/classes/rootfs_rpm.bbclass +++ b/meta/classes/rootfs_rpm.bbclass @@ -163,8 +163,7 @@ rpm_setup_smart_target_config() { # Set up smart configuration for the target rm -rf ${IMAGE_ROOTFS}/var/lib/smart smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart channel --add rpmsys type=rpm-sys -y - smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart config --set rpm-nolinktos=1 - smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart config --set rpm-noparentdirs=1 + package_write_smart_config ${IMAGE_ROOTFS} rm -f ${IMAGE_ROOTFS}/var/lib/smart/config.old } diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf index 62a3936..07eb473 100644 --- a/meta/conf/bitbake.conf +++ b/meta/conf/bitbake.conf @@ -753,6 +753,8 @@ COMBINED_FEATURES[vardeps] += "DISTRO_FEATURES MACHINE_FEATURES" SERIAL_CONSOLE ??= "" SERIAL_CONSOLES ??= "${@d.getVar('SERIAL_CONSOLE', True).replace(' ', ';')}" +BAD_RECOMMENDATIONS ?= "" + # Make sure MACHINE isn't exported # (breaks binutils at least) MACHINE[unexport] = "1" -- 1.8.1.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-07-25 17:10 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-07-25 17:09 [PATCH 0/4] Smart/RPM related fixes Paul Eggleton 2013-07-25 17:09 ` [PATCH 1/4] python-smartpm: fix sometimes reporting no provider instead of conflict Paul Eggleton 2013-07-25 17:09 ` [PATCH 2/4] python-smartpm: add ignore-recommends package flag Paul Eggleton 2013-07-25 17:09 ` [PATCH 3/4] classes/image: ensure BAD_RECOMMENDATIONS supports pre-renamed package names Paul Eggleton 2013-07-25 17:09 ` [PATCH 4/4] classes/rootfs_rpm: implement BAD_RECOMMENDATIONS for RPM Paul Eggleton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox