159 lines
7.5 KiB
Diff
Executable File
159 lines
7.5 KiB
Diff
Executable File
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
|