[Yum-devel] [PATCH 3/3] Fix installonly installs and "broken" rpmdbv stuff from tracebacks

Tim Lauridsen tim.lauridsen at gmail.com
Mon Sep 27 04:40:12 UTC 2010


On Fri, Sep 24, 2010 at 4:21 PM, James Antill <james at and.org> wrote:

> ---
>  test/merge-history-transactions-tests.py |   71
> +++++++++++++++++++++++++++++-
>  yum/history.py                           |   23 +++-------
>  2 files changed, 76 insertions(+), 18 deletions(-)
>
> diff --git a/test/merge-history-transactions-tests.py
> b/test/merge-history-transactions-tests.py
> index 96fc625..569ba8d 100644
> --- a/test/merge-history-transactions-tests.py
> +++ b/test/merge-history-transactions-tests.py
> @@ -509,9 +509,9 @@ class MergeHistTransTests(unittest.TestCase):
>         self.assertEquals(pkgs[3], opkg3)
>         self.assertEquals(pkgs[3].state, opkg3.state)
>
> -    def testInRmMerge1(self, xstate='Install'):
> +    def testInRmMerge1(self, xstate='Install', estate='Erase'):
>         npkg1 = self._pkg_new('foo', state=xstate)
> -        npkg2 = self._pkg_new('foo', state='Erase')
> +        npkg2 = self._pkg_new('foo', state=estate)
>         npkg3 = self._pkg_new('bar', version='6', state='True-Install')
>
>         trans = []
> @@ -525,6 +525,36 @@ class MergeHistTransTests(unittest.TestCase):
>         self.assertEquals(pkgs[0], npkg3)
>         self.assertEquals(pkgs[0].state, npkg3.state)
>
> +    def testInRmMerge2(self, xstate='Install'):
> +        self.testInRmMerge1(xstate, 'Obsoleted')
> +
> +    def testInRmInonlyMerge1(self, xstate='True-Install', estate='Erase'):
> +        npkg1 = self._pkg_new('foo', state=xstate)
> +        npkg2 = self._pkg_new('foo', version='2', state=xstate)
> +        npkg3 = self._pkg_new('foo', version='3', state=xstate)
> +        npkg4 = self._pkg_new('foo', state=estate)
> +        npkg5 = self._pkg_new('foo', version='2', state=estate)
> +        npkg6 = self._pkg_new('foo', version='3', state=estate)
> +        npkg9 = self._pkg_new('bar', version='6', state=xstate)
> +
> +        trans = []
> +        trans.append(self._trans_new([npkg1]))
> +        trans.append(self._trans_new([npkg2]))
> +        trans.append(self._trans_new([npkg3]))
> +        trans.append(self._trans_new([npkg4]))
> +        trans.append(self._trans_new([npkg5]))
> +        trans.append(self._trans_new([npkg6]))
> +        trans.append(self._trans_new([npkg9]))
> +        merged = self._merge_new(trans)
> +        self.assertMergedMain(merged, trans)
> +        pkgs = merged.trans_data
> +        self.assertEquals(len(pkgs), 1)
> +        self.assertEquals(pkgs[0], npkg9)
> +        self.assertEquals(pkgs[0].state, npkg9.state)
> +
> +    def testInRmInonlyMerge2(self, xstate='True-Install'):
> +        self.testInRmInonlyMerge1(xstate, 'Obsoleted')
> +
>     def testUpRmMerge1(self, xstate='Update'):
>         npkg1 = self._pkg_new('foo')
>         opkg2 = self._pkg_new('bar', version='4', state='Updated')
> @@ -664,6 +694,37 @@ class MergeHistTransTests(unittest.TestCase):
>     def testUpRmInuMerge2(self, xstate='Update', ystate='Install'):
>         self.testUpRmInuMerge1(xstate, ystate, 'Obsoleted')
>
> +    def testBrokenUpMerge1(self, xstate='Update', estate='Erase'):
> +        # This is "broken", so as long as we don't die it's all good.
> +        # The below test basically documents what we do.
> +        opkg1 = self._pkg_new('foo', version='1',   state='Updated')
> +        npkg1 = self._pkg_new('foo', version='2',   state=xstate)
> +        opkg2 = self._pkg_new('foo', version='11',  state='Updated')
> +        npkg2 = self._pkg_new('foo', version='21',  state=xstate)
> +        opkg3 = self._pkg_new('foo', version='110', state='Updated')
> +        npkg3 = self._pkg_new('foo', version='210', state=xstate)
> +        npkg4 = self._pkg_new('foo', version='2',   state=estate)
> +        npkg5 = self._pkg_new('foo', version='21',  state=estate)
> +        npkg6 = self._pkg_new('foo', version='210', state=estate)
> +
> +        trans = []
> +        trans.append(self._trans_new([opkg1, npkg1]))
> +        trans.append(self._trans_new([opkg2, npkg2]))
> +        trans.append(self._trans_new([opkg3, npkg3]))
> +        trans.append(self._trans_new([npkg4]))
> +        trans.append(self._trans_new([npkg5]))
> +        trans.append(self._trans_new([npkg6]))
> +        merged = self._merge_new(trans)
> +        self.assertMergedMain(merged, trans)
> +        pkgs = merged.trans_data
> +        self.assertEquals(len(pkgs), 3)
> +        self.assertEquals(pkgs[0], opkg1)
> +        self.assertEquals(pkgs[0].state, 'Updated')
> +        self.assertEquals(pkgs[1], opkg2)
> +        self.assertEquals(pkgs[1].state, 'Updated')
> +        self.assertEquals(pkgs[2], opkg3)
> +        self.assertEquals(pkgs[2].state, estate)
> +
>     #  Obsoleting is the _painful_ one because it really should be a state,
> but
>     # an attribute. So "Obsoleting" can be any of:
>     #     Install*, Reinstall, Update, Downgrade
> @@ -697,6 +758,12 @@ class MergeHistTransTests(unittest.TestCase):
>         self.testDownUpMerge5(xstate='Obsoleting')
>     def testObsIRM1(self):
>         self.testInRmMerge1(xstate='Obsoleting')
> +    def testObsIRM2(self):
> +        self.testInRmMerge2(xstate='Obsoleting')
> +    def testObsIRMM1(self):
> +        self.testInRmInonlyMerge1(xstate='Obsoleting')
> +    def testObsIRMM2(self):
> +        self.testInRmInonlyMerge1(xstate='Obsoleting')
>     def testObsURM1(self):
>         self.testUpRmMerge1(xstate='Obsoleting')
>     def testObsURM2(self):
> diff --git a/yum/history.py b/yum/history.py
> index eda0dd3..f1c287e 100644
> --- a/yum/history.py
> +++ b/yum/history.py
> @@ -320,10 +320,14 @@ class
> YumMergedHistoryTransaction(YumHistoryTransaction):
>             self._move_pkg(sk, nstate, npkgtup2pkg, npkgstate2pkg)
>         def _del1_n(pkg):
>             del npkgtup2pkg[pkg.pkgtup]
> -            del npkgstate2pkg[self._p2sk(pkg)]
> +            key = self._p2sk(pkg)
> +            if key in npkgstate2pkg: # For broken rpmdbv's and installonly
> +                del npkgstate2pkg[key]
>         def _del1_f(pkg):
>             del fpkgtup2pkg[pkg.pkgtup]
> -            del fpkgstate2pkg[self._p2sk(pkg)]
> +            key = self._p2sk(pkg)
> +            if key in fpkgstate2pkg: # For broken rpmdbv's and installonly
> +                del fpkgstate2pkg[key]
>         def _del2(fpkg, npkg):
>             assert fpkg.pkgtup == npkg.pkgtup
>             _del1_f(fpkg)
> @@ -458,20 +462,7 @@ class
> YumMergedHistoryTransaction(YumHistoryTransaction):
>                 fpkgtup2pkg[x] = npkgtup2pkg[x]
>             for x in npkgstate2pkg:
>                 fpkgstate2pkg[x] = npkgstate2pkg[x]
> -        if True:
> -            return sorted(fpkgstate2pkg.values())
> -
> -        # This just dumps "everything", and is thus. pretty crappy
> -        ret = []
> -        filt = set()
> -        for obj in self._merged_objs:
> -            for pkg in obj.trans_data:
> -                key = (pkg.state, pkg.pkgtup)
> -                if key in filt:
> -                    continue
> -                filt.add(key)
> -                ret.append(pkg)
> -        return sorted(ret)
> +        return sorted(fpkgtup2pkg.values())
>
>     def _getErrors(self):
>         ret = []
> --
> 1.7.2.3
>
> _______________________________________________
> 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/20100927/1479430b/attachment-0001.html>


More information about the Yum-devel mailing list