256 lines
8.6 KiB
Diff
256 lines
8.6 KiB
Diff
From bc5990647ad94fcb4acdb68612e16fe514ee59b7 Mon Sep 17 00:00:00 2001
|
|
From: Mark Wielaard <mark@klomp.org>
|
|
Date: Thu, 29 Jun 2017 13:26:24 +0200
|
|
Subject: [PATCH] Extract package file list processing in separate functions.
|
|
|
|
Extract two functions resetPackageFilesDefaults() and addPackageFileList()
|
|
from processPackageFiles(). This will make it possible to add multiple
|
|
(generated) file lists to a package later.
|
|
|
|
Signed-off-by: Mark Wielaard <mark@klomp.org>
|
|
(cherry picked from commit 139d62d3b8068b0e39893babf13f0c3cc5329e75)
|
|
---
|
|
build/files.c | 170 ++++++++++++++++++++++++++++++++++++----------------------
|
|
1 file changed, 107 insertions(+), 63 deletions(-)
|
|
|
|
diff --git a/build/files.c b/build/files.c
|
|
index e93efebd7..8baf85e9d 100644
|
|
--- a/build/files.c
|
|
+++ b/build/files.c
|
|
@@ -2307,45 +2307,35 @@ static void processSpecialDir(rpmSpec spec, Package pkg, FileList fl,
|
|
freeStringBuf(docScript);
|
|
free(mkdocdir);
|
|
}
|
|
-
|
|
|
|
-static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
|
|
- Package pkg, int installSpecialDoc, int test)
|
|
+
|
|
+/* Resets the default settings for files in the package list.
|
|
+ Used in processPackageFiles whenever a new set of files is added. */
|
|
+static void resetPackageFilesDefaults (struct FileList_s *fl,
|
|
+ rpmBuildPkgFlags pkgFlags)
|
|
{
|
|
struct AttrRec_s root_ar = { 0, 0, 0, 0, 0, 0 };
|
|
- struct FileList_s fl;
|
|
- ARGV_t fileNames = NULL;
|
|
- specialDir specialDoc = NULL;
|
|
- specialDir specialLic = NULL;
|
|
|
|
- pkg->cpioList = NULL;
|
|
+ root_ar.ar_user = rpmstrPoolId(fl->pool, "root", 1);
|
|
+ root_ar.ar_group = rpmstrPoolId(fl->pool, "root", 1);
|
|
+ dupAttrRec(&root_ar, &fl->def.ar); /* XXX assume %defattr(-,root,root) */
|
|
|
|
- for (ARGV_const_t fp = pkg->fileFile; fp && *fp != NULL; fp++) {
|
|
- if (readFilesManifest(spec, pkg, *fp))
|
|
- return RPMRC_FAIL;
|
|
- }
|
|
- /* Init the file list structure */
|
|
- memset(&fl, 0, sizeof(fl));
|
|
-
|
|
- fl.pool = rpmstrPoolLink(spec->pool);
|
|
- /* XXX spec->buildRoot == NULL, then xstrdup("") is returned */
|
|
- fl.buildRoot = rpmGenPath(spec->rootDir, spec->buildRoot, NULL);
|
|
- fl.buildRootLen = strlen(fl.buildRoot);
|
|
+ fl->def.verifyFlags = RPMVERIFY_ALL;
|
|
|
|
- root_ar.ar_user = rpmstrPoolId(fl.pool, "root", 1);
|
|
- root_ar.ar_group = rpmstrPoolId(fl.pool, "root", 1);
|
|
- dupAttrRec(&root_ar, &fl.def.ar); /* XXX assume %defattr(-,root,root) */
|
|
-
|
|
- fl.def.verifyFlags = RPMVERIFY_ALL;
|
|
-
|
|
- fl.pkgFlags = pkgFlags;
|
|
+ fl->pkgFlags = pkgFlags;
|
|
+}
|
|
|
|
- { char *docs = rpmGetPath("%{?__docdir_path}", NULL);
|
|
- argvSplit(&fl.docDirs, docs, ":");
|
|
- free(docs);
|
|
- }
|
|
-
|
|
- for (ARGV_const_t fp = pkg->fileList; *fp != NULL; fp++) {
|
|
+/* Adds the given fileList to the package. If fromSpecFileList is not zero
|
|
+ then the specialDirs are also filled in and the files are sanitized
|
|
+ through processBinaryFile(). Otherwise no special files are processed
|
|
+ and the files are added directly through addFile(). */
|
|
+static void addPackageFileList (struct FileList_s *fl, Package pkg,
|
|
+ ARGV_t *fileList,
|
|
+ specialDir *specialDoc, specialDir *specialLic,
|
|
+ int fromSpecFileList)
|
|
+{
|
|
+ ARGV_t fileNames = NULL;
|
|
+ for (ARGV_const_t fp = *fileList; *fp != NULL; fp++) {
|
|
char buf[strlen(*fp) + 1];
|
|
const char *s = *fp;
|
|
SKIPSPACE(s);
|
|
@@ -2355,41 +2345,63 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
|
|
rstrlcpy(buf, s, sizeof(buf));
|
|
|
|
/* Reset for a new line in %files */
|
|
- FileEntryFree(&fl.cur);
|
|
+ FileEntryFree(&fl->cur);
|
|
|
|
/* turn explicit flags into %def'd ones (gosh this is hacky...) */
|
|
- fl.cur.specdFlags = ((unsigned)fl.def.specdFlags) >> 8;
|
|
- fl.cur.verifyFlags = fl.def.verifyFlags;
|
|
-
|
|
- if (parseForVerify(buf, 0, &fl.cur) ||
|
|
- parseForVerify(buf, 1, &fl.def) ||
|
|
- parseForAttr(fl.pool, buf, 0, &fl.cur) ||
|
|
- parseForAttr(fl.pool, buf, 1, &fl.def) ||
|
|
- parseForDev(buf, &fl.cur) ||
|
|
- parseForConfig(buf, &fl.cur) ||
|
|
- parseForLang(buf, &fl.cur) ||
|
|
- parseForCaps(buf, &fl.cur) ||
|
|
- parseForSimple(buf, &fl.cur, &fileNames))
|
|
+ fl->cur.specdFlags = ((unsigned)fl->def.specdFlags) >> 8;
|
|
+ fl->cur.verifyFlags = fl->def.verifyFlags;
|
|
+
|
|
+ if (parseForVerify(buf, 0, &fl->cur) ||
|
|
+ parseForVerify(buf, 1, &fl->def) ||
|
|
+ parseForAttr(fl->pool, buf, 0, &fl->cur) ||
|
|
+ parseForAttr(fl->pool, buf, 1, &fl->def) ||
|
|
+ parseForDev(buf, &fl->cur) ||
|
|
+ parseForConfig(buf, &fl->cur) ||
|
|
+ parseForLang(buf, &fl->cur) ||
|
|
+ parseForCaps(buf, &fl->cur) ||
|
|
+ parseForSimple(buf, &fl->cur, &fileNames))
|
|
{
|
|
- fl.processingFailed = 1;
|
|
+ fl->processingFailed = 1;
|
|
continue;
|
|
}
|
|
|
|
for (ARGV_const_t fn = fileNames; fn && *fn; fn++) {
|
|
- if (fl.cur.attrFlags & RPMFILE_SPECIALDIR) {
|
|
- rpmFlags oattrs = (fl.cur.attrFlags & ~RPMFILE_SPECIALDIR);
|
|
+
|
|
+ /* For file lists that don't come from a spec file list
|
|
+ processing is easy. There are no special files and the
|
|
+ file names don't need to be adjusted. */
|
|
+ if (!fromSpecFileList) {
|
|
+ if (fl->cur.attrFlags & RPMFILE_SPECIALDIR
|
|
+ || fl->cur.attrFlags & RPMFILE_DOCDIR
|
|
+ || fl->cur.attrFlags & RPMFILE_PUBKEY) {
|
|
+ rpmlog(RPMLOG_ERR,
|
|
+ _("Special file in generated file list: %s\n"),
|
|
+ *fn);
|
|
+ fl->processingFailed = 1;
|
|
+ continue;
|
|
+ }
|
|
+ if (fl->cur.attrFlags & RPMFILE_DIR)
|
|
+ fl->cur.isDir = 1;
|
|
+ addFile(fl, *fn, NULL);
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ /* File list does come from the spec, try to detect special
|
|
+ files and adjust the actual file names. */
|
|
+ if (fl->cur.attrFlags & RPMFILE_SPECIALDIR) {
|
|
+ rpmFlags oattrs = (fl->cur.attrFlags & ~RPMFILE_SPECIALDIR);
|
|
specialDir *sdp = NULL;
|
|
if (oattrs == RPMFILE_DOC) {
|
|
- sdp = &specialDoc;
|
|
+ sdp = specialDoc;
|
|
} else if (oattrs == RPMFILE_LICENSE) {
|
|
- sdp = &specialLic;
|
|
+ sdp = specialLic;
|
|
}
|
|
|
|
if (sdp == NULL || **fn == '/') {
|
|
rpmlog(RPMLOG_ERR,
|
|
_("Can't mix special %s with other forms: %s\n"),
|
|
(oattrs & RPMFILE_DOC) ? "%doc" : "%license", *fn);
|
|
- fl.processingFailed = 1;
|
|
+ fl->processingFailed = 1;
|
|
continue;
|
|
}
|
|
|
|
@@ -2397,32 +2409,65 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
|
|
if (*sdp == NULL) {
|
|
*sdp = specialDirNew(pkg->header, oattrs);
|
|
}
|
|
- addSpecialFile(*sdp, *fn, &fl.cur, &fl.def);
|
|
+ addSpecialFile(*sdp, *fn, &fl->cur, &fl->def);
|
|
continue;
|
|
}
|
|
|
|
/* this is now an artificial limitation */
|
|
if (fn != fileNames) {
|
|
rpmlog(RPMLOG_ERR, _("More than one file on a line: %s\n"),*fn);
|
|
- fl.processingFailed = 1;
|
|
+ fl->processingFailed = 1;
|
|
continue;
|
|
}
|
|
|
|
- if (fl.cur.attrFlags & RPMFILE_DOCDIR) {
|
|
- argvAdd(&(fl.docDirs), *fn);
|
|
- } else if (fl.cur.attrFlags & RPMFILE_PUBKEY) {
|
|
- (void) processMetadataFile(pkg, &fl, *fn, RPMTAG_PUBKEYS);
|
|
+ if (fl->cur.attrFlags & RPMFILE_DOCDIR) {
|
|
+ argvAdd(&(fl->docDirs), *fn);
|
|
+ } else if (fl->cur.attrFlags & RPMFILE_PUBKEY) {
|
|
+ (void) processMetadataFile(pkg, fl, *fn, RPMTAG_PUBKEYS);
|
|
} else {
|
|
- if (fl.cur.attrFlags & RPMFILE_DIR)
|
|
- fl.cur.isDir = 1;
|
|
- (void) processBinaryFile(pkg, &fl, *fn);
|
|
+ if (fl->cur.attrFlags & RPMFILE_DIR)
|
|
+ fl->cur.isDir = 1;
|
|
+ (void) processBinaryFile(pkg, fl, *fn);
|
|
}
|
|
}
|
|
|
|
- if (fl.cur.caps)
|
|
- fl.haveCaps = 1;
|
|
+ if (fl->cur.caps)
|
|
+ fl->haveCaps = 1;
|
|
+ }
|
|
+ argvFree(fileNames);
|
|
+}
|
|
+
|
|
+static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
|
|
+ Package pkg, int installSpecialDoc, int test)
|
|
+{
|
|
+ struct FileList_s fl;
|
|
+ specialDir specialDoc = NULL;
|
|
+ specialDir specialLic = NULL;
|
|
+
|
|
+ pkg->cpioList = NULL;
|
|
+
|
|
+ for (ARGV_const_t fp = pkg->fileFile; fp && *fp != NULL; fp++) {
|
|
+ if (readFilesManifest(spec, pkg, *fp))
|
|
+ return RPMRC_FAIL;
|
|
+ }
|
|
+ /* Init the file list structure */
|
|
+ memset(&fl, 0, sizeof(fl));
|
|
+
|
|
+ fl.pool = rpmstrPoolLink(spec->pool);
|
|
+ /* XXX spec->buildRoot == NULL, then xstrdup("") is returned */
|
|
+ fl.buildRoot = rpmGenPath(spec->rootDir, spec->buildRoot, NULL);
|
|
+ fl.buildRootLen = strlen(fl.buildRoot);
|
|
+
|
|
+ resetPackageFilesDefaults (&fl, pkgFlags);
|
|
+
|
|
+ { char *docs = rpmGetPath("%{?__docdir_path}", NULL);
|
|
+ argvSplit(&fl.docDirs, docs, ":");
|
|
+ free(docs);
|
|
}
|
|
|
|
+ addPackageFileList (&fl, pkg, &pkg->fileList,
|
|
+ &specialDoc, &specialLic, 1);
|
|
+
|
|
/* Now process special docs and licenses if present */
|
|
if (specialDoc)
|
|
processSpecialDir(spec, pkg, &fl, specialDoc, installSpecialDoc, test);
|
|
@@ -2451,7 +2496,6 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
|
|
genCpioListAndHeader(&fl, pkg, 0);
|
|
|
|
exit:
|
|
- argvFree(fileNames);
|
|
FileListFree(&fl);
|
|
specialDirFree(specialDoc);
|
|
specialDirFree(specialLic);
|