[Yum-devel] [PATCH 1/9] Add skip broken packages to history transaction.

Tim Lauridsen tim.lauridsen at googlemail.com
Fri May 7 16:34:06 UTC 2010


On Thu, May 6, 2010 at 9:11 PM, James Antill <james at and.org> wrote:

> ---
>  docs/yum.8      |    2 +
>  output.py       |   24 +++++++++++++++++-
>  yum/__init__.py |    4 ++-
>  yum/history.py  |   70
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  4 files changed, 96 insertions(+), 4 deletions(-)
>
> diff --git a/docs/yum.8 b/docs/yum.8
> index b9ee5ec..f9eb7fd 100644
> --- a/docs/yum.8
> +++ b/docs/yum.8
> @@ -320,6 +320,8 @@ if there was something not good with the transaction.
>  .br
>  .I \fBE\fR - The transaction completed fine, but had warning/error output
> during the transaction.
>  .br
> +.I \fBs\fR - The transaction completed fine, but --skip-broken was enabled
> and had to skip some packages.
> +.br
>
>  .IP
>  .IP "\fBcheck\fP"
> diff --git a/output.py b/output.py
> index 95564e1..65d3f44 100755
> --- a/output.py
> +++ b/output.py
> @@ -1333,6 +1333,8 @@ to exit.
>                 # We don't check .errors, because return_code will be non-0
>             elif old.output:
>                 rmark = lmark = 'E'
> +            elif old.trans_skip:
> +                rmark = lmark = 's'
>             if old.altered_lt_rpmdb:
>                 rmark = '<'
>             if old.altered_gt_rpmdb:
> @@ -1485,11 +1487,29 @@ to exit.
>                 state  = _('Updated')
>             elif ipkgs[0] < hpkg:
>                 state  = _('Downgraded')
> -            else: # multiple versions installed, both older and newer
> -                state  = _('Weird')
> +            else:
> +                assert False, "Impossible, installed not newer and not
> older"
>             print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg)
>         print _("Packages Altered:")
>         self.historyInfoCmdPkgsAltered(old, pats)
> +        if old.trans_skip:
> +            print _("Packages Skipped:")
> +        for hpkg in old.trans_skip:
> +            prefix = " " * 4
> +            state  = _('Installed')
> +            ipkgs = self.rpmdb.searchNames([hpkg.name])
> +            ipkgs.sort()
> +            if not ipkgs:
> +                state  = _('Not installed')
> +            elif hpkg.pkgtup in (ipkg.pkgtup for ipkg in ipkgs):
> +                pass
> +            elif ipkgs[-1] > hpkg:
> +                state  = _('Older')
> +            elif ipkgs[0] < hpkg:
> +                state  = _('Newer')
> +            else:
> +                assert False, "Impossible, installed not newer and not
> older"
> +            print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg)
>         if old.output:
>             print _("Scriptlet output:")
>             num = 0
> diff --git a/yum/__init__.py b/yum/__init__.py
> index 64663cc..57c92f3 100644
> --- a/yum/__init__.py
> +++ b/yum/__init__.py
> @@ -1269,7 +1269,9 @@ class YumBase(depsolve.Depsolve):
>                 ignore_pkgs = [txmbr.po for txmbr in txmbrs]
>                 self._rpmdb_warn_checks(warn=lastdbv is not None,
>                                         ignore_pkgs=ignore_pkgs)
> -            self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo))
> +            self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo),
> +            self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo),
> +                             self.skipped_packages)
>
>         #  Just before we update the transaction, update what we think the
>         # rpmdb will look like. This needs to be done before the run, so
> that if
> diff --git a/yum/history.py b/yum/history.py
> index cba6bf3..7305a62 100644
> --- a/yum/history.py
> +++ b/yum/history.py
> @@ -128,6 +128,7 @@ class YumHistoryTransaction:
>
>         self._loaded_TW = None
>         self._loaded_TD = None
> +        self._loaded_TS = None
>
>         self._loaded_ER = None
>         self._loaded_OT = None
> @@ -153,9 +154,14 @@ class YumHistoryTransaction:
>         if self._loaded_TD is None:
>             self._loaded_TD =
> sorted(self._history._old_data_pkgs(self.tid))
>         return self._loaded_TD
> +    def _getTransSkip(self):
> +        if self._loaded_TS is None:
> +            self._loaded_TS =
> sorted(self._history._old_skip_pkgs(self.tid))
> +        return self._loaded_TS
>
>     trans_with = property(fget=lambda self: self._getTransWith())
>     trans_data = property(fget=lambda self: self._getTransData())
> +    trans_skip = property(fget=lambda self: self._getTransSkip())
>
>     def _getErrors(self):
>         if self._loaded_ER is None:
> @@ -311,6 +317,17 @@ class YumHistory:
>                          VALUES (?, ?)""", (self._tid, pid))
>         return cur.lastrowid
>
> +    def trans_skip_pid(self, pid):
> +        cur = self._get_cursor()
> +        if cur is None or not self._update_db_file_2():
> +            return None
> +
> +        res = executeSQL(cur,
> +                         """INSERT INTO trans_skip_pkgs
> +                         (tid, pkgtupid)
> +                         VALUES (?, ?)""", (self._tid, pid))
> +        return cur.lastrowid
> +
>     def trans_data_pid_beg(self, pid, state):
>         assert state is not None
>         if not hasattr(self, '_tid') or state is None:
> @@ -338,7 +355,7 @@ class YumHistory:
>         self._commit()
>         return cur.lastrowid
>
> -    def beg(self, rpmdb_version, using_pkgs, txmbrs):
> +    def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[]):
>         cur = self._get_cursor()
>         if cur is None:
>             return
> @@ -359,6 +376,10 @@ class YumHistory:
>             state = self.txmbr2state(txmbr)
>             self.trans_data_pid_beg(pid, state)
>
> +        for pkg in skip_packages:
> +            pid   = self.pkg2pid(pkg)
> +            self.trans_skip_pid(pid)
> +
>         self._commit()
>
>     def _log_errors(self, errors):
> @@ -467,6 +488,20 @@ class YumHistory:
>                 obj.state_installed = False
>             ret.append(obj)
>         return ret
> +    def _old_skip_pkgs(self, tid):
> +        cur = self._get_cursor()
> +        if cur is None or not self._update_db_file_2():
> +            return []
> +        executeSQL(cur,
> +                   """SELECT name, arch, epoch, version, release, checksum
> +                      FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid)
> +                      WHERE tid = ?
> +                      ORDER BY name ASC, epoch ASC""", (tid,))
> +        ret = []
> +        for row in cur:
> +            obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4],
> row[5])
> +            ret.append(obj)
> +        return ret
>
>     def old(self, tids=[], limit=None, complete_transactions_only=False):
>         """ Return a list of the last transactions, note that this includes
> @@ -610,6 +645,37 @@ class YumHistory:
>             tids.add(row[0])
>         return tids
>
> +    _update_ops_2 = ['''\
> +\
> + CREATE TABLE trans_skip_pkgs (
> +     tid INTEGER NOT NULL REFERENCES trans_beg,
> +     pkgtupid INTEGER NOT NULL REFERENCES pkgtups);
> +''']
> +
> +    def _update_db_file_2(self):
> +        """ Update to version 2 of history, includes trans_skip_pkgs. """
> +        if not self.conf.writable:
> +            return False
> +
> +        if hasattr(self, '_cached_updated_2'):
> +            return self._cached_updated_2
> +
> +        cur = self._get_cursor()
> +        if cur is None:
> +            return False
> +
> +        executeSQL(cur, "PRAGMA table_info(trans_skip_pkgs)")
> +        #  If we get anything, we're fine. There might be a better way of
> +        # saying "anything" but this works.
> +        for ob in cur:
> +            break
> +        else:
> +            for op in self._update_ops_2:
> +                cur.execute(op)
> +            self._commit()
> +        self._cached_updated_2 = True
> +        return True
> +
>     def _create_db_file(self):
>         """ Create a new history DB file, populating tables etc. """
>
> @@ -671,6 +737,8 @@ class YumHistory:
>  ''']
>         for op in ops:
>             cur.execute(op)
> +        for op in self._update_ops_2:
> +            cur.execute(op)
>         self._commit()
>
>  # Pasted from sqlitesack
> --
> 1.7.0.1
>
> _______________________________________________
> Yum-devel mailing list
> Yum-devel at lists.baseurl.org
> http://lists.baseurl.org/mailman/listinfo/yum-devel
>

ACK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.baseurl.org/pipermail/yum-devel/attachments/20100507/9cef7d31/attachment.htm>


More information about the Yum-devel mailing list