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