]> code.ossystems Code Review - openembedded-core.git/commitdiff
python-smartpm: Add an attempt install mode
authorMark Hatle <mark.hatle@windriver.com>
Wed, 11 Sep 2013 01:59:35 +0000 (20:59 -0500)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 11 Sep 2013 10:06:06 +0000 (11:06 +0100)
[ YOCTO #3723 ]

Add a mode to smart that will allow an installation to continue, instead of
failure in the case that one or more items is uninstallable.

Uninstallable packages are simply ignored, and no error is generated.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/package_rpm.bbclass
meta/recipes-devtools/python/python-smartpm/smart-attempt.patch [new file with mode: 0644]
meta/recipes-devtools/python/python-smartpm_1.4.1.bb

index 8ab42c441e2bea02b05dc58041a6d3baa5c0e2a6..699d0f200aef64ec61bcdba709c2dee265ec998d 100644 (file)
@@ -472,11 +472,8 @@ EOF
                echo "Attempting $pkgs_to_install"
                echo "Note: see `dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}"
                translate_oe_to_smart ${sdk_mode} --attemptonly $package_attemptonly
-               for each_pkg in $pkgs_to_install ;  do
-                       # We need to try each package individually as a single dependency failure
-                       # will break the whole set otherwise.
-                       smart --data-dir=${target_rootfs}/var/lib/smart install -y $each_pkg >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1 || true
-               done
+               echo "Attempting $pkgs_to_install" >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}"
+               smart --data-dir=${target_rootfs}/var/lib/smart install --attempt -y ${pkgs_to_install} >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1
        fi
 }
 
diff --git a/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch b/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch
new file mode 100644 (file)
index 0000000..0d603d3
--- /dev/null
@@ -0,0 +1,59 @@
+Add a mechanism to attempt the install operation, w/o failing.
+
+For complementary and 'attemptonly' packages, we need a way to instruct smart to
+try to install, but ignore any failures.
+
+This option only works for the install operation.
+
+Upstream-Status: Pending
+
+Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
+
+Index: smart-1.4.1/smart/commands/install.py
+===================================================================
+--- smart-1.4.1.orig/smart/commands/install.py
++++ smart-1.4.1/smart/commands/install.py
+@@ -50,6 +50,8 @@ def option_parser():
+     parser = OptionParser(usage=USAGE,
+                           description=DESCRIPTION,
+                           examples=EXAMPLES)
++    parser.add_option("--attempt", action="store_true",
++                      help=_("attempt to install packages, ignore failures"))
+     parser.add_option("--stepped", action="store_true",
+                       help=_("split operation in steps"))
+     parser.add_option("--urls", action="store_true",
+@@ -80,6 +82,9 @@ def main(ctrl, opts):
+     if not opts.args:
+         raise Error, _("no package(s) given")
++    if opts.attempt:
++      sysconf.set("attempt-install", True, soft=True)
++
+     if opts.explain:
+         sysconf.set("explain-changesets", True, soft=True)
+Index: smart-1.4.1/smart/transaction.py
+===================================================================
+--- smart-1.4.1.orig/smart/transaction.py
++++ smart-1.4.1/smart/transaction.py
+@@ -1216,9 +1216,17 @@ class Transaction(object):
+                     else:
+                         op = REMOVE
+                 if op is INSTALL or op is REINSTALL:
+-                    self._install(pkg, changeset, locked, pending)
+-                    if pkg in changeset:
+-                        changeset.setRequested(pkg, True)
++                    try:
++                        self._install(pkg, changeset, locked, pending)
++                        if pkg in changeset:
++                            changeset.setRequested(pkg, True)
++                    except Failed, e:
++                        if sysconf.has("attempt-install", soft=True):
++                            if pkg in changeset:
++                                del changeset[pkg]
++                            continue
++                        else:
++                            raise Failed, e
+                 elif op is REMOVE:
+                     self._remove(pkg, changeset, locked, pending)
+                 elif op is UPGRADE:
index 5d673b990276aa1c5a0876d686aa5306d30e05d4..f406d692e3eff27d82043dc116eb6aaf5efed696 100644 (file)
@@ -30,6 +30,7 @@ SRC_URI = "\
           file://smart-flag-ignore-recommends.patch \
           file://smart-flag-exclude-packages.patch \
           file://smart-config-ignore-all-recommends.patch \
+          file://smart-attempt.patch \
           "
 
 SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6"