diff --git a/defclean.diff b/defclean.diff new file mode 100644 index 0000000..1f02855 --- /dev/null +++ b/defclean.diff @@ -0,0 +1,18 @@ +Index: build/parseSpec.c +=================================================================== +--- build/parseSpec.c.orig ++++ build/parseSpec.c +@@ -569,6 +569,13 @@ int parseSpec(rpmts ts, const char *spec + } + /* LCL: parsePart is modified @*/ + ++ if (spec->clean == NULL) { ++ char *body = rpmExpand("%{?buildroot: %{__rm} -rf %{buildroot}}", NULL); ++ spec->clean = newStringBuf(); ++ appendLineStringBuf(spec->clean, body); ++ free(body); ++ } ++ + /* Check for description in each package and add arch and os */ + { + char *platform = rpmExpand("%{_target_platform}", NULL); diff --git a/lazystatfs.diff b/lazystatfs.diff new file mode 100644 index 0000000..ecfbb69 --- /dev/null +++ b/lazystatfs.diff @@ -0,0 +1,286 @@ +Index: lib/rpmts.c +=================================================================== +--- lib/rpmts.c.orig ++++ lib/rpmts.c +@@ -779,83 +779,102 @@ rpmdb rpmtsGetRdb(rpmts ts) + + int rpmtsInitDSI(const rpmts ts) + { +- rpmDiskSpaceInfo dsi; +- struct stat sb; +- int rc; +- int i; +- + if (rpmtsFilterFlags(ts) & RPMPROB_FILTER_DISKSPACE) + return 0; +- +- rpmlog(RPMLOG_DEBUG, "mounted filesystems:\n"); +- rpmlog(RPMLOG_DEBUG, +- " i dev bsize bavail iavail mount point\n"); +- +- rc = rpmGetFilesystemList(&ts->filesystems, &ts->filesystemCount); +- if (rc || ts->filesystems == NULL || ts->filesystemCount <= 0) +- return rc; +- +- /* Get available space on mounted file systems. */ +- + ts->dsi = _free(ts->dsi); +- ts->dsi = xcalloc((ts->filesystemCount + 1), sizeof(*ts->dsi)); ++ ts->dsi = xcalloc(1, sizeof(*ts->dsi)); ++ return 0; ++} + +- dsi = ts->dsi; ++static rpmDiskSpaceInfo rpmtsCreateDSI(const rpmts ts, dev_t dev, const char *dirName, int count) ++{ ++ rpmDiskSpaceInfo dsi; ++ struct stat sb; ++ int rc; + +- if (dsi != NULL) +- for (i = 0; (i < ts->filesystemCount) && dsi; i++, dsi++) { + #if STATFS_IN_SYS_STATVFS +- struct statvfs sfb; +- memset(&sfb, 0, sizeof(sfb)); +- rc = statvfs(ts->filesystems[i], &sfb); ++ struct statvfs sfb; ++ memset(&sfb, 0, sizeof(sfb)); ++ rc = statvfs(dirName, &sfb); + #else +- struct statfs sfb; +- memset(&sfb, 0, sizeof(sfb)); ++ struct statfs sfb; ++ memset(&sfb, 0, sizeof(sfb)); + # if STAT_STATFS4 + /* This platform has the 4-argument version of the statfs call. The last two + * should be the size of struct statfs and 0, respectively. The 0 is the + * filesystem type, and is always 0 when statfs is called on a mounted + * filesystem, as we're doing. + */ +- rc = statfs(ts->filesystems[i], &sfb, sizeof(sfb), 0); ++ rc = statfs(dirName, &sfb, sizeof(sfb), 0); + # else +- rc = statfs(ts->filesystems[i], &sfb); ++ rc = statfs(dirName, &sfb); + # endif + #endif +- if (rc) +- break; +- +- rc = stat(ts->filesystems[i], &sb); +- if (rc) +- break; +- dsi->dev = sb.st_dev; ++ if (rc) ++ return NULL; + +- dsi->bsize = sfb.f_bsize; +- dsi->bneeded = 0; +- dsi->ineeded = 0; ++ rc = stat(dirName, &sb); ++ if (rc) ++ return NULL; ++ if (sb.st_dev != dev) ++ return NULL; ++ ++ ts->dsi = xrealloc(ts->dsi, (count + 2) * sizeof(*ts->dsi)); ++ dsi = ts->dsi + count; ++ memset(dsi, 0, 2 * sizeof(*dsi)); ++ dsi->dev = dev; ++ dsi->bsize = sfb.f_bsize; ++ if (!dsi->bsize) ++ dsi->bsize = 512; /* we need a bsize */ ++ dsi->bneeded = 0; ++ dsi->ineeded = 0; + #ifdef STATFS_HAS_F_BAVAIL +- dsi->bavail = sfb.f_bavail; ++ dsi->bavail = sfb.f_bavail; + #else + /* FIXME: the statfs struct doesn't have a member to tell how many blocks are + * available for non-superusers. f_blocks - f_bfree is probably too big, but + * it's about all we can do. + */ +- dsi->bavail = sfb.f_blocks - sfb.f_bfree; ++ dsi->bavail = sfb.f_blocks - sfb.f_bfree; + #endif +- /* XXX Avoid FAT and other file systems that have not inodes. */ +- /* XXX assigning negative value to unsigned type */ +- dsi->iavail = !(sfb.f_ffree == 0 && sfb.f_files == 0) +- ? sfb.f_ffree : -1; +- rpmlog(RPMLOG_DEBUG, +- "%5d 0x%08x %8" PRId64 " %12" PRId64 " %12" PRId64" %s\n", +- i, (unsigned) dsi->dev, dsi->bsize, +- dsi->bavail, dsi->iavail, +- ts->filesystems[i]); ++ /* XXX Avoid FAT and other file systems that have not inodes. */ ++ /* XXX assigning negative value to unsigned type */ ++ dsi->iavail = !(sfb.f_ffree == 0 && sfb.f_files == 0) ++ ? sfb.f_ffree : -1; ++ ++ return dsi; ++} ++ ++static void rpmtsFindDSIMount(const rpmts ts, rpmDiskSpaceInfo dsi) ++{ ++ int i; ++ struct stat sb; ++ ++ /* must leave chroot for this */ ++ if (rpmtsChrootDone(ts)) { ++ chroot("."); ++ } ++ if (!ts->filesystemCount) ++ rpmGetFilesystemList(&ts->filesystems, &ts->filesystemCount); ++ for (i = 0; i < ts->filesystemCount; i++) { ++ if (stat(ts->filesystems[i], &sb)) ++ continue; ++ if (sb.st_dev == dsi->dev) { ++ dsi->mntPoint = ts->filesystems[i]; ++ break; ++ } ++ } ++ if (i == ts->filesystemCount) { ++ /* file system not found, create something to display */ ++ dsi->mntPoint = xmalloc(20); ++ sprintf(dsi->mntPoint, "dev 0x%08x", (unsigned)dsi->dev); ++ } ++ if (rpmtsChrootDone(ts)) { ++ chroot(ts->rootDir); + } +- return rc; + } + +-void rpmtsUpdateDSI(const rpmts ts, dev_t dev, ++void rpmtsUpdateDSI(const rpmts ts, dev_t dev, const char *dirName, + rpm_loff_t fileSize, rpm_loff_t prevSize, rpm_loff_t fixupSize, + rpmFileAction action) + { +@@ -866,8 +885,10 @@ void rpmtsUpdateDSI(const rpmts ts, dev_ + if (dsi) { + while (dsi->bsize && dsi->dev != dev) + dsi++; +- if (dsi->bsize == 0) +- dsi = NULL; ++ if (dsi->bsize == 0) { ++ /* create new entry */ ++ dsi = rpmtsCreateDSI(ts, dev, dirName, dsi - ts->dsi); ++ } + } + if (dsi == NULL) + return; +@@ -910,32 +931,32 @@ void rpmtsCheckDSIProblems(const rpmts t + rpmDiskSpaceInfo dsi; + rpmps ps; + int fc; +- int i; +- +- if (ts->filesystems == NULL || ts->filesystemCount <= 0) +- return; + + dsi = ts->dsi; +- if (dsi == NULL) ++ if (dsi == NULL || !dsi->bsize) + return; + fc = rpmfiFC(rpmteFI(te)); + if (fc <= 0) + return; + + ps = rpmtsProblems(ts); +- for (i = 0; i < ts->filesystemCount; i++, dsi++) { ++ for (; dsi->bsize; dsi++) { + + if (dsi->bavail >= 0 && adj_fs_blocks(dsi->bneeded) > dsi->bavail) { ++ if (!dsi->mntPoint) ++ rpmtsFindDSIMount(ts, dsi); + rpmpsAppend(ps, RPMPROB_DISKSPACE, + rpmteNEVRA(te), rpmteKey(te), +- ts->filesystems[i], NULL, NULL, ++ dsi->mntPoint, NULL, NULL, + (adj_fs_blocks(dsi->bneeded)) * dsi->bsize); + } + + if (dsi->iavail >= 0 && adj_fs_blocks(dsi->ineeded) > dsi->iavail) { ++ if (!dsi->mntPoint) ++ rpmtsFindDSIMount(ts, dsi); + rpmpsAppend(ps, RPMPROB_DISKNODES, + rpmteNEVRA(te), rpmteKey(te), +- ts->filesystems[i], NULL, NULL, ++ dsi->mntPoint, NULL, NULL, + (adj_fs_blocks(dsi->ineeded))); + } + } +Index: lib/rpmts.h +=================================================================== +--- lib/rpmts.h.orig ++++ lib/rpmts.h +@@ -485,7 +485,7 @@ int rpmtsSuspendResumeDBLock(rpmts ts, i + * @param fixupSize long size difference + * @param action file disposition + */ +-void rpmtsUpdateDSI(const rpmts ts, dev_t dev, ++void rpmtsUpdateDSI(const rpmts ts, dev_t dev, const char *dirName, + rpm_loff_t fileSize, rpm_loff_t prevSize, rpm_loff_t fixupSize, + rpmFileAction action); + +Index: lib/rpmts_internal.h +=================================================================== +--- lib/rpmts_internal.h.orig ++++ lib/rpmts_internal.h +@@ -14,6 +14,7 @@ typedef struct diskspaceInfo_s * rpmDisk + /** \ingroup rpmts + */ + struct diskspaceInfo_s { ++ const char *mntPoint; /*!< File system mount point */ + dev_t dev; /*!< File system device number. */ + int64_t bneeded; /*!< No. of blocks needed. */ + int64_t ineeded; /*!< No. of inodes needed. */ +Index: lib/transaction.c +=================================================================== +--- lib/transaction.c.orig ++++ lib/transaction.c +@@ -343,7 +343,7 @@ assert(otherFi != NULL); + } + + /* Update disk space info for a file. */ +- rpmtsUpdateDSI(ts, fiFps->entry->dev, rpmfiFSize(fi), ++ rpmtsUpdateDSI(ts, fiFps->entry->dev, fiFps->entry->dirName, rpmfiFSize(fi), + rpmfiFReplacedSize(fi), fixupSize, rpmfsGetAction(fs, i)); + + } +Index: configure.ac +=================================================================== +--- configure.ac.orig ++++ configure.ac +@@ -511,25 +511,25 @@ dnl + found_struct_statfs=no + + if test X$found_struct_statfs = Xno ; then +-dnl Solaris 2.6+ wants to use statvfs ++dnl first try including sys/vfs.h + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #ifdef HAVE_SYS_TYPES_H + #include + #endif +-#include ]], [[struct statvfs sfs;]])],[AC_MSG_RESULT(in sys/statvfs.h) +- AC_DEFINE(STATFS_IN_SYS_STATVFS, 1, +- [statfs in (for solaris 2.6+ systems)]) ++#include ]], [[struct statfs sfs;]])],[AC_MSG_RESULT(in sys/vfs.h) ++ AC_DEFINE(STATFS_IN_SYS_VFS, 1, [statfs in (for linux systems)]) + found_struct_statfs=yes],[]) + fi + + if test X$found_struct_statfs = Xno ; then +-dnl first try including sys/vfs.h ++dnl Solaris 2.6+ wants to use statvfs + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #ifdef HAVE_SYS_TYPES_H + #include + #endif +-#include ]], [[struct statfs sfs;]])],[AC_MSG_RESULT(in sys/vfs.h) +- AC_DEFINE(STATFS_IN_SYS_VFS, 1, [statfs in (for linux systems)]) ++#include ]], [[struct statvfs sfs;]])],[AC_MSG_RESULT(in sys/statvfs.h) ++ AC_DEFINE(STATFS_IN_SYS_STATVFS, 1, ++ [statfs in (for solaris 2.6+ systems)]) + found_struct_statfs=yes],[]) + fi + diff --git a/rpm-python.spec b/rpm-python.spec index 8d6e6d5..190f4dd 100644 --- a/rpm-python.spec +++ b/rpm-python.spec @@ -25,7 +25,7 @@ License: GPL v2 or later Group: System/Packages Summary: Python Bindings for Manipulating RPM Packages Version: 4.7.1 -Release: 3 +Release: 4 Requires: rpm = %{version} %py_requires Source99: rpm.spec diff --git a/rpm.changes b/rpm.changes index 1757171..b5a74e0 100644 --- a/rpm.changes +++ b/rpm.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Fri Sep 4 11:32:33 CEST 2009 - mls@suse.de + +- do not statfs all filesystems until there is something + to report +- cherry pick default clean section patch from upstream +- add make_install macro definition + ------------------------------------------------------------------- Wed Sep 2 17:16:37 CEST 2009 - mls@suse.de diff --git a/rpm.spec b/rpm.spec index d0da9d0..1e938ff 100644 --- a/rpm.spec +++ b/rpm.spec @@ -28,7 +28,7 @@ PreReq: %insserv_prereq %fillup_prereq permissions AutoReqProv: on Summary: The RPM Package Manager Version: 4.7.1 -Release: 3 +Release: 4 Source: rpm-%{version}.tar.bz2 Source1: RPM-HOWTO.tar.bz2 Source2: RPM-Tips.html.tar.bz2 @@ -99,6 +99,8 @@ Patch63: debuginfo-mono.patch Patch64: allowufdio.diff Patch65: fixabsfilelists.diff Patch66: fixqueryreturn.diff +Patch67: lazystatfs.diff +Patch68: defclean.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build # # avoid bootstrapping problem @@ -158,7 +160,7 @@ rm -f rpmdb/db.h %patch -P 30 -P 31 -P 32 -P 33 -P 34 -P 35 -P 36 -P 37 -P 38 -P 39 %patch -P 40 -P 41 -P 42 -P 43 -P 44 -P 45 -P 46 -P 47 -P 48 -P 49 %patch -P 50 -P 51 -P 52 -P 53 -P 54 -P 55 -P 56 -P 57 -P 58 -P 59 -%patch -P 60 -P 61 -P 62 -P 63 -P 64 -P 65 -P 66 +%patch -P 60 -P 61 -P 62 -P 63 -P 64 -P 65 -P 66 -P 67 -P 68 #chmod 755 scripts/find-supplements{,.ksyms} #chmod 755 scripts/find-provides.ksyms scripts/find-requires.ksyms #chmod 755 scripts/firmware.prov @@ -271,6 +273,9 @@ if test -s var/lib/rpm/packages.rpm ; then mv -f var/lib/rpm/packages.rpm var/lib/rpm/packages.rpm3 rm -f var/lib/rpm/conflictsindex.rpm var/lib/rpm/fileindex.rpm var/lib/rpm/groupindex.rpm var/lib/rpm/nameindex.rpm var/lib/rpm/providesindex.rpm var/lib/rpm/requiredby.rpm var/lib/rpm/triggerindex.rpm fi +if test -s var/lib/rpm/Filemd5s -a ! -e var/lib/rpm/Filedigests ; then + ln var/lib/rpm/Filemd5s var/lib/rpm/Filedigests +fi %postun %{insserv_cleanup}