From 2e4024d94b72cff0c847e0a799acf427fb6d0594 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Wed, 28 Oct 2009 07:47:16 +0000 Subject: [PATCH] - support multiple python implementations in brp-python-bytecompile (#531117) - make disk space problem reporting a bit saner (#517418) --- rpm-4.7.1-diskspace.patch | 56 ++++++++++++++++++++++ rpm-4.7.1-python-bytecompile.patch | 74 ++++++++++++++++++++++++++++++ rpm.spec | 10 +++- 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 rpm-4.7.1-diskspace.patch create mode 100644 rpm-4.7.1-python-bytecompile.patch diff --git a/rpm-4.7.1-diskspace.patch b/rpm-4.7.1-diskspace.patch new file mode 100644 index 0000000..20e3aea --- /dev/null +++ b/rpm-4.7.1-diskspace.patch @@ -0,0 +1,56 @@ +commit 2222e81e1cf74bbf78acb9969592ab06e2289929 +Author: Panu Matilainen +Date: Tue Oct 27 10:57:35 2009 +0200 + + Make disk space problem reporting slightly saner (RhBug:517418) + - Only report disk space/inode issues for packages that are affected + instead of piling up all the problems in all filesystems on all remaining + packages + - The messages are still ambiguous at best, need to figure out something + better one of these days... + +diff --git a/lib/rpmts.c b/lib/rpmts.c +index 38fedc8..6e28b82 100644 +--- a/lib/rpmts.c ++++ b/lib/rpmts.c +@@ -910,17 +910,23 @@ void rpmtsCheckDSIProblems(const rpmts ts, const rpmte te) + for (i = 0; i < ts->filesystemCount; i++, dsi++) { + + if (dsi->bavail >= 0 && adj_fs_blocks(dsi->bneeded) > dsi->bavail) { +- rpmpsAppend(ps, RPMPROB_DISKSPACE, ++ if (dsi->bneeded != dsi->obneeded) { ++ rpmpsAppend(ps, RPMPROB_DISKSPACE, + rpmteNEVRA(te), rpmteKey(te), + ts->filesystems[i], NULL, NULL, +- (adj_fs_blocks(dsi->bneeded) - dsi->bavail) * dsi->bsize); ++ (adj_fs_blocks(dsi->bneeded) - dsi->bavail) * dsi->bsize); ++ dsi->obneeded = dsi->bneeded; ++ } + } + + if (dsi->iavail >= 0 && adj_fs_blocks(dsi->ineeded) > dsi->iavail) { +- rpmpsAppend(ps, RPMPROB_DISKNODES, ++ if (dsi->ineeded != dsi->oineeded) { ++ rpmpsAppend(ps, RPMPROB_DISKNODES, + rpmteNEVRA(te), rpmteKey(te), + ts->filesystems[i], NULL, NULL, +- (adj_fs_blocks(dsi->ineeded) - dsi->iavail)); ++ (adj_fs_blocks(dsi->ineeded) - dsi->iavail)); ++ dsi->oineeded = dsi->ineeded; ++ } + } + } + ps = rpmpsFree(ps); +diff --git a/lib/rpmts_internal.h b/lib/rpmts_internal.h +index 6189fc1..1b0f847 100644 +--- a/lib/rpmts_internal.h ++++ b/lib/rpmts_internal.h +@@ -20,6 +20,8 @@ struct diskspaceInfo_s { + int64_t bsize; /*!< File system block size. */ + int64_t bavail; /*!< No. of blocks available. */ + int64_t iavail; /*!< No. of inodes available. */ ++ int64_t obneeded; /*!< Bookkeeping to avoid duplicate reports */ ++ int64_t oineeded; /*!< Bookkeeping to avoid duplicate reports */ + }; + + /** \ingroup rpmts diff --git a/rpm-4.7.1-python-bytecompile.patch b/rpm-4.7.1-python-bytecompile.patch new file mode 100644 index 0000000..e25adc6 --- /dev/null +++ b/rpm-4.7.1-python-bytecompile.patch @@ -0,0 +1,74 @@ +commit 5463570061a7ca9ed947885b516c2551778b636f +Author: Panu Matilainen +Date: Tue Oct 27 16:07:43 2009 +0200 + + Support multiple python versions in brp-python-bytecompile (RhBug:53117) + - For *.py files in python library path, use matching python interpreter + version for compiling, this is especially needed for Python 3 which + is very different from Python 2 code. And even if the code compiled + with a wrong version, it would be recompiled at run-time when invoked + with the intended python version, causing verification errors etc. + - For *.py files outside the library path, use "system python" which + might not be always correct but we dont really know any better. + - Patch from David Malcolm + +diff --git a/scripts/brp-python-bytecompile b/scripts/brp-python-bytecompile +index 6405c5e..1faa6db 100644 +--- a/scripts/brp-python-bytecompile ++++ b/scripts/brp-python-bytecompile +@@ -6,8 +6,8 @@ if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + fi + + # If we don't have a python interpreter, avoid changing anything. +-python=${1:-/usr/bin/python} +-if [ ! -x "$python" ]; then ++default_python=${1:-/usr/bin/python} ++if [ ! -x "$default_python" ]; then + exit 0 + fi + +@@ -19,8 +19,37 @@ if [ -z "$depth" -o "$depth" -le "1" ]; then + exit 0 + fi + ++# .pyc/.pyo files embed a "magic" value, identifying the ABI version of Python ++# bytecode that they are for. ++# ++# The files below RPM_BUILD_ROOT could be targetting multiple versions of ++# python (e.g. a single build that emits several subpackages e.g. a ++# python26-foo subpackage, a python31-foo subpackage etc) ++# ++# Support this by assuming that below each /usr/lib/python$VERSION/, all ++# .pyc/.pyo files are to be compiled for /usr/bin/python$VERSION. ++# ++# For example, below /usr/lib/python2.6/, we're targetting /usr/bin/python2.6 ++# and below /usr/lib/python3.1/, we're targetting /usr/bin/python3.1 ++ ++for python_libdir in $RPM_BUILD_ROOT/usr/lib*/python*/ ; ++do ++ python_binary=/usr/bin/$(basename $python_libdir) ++ echo "Bytecompiling .py files below $python_libdir using $python_binary" ++ ++ # Generate normal (.pyc) byte-compiled files. ++ $python_binary -c 'import compileall; compileall.compile_dir("'"$python_libdir"'", '"$depth"', "/", force=1, quiet=1)' ++ ++ # Generate optimized (.pyo) byte-compiled files. ++ $python_binary -O -c 'import compileall; compileall.compile_dir("'"$python_libdir"'", '"$depth"', "/", force=1, quiet=1)' ++done ++ ++ ++# Handle other locations in the filesystem using the default python ++# implementation: ++ + # Generate normal (.pyc) byte-compiled files. +-$python -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/"'"), quiet=1))' ++$default_python -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib.*/python.+/"'"), quiet=1))' + if [ $? != 0 ]; then + # One or more of the files had a syntax error + # XXX TODO: parametrize the exit code, only warn for now +@@ -28,4 +57,4 @@ if [ $? != 0 ]; then + fi + + # Generate optimized (.pyo) byte-compiled files. +-$python -O -c 'import compileall, re; compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/"'"))' > /dev/null ++$default_python -O -c 'import compileall, re; compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib.*/python.+/"'"))' > /dev/null diff --git a/rpm.spec b/rpm.spec index 0fbc986..fc7cfad 100644 --- a/rpm.spec +++ b/rpm.spec @@ -21,7 +21,7 @@ Summary: The RPM package management system Name: rpm Version: %{rpmver} -Release: 7%{?dist} +Release: 8%{?dist} Group: System Environment/Base Url: http://www.rpm.org/ Source0: http://rpm.org/releases/rpm-4.7.x/%{name}-%{srcver}.tar.bz2 @@ -50,6 +50,8 @@ Patch207: rpm-4.7.1-chroot-remove-env.patch Patch208: rpm-4.7.1-remove-db4-xa.patch Patch209: rpm-4.7.1-perl-heredoc.patch Patch210: rpm-4.7.0-extra-provides.patch +Patch211: rpm-4.7.1-python-bytecompile.patch +Patch212: rpm-4.7.1-diskspace.patch # These are not yet upstream Patch301: rpm-4.6.0-niagara.patch @@ -213,6 +215,8 @@ packages on a system. %patch208 -p1 -b .remove-db4-xa %patch209 -p1 -b .perl-heredoc %patch210 -p1 -b .extra-prov +%patch211 -p1 -b .python-bytecompile +%patch212 -p1 -b .diskspace %patch301 -p1 -b .niagara %patch302 -p1 -b .geode @@ -427,6 +431,10 @@ exit 0 %doc doc/librpm/html/* %changelog +* Wed Oct 28 2009 Panu Matilainen - 4.7.1-8 +- support multiple python implementations in brp-python-bytecompile (#531117) +- make disk space problem reporting a bit saner (#517418) + * Tue Oct 06 2009 Panu Matilainen - 4.7.1-7 - fix build with BDB 4.8.x by removing XA "support" from BDB backend - perl dep extractor heredoc parsing improvements (#524929)