[yum-commits] Branch 'yum-3_2_X' - 6 commits - shell.py test/check-po-yes-no.py test/simpleobsoletestests.py yum/__init__.py yummain.py yum.spec

James Antill james at osuosl.org
Mon Aug 8 18:49:37 UTC 2011


 shell.py                     |   33 +++++++++-
 test/check-po-yes-no.py      |   13 +++-
 test/simpleobsoletestests.py |   36 +++++++++++
 yum.spec                     |  130 +++++++++++++++++++++++++++++++++++--------
 yum/__init__.py              |    7 --
 yummain.py                   |   10 +--
 6 files changed, 191 insertions(+), 38 deletions(-)

New commits:
commit 8c9f8db66ea8c6f2b610781c03e9ca48bd85e50b
Author: Zdeněk Pavlas <zpavlas at redhat.com>
Date:   Mon Aug 8 10:20:07 2011 +0200

    Simplify error handling when obtaining a lock
    
    Handle non-transient errors (EPERM, EACCES, ENOSPC) first.

diff --git a/yummain.py b/yummain.py
index e2fe87b..d7ba288 100755
--- a/yummain.py
+++ b/yummain.py
@@ -120,16 +120,16 @@ def main(args):
             if exception2msg(e) != lockerr:
                 lockerr = exception2msg(e)
                 logger.critical(lockerr)
-            if (e.errno not in (errno.EPERM, errno.EACCES, errno.ENOSPC) and
-                not base.conf.exit_on_lock):
+            if e.errno in (errno.EPERM, errno.EACCES, errno.ENOSPC):
+                logger.critical(_("Can't create lock file; exiting"))
+                return 1
+
+            if not base.conf.exit_on_lock:
                 logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit..."))
                 tm = 0.1
                 if show_lock_owner(e.pid, logger):
                     tm = 2
                 time.sleep(tm)
-            elif e.errno in (errno.EPERM, errno.EACCES, errno.ENOSPC):
-                logger.critical(_("Can't create lock file; exiting"))
-                return 1
             else:
                 logger.critical(_("Another app is currently holding the yum lock; exiting as configured by exit_on_lock"))
                 return 1
commit c0222711fdfa2e8094bc4296c13deebba7c3cd69
Author: Zdeněk Pavlas <zpavlas at redhat.com>
Date:   Mon Aug 8 10:19:30 2011 +0200

    Handle ENOSPC when creating a lock file.
    
    Instead of printing a traceback, just print an error message.
    Resolves BZ 728847.

diff --git a/yum/__init__.py b/yum/__init__.py
index 530bfd4..ba21613 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1842,16 +1842,15 @@ class YumBase(depsolve.Depsolve):
             if not os.path.exists(lockdir):
                 os.makedirs(lockdir, mode=0755)
             fd = os.open(filename, os.O_EXCL|os.O_CREAT|os.O_WRONLY, mode)    
+            os.write(fd, contents)
+            os.close(fd)
+            return 1
         except OSError, msg:
             if not msg.errno == errno.EEXIST: 
                 # Whoa. What the heck happened?
                 errmsg = _('Could not create lock at %s: %s ') % (filename, str(msg))
                 raise Errors.LockError(msg.errno, errmsg, int(contents))
             return 0
-        else:
-            os.write(fd, contents)
-            os.close(fd)
-            return 1
     
     def _unlock(self, filename):
         misc.unlink_f(filename)
diff --git a/yummain.py b/yummain.py
index d6abd70..e2fe87b 100755
--- a/yummain.py
+++ b/yummain.py
@@ -120,14 +120,14 @@ def main(args):
             if exception2msg(e) != lockerr:
                 lockerr = exception2msg(e)
                 logger.critical(lockerr)
-            if (e.errno not in (errno.EPERM, errno.EACCES) and
+            if (e.errno not in (errno.EPERM, errno.EACCES, errno.ENOSPC) and
                 not base.conf.exit_on_lock):
                 logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit..."))
                 tm = 0.1
                 if show_lock_owner(e.pid, logger):
                     tm = 2
                 time.sleep(tm)
-            elif e.errno in (errno.EPERM, errno.EACCES):
+            elif e.errno in (errno.EPERM, errno.EACCES, errno.ENOSPC):
                 logger.critical(_("Can't create lock file; exiting"))
                 return 1
             else:
commit db683acf7d414dd6c2b23d9fe94fb37ac919b40b
Author: James Antill <james at and.org>
Date:   Fri Aug 5 13:27:21 2011 -0400

    Merge yum.spec with Fedora, for sanity. Add %check back in, with switch.

diff --git a/yum.spec b/yum.spec
index 825f745..b78a9f6 100644
--- a/yum.spec
+++ b/yum.spec
@@ -1,4 +1,21 @@
-Summary: RPM installer/updater
+%define move_yum_conf_back 1
+%define auto_sitelib 1
+%define yum_updatesd 0
+%define disable_check 0
+
+%if %{auto_sitelib}
+
+%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+%else
+%define python_sitelib /usr/lib/python?.?/site-packages
+%endif
+
+# We always used /usr/lib here, even on 64bit ... so it's a bit meh.
+%define yum_pluginslib   /usr/lib/yum-plugins
+%define yum_pluginsshare /usr/share/yum-plugins
+
+Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
 Release: 0
@@ -6,19 +23,29 @@ License: GPLv2+
 Group: System Environment/Base
 Source: %{name}-%{version}.tar.gz
 URL: http://yum.baseurl.org/
-BuildRoot: %{_tmppath}/%{name}-%{version}root
 BuildArchitectures: noarch
 BuildRequires: python
 BuildRequires: gettext
 BuildRequires: intltool
-
+# This is really CheckRequires ...
+BuildRequires: python-nose
+BuildRequires: python >= 2.4
+BuildRequires: rpm-python, rpm >= 0:4.4.2
+BuildRequires: python-iniparse
+BuildRequires: python-sqlite
+BuildRequires: python-urlgrabber >= 3.9.0-8
+BuildRequires: yum-metadata-parser >= 1.1.0
+BuildRequires: pygpgme
+# End of CheckRequires
+Conflicts: pirut < 1.1.4
 Requires: python >= 2.4
 Requires: rpm-python, rpm >= 0:4.4.2
+Requires: python-iniparse
 Requires: python-sqlite
-Requires: urlgrabber >= 3.9.2
+Requires: python-urlgrabber >= 3.9.0-8
 Requires: yum-metadata-parser >= 1.1.0
-Requires: python-iniparse
 Requires: pygpgme
+
 Conflicts: rpm >= 5-0
 # Zif is a re-implementation of yum in C, however:
 #
@@ -34,18 +61,26 @@ Conflicts: rpm >= 5-0
 # zif experts).
 #
 # ...so we have two sane choices: i) Conflict with it. 2) Stop developing yum.
-Conflicts: zif
+#
+#  Upstream says that #2 will no longer be true after this release.
+Conflicts: zif <= 0.1.3-3.fc15
+
 Obsoletes: yum-skip-broken <= 1.1.18
+Provides: yum-skip-broken = 1.1.18.yum
 Obsoletes: yum-basearchonly <= 1.1.9
+Obsoletes: yum-plugin-basearchonly <= 1.1.9
+Provides: yum-basearchonly = 1.1.9.yum
+Provides: yum-plugin-basearchonly = 1.1.9.yum
 Obsoletes: yum-allow-downgrade < 1.1.20-0
 Obsoletes: yum-plugin-allow-downgrade < 1.1.22-0
+Provides: yum-allow-downgrade = 1.1.20-0.yum
+Provides: yum-plugin-allow-downgrade = 1.1.22-0.yum
 Obsoletes: yum-plugin-protect-packages < 1.1.27-0
-Provides: yum-skip-broken
-Provides: yum-basearchonly
-Provides: yum-allow-downgrade
-Provides: yum-plugin-allow-downgrade
-Provides: yum-protect-packages
-Provides: yum-plugin-protect-packages
+Provides: yum-protect-packages = 1.1.27-0.yum
+Provides: yum-plugin-protect-packages = 1.1.27-0.yum
+Obsoletes: yum-plugin-download-order <= 0.2-2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
 
 %description
 Yum is a utility that can check for and automatically download and
@@ -58,9 +93,11 @@ Group: Applications/System
 Requires: yum = %{version}-%{release}
 Requires: dbus-python
 Requires: pygobject2
-Requires(preun): /sbin/chkconfig 
+Requires(preun): /sbin/chkconfig
+Requires(post): /sbin/chkconfig
 Requires(preun): /sbin/service
-Requires(postun): /sbin/chkconfig 
+Requires(post): /sbin/service
+Requires(postun): /sbin/chkconfig
 Requires(postun): /sbin/service
 
 
@@ -83,18 +120,46 @@ Requires(postun): /sbin/service
 These are the files needed to run yum updates as a cron job.
 Install this package if you want auto yum updates nightly via cron.
 
+
+
 %prep
 %setup -q
 
 %build
 make
 
+%if !%{disable_check}
+%check
+make check
+%endif
+
 
 %install
 [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
 make DESTDIR=$RPM_BUILD_ROOT install
-# install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/etc/yum/yum.conf
-# install -m 755 %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.daily/yum.cron
+install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/yum.conf
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/yum/pluginconf.d $RPM_BUILD_ROOT/%{yum_pluginslib}
+mkdir -p $RPM_BUILD_ROOT/%{yum_pluginsshare}
+
+%if %{move_yum_conf_back}
+# for now, move repodir/yum.conf back
+mv $RPM_BUILD_ROOT/%{_sysconfdir}/yum/repos.d $RPM_BUILD_ROOT/%{_sysconfdir}/yum.repos.d
+rm -f $RPM_BUILD_ROOT/%{_sysconfdir}/yum/yum.conf
+%endif
+
+%if %{yum_updatesd}
+echo Keeping local yum-updatesd
+%else
+
+# yum-updatesd has moved to the separate source version
+rm -f $RPM_BUILD_ROOT/%{_sysconfdir}/yum/yum-updatesd.conf 
+rm -f $RPM_BUILD_ROOT/%{_sysconfdir}/rc.d/init.d/yum-updatesd
+rm -f $RPM_BUILD_ROOT/%{_sysconfdir}/dbus-1/system.d/yum-updatesd.conf
+rm -f $RPM_BUILD_ROOT/%{_sbindir}/yum-updatesd
+rm -f $RPM_BUILD_ROOT/%{_mandir}/man*/yum-updatesd*
+rm -f $RPM_BUILD_ROOT/%{_datadir}/yum-cli/yumupd.py*
+
+%endif
 
 # Ghost files:
 mkdir -p $RPM_BUILD_ROOT/var/lib/yum/history
@@ -102,12 +167,18 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/yum/plugins
 mkdir -p $RPM_BUILD_ROOT/var/lib/yum/yumdb
 touch $RPM_BUILD_ROOT/var/lib/yum/uuid
 
+# rpmlint bogus stuff...
+chmod +x $RPM_BUILD_ROOT/%{_datadir}/yum-cli/*.py
+chmod +x $RPM_BUILD_ROOT/%{python_sitelib}/yum/*.py
+chmod +x $RPM_BUILD_ROOT/%{python_sitelib}/rpmUtils/*.py
+
 %find_lang %name
 
 %clean
 [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
 
 
+%if %{yum_updatesd}
 %post updatesd
 /sbin/chkconfig --add yum-updatesd
 /sbin/service yum-updatesd condrestart >/dev/null 2>&1
@@ -119,6 +190,7 @@ if [ $1 = 0 ]; then
  /sbin/service yum-updatesd stop >/dev/null 2>&1
 fi
 exit 0
+%endif
 
 
 %post cron
@@ -165,21 +237,29 @@ exit 0
 
 
 %files -f %{name}.lang
-%defattr(-, root, root)
+%defattr(-, root, root, -)
 %doc README AUTHORS COPYING TODO INSTALL ChangeLog PLUGINS
+%if %{move_yum_conf_back}
+%config(noreplace) %{_sysconfdir}/yum.conf
+%dir %{_sysconfdir}/yum.repos.d
+%else
 %config(noreplace) %{_sysconfdir}/yum/yum.conf
+%dir %{_sysconfdir}/yum/repos.d
+%endif
 %config(noreplace) %{_sysconfdir}/yum/version-groups.conf
 %dir %{_sysconfdir}/yum
 %dir %{_sysconfdir}/yum/protected.d
-%dir %{_sysconfdir}/yum/repos.d
 %dir %{_sysconfdir}/yum/vars
-%config %{_sysconfdir}/logrotate.d/%{name}
+%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
 %{_sysconfdir}/bash_completion.d
+%dir %{_datadir}/yum-cli
 %{_datadir}/yum-cli/*
+%if %{yum_updatesd}
 %exclude %{_datadir}/yum-cli/yumupd.py*
+%endif
 %{_bindir}/yum
-/usr/lib/python?.?/site-packages/yum
-/usr/lib/python?.?/site-packages/rpmUtils
+%{python_sitelib}/yum
+%{python_sitelib}/rpmUtils
 %dir /var/cache/yum
 %dir /var/lib/yum
 %ghost /var/lib/yum/uuid
@@ -188,7 +268,10 @@ exit 0
 %ghost /var/lib/yum/yumdb
 %{_mandir}/man*/yum.*
 %{_mandir}/man*/yum-shell*
-
+# plugin stuff
+%dir %{_sysconfdir}/yum/pluginconf.d 
+%dir %{yum_pluginslib}
+%dir %{yum_pluginsshare}
 
 %files cron
 %defattr(-,root,root)
@@ -202,7 +285,7 @@ exit 0
 %{_datadir}/yum-cron/update.yum
 %{_datadir}/yum-cron/cleanup.yum
 
-
+%if %{yum_updatesd}
 %files updatesd
 %defattr(-, root, root)
 %config(noreplace) %{_sysconfdir}/yum/yum-updatesd.conf
@@ -211,6 +294,7 @@ exit 0
 %{_datadir}/yum-cli/yumupd.py*
 %{_sbindir}/yum-updatesd
 %{_mandir}/man*/yum-updatesd*
+%endif
 
 %changelog
 * Thu Jul 28 2011 Matthew Miller <mattdm at mattdm.org>
commit 416cade29978510215d24c0b4b522c5648bc17ba
Author: James Antill <james at and.org>
Date:   Fri Aug 5 11:04:56 2011 -0400

    Add some unit testcases for BZ 721170.

diff --git a/test/simpleobsoletestests.py b/test/simpleobsoletestests.py
index 97a9923..70dde98 100644
--- a/test/simpleobsoletestests.py
+++ b/test/simpleobsoletestests.py
@@ -244,6 +244,42 @@ class SimpleObsoletesTests(OperationsTests):
         self.assert_(res=='ok', msg)
         self.assertResult((p.obsoletes_noarch,))
 
+    def testObsoletesOffPostInst1(self):
+        p = self.pkgs
+        res, msg = self.runOperation(['install', 'zsh'], [p.obsoletes_i386], [p.installed_i386])
+        self.assert_(res=='ok', msg)
+        self.assertResult((p.obsoletes_i386,))
+
+    def testObsoletesOffPostInst2(self):
+        p = self.pkgs
+        res, msg = self.runOperation(['install', 'zsh'], [p.obsoletes_i386], [p.installed_i386], {'obsoletes' : False})
+        self.assert_(res=='ok', msg)
+        self.assertResult((p.obsoletes_i386,))
+
+    def testObsoletesOffPostAvail1(self):
+        p = self.pkgs
+        res, msg = self.runOperation(['install', 'zsh-ng', 'zsh'], [], [p.obsoletes_i386, p.installed_i386])
+        self.assert_(res=='ok', msg)
+        self.assertResult((p.obsoletes_i386,))
+
+    def testObsoletesOffPostAvail2(self):
+        p = self.pkgs
+        res, msg = self.runOperation(['install', 'zsh-ng', 'zsh'], [], [p.obsoletes_i386, p.installed_i386], {'obsoletes' : False})
+        self.assert_(res=='ok', msg)
+        self.assertResult((p.obsoletes_i386,))
+
+    def testObsoletesOffPostAvail3(self):
+        p = self.pkgs
+        res, msg = self.runOperation(['install', 'zsh', 'zsh-ng'], [], [p.obsoletes_i386, p.installed_i386])
+        self.assert_(res=='ok', msg)
+        self.assertResult((p.obsoletes_i386,))
+
+    def testObsoletesOffPostAvail4(self):
+        p = self.pkgs
+        res, msg = self.runOperation(['install', 'zsh', 'zsh-ng'], [], [p.obsoletes_i386, p.installed_i386], {'obsoletes' : False})
+        self.assert_(res=='ok', msg)
+        self.assertResult((p.obsoletes_i386,))
+
     def _MultiObsHelper(self):
         ret = {'zsh'  : FakePackage('zsh', '1', '1', '0', 'noarch'),
                'ksh'  : FakePackage('ksh', '1', '1', '0', 'noarch'),
commit fb9e63a6b1223dee47c56befed66d25abfec105e
Author: James Antill <james at and.org>
Date:   Fri Aug 5 10:56:14 2011 -0400

    Lots of langs use y/n, so ignore testing for that "missing" translation.

diff --git a/test/check-po-yes-no.py b/test/check-po-yes-no.py
index e22318e..b9cb8aa 100755
--- a/test/check-po-yes-no.py
+++ b/test/check-po-yes-no.py
@@ -16,6 +16,8 @@ def trans(msg, default):
         msg = msg[:-2]
     return unicode(msg, encoding='utf-8')
 
+allow_plain_yn = True
+
 for fname in glob.glob("po/*.po"):
     next = None
     is_this_ok  = None
@@ -32,7 +34,8 @@ for fname in glob.glob("po/*.po"):
         if next is not None:
             if next == 'is_this_ok':
                 sis_this_ok = line
-                if line == 'msgstr ""\n' or line.find('[y/N]') != -1:
+                if line == 'msgstr ""\n' or (not allow_plain_yn and
+                                             line.find('[y/N]') != -1):
                     is_this_ok = False
                 else:
                     is_this_ok = True
@@ -62,9 +65,9 @@ for fname in glob.glob("po/*.po"):
             next = 'n'
     if (is_this_ok is None or
         yes is None or
-        y   is None or
+        (not allow_plain_yn and y   is None) or
         no  is None or
-        n   is None):
+        (not allow_plain_yn and n   is None)):
         print >>sys.stderr, """\
 ERROR: Can't find all the msg id's in %s
 is_this_ok %s
@@ -96,6 +99,10 @@ n          %5s: %s
        to_utf8(is_this_ok), to_utf8(sis_this_ok),
        to_utf8(yes), to_utf8(syes), to_utf8(y), to_utf8(sy),
        to_utf8(no), to_utf8(sno), to_utf8(n), to_utf8(sn))
+
+    if allow_plain_yn:
+        continue
+
     if syes[0] != sy:
         print >>sys.stderr, """\
 ERROR: yes/y translations don't match in: %s
commit 8b7865ace9ed347b956aada904b9ecdc40ca4963
Author: Nick Jacek <njacek at redhat.com>
Date:   Thu Aug 4 17:00:05 2011 -0400

     Sick hack to work around python readline changes. BZ 448864
    
     This is a modification of a patch James posted a while ago, see
    http://lists.baseurl.org/pipermail/yum-devel/2010-September/007495.html
     The changes from that patch are: changing __builtin__.raw_input so
    that _sick_hack_raw_input is used when raw_input is called from other
    modules; calling to_utf8 on the prompt to raw_input, so that non-ascii
    prompts don't break anything; and finally resetting sys.stdout fewer
    times, to be simpler.  I've tested the shell quite a bit using a
    Japanese locale so that lots of unicode characters are printed, I
    don't speak Japanese, so it might be outputting nonsense, but as far
    as I can tell everything works as it should.

diff --git a/shell.py b/shell.py
index 636f12c..34a492e 100644
--- a/shell.py
+++ b/shell.py
@@ -23,10 +23,11 @@ import cmd
 import shlex
 import logging
 
-from yum import Errors
+from yum import Errors, _
 from yum.constants import *
 import yum.logginglevels as logginglevels
-
+from yum.i18n import to_utf8
+import __builtin__
 
 class YumShell(cmd.Cmd):
     """A class to implement an interactive yum shell."""
@@ -72,7 +73,33 @@ class YumShell(cmd.Cmd):
                 raise Errors.YumBaseError, "Fatal error in script, exiting"
         
         return inputs
-        
+
+    def cmdloop(self, *args, **kwargs):
+        """ Sick hack for readline. """
+
+        oraw_input = raw_input
+        owriter    = sys.stdout
+        _ostdout   = owriter.stream
+
+        def _sick_hack_raw_input(prompt):
+            sys.stdout = _ostdout
+            rret = oraw_input(to_utf8(prompt))
+            sys.stdout = owriter
+
+            return rret
+
+        __builtin__.raw_input = _sick_hack_raw_input
+
+        try:
+            cret = cmd.Cmd.cmdloop(self, *args, **kwargs)
+        except:
+            __builtin__.raw_input  = oraw_input
+            raise
+
+        __builtin__.raw_input = oraw_input
+
+        return cret
+
     def script(self):
         """Execute a script file in the yum shell.  The location of
         the script file is supplied by the :class:`cli.YumBaseCli`


More information about the Yum-commits mailing list