diff options
-rw-r--r-- | meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch | 158 | ||||
-rw-r--r-- | meta/recipes-devtools/python/python-smartpm_git.bb | 1 |
2 files changed, 159 insertions, 0 deletions
diff --git a/meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch b/meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch new file mode 100644 index 00000000000..6e672b3321e --- /dev/null +++ b/meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch @@ -0,0 +1,158 @@ +Sadly, smart is not deterministic so the same build can go down multiple different +pathways. We'd expect to see the same warnings however depending on the pathway +taken, it may or may not warn, particularly with Recommends since they're optional. + +For example, where a Recommended package is available but has Conflicts, we'd expect +to see an warning that we couldn't install it. Some code paths silently hide this +(its a LOCKED_CONFLICT). We add printing of warnings for this case. + +Also, if there are two compatible feeds available (e.g. i586 and core2_32), this +changes the code path from direct _install() to _pending() since there are multiple +providers. This patch adds warning handling to _pending() so we don't hit hard +failures there. This is as seen with the mysterious libspeexdsp failures for x86-lsb +on the autobuilder. + +Upstream-Status: Pending +RP +2015/7/16 + +Index: git/smart/transaction.py +=================================================================== +--- git.orig/smart/transaction.py ++++ git/smart/transaction.py +@@ -651,13 +651,14 @@ class Transaction(object): + + if not prvpkgs: + # No packages provide it at all. Give up. ++ ++ 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 reqrequired: +- 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)) +@@ -665,7 +666,11 @@ class Transaction(object): + raise Failed, _("Can't install %s: no package provides %s") % \ + (pkg, req) + else: ++ if reasons: ++ iface.warning(_("Can't install %s: unable to install provider for %s:\n %s") % \ ++ (pkg, req, '\n '.join(reasons))) ++ + # It's only a recommend, skip + continue + + if len(prvpkgs) == 1: +@@ -846,6 +852,14 @@ class Transaction(object): + isinst = changeset.installed + getweight = self._policy.getWeight + ++ attempt = sysconf.has("attempt-install", soft=True) ++ ++ def handle_failure(msg): ++ if attempt: ++ iface.warning(msg) ++ else: ++ raise Failed, msg ++ + updown = [] + while pending: + item = pending.pop(0) +@@ -870,8 +884,9 @@ class Transaction(object): + + if not prvpkgs: + # No packages provide it at all. Give up. +- raise Failed, _("Can't install %s: no package " +- "provides %s") % (pkg, req) ++ handle_failure(_("Can't install %s: no package " ++ "provides %s") % (pkg, req)) ++ continue + + if len(prvpkgs) > 1: + # More than one package provide it. We use _pending here, +@@ -894,9 +909,10 @@ class Transaction(object): + keeporder, cs, lk)) + keeporder += 0.000001 + if not alternatives: +- raise Failed, _("Can't install %s: all packages " ++ handle_failure(_("Can't install %s: all packages " + "providing %s failed to install:\n%s")\ +- % (pkg, req, "\n".join(failures)) ++ % (pkg, req, "\n".join(failures))) ++ continue + alternatives.sort() + changeset.setState(alternatives[0][1]) + if len(alternatives) == 1: +@@ -954,18 +970,20 @@ class Transaction(object): + + for reqpkg in reqpkgs: + if reqpkg in locked and isinst(reqpkg): +- raise Failed, _("Can't remove %s: requiring " ++ handle_failure(_("Can't remove %s: requiring " + "package %s is locked") % \ +- (pkg, reqpkg) ++ (pkg, reqpkg)) ++ continue + for reqpkg in reqpkgs: + # We check again, since other actions may have + # changed their state. + if not isinst(reqpkg): + continue + if reqpkg in locked: +- raise Failed, _("Can't remove %s: requiring " ++ handle_failure(_("Can't remove %s: requiring " + "package %s is locked") % \ +- (pkg, reqpkg) ++ (pkg, reqpkg)) ++ continue + self._remove(reqpkg, changeset, locked, + pending, depth) + continue +@@ -978,12 +996,14 @@ class Transaction(object): + try: + for reqpkg in reqpkgs: + if reqpkg in locked and isinst(reqpkg): +- raise Failed, _("%s is locked") % reqpkg ++ handle_failure(_("%s is locked") % reqpkg) ++ continue + for reqpkg in reqpkgs: + if not cs.installed(reqpkg): + continue + if reqpkg in lk: +- raise Failed, _("%s is locked") % reqpkg ++ handle_failure(_("%s is locked") % reqpkg) ++ continue + self._remove(reqpkg, cs, lk, None, depth) + except Failed, e: + failures.append(unicode(e)) +@@ -991,9 +1011,10 @@ class Transaction(object): + alternatives.append((getweight(cs), cs, lk)) + + if not alternatives: +- raise Failed, _("Can't install %s: all packages providing " ++ handle_failure(_("Can't install %s: all packages providing " + "%s failed to install:\n%s") \ +- % (pkg, prv, "\n".join(failures)) ++ % (pkg, prv, "\n".join(failures))) ++ continue + + alternatives.sort() + changeset.setState(alternatives[0][1]) +@@ -1246,6 +1267,7 @@ class Transaction(object): + changeset.setRequested(pkg, True) + except Failed, e: + if sysconf.has("attempt-install", soft=True): ++ iface.warning(_("Can't install %s: %s") % (pkg, str(e))) + if pkg in changeset: + del changeset[pkg] + continue diff --git a/meta/recipes-devtools/python/python-smartpm_git.bb b/meta/recipes-devtools/python/python-smartpm_git.bb index 18df892b9b4..163461e5923 100644 --- a/meta/recipes-devtools/python/python-smartpm_git.bb +++ b/meta/recipes-devtools/python/python-smartpm_git.bb @@ -18,6 +18,7 @@ SRC_URI = "\ file://smart-improve-error-reporting.patch \ file://smart-channelsdir.patch \ file://smart-attempt.patch \ + file://smart-attempt-fix.patch \ file://smart-rpm4-fixes.patch \ file://smart-add-for-rpm-ignoresize-check.patch \ file://smart-already-installed-message.patch \ |