[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