diff --git a/build/files.c b/build/files.c index 321fe5d..ff3dc11 100644 --- a/build/files.c +++ b/build/files.c @@ -85,6 +85,10 @@ typedef struct AttrRec_s { mode_t ar_dmode; } * AttrRec; +/* List of files */ +static StringBuf check_fileList = NULL; +static int check_fileListLen = 0; + /** */ /*@unchecked@*/ @@ -1626,6 +1630,13 @@ static int addFile(FileList fl, const char * diskURL, (unsigned)fileMode, fileUname, fileGname, fileURL); #endif + /* This check must be consistent with check-files script. */ + if (S_ISREG(fileMode) || S_ISLNK(fileMode)) { + appendStringBuf(check_fileList, diskURL); + appendStringBuf(check_fileList, "\n"); + check_fileListLen += strlen(diskURL) + 1; + } + /* Add to the file list */ if (fl->fileListRecsUsed == fl->fileListRecsAlloced) { fl->fileListRecsAlloced += 128; @@ -2800,13 +2811,69 @@ static void printDeps(Header h) versions = hfd(versions, dvt); } +/** + * Check packaged file list against what's in the build root. + * @param fileList packaged file list + * @param fileListLen no. of packaged files + * @return -1 if skipped, 0 on OK, 1 on error + */ +static int checkFiles(StringBuf fileList, int fileListLen) +{ + StringBuf readBuf = NULL; + const char * s; + char ** av = NULL; + int ac = 0; + int rc = 0; + char *buf; + + s = rpmExpand("%{?__check_files}", NULL); + if (!(s && *s)) { + rc = -1; + goto exit; + } + if (!((rc = poptParseArgvString(s, &ac, (const char ***)&av)) == 0 + && ac > 0 && av != NULL)) + { + goto exit; + } + + rpmMessage(RPMMESS_NORMAL, _("Checking for unpackaged files: %s\n"), s); + + if ((readBuf = getOutputFrom(NULL, av, getStringBuf(fileList), fileListLen, 0))) { + static int _unpackaged_files_terminate_build = 0; + static int oneshot = 0; + + if (!oneshot) { + _unpackaged_files_terminate_build = + rpmExpandNumeric("%{?_unpackaged_files_terminate_build}"); + oneshot = 1; + } + + buf = getStringBuf(readBuf); + if (*buf && (*buf != '\n')) { + rc = (_unpackaged_files_terminate_build) ? 1 : 0; + rpmMessage((rc ? RPMMESS_ERROR : RPMMESS_WARNING), + _("Installed (but unpackaged) file(s) found:\n%s"), buf); + } + } + +exit: + freeStringBuf(readBuf); + s = _free(s); + av = _free(av); + return rc; +} + int processBinaryFiles(Spec spec, int installSpecialDoc, int test) { Package pkg; - + int rc = 0; + + check_fileList = newStringBuf(); + check_fileListLen = 0; + for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) { const char *n, *v, *r; - int rc; if (pkg->fileList == NULL) continue; @@ -2815,7 +2882,7 @@ int processBinaryFiles(Spec spec, int installSpecialDoc, int test) rpmMessage(RPMMESS_NORMAL, _("Processing files: %s-%s-%s\n"), n, v, r); rc = processPackageFiles(spec, pkg, installSpecialDoc, test); - if (rc) return rc; + if (rc) break; /* XXX This should be added always so that packages look alike. * XXX However, there is logic in files.c/depends.c that checks for @@ -2823,17 +2890,28 @@ int processBinaryFiles(Spec spec, int installSpecialDoc, int test) */ if (headerIsEntry(pkg->header, RPMTAG_MULTILIBS)) { rc = generateDepends(spec, pkg, pkg->cpioList, 1); - if (rc) return rc; + if (rc) break; rc = generateDepends(spec, pkg, pkg->cpioList, 2); - if (rc) return rc; + if (rc) break; } else { rc = generateDepends(spec, pkg, pkg->cpioList, 0); - if (rc) return rc; + if (rc) break; } /*@-noeffect@*/ printDeps(pkg->header); /*@=noeffect@*/ } - return 0; + /* Now we have in fileList list of files from all packages. + * We pass it to a script which do the work of finding missing + * and duplicated files. + */ + + if (rc == 0 && checkFiles(check_fileList, check_fileListLen) > 0) + rc = 1; + + check_fileListLen = 0; + freeStringBuf(check_fileList); + + return rc; } diff --git a/macros.in b/macros.in index 78a560a..e410af1 100644 --- a/macros.in +++ b/macros.in @@ -284,6 +284,16 @@ # #%vendor +# Script gets packaged file list on input and buildroot in $RPM_BUILD_ROOT variable. +# Returns list of unpackaged files, i.e. files in $RPM_BUILD_ROOT not packaged. +# +%__check_files @RPMCONFIGDIR@/check-files + +# Should unpackaged files in a buildroot terminate a build? +# +# Note: The default value should be 0 for legacy compatibility. +%_unpackaged_files_terminate_build 0 + #============================================================================== # ---- Package version macro. # The type of package to produce, for compatibility with legacy diff --git a/rpm-4_0.spec b/rpm-4_0.spec index 21d2af2..2e29a13 100644 --- a/rpm-4_0.spec +++ b/rpm-4_0.spec @@ -6,7 +6,7 @@ Name: %rpm_name Version: %rpm_version -Release: alt26.1 +Release: alt26.2 %define ifdef() %if %{expand:%%{?%{1}:1}%%{!?%{1}:0}} %define get_dep() %(rpm -q --qf '%%{NAME} >= %%|SERIAL?{%%{SERIAL}:}|%%{VERSION}-%%{RELEASE}' %1 2>/dev/null || echo '%1 >= unknown') @@ -415,6 +415,7 @@ fi %rpmattr %_libdir/%name/brp-* %rpmattr %_libdir/%name/*_files %rpmattr %_libdir/%name/mkinstalldirs +%rpmattr %_libdir/%name/check-files %rpmattr %_libdir/%name/convertrpmrc.sh %rpmattr %_libdir/%name/rpm2cpio.sh %rpmattr %_libdir/%name/filesize @@ -473,11 +474,12 @@ fi %endif #with contrib %changelog -* Fri Nov 07 2003 Dmitry V. Levin 4.0.4-alt26.1 +* Fri Nov 07 2003 Dmitry V. Levin 4.0.4-alt26.2 - Do not package build-topdir subpackage by default. - verify_elf: implemented TEXTREL checking. - README.ALT-ru_RU.KOI8-R: document it. - helper shell scripts: use printf instead of echo where appropriate. +- Backported %%_unpackaged_files_terminate_build support. * Sat Sep 27 2003 Dmitry V. Levin 4.0.4-alt26 - gendiff: cleanup (#2558).