--- rpm-5.4.9/build/pack.c.pkgcheck~ 2012-04-15 17:04:14.000000000 +0200 +++ rpm-5.4.9/build/pack.c 2012-05-15 02:21:17.851100279 +0200 @@ -1127,6 +1127,25 @@ static rpmTag copyTags[] = { 0 }; +static rpmRC checkPackages(const char *pkgcheck) +{ + int fail = rpmExpandNumeric("%{?_nonzero_exit_pkgcheck_terminate_build}"); + int xx; + + rpmlog(RPMLOG_NOTICE, _("Executing \"%s\":\n"), pkgcheck); + xx = system(pkgcheck); + if (WEXITSTATUS(xx) == -1 || WEXITSTATUS(xx) == 127) { + rpmlog(RPMLOG_ERR, _("Execution of \"%s\" failed.\n"), pkgcheck); + if (fail) return 127; + } + if (WEXITSTATUS(xx) != 0) { + rpmlog(RPMLOG_ERR, _("Package check \"%s\" failed.\n"), pkgcheck); + if (fail) return RPMRC_FAIL; + } + + return RPMRC_OK; +} + rpmRC packageBinaries(Spec spec) { HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he)); @@ -1136,6 +1155,7 @@ rpmRC packageBinaries(Spec spec) Package pkg; rpmRC rc = RPMRC_OK; /* assume success */ int xx; + ARGV_t pkglist = NULL; for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) { const char *fn; @@ -1233,11 +1253,46 @@ assert(csa->fi != NULL); csa->cpioFdIn = fdFree(csa->cpioFdIn, "init (packageBinaries)"); /*@=nullpass =onlytrans =refcounttrans @*/ /*@=type@*/ + if (rc == RPMRC_OK) { + /* Do check each written package if enabled */ + char *pkgcheck = rpmExpand("%{?_build_pkgcheck} ", fn, NULL); + if (pkgcheck[0] != ' ') { + rc = checkPackages(pkgcheck); + } + pkgcheck = _free(pkgcheck); + xx = argvAdd(&pkglist, fn); + } fn = _free(fn); - if (rc) + if (rc) { + pkglist = argvFree(pkglist); goto exit; + } } - + + /* Now check the package set if enabled */ + if (pkglist != NULL) { + char *pkgcheck_set = NULL; + char *pkgs = NULL; + size_t pkglen = 0; + int i; + for (i = 0; i < argvCount(pkglist); i++) + pkglen += strlen(pkglist[i]) + 1; + pkgs = xcalloc(1, pkglen); + for (i = 0; i < argvCount(pkglist); i++) { + if (i) + strcat(pkgs, " "); + strcat(pkgs, pkglist[i]); + } + + pkgcheck_set = rpmExpand("%{?_build_pkgcheck_set} ", pkgs, NULL); + if (pkgcheck_set[0] != ' ') { /* run only if _build_pkgcheck_set is defined */ + rc = checkPackages(pkgcheck_set); + } + pkgcheck_set = _free(pkgcheck_set); + pkglist = argvFree(pkglist); + pkgs = _free(pkgs); + } + exit: return rc; @@ -1310,6 +1365,7 @@ rpmRC packageSources(Spec spec) /* XXX this should be %_srpmdir */ { const char *srcrpmdir = rpmGetPath("%{_srcrpmdir}/", NULL); const char *fn = rpmGetPath("%{_srcrpmdir}/", spec->sourceRpmName,NULL); + const char *pkgcheck = rpmExpand("%{?_build_pkgcheck_srpm} ", fn, NULL); rc = rpmioMkpath(srcrpmdir, 0755, -1, -1); @@ -1333,6 +1389,11 @@ assert(csa->fi != NULL); rc = writeRPM(&spec->sourceHeader, &spec->sourcePkgId, fn, csa, spec->passPhrase, &spec->cookie, spec->dig); + /* Do check SRPM package if enabled */ + if (rc == RPMRC_OK && pkgcheck[0] != ' ') { + rc = checkPackages(pkgcheck); + } + /*@-onlytrans@*/ csa->fi->te = _free(csa->fi->te); /* XXX memory leak */ /*@=onlytrans@*/ @@ -1343,6 +1404,7 @@ assert(csa->fi != NULL); /*@=type@*/ srcrpmdir = _free(srcrpmdir); fn = _free(fn); + pkgcheck = _free(pkgcheck); } rc = (rc ? RPMRC_FAIL : RPMRC_OK); --- rpm-5.4.9/macros/macros.rpmbuild.in.pkgcheck~ 2012-05-15 02:19:32.732564561 +0200 +++ rpm-5.4.9/macros/macros.rpmbuild.in 2012-05-15 02:19:32.795564880 +0200 @@ -193,6 +193,30 @@ echo "Patch #%{__patch_number} (%{basena %_missing_doc_files_terminate_build 1 # +# Program to call for each successfully built and written binary package. +# The package name is passed to the program as a command-line argument. +# +#%_build_pkgcheck %{_bindir}/rpmlint + +# +# Program to call for the whole binary package set after build. +# The package set is passed to the program via command-line arguments. +# +#%_build_pkgcheck_set %{_bindir}/rpmlint + +# +# Program to call for successfully built and written SRPM. +# The package name is passed to the program as a command-line argument. +# +#%_build_pkgcheck_srpm %{_bindir}/rpmlint + +# +# Should the build of packages fail if package checker (if defined) returns +# non-zero exit status? +# +#%_nonzero_exit_pkgcheck_terminate_build 1 + +# # Should an ELF file processed by find-debuginfo.sh having no build ID # terminate a build? This is left undefined to disable it and defined to # enable. --- rpm-5.4.9/macros/mandriva.in.pkgcheck~ 2012-05-15 02:19:32.771564758 +0200 +++ rpm-5.4.9/macros/mandriva.in 2012-05-15 02:19:32.795564880 +0200 @@ -127,6 +127,10 @@ end\ %_duplicate_files_terminate_build 1 %_unpackaged_subdirs_terminate_build 0 +%_build_pkgcheck_set /usr/bin/rpmlint -T -f %{_sourcedir}/%{name}.rpmlintrc +%_build_pkgcheck_srpm /usr/bin/rpmlint -T -f %{_sourcedir}/%{name}.rpmlintrc +%_nonzero_exit_pkgcheck_terminate_build 1 + %_enable_debug_packages 1