[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