From bcc54f828865ea5ba8b99acb2b6882f6e32190b0 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 28 Jul 2017 18:30:37 +0200 Subject: [PATCH] store mapping for renamed files We will need this in next commit so we know which original name files had, so we can reference appropriate debug file. Reviewed-by: Mark Wielaard Signed-off-by: Igor Gnatenko (cherry picked from commit cc8a682c386bf28540dc3fa5dbbb66c57bca5ec5) --- build/files.c | 42 +++++++++++++++++++++++++++++++----------- build/rpmbuild_internal.h | 12 ++++++++++++ build/spec.c | 2 ++ 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/build/files.c b/build/files.c index 36e1ed5ea..42709a549 100644 --- a/build/files.c +++ b/build/files.c @@ -50,6 +50,17 @@ #define DEBUG_ID_DIR "/usr/lib/debug/.build-id" #define DEBUG_DWZ_DIR "/usr/lib/debug/.dwz" +#undef HASHTYPE +#undef HTKEYTYPE +#undef HTDATATYPE +#define HASHTYPE fileRenameHash +#define HTKEYTYPE const char * +#define HTDATATYPE const char * +#include "lib/rpmhash.C" +#undef HASHTYPE +#undef HTKEYTYPE +#undef HTDATATYPE + /** */ enum specfFlags_e { @@ -982,19 +993,28 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc) } /* Adjust paths if needed */ - if (!isSrc && pkg->removePostfixes) - for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) { - char * cpiopath = flp->cpioPath; - - for (ARGV_const_t postfix_p = pkg->removePostfixes; *postfix_p; postfix_p++) { - int len = strlen(*postfix_p); - int plen = strlen(cpiopath); - if (len <= plen && !strncmp(cpiopath+plen-len, *postfix_p, len)) { - cpiopath[plen-len] = '\0'; - if (plen-len > 0 && cpiopath[plen-len-1] == '/') { - cpiopath[plen-len-1] = '\0'; + if (!isSrc && pkg->removePostfixes) { + pkg->fileRenameMap = fileRenameHashCreate(fl->files.used, + rstrhash, strcmp, + (fileRenameHashFreeKey)rfree, (fileRenameHashFreeData)rfree); + for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) { + char * cpiopath = flp->cpioPath; + char * cpiopath_orig = xstrdup(cpiopath); + + for (ARGV_const_t postfix_p = pkg->removePostfixes; *postfix_p; postfix_p++) { + int len = strlen(*postfix_p); + int plen = strlen(cpiopath); + if (len <= plen && !strncmp(cpiopath+plen-len, *postfix_p, len)) { + cpiopath[plen-len] = '\0'; + if (plen-len > 0 && cpiopath[plen-len-1] == '/') { + cpiopath[plen-len-1] = '\0'; + } } } + if (strcmp(cpiopath_orig, cpiopath)) + fileRenameHashAddEntry(pkg->fileRenameMap, xstrdup(cpiopath), cpiopath_orig); + else + _free(cpiopath_orig); } } diff --git a/build/rpmbuild_internal.h b/build/rpmbuild_internal.h index 5978a6d32..5dd0a5b83 100644 --- a/build/rpmbuild_internal.h +++ b/build/rpmbuild_internal.h @@ -6,6 +6,17 @@ #include #include "build/rpmbuild_misc.h" +#undef HASHTYPE +#undef HTKEYTYPE +#undef HTDATATYPE +#define HASHTYPE fileRenameHash +#define HTKEYTYPE const char * +#define HTDATATYPE const char * +#include "lib/rpmhash.H" +#undef HASHTYPE +#undef HTKEYTYPE +#undef HTDATATYPE + struct TriggerFileEntry { int index; char * fileName; @@ -120,6 +131,7 @@ struct Package_s { ARGV_t fileList; /* If NULL, package will not be written */ ARGV_t fileExcludeList; ARGV_t removePostfixes; + fileRenameHash fileRenameMap; ARGV_t policyList; Package next; diff --git a/build/spec.c b/build/spec.c index c33cde7eb..eaa5dce61 100644 --- a/build/spec.c +++ b/build/spec.c @@ -104,6 +104,7 @@ Package newPackage(const char *name, rpmstrPool pool, Package *pkglist) p->fileExcludeList = NULL; p->fileFile = NULL; p->policyList = NULL; + p->fileRenameMap = NULL; p->pool = rpmstrPoolLink(pool); p->dpaths = NULL; @@ -148,6 +149,7 @@ static Package freePackage(Package pkg) pkg->fileFile = argvFree(pkg->fileFile); pkg->policyList = argvFree(pkg->policyList); pkg->removePostfixes = argvFree(pkg->removePostfixes); + pkg->fileRenameMap = fileRenameHashFree(pkg->fileRenameMap); pkg->cpioList = rpmfilesFree(pkg->cpioList); pkg->dpaths = argvFree(pkg->dpaths);