From 9ff0e8b4012f1e68f6caebc3027f9d1bada00f13 Mon Sep 17 00:00:00 2001 From: Alexander Kanavin Date: Mon, 2 Jan 2017 15:14:41 +0200 Subject: python-smartpm: remove the recipe Signed-off-by: Alexander Kanavin --- ...m_sys-use-md5sum-instead-of-mtime-as-the-.patch | 38 -- ...art-add-deugging-when-targetpath-is-empty.patch | 47 --- .../smart-add-for-rpm-ignoresize-check.patch | 35 -- .../smart-already-installed-message.patch | 54 --- .../python/python-smartpm/smart-attempt-fix.patch | 158 --------- .../python/python-smartpm/smart-attempt.patch | 185 ---------- ...cache.py-getPackages-matches-name-version.patch | 43 --- .../python-smartpm/smart-channel-remove-all.patch | 33 -- .../python/python-smartpm/smart-channelsdir.patch | 24 -- .../python/python-smartpm/smart-locale.patch | 27 -- .../python/python-smartpm/smart-recommends.patch | 381 --------------------- .../smart-rpm-transaction-failure-check.patch | 57 --- .../smart-set-noprogress-for-pycurl.patch | 20 -- .../smartpm-rpm5-support-check-signatures.patch | 112 ------ meta/recipes-devtools/python/python-smartpm_git.bb | 141 -------- 15 files changed, 1355 deletions(-) delete mode 100644 meta/recipes-devtools/python/python-smartpm/channels-rpm_sys-use-md5sum-instead-of-mtime-as-the-.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-add-deugging-when-targetpath-is-empty.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-add-for-rpm-ignoresize-check.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-already-installed-message.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-attempt.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-channel-remove-all.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-channelsdir.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-locale.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-recommends.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-rpm-transaction-failure-check.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-set-noprogress-for-pycurl.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm/smartpm-rpm5-support-check-signatures.patch delete mode 100644 meta/recipes-devtools/python/python-smartpm_git.bb diff --git a/meta/recipes-devtools/python/python-smartpm/channels-rpm_sys-use-md5sum-instead-of-mtime-as-the-.patch b/meta/recipes-devtools/python/python-smartpm/channels-rpm_sys-use-md5sum-instead-of-mtime-as-the-.patch deleted file mode 100644 index 2f14a124ef..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/channels-rpm_sys-use-md5sum-instead-of-mtime-as-the-.patch +++ /dev/null @@ -1,38 +0,0 @@ -channels/rpm_sys: use md5sum instead of mtime as the digest - -Use the internal getFileDigest() function (which defaults to md5) instead of -mtime for getting the file digest. On some systems mtime proved to be -unreliable because of delayed update. This caused smart to miss rpm db updates -and thus get its understanding of installed packages out of sync. - -Upstream-Status: Pending - -Signed-off-by: Markus Lehtonen ---- - smart/channels/rpm_sys.py | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/smart/channels/rpm_sys.py b/smart/channels/rpm_sys.py -index b9fda27..6f1fe94 100644 ---- a/smart/channels/rpm_sys.py -+++ b/smart/channels/rpm_sys.py -@@ -22,6 +22,7 @@ - from smart.backends.rpm.header import RPMDBLoader - from smart.backends.rpm.base import getTS, rpm_join_dbpath - from smart.channel import PackageChannel -+from smart.util.filetools import getFileDigest - from smart import * - import os - -@@ -35,7 +36,7 @@ class RPMSysChannel(PackageChannel): - dbdir = rpm_join_dbpath(sysconf.get("rpm-root", "/"), - sysconf.get("rpm-dbpath", "var/lib/rpm")) - path = os.path.join(dbdir, "Packages") -- digest = os.path.getmtime(path) -+ digest = getFileDigest(path) - if digest == self._digest: - return True - self.removeLoaders() --- -2.6.6 - diff --git a/meta/recipes-devtools/python/python-smartpm/smart-add-deugging-when-targetpath-is-empty.patch b/meta/recipes-devtools/python/python-smartpm/smart-add-deugging-when-targetpath-is-empty.patch deleted file mode 100644 index 5e80804bf4..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-add-deugging-when-targetpath-is-empty.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 01e51afd03131947f8d74b9a23fdbc0078249499 Mon Sep 17 00:00:00 2001 -From: Mariano Lopez -Date: Wed, 3 Aug 2016 07:47:09 +0000 -Subject: [PATCH] fetcher.py: Add debugging when targetpath is empty - -There are several errors when openining files or manipulating -path strings, those errors point targetpath passed to -setSucceeded() is empty. This patch won't solve the problems, -but will add debugging to give an idea why is failing. - -Upstream-Status: Inappropriate [debugging] - -Signed-off-by: Mariano Lopez ---- - smart/fetcher.py | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/smart/fetcher.py b/smart/fetcher.py -index dd3ff6b..64aa979 100644 ---- a/smart/fetcher.py -+++ b/smart/fetcher.py -@@ -594,6 +594,22 @@ class FetchItem(object): - self._eta = None - - def setSucceeded(self, targetpath, fetchedsize=0): -+ # It seems the in some odd cases targetpath here -+ # is empty, this will lead to bugs in several places -+ if not targetpath: -+ import traceback -+ tb_str = "" -+ for threadId, stack in sys._current_frames().items(): -+ tb_str += '\nThreadID: %s' % threadId -+ for filename, lineno, name, line in traceback.extract_stack(stack): -+ tb_str += '\nFile: "%s", line %d, in %s' % (filename, lineno, name) -+ if line: -+ tb_str += "\n %s" % line.strip() -+ error_string = ["No file path specified", -+ "URL: %s" % self._url, -+ "Status: %s" % self._status, -+ "Traceback: %s" % tb_str] -+ raise Error, _("\n".join(error_string)) - if self._status is not FAILED: - self._status = SUCCEEDED - self._targetpath = targetpath --- -2.6.6 - diff --git a/meta/recipes-devtools/python/python-smartpm/smart-add-for-rpm-ignoresize-check.patch b/meta/recipes-devtools/python/python-smartpm/smart-add-for-rpm-ignoresize-check.patch deleted file mode 100644 index fe98d070d3..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-add-for-rpm-ignoresize-check.patch +++ /dev/null @@ -1,35 +0,0 @@ -python-smartpm: Add checking for "rpm-ignoresize" option - -The do_rootfs takes a very long time when build host has mounted many NFS -devices. syscall lstat() was being called on every filesystem mounted on the -build host during building. -The reason for the lstat() is that rpm is verifying that enough free disk space -is available to do the install. However, since the install is into the target -rootfs it should not matter how much free space there is in the host mounts. -Add checking for "rpm-ignoresize", by it, smart can make whether RPM skip -checking for diskspace when install a rpm package. - -Upstream-Status: Pending - -Signed-off-by: wenlin.kang -Signed-off-by: Chong Lu ---- - smart/backends/rpm/pm.py | 4 ++++ - 1 file changed, 4 insertions(+) - -Index: git/smart/backends/rpm/pm.py -=================================================================== ---- git.orig/smart/backends/rpm/pm.py -+++ git/smart/backends/rpm/pm.py -@@ -233,6 +233,11 @@ class RPMPackageManager(PackageManager): - if sysconf.get("rpm-order"): - ts.order() - probfilter = rpm.RPMPROB_FILTER_OLDPACKAGE -+ -+ if sysconf.get("rpm-ignoresize", False): -+ probfilter |= rpm.RPMPROB_FILTER_DISKNODES -+ probfilter |= rpm.RPMPROB_FILTER_DISKSPACE -+ - if force or reinstall: - probfilter |= rpm.RPMPROB_FILTER_REPLACEPKG - probfilter |= rpm.RPMPROB_FILTER_REPLACEOLDFILES diff --git a/meta/recipes-devtools/python/python-smartpm/smart-already-installed-message.patch b/meta/recipes-devtools/python/python-smartpm/smart-already-installed-message.patch deleted file mode 100644 index 9055555cd0..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-already-installed-message.patch +++ /dev/null @@ -1,54 +0,0 @@ -From a74a9a9eb9d75964a0e978950e8b191d7a18d763 Mon Sep 17 00:00:00 2001 -From: Paul Eggleton -Date: Fri, 5 Jun 2015 17:07:16 +0100 -Subject: [PATCH] smart: change "is already installed" message from warning to - info - -This doesn't need to be a warning. - -Upstream-Status: Pending - -Signed-off-by: Paul Eggleton ---- - smart/commands/install.py | 4 ++-- - smart/interfaces/text/interactive.py | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/smart/commands/install.py b/smart/commands/install.py -index 6ef9682..80d456b 100644 ---- a/smart/commands/install.py -+++ b/smart/commands/install.py -@@ -152,7 +152,7 @@ def main(ctrl, opts): - for obj in results: - for pkg in obj.packages: - if pkg.installed: -- iface.warning(_("%s (for %s) is already installed") -+ iface.info(_("%s (for %s) is already installed") - % (pkg, arg)) - installed = True - break -@@ -184,7 +184,7 @@ def main(ctrl, opts): - for name in names: - pkg = names[name][0] - if pkg.installed: -- iface.warning(_("%s is already installed") % pkg) -+ iface.info(_("%s is already installed") % pkg) - else: - trans.enqueue(pkg, INSTALL) - -diff --git a/smart/interfaces/text/interactive.py b/smart/interfaces/text/interactive.py -index 9865584..190867b 100644 ---- a/smart/interfaces/text/interactive.py -+++ b/smart/interfaces/text/interactive.py -@@ -278,7 +278,7 @@ class Interpreter(Cmd): - for name in names: - pkg = names[name][0] - if pkg.installed: -- iface.warning(_("%s is already installed") % pkg) -+ iface.info(_("%s is already installed") % pkg) - else: - found = True - transaction.enqueue(pkg, INSTALL) --- -2.1.0 - diff --git a/meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch b/meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch deleted file mode 100644 index 6e672b3321..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-attempt-fix.patch +++ /dev/null @@ -1,158 +0,0 @@ -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/smart-attempt.patch b/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch deleted file mode 100644 index e1182041bc..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch +++ /dev/null @@ -1,185 +0,0 @@ -From b105e7fe812da3ccaf7155c0fe14c8728b0d39a5 Mon Sep 17 00:00:00 2001 -From: Mark Hatle -Date: Mon, 20 Jan 2014 14:30:52 +0000 -Subject: [PATCH] Add mechanism to attempt install without failing - -In OpenEmbedded, for complementary and 'attemptonly' package processing, -we need a way to instruct smart to try to install, but ignore any -failures (usually conflicts). - -This option only works for the install operation. - -If a complementary install fails, an actual error occurred, one that -we can't ignore without losing the entire attempted transaction. Keep -this as an error so that we can catch these cases in the futre. - -Upstream-Status: Pending - -Signed-off-by: Mark Hatle -Signed-off-by: Paul Eggleton ---- - backends/rpm/pm.py | 35 ++++++++++++++++++++++++++++++++++- - transaction.py | 50 +++++++++++++++++++++++++++++++++++++------------- - 2 files changed, 71 insertions(+), 14 deletions(-) - -diff --git a/smart/backends/rpm/pm.py b/smart/backends/rpm/pm.py -index 9bbd952..ba6405a 100644 ---- a/smart/backends/rpm/pm.py -+++ b/smart/backends/rpm/pm.py -@@ -241,15 +241,56 @@ class RPMPackageManager(PackageManager): - cb = RPMCallback(prog, upgradednames) - cb.grabOutput(True) - probs = None -+ retry = 0 - try: - probs = ts.run(cb, None) - finally: - del getTS.ts - cb.grabOutput(False) -+ # If there are file conflicts, and we're attempting installation, -+ # remove conflicting packages from the transaction and retry -+ # If there are other problems returned by ts.run(), that are not -+ # linked with packages/files conflicts (the returned list is empty), -+ # then don't retry -+ if (probs is not None) and (len(probs) != 0) and sysconf.has("attempt-install", soft=True): -+ def remove_conflict(pkgNEVR): -+ for key in changeset.keys(): -+ if pkgNEVR == str(key): -+ del changeset[key] -+ del pkgpaths[key] -+ iface.warning("Removing %s due to file %s conflicting with %s" % (pkgNEVR, fname, altNEVR)) -+ break -+ -+ retry = 1 -+ for prob in probs: -+ if prob[1][0] == rpm.RPMPROB_NEW_FILE_CONFLICT: -+ msg = prob[0].split() -+ fname = msg[1] -+ pkgNEVR = msg[7] -+ altNEVR = msg[9] -+ pkgNEVR = pkgNEVR.rsplit('.', 1)[0] + '@' + pkgNEVR.rsplit('.', 1)[1] -+ altNEVR = altNEVR.rsplit('.', 1)[0] + '@' + altNEVR.rsplit('.', 1)[1] -+ remove_conflict(pkgNEVR) -+ elif prob[1][0] == rpm.RPMPROB_FILE_CONFLICT: -+ msg = prob[0].split() -+ fname = msg[1] -+ pkgNEVR = msg[5] -+ altNEVR = msg[11] -+ pkgNEVR = pkgNEVR.rsplit('.', 1)[0] + '@' + pkgNEVR.rsplit('.', 1)[1] -+ altNEVR = altNEVR.rsplit('.', 1)[0] + '@' + altNEVR.rsplit('.', 1)[1] -+ remove_conflict(pkgNEVR) -+ else: -+ retry = 0 -+ - prog.setDone() -- if probs is not None: -+ # If there are other problems than packages/files conflicts -+ # returned by ts.run(), the returned list is empty, and if -+ # we're only attempting installation, then don't raise any error -+ if (probs is not None) and ((len(probs) != 0) or not sysconf.has("attempt-install", soft=True)) and (not retry): - raise Error, "\n".join([x[0] for x in probs]) - prog.stop() -+ if retry and len(changeset): -+ self.commit(changeset, pkgpaths) - - class RPMCallback: - def __init__(self, prog, upgradednames): -diff --git a/smart/transaction.py b/smart/transaction.py -index 4b90cb7..3e043e9 100644 ---- a/smart/transaction.py -+++ b/smart/transaction.py -@@ -555,6 +555,8 @@ class Transaction(object): - changeset.set(pkg, INSTALL) - isinst = changeset.installed - -+ attempt = sysconf.has("attempt-install", soft=True) -+ - # Remove packages conflicted by this one. - for cnf in pkg.conflicts: - for prv in cnf.providedby: -@@ -564,11 +566,16 @@ class Transaction(object): - if not isinst(prvpkg): - locked[prvpkg] = (LOCKED_CONFLICT_BY, pkg) - continue -- if prvpkg in locked: -- raise Failed, _("Can't install %s: conflicted package " -- "%s is locked") % (pkg, prvpkg) -- self._remove(prvpkg, changeset, locked, pending, depth) -- pending.append((PENDING_UPDOWN, prvpkg)) -+ if attempt: -+ del changeset[pkg] -+ raise Failed, _("Can't install %s: it conflicts with package " -+ "%s") % (pkg, prvpkg) -+ else: -+ if prvpkg in locked: -+ raise Failed, _("Can't install %s: conflicted package " -+ "%s is locked") % (pkg, prvpkg) -+ self._remove(prvpkg, changeset, locked, pending, depth) -+ pending.append((PENDING_UPDOWN, prvpkg)) - - # Remove packages conflicting with this one. - for prv in pkg.provides: -@@ -579,12 +586,18 @@ class Transaction(object): - if not isinst(cnfpkg): - locked[cnfpkg] = (LOCKED_CONFLICT, pkg) - continue -- if cnfpkg in locked: -+ if attempt: -+ del changeset[pkg] - raise Failed, _("Can't install %s: it's conflicted by " -- "the locked package %s") \ -- % (pkg, cnfpkg) -- self._remove(cnfpkg, changeset, locked, pending, depth) -- pending.append((PENDING_UPDOWN, cnfpkg)) -+ "the package %s") \ -+ % (pkg, cnfpkg) -+ else: -+ if cnfpkg in locked: -+ raise Failed, _("Can't install %s: it's conflicted by " -+ "the locked package %s") \ -+ % (pkg, cnfpkg) -+ self._remove(cnfpkg, changeset, locked, pending, depth) -+ pending.append((PENDING_UPDOWN, cnfpkg)) - - # Remove packages with the same name that can't - # coexist with this one. -@@ -594,10 +607,15 @@ class Transaction(object): - if not isinst(namepkg): - locked[namepkg] = (LOCKED_NO_COEXIST, pkg) - continue -- if namepkg in locked: -+ if attempt: -+ del changeset[pkg] - raise Failed, _("Can't install %s: it can't coexist " - "with %s") % (pkg, namepkg) -- self._remove(namepkg, changeset, locked, pending, depth) -+ else: -+ if namepkg in locked: -+ raise Failed, _("Can't install %s: it can't coexist " -+ "with %s") % (pkg, namepkg) -+ self._remove(namepkg, changeset, locked, pending, depth) - - # Install packages required by this one. - for req in pkg.requires + pkg.recommends: -@@ -1176,6 +1194,8 @@ class Transaction(object): - - self._policy.runStarting() - -+ attempt = sysconf.has("attempt-install", soft=True) -+ - try: - changeset = self._changeset.copy() - isinst = changeset.installed -@@ -1190,7 +1210,11 @@ class Transaction(object): - 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 -+ if attempt: -+ iface.warning(_("Can't install %s: it's locked") % pkg) -+ del changeset[pkg] -+ else: -+ raise Failed, _("Can't install %s: it's locked") % pkg - changeset.set(pkg, INSTALL) - locked[pkg] = (LOCKED_INSTALL, None) - elif op is REMOVE: diff --git a/meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch b/meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch deleted file mode 100644 index 225b02f964..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch +++ /dev/null @@ -1,43 +0,0 @@ -From ee05e55e84b53f4bb0d0baba13ca47a8f84b7cb4 Mon Sep 17 00:00:00 2001 -From: Robert Yang -Date: Wed, 30 Sep 2015 01:12:52 -0700 -Subject: [PATCH] smart:cache.py: getPackages() matches name + arch - -It only matched name ony in the past, for example: -smart install busybox (matched) -but: -smart install busybox@core2_64 (didn't match) - -The installation is very slow when no match since it would seach all the -packages in the repo -This patch makes it match both. - -Upstream-Status: Pending - -Signed-off-by: Robert Yang ---- - smart/cache.py | 3 ++- - smart/ccache.c | 9 ++++++++- - 2 files changed, 10 insertions(+), 2 deletions(-) - -diff --git a/smart/control.py b/smart/control.py -index d44abe7..f23a604 100644 ---- a/smart/control.py -+++ b/smart/control.py -@@ -876,9 +876,13 @@ class Control(object): - objects = [] - - # If we find packages with exactly the given -- # name or name-version, use them. -- for pkg in self._cache.getPackages(s): -- if pkg.name == s or "%s-%s" % (pkg.name, pkg.version) == s: -+ # name, name-version, or name@arch, use them. -+ s_name = s -+ if "@" in s: -+ s_name = s.split("@")[0] -+ for pkg in self._cache.getPackages(s_name): -+ if pkg.name == s or "%s-%s" % (pkg.name, pkg.version) == s \ -+ or "%s@%s" % (pkg.name, pkg.version.split('@')[1]) == s: - objects.append((1.0, pkg)) - - if not objects: diff --git a/meta/recipes-devtools/python/python-smartpm/smart-channel-remove-all.patch b/meta/recipes-devtools/python/python-smartpm/smart-channel-remove-all.patch deleted file mode 100644 index da23e7ce42..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-channel-remove-all.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 6d2363a705697f615d9e5af5d6703b291e618b46 Mon Sep 17 00:00:00 2001 -From: Daniel Klauer -Date: Thu, 12 May 2016 17:55:01 +0200 -Subject: [PATCH] Fix channel command --remove-all option parsing - -Option.take_action() stores a list of options given for validation later. -It strips leading dashes and turns remaining dashes into underscores. -This list is what ensure_action() will compare its arguments against, -thus we must use underscores here. - -Upstream-Status: Pending - -Signed-off-by: Daniel Klauer ---- - smart/commands/channel.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/smart/commands/channel.py b/smart/commands/channel.py -index 108f3f1..6234f69 100644 ---- a/smart/commands/channel.py -+++ b/smart/commands/channel.py -@@ -164,7 +164,7 @@ def main(ctrl, opts): - opts.check_args_of_option("edit", 0) - opts.check_args_of_option("enable", -1) - opts.check_args_of_option("disable", -1) -- opts.ensure_action("channel", ["add", "set", "remove", "remove-all", -+ opts.ensure_action("channel", ["add", "set", "remove", "remove_all", - "list", "show", "yaml", "enable", "disable"]) - opts.check_remaining_args() - --- -1.9.1 - diff --git a/meta/recipes-devtools/python/python-smartpm/smart-channelsdir.patch b/meta/recipes-devtools/python/python-smartpm/smart-channelsdir.patch deleted file mode 100644 index e621b33875..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-channelsdir.patch +++ /dev/null @@ -1,24 +0,0 @@ -Make CHANNELSDIR in smart empty, since this causes host contamination issues -on some RPM-based hosts on which smart is already installed. - -[YOCTO #3881] - -Upstream-Status: Inappropriate [embedded specific] - -diff --git a/smart/plugins/channelsync.py b/smart/plugins/channelsync.py -index 3ba95ff..646d696 100644 ---- a/smart/plugins/channelsync.py -+++ b/smart/plugins/channelsync.py -@@ -23,7 +23,11 @@ from smart.channel import * - from smart import * - import os - --CHANNELSDIR = "/etc/smart/channels/" -+# For now, we leave the definition of CHANNELSDIR empty. This prevents smart -+# from erroneously consider the build host's channels while setting up its -+# channels [YOCTO #3881]. If this feature will be used in the future, CHANNELSDIR -+# should be set to a proper value. -+CHANNELSDIR = "" - - def syncChannels(channelsdir, force=None): - diff --git a/meta/recipes-devtools/python/python-smartpm/smart-locale.patch b/meta/recipes-devtools/python/python-smartpm/smart-locale.patch deleted file mode 100644 index 0f1dfb91d5..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-locale.patch +++ /dev/null @@ -1,27 +0,0 @@ -rpm or commands run by rpm can use output which isn't strictly acsii such -as quotation characters around expression which are character 0xe2. - -Use utf-8 as an encoding rather than whatever the system suggests to -ensure smart copes with this rather than erroring with unicode errors. - -RP 2016/5/19 -Upstream-Status: Pending - - -Index: git/smart/backends/rpm/pm.py -=================================================================== ---- git.orig/smart/backends/rpm/pm.py -+++ git/smart/backends/rpm/pm.py -@@ -32,11 +32,7 @@ from smart.pm import PackageManager - from smart import sysconf, iface, Error, _ - - --try: -- ENCODING = locale.getpreferredencoding() --except locale.Error: -- ENCODING = "ascii" -- -+ENCODING = "utf-8" - - def get_public_key(header): - return header.sprintf("%|DSAHEADER?{%{DSAHEADER:pgpsig}}:" diff --git a/meta/recipes-devtools/python/python-smartpm/smart-recommends.patch b/meta/recipes-devtools/python/python-smartpm/smart-recommends.patch deleted file mode 100644 index d607fc4752..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-recommends.patch +++ /dev/null @@ -1,381 +0,0 @@ -Handle recommended packages in core and rpm backends - -Identify and store recommended packages in the cache, add a query option -to read them and ignore them if they are not present when installing. - -Initial identification code from Mark Hatle . - -Upstream-Status: Pending - -Signed-off-by: Paul Eggleton - -diff --git a/smart/backends/rpm/base.py b/smart/backends/rpm/base.py -index 9332ea0..4fcfbee 100644 ---- a/smart/backends/rpm/base.py -+++ b/smart/backends/rpm/base.py -@@ -225,6 +225,52 @@ class RPMPackage(Package): - break - else: - return False -+ srecs = fk(self.recommends) -+ orecs = fk(other.recommends) -+ if srecs != orecs: -+ for srec in srecs: -+ if srec.name[0] == "/" or srec in orecs: -+ continue -+ for orec in orecs: -+ if (srec.name == orec.name and -+ srec.relation == orec.relation and -+ checkver(srec.version, orec.version)): -+ break -+ else: -+ return False -+ for orec in orecs: -+ if orec.name[0] == "/" or orec in srecs: -+ continue -+ for srec in srecs: -+ if (srec.name == orec.name and -+ srec.relation == orec.relation and -+ checkver(srec.version, orec.version)): -+ break -+ else: -+ return False -+ srecs = fk(self.recommends) -+ orecs = fk(other.recommends) -+ if srecs != orecs: -+ for srec in srecs: -+ if srec.name[0] == "/" or srec in orecs: -+ continue -+ for orec in orecs: -+ if (srec.name == orec.name and -+ srec.relation == orec.relation and -+ checkver(srec.version, orec.version)): -+ break -+ else: -+ return False -+ for orec in orecs: -+ if orec.name[0] == "/" or orec in srecs: -+ continue -+ for srec in srecs: -+ if (srec.name == orec.name and -+ srec.relation == orec.relation and -+ checkver(srec.version, orec.version)): -+ break -+ else: -+ return False - return True - - def coexists(self, other): -diff --git a/smart/ccache.c b/smart/ccache.c -index 7193185..8b66515 100644 ---- a/smart/ccache.c -+++ b/smart/ccache.c -@@ -500,6 +500,46 @@ Package_equals(PackageObject *self, PackageObject *other) - } - } - -+ ilen = 0; -+ jlen = 0; -+ for (i = 0; i != PyList_GET_SIZE(self->recommends); i++) { -+ PyObject *item = PyList_GET_ITEM(self->recommends, i); -+ if (!PyObject_IsInstance(item, (PyObject *)&Depends_Type)) { -+ PyErr_SetString(PyExc_TypeError, "Depends instance expected"); -+ return NULL; -+ } -+ if (STR(((DependsObject *)item)->name)[0] != '/') -+ ilen += 1; -+ } -+ for (j = 0; j != PyList_GET_SIZE(other->recommends); j++) { -+ PyObject *item = PyList_GET_ITEM(other->recommends, j); -+ if (!PyObject_IsInstance(item, (PyObject *)&Depends_Type)) { -+ PyErr_SetString(PyExc_TypeError, "Depends instance expected"); -+ return NULL; -+ } -+ if (STR(((DependsObject *)item)->name)[0] != '/') -+ jlen += 1; -+ } -+ if (ilen != jlen) { -+ ret = Py_False; -+ goto exit; -+ } -+ -+ ilen = PyList_GET_SIZE(self->recommends); -+ jlen = PyList_GET_SIZE(other->recommends); -+ for (i = 0; i != ilen; i++) { -+ PyObject *item = PyList_GET_ITEM(self->recommends, i); -+ if (STR(((DependsObject *)item)->name)[0] != '/') { -+ for (j = 0; j != jlen; j++) -+ if (item == PyList_GET_ITEM(other->recommends, j)) -+ break; -+ if (j == jlen) { -+ ret = Py_False; -+ goto exit; -+ } -+ } -+ } -+ - exit: - Py_INCREF(ret); - return ret; -@@ -1813,6 +1853,59 @@ Loader_buildPackage(LoaderObject *self, PyObject *args) - } - } - -+ /* if recargs: */ -+ if (recargs) { -+ int i = 0; -+ int len = PyList_GET_SIZE(recargs); -+ /* pkg.recommends = [] */ -+ Py_DECREF(pkgobj->recommends); -+ pkgobj->recommends = PyList_New(len); -+ /* for args in recargs: */ -+ for (; i != len; i++) { -+ PyObject *args = PyList_GET_ITEM(recargs, i); -+ DependsObject *recobj; -+ PyObject *rec; -+ -+ if (!PyTuple_Check(args)) { -+ PyErr_SetString(PyExc_TypeError, -+ "Item in recargs is not a tuple"); -+ return NULL; -+ } -+ -+ /* rec = cache._objmap.get(args) */ -+ rec = PyDict_GetItem(cache->_objmap, args); -+ recobj = (DependsObject *)rec; -+ -+ /* if not rec: */ -+ if (!rec) { -+ if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 2) { -+ PyErr_SetString(PyExc_ValueError, "Invalid recargs tuple"); -+ return NULL; -+ } -+ /* rec = args[0](*args[1:]) */ -+ callargs = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); -+ rec = PyObject_CallObject(PyTuple_GET_ITEM(args, 0), callargs); -+ Py_DECREF(callargs); -+ if (!rec) return NULL; -+ recobj = (DependsObject *)rec; -+ -+ /* cache._objmap[args] = rec */ -+ PyDict_SetItem(cache->_objmap, args, rec); -+ Py_DECREF(rec); -+ -+ /* cache._recommends.append(rec) */ -+ PyList_Append(cache->_recommends, rec); -+ } -+ -+ /* relpkgs.append(rec.packages) */ -+ PyList_Append(relpkgs, recobj->packages); -+ -+ /* pkg.recommends.append(rec) */ -+ Py_INCREF(rec); -+ PyList_SET_ITEM(pkgobj->recommends, i, rec); -+ } -+ } -+ - /* if upgargs: */ - if (upgargs) { - int i = 0; -@@ -2592,6 +2685,16 @@ Cache_reset(CacheObject *self, PyObject *args) - if (PyList_Check(reqobj->providedby)) - LIST_CLEAR(reqobj->providedby); - } -+ len = PyList_GET_SIZE(self->_recommends); -+ for (i = 0; i != len; i++) { -+ DependsObject *reqobj; -+ PyObject *req; -+ req = PyList_GET_ITEM(self->_recommends, i); -+ reqobj = (DependsObject *)req; -+ LIST_CLEAR(reqobj->packages); -+ if (PyList_Check(reqobj->providedby)) -+ LIST_CLEAR(reqobj->providedby); -+ } - len = PyList_GET_SIZE(self->_upgrades); - for (i = 0; i != len; i++) { - DependsObject *upgobj; -@@ -2834,6 +2937,30 @@ Cache__reload(CacheObject *self, PyObject *args) - } - - /* -+ for rec in pkg.recommends: -+ rec.packages.append(pkg) -+ if rec not in recommends: -+ recommends[rec] = True -+ objmap[rec.getInitArgs()] = rec -+ */ -+ if (PyList_Check(pkg->recommends)) { -+ klen = PyList_GET_SIZE(pkg->recommends); -+ for (k = 0; k != klen; k++) { -+ PyObject *rec = PyList_GET_ITEM(pkg->recommends, k); -+ PyList_Append(((DependsObject *)rec)->packages, -+ (PyObject *)pkg); -+ if (!PyDict_GetItem(recommends, rec)) { -+ PyDict_SetItem(recommends, rec, Py_True); -+ args = PyObject_CallMethod(rec, "getInitArgs", -+ NULL); -+ if (!args) return NULL; -+ PyDict_SetItem(objmap, args, rec); -+ Py_DECREF(args); -+ } -+ } -+ } -+ -+ /* - for upg in pkg.upgrades: - upg.packages.append(pkg) - if upg not in upgrades: -@@ -3097,6 +3224,47 @@ Cache_linkDeps(CacheObject *self, PyObject *args) - Py_DECREF(seq); - } - -+ /* recnames = {} */ -+ recnames = PyDict_New(); -+ /* for rec in self._recommends: */ -+ len = PyList_GET_SIZE(self->_recommends); -+ for (i = 0; i != len; i++) { -+ PyObject *rec = PyList_GET_ITEM(self->_recommends, i); -+ -+ /* for name in rec.getMatchNames(): */ -+ PyObject *names = PyObject_CallMethod(rec, "getMatchNames", NULL); -+ PyObject *seq = PySequence_Fast(names, "getMatchNames() returned " -+ "non-sequence object"); -+ int nameslen; -+ if (!seq) return NULL; -+ nameslen = PySequence_Fast_GET_SIZE(seq); -+ for (j = 0; j != nameslen; j++) { -+ PyObject *name = PySequence_Fast_GET_ITEM(seq, j); -+ -+ /* lst = recnames.get(name) */ -+ lst = PyDict_GetItem(recnames, name); -+ -+ /* -+ if lst: -+ lst.append(rec) -+ else: -+ recnames[name] = [rec] -+ */ -+ if (lst) { -+ PyList_Append(lst, rec); -+ } else { -+ lst = PyList_New(1); -+ Py_INCREF(rec); -+ PyList_SET_ITEM(lst, 0, rec); -+ PyDict_SetItem(recnames, name, lst); -+ Py_DECREF(lst); -+ } -+ } -+ -+ Py_DECREF(names); -+ Py_DECREF(seq); -+ } -+ - /* upgnames = {} */ - upgnames = PyDict_New(); - /* for upg in self._upgrades: */ -@@ -3286,6 +3454,56 @@ Cache_linkDeps(CacheObject *self, PyObject *args) - } - } - -+ /* lst = recnames.get(prv.name) */ -+ lst = PyDict_GetItem(recnames, prv->name); -+ -+ /* if lst: */ -+ if (lst) { -+ /* for rec in lst: */ -+ int reclen = PyList_GET_SIZE(lst); -+ for (j = 0; j != reclen; j++) { -+ DependsObject *rec = (DependsObject *)PyList_GET_ITEM(lst, j); -+ /* if rec.matches(prv): */ -+ PyObject *ret = PyObject_CallMethod((PyObject *)rec, "matches", -+ "O", (PyObject *)prv); -+ if (!ret) return NULL; -+ if (PyObject_IsTrue(ret)) { -+ /* -+ if rec.providedby: -+ rec.providedby.append(prv) -+ else: -+ rec.providedby = [prv] -+ */ -+ if (PyList_Check(rec->providedby)) { -+ PyList_Append(rec->providedby, (PyObject *)prv); -+ } else { -+ PyObject *_lst = PyList_New(1); -+ Py_INCREF(prv); -+ PyList_SET_ITEM(_lst, 0, (PyObject *)prv); -+ Py_DECREF(rec->providedby); -+ rec->providedby = _lst; -+ } -+ -+ /* -+ if prv.recommendedby: -+ prv.recommendedby.append(prv) -+ else: -+ prv.recommendedby = [prv] -+ */ -+ if (PyList_Check(prv->recommendedby)) { -+ PyList_Append(prv->recommendedby, (PyObject *)rec); -+ } else { -+ PyObject *_lst = PyList_New(1); -+ Py_INCREF(rec); -+ PyList_SET_ITEM(_lst, 0, (PyObject *)rec); -+ Py_DECREF(prv->recommendedby); -+ prv->recommendedby = _lst; -+ } -+ } -+ Py_DECREF(ret); -+ } -+ } -+ - /* lst = upgnames.get(prv.name) */ - lst = PyDict_GetItem(upgnames, prv->name); - -@@ -3821,6 +4094,21 @@ Cache__setstate__(CacheObject *self, PyObject *state) - } - - /* -+ for rec in pkg.recommends: -+ rec.packages.append(pkg) -+ recommends[rec] = True -+ */ -+ if (PyList_Check(pkgobj->recommends)) { -+ jlen = PyList_GET_SIZE(pkgobj->recommends); -+ for (j = 0; j != jlen; j++) { -+ PyObject *rec = PyList_GET_ITEM(pkgobj->recommends, j); -+ DependsObject *recobj = (DependsObject *)rec; -+ PyList_Append(recobj->packages, pkg); -+ PyDict_SetItem(recommends, rec, Py_True); -+ } -+ } -+ -+ /* - for upg in pkg.upgrades: - upg.packages.append(pkg) - upgrades[upg] = True -diff --git a/smart/commands/query.py b/smart/commands/query.py -index 9265cd9..b6f5697 100644 ---- a/smart/commands/query.py -+++ b/smart/commands/query.py -@@ -750,6 +750,22 @@ class TextOutput(NullOutput): - name = str(prvpkg) - print " ", "%s (%s)" % (name, prv) - -+ def showRecommends(self, pkg, rec): -+ if self._firstrecommends: -+ self._firstrecommends = False -+ print " ", _("Recommends:") -+ print " ", rec -+ -+ def showRecommendsProvidedBy(self, pkg, req, prv, prvpkg): -+ if self._firstrecommendsprovidedby: -+ self._firstrecommendsprovidedby = False -+ print " ", _("Provided By:") -+ if self.opts.hide_version: -+ name = prvpkg.name -+ else: -+ name = str(prvpkg) -+ print " ", "%s (%s)" % (name, prv) -+ - def showUpgrades(self, pkg, upg): - if self._firstupgrades: - self._firstupgrades = False diff --git a/meta/recipes-devtools/python/python-smartpm/smart-rpm-transaction-failure-check.patch b/meta/recipes-devtools/python/python-smartpm/smart-rpm-transaction-failure-check.patch deleted file mode 100644 index bb8c3afdb7..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-rpm-transaction-failure-check.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 0c55d7e18f40465e95e8e4bf22af01f5d4477d3c Mon Sep 17 00:00:00 2001 -From: Daniel Klauer -Date: Wed, 11 May 2016 17:22:49 +0200 -Subject: [PATCH] rpm: Don't ignore transaction error with empty problems list - -SmartPM could misinterpret RPM transaction error as success, -if ts.run() (RPM Python API) returns an empty problems list, -because of incorrect check for None which treated empty list -to be the same as None when it has different meaning. - -ts.run() returns: -* None in case of success -* problems list in case of error, may be empty -(look at rpmts_Run() in rpm-5.4.14/python/rpmts-py.c [1]) - -"if mylist" is not good enough to check for error here, because it will -treat an empty list as "false" because its len() == 0 [2]. - -ts.check() seems to be different (it's ok for it to return an empty list), -but for consistency it should be made clear that it can return either None, -an empty list or a non-empty list. - -[1] http://rpm5.org/cvs/fileview?f=rpm/python/rpmts-py.c&v=1.111.2.3 -[2] https://docs.python.org/2/library/stdtypes.html#truth-value-testing - -Upstream-Status: Pending - -Signed-off-by: Daniel Klauer ---- - smart/backends/rpm/pm.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/smart/backends/rpm/pm.py b/smart/backends/rpm/pm.py -index 9bbd952..635f726 100644 ---- a/smart/backends/rpm/pm.py -+++ b/smart/backends/rpm/pm.py -@@ -208,7 +208,7 @@ class RPMPackageManager(PackageManager): - force = sysconf.get("rpm-force", False) - if not force: - probs = ts.check() -- if probs: -+ if (probs is not None) and (len(probs) != 0): - problines = [] - for prob in probs: - name1 = "%s-%s-%s" % prob[0] -@@ -247,7 +247,7 @@ class RPMPackageManager(PackageManager): - del getTS.ts - cb.grabOutput(False) - prog.setDone() -- if probs: -+ if probs is not None: - raise Error, "\n".join([x[0] for x in probs]) - prog.stop() - --- -1.9.1 - diff --git a/meta/recipes-devtools/python/python-smartpm/smart-set-noprogress-for-pycurl.patch b/meta/recipes-devtools/python/python-smartpm/smart-set-noprogress-for-pycurl.patch deleted file mode 100644 index 2885998acc..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smart-set-noprogress-for-pycurl.patch +++ /dev/null @@ -1,20 +0,0 @@ -Set NOPROGRESS for pycurl just as same as default operation in pycurl module itself. -If set NOPROGRESS with 0 for pycurl, it causes dead lock issue of Python GIL when -call smart library by python gui just like pygtk. - -Upstream-Status: Pending - -Signed-off-by: Kai Kang ---- -diff -u smart-1.4.1/smart.orig/fetcher.py smart-1.4.1/smart/fetcher.py ---- smart-1.4.1/smart.orig/fetcher.py 2014-07-15 16:42:19.240437080 +0800 -+++ smart-1.4.1/smart/fetcher.py 2014-07-15 17:02:37.812470289 +0800 -@@ -1720,7 +1720,7 @@ - handle.setopt(pycurl.OPT_FILETIME, 1) - handle.setopt(pycurl.LOW_SPEED_LIMIT, 1) - handle.setopt(pycurl.LOW_SPEED_TIME, SOCKETTIMEOUT) -- handle.setopt(pycurl.NOPROGRESS, 0) -+ handle.setopt(pycurl.NOPROGRESS, 1) - handle.setopt(pycurl.PROGRESSFUNCTION, progress) - handle.setopt(pycurl.WRITEDATA, local) - handle.setopt(pycurl.FOLLOWLOCATION, 1) diff --git a/meta/recipes-devtools/python/python-smartpm/smartpm-rpm5-support-check-signatures.patch b/meta/recipes-devtools/python/python-smartpm/smartpm-rpm5-support-check-signatures.patch deleted file mode 100644 index 4067a90a08..0000000000 --- a/meta/recipes-devtools/python/python-smartpm/smartpm-rpm5-support-check-signatures.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 5b79e28bd70a0ec5b34c5ff19b66cbbdd1e48835 Mon Sep 17 00:00:00 2001 -From: Haiqing Bai -Date: Fri, 18 Mar 2016 13:34:07 +0800 -Subject: [PATCH] Make smartpm to support check signatures of rpmv5. - -The original support for 'rpm-check-signatures' has been -disabled for the RPMv5 does not support '_RPMVSF_NOSIGNATURES' -now. This fix replaces the '_RPMVSF_NOSIGNATURES' with -rpm VS flags set:RPMVSF_NODSAHEADER|RPMVSF_NORSAHEADER| -RPMVSF_NODSA|RPMVSF_NORSA. - -Upstream-Status: Pending -Signed-off-by: Haiqing Bai ---- - smart/backends/rpm/base.py | 43 +++++++++++++++++++++++++++++++---------- - smart/backends/rpm/pm.py | 2 +- - smart/plugins/yumchannelsync.py | 5 +++-- - 3 files changed, 37 insertions(+), 13 deletions(-) - -diff --git a/smart/backends/rpm/base.py b/smart/backends/rpm/base.py -index 85f4d49..dbd6165 100644 ---- a/smart/backends/rpm/base.py -+++ b/smart/backends/rpm/base.py -@@ -63,11 +63,23 @@ def getTS(new=False): - if sysconf.get("rpm-dbpath"): - rpm.addMacro('_dbpath', "/" + sysconf.get("rpm-dbpath")) - getTS.ts = rpm.ts(getTS.root) -- if not sysconf.get("rpm-check-signatures", False): -- if hasattr(rpm, '_RPMVSF_NOSIGNATURES'): -- getTS.ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES) -- else: -- raise Error, _("rpm requires checking signatures") -+ -+ # _RPMVSF_NOSIGNATURES is not supported in RPMv5, so here uses -+ # RPMVSF_NODSAHEADER|RPMVSF_NORSAHEADER|RPMVSF_NODSA|RPMVSF_NORSA -+ # to replace '_RPMVSF_NOSIGNATURES' to continue to support check -+ # rpm signatures -+ -+ #if not sysconf.get("rpm-check-signatures", False): -+ # if hasattr(rpm, '_RPMVSF_NOSIGNATURES'): -+ # getTS.ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES) -+ # else: -+ # raise Error, _("rpm requires checking signatures") -+ if sysconf.get("rpm-check-signatures") == False: -+ getTS.ts.setVSFlags(rpm.RPMVSF_NODSAHEADER|rpm.RPMVSF_NORSAHEADER|\ -+ rpm.RPMVSF_NODSA|rpm.RPMVSF_NORSA) -+ else: -+ getTS.ts.setVSFlags(0) -+ - rpm_dbpath = sysconf.get("rpm-dbpath", "var/lib/rpm") - dbdir = rpm_join_dbpath(getTS.root, rpm_dbpath) - if not os.path.isdir(dbdir): -@@ -89,11 +101,22 @@ def getTS(new=False): - if sysconf.get("rpm-dbpath"): - rpm.addMacro('_dbpath', "/" + sysconf.get("rpm-dbpath")) - ts = rpm.ts(getTS.root) -- if not sysconf.get("rpm-check-signatures", False): -- if hasattr(rpm, '_RPMVSF_NOSIGNATURES'): -- ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES) -- else: -- raise Error, _("rpm requires checking signatures") -+ -+ # _RPMVSF_NOSIGNATURES is not supported in RPMv5, so here uses -+ # RPMVSF_NODSAHEADER|RPMVSF_NORSAHEADER|RPMVSF_NODSA|RPMVSF_NORSA -+ # to replace '_RPMVSF_NOSIGNATURES' to continue to support check -+ # rpm signatures -+ -+ #if not sysconf.get("rpm-check-signatures", False): -+ # if hasattr(rpm, '_RPMVSF_NOSIGNATURES'): -+ # ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES) -+ # else: -+ # raise Error, _("rpm requires checking signatures") -+ if sysconf.get("rpm-check-signatures") == False: -+ ts.setVSFlags(rpm.RPMVSF_NODSAHEADER|rpm.RPMVSF_NORSAHEADER|\ -+ rpm.RPMVSF_NODSA|rpm.RPMVSF_NORSA) -+ else: -+ ts.setVSFlags(0) - return ts - else: - return getTS.ts -diff --git a/smart/backends/rpm/pm.py b/smart/backends/rpm/pm.py -index b57a844..7b651b5 100644 ---- a/smart/backends/rpm/pm.py -+++ b/smart/backends/rpm/pm.py -@@ -180,7 +180,7 @@ class RPMPackageManager(PackageManager): - fd = os.open(path, os.O_RDONLY) - try: - h = ts.hdrFromFdno(fd) -- if sysconf.get("rpm-check-signatures", False): -+ if sysconf.get("rpm-check-signatures", True): - if get_public_key(h) == '(none)': - raise rpm.error('package is not signed') - except rpm.error, e: -diff --git a/smart/plugins/yumchannelsync.py b/smart/plugins/yumchannelsync.py -index f8107e6..2dc5482 100644 ---- a/smart/plugins/yumchannelsync.py -+++ b/smart/plugins/yumchannelsync.py -@@ -56,8 +56,9 @@ def _getreleasever(): - - rpmroot = sysconf.get("rpm-root", "/") - ts = rpmUtils.transaction.initReadOnlyTransaction(root=rpmroot) -- if hasattr(rpm, '_RPMVSF_NOSIGNATURES') and hasattr(rpm, '_RPMVSF_NODIGESTS'): -- ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) -+ #_RPMVSF_NOSIGNATURES is not supported in RPMv5 -+ #if hasattr(rpm, '_RPMVSF_NOSIGNATURES') and hasattr(rpm, '_RPMVSF_NODIGESTS'): -+ # ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) - releasever = None - # HACK: we're hard-coding the most used distros, will add more if needed - idx = ts.dbMatch('provides', 'fedora-release') --- -1.9.1 - diff --git a/meta/recipes-devtools/python/python-smartpm_git.bb b/meta/recipes-devtools/python/python-smartpm_git.bb deleted file mode 100644 index 31c273deaf..0000000000 --- a/meta/recipes-devtools/python/python-smartpm_git.bb +++ /dev/null @@ -1,141 +0,0 @@ -SUMMARY = "The Smart Package Manager" -DESCRIPTION = "The Smart Package Manager project has the ambitious objective of creating \ -smart and portable algorithms for solving adequately the problem of managing software \ -upgrades and installation." - -HOMEPAGE = "http://labix.org/smart/" -SECTION = "devel/python" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://LICENSE;md5=393a5ca445f6965873eca0259a17f833" - -DEPENDS = "python rpm gettext-native python-rpm" -SRCNAME = "smart" - -SRC_URI = "\ - git://github.com/smartpm/smart.git \ - file://smart-recommends.patch \ - file://smart-channelsdir.patch \ - file://smart-rpm-transaction-failure-check.patch \ - file://smart-attempt.patch \ - file://smart-attempt-fix.patch \ - file://smart-add-for-rpm-ignoresize-check.patch \ - file://smart-already-installed-message.patch \ - file://smart-set-noprogress-for-pycurl.patch \ - file://smart-cache.py-getPackages-matches-name-version.patch \ - file://smart-channel-remove-all.patch \ - file://smart-locale.patch \ - file://smartpm-rpm5-support-check-signatures.patch \ - file://smart-add-deugging-when-targetpath-is-empty.patch \ - file://channels-rpm_sys-use-md5sum-instead-of-mtime-as-the-.patch \ - " - -SRCREV = "407a7eca766431257dcd1da15175cc36a1bb22d0" -PV = "1.5+git${SRCPV}" - -S = "${WORKDIR}/git" - -# Options - rpm, qt4, gtk -PACKAGECONFIG ??= "rpm" - -RPM_RDEP = "${PN}-backend-rpm" -QT_RDEP = "${PN}-interface-qt4" -GTK_RDEP = "${PN}-interface-gtk" - -RPM_RDEP_class-native = "" -QT_RDEP_class-native = "" -GTK_RDEP_class-native = "" - -RPM_RDEP_class-nativesdk = "" -QT_RDEP_class-nativesdk = "" -GTK_RDEP_class-nativesdk = "" - -PACKAGECONFIG[rpm] = ",,rpm,${RPM_RDEP}" -PACKAGECONFIG[qt4] = ",,qt4-x11,${QT_RDEP}" -PACKAGECONFIG[gtk] = ",,gtk+,${GTK_RDEP}" - -inherit distutils - -do_install_append() { - # We don't support the following items - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/backends/slack - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/backends/arch - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/interfaces/qt - - # Temporary, debian support in OE is missing the python module - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/aptchannelsync.py* - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/debdir.py* - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/backends/deb - - # Disable automatic channel detection - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/detectsys.py* - - # Disable landscape support - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/landscape.py* - - # Disable urpmi channel support - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/urpmichannelsync.py* - - # Disable yum channel support - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/yumchannelsync.py* - - # Disable zypper channel support - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/zyppchannelsync.py* - - if [ -z "${@bb.utils.filter('PACKAGECONFIG', 'rpm', d)}" ]; then - rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/smart/plugins/rpmdir.py* - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/backends/rpm - fi - - if [ -z "${@bb.utils.filter('PACKAGECONFIG', 'qt4', d)}" ]; then - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/interfaces/qt4 - fi - - if [ -z "${@bb.utils.contains('PACKAGECONFIG', 'gtk+', 'gtk', '', d)}" ]; then - rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/smart/interfaces/gtk - fi -} - -add_native_wrapper() { - create_wrapper ${D}/${bindir}/smart \ - RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir'), d.getVar('bindir'))}/rpm \ - RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir'), d.getVar('bindir'))}/rpm} \ - RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir'), d.getVar('bindir'))}/locale -} - -do_install_append_class-native() { - sed -i -e 's|^#!.*/usr/bin/env python|#! /usr/bin/env nativepython|' ${D}${bindir}/smart - add_native_wrapper -} - -do_install_append_class-nativesdk() { - add_native_wrapper -} - -PACKAGES = "${PN}-dev ${PN}-dbg ${PN}-doc smartpm \ - ${@bb.utils.contains('PACKAGECONFIG', 'rpm', '${PN}-backend-rpm', '', d)} \ - ${@bb.utils.contains('PACKAGECONFIG', 'qt4', '${PN}-interface-qt4', '', d)} \ - ${@bb.utils.contains('PACKAGECONFIG', 'gtk', '${PN}-interface-gtk', '', d)} \ - ${PN}-interface-images ${PN}" - -RDEPENDS_smartpm = "${PN}" - -RDEPENDS_${PN} += "${PN}-backend-rpm python-codecs python-textutils python-xml python-fcntl \ - python-pickle python-crypt python-compression python-shell \ - python-resource python-netclient python-threading python-unixadmin python-pprint" -RDEPENDS_${PN}_class-native = "" - -RDEPENDS_${PN}-backend-rpm = "python-rpm" - -RDEPENDS_${PN}-interface-qt4 = "qt4-x11 ${PN}-interface-images" -RDEPENDS_${PN}-interface-gtk = "gtk+ ${PN}-interface-images" - -FILES_smartpm = "${bindir}/smart" - -FILES_${PN}-backend-rpm = "${PYTHON_SITEPACKAGES_DIR}/smart/backends/rpm" - -FILES_${PN}-interface-qt4 = "${PYTHON_SITEPACKAGES_DIR}/smart/interfaces/qt4" -FILES_${PN}-interface-gtk = "${PYTHON_SITEPACKAGES_DIR}/smart/interfaces/gtk" -FILES_${PN}-interface-images = "${datadir}/${baselib}/python*/site-packages/smart/interfaces/images" - -BBCLASSEXTEND = "native nativesdk" - -- cgit 1.2.3-korg