RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [EMAIL PROTECTED] Module: rpm Date: 08-Jun-2008 18:01:21 Branch: rpm-5_0 Handle: 2008060816011901 Modified files: (Branch: rpm-5_0) rpm CHANGES rpmqv.c rpm/build build.c files.c pack.c parseChangelog.c parseDescription.c parsePreamble.c parsePrep.c parseScript.c parseSpec.c poptBT.c reqprov.c rpmbuild.h rpmspec.h spec.c Log: - merge "explicit-source-fetch-cli-option" patch from OpenPKG. - merge "download-source-files-from-original-location" patch from OpenPKG. - merge "support-external-download-command" patch from OpenPKG. - merge "support-srcdefattr" patch from OpenPKG. - permit noarch sub-packages. Pattern match guaranteee next ... - parser: inherit group/summary/description if not specified in subpkg. - parser: permit identically named sub-pkgs with different versions. - parser: trim comments where it makes sense to do so. Summary: Revision Changes Path 1.2054.2.89 +8 -0 rpm/CHANGES 2.127.2.1 +2 -2 rpm/build/build.c 1.310.2.4 +19 -23 rpm/build/files.c 2.281.2.3 +16 -6 rpm/build/pack.c 2.43.2.1 +1 -1 rpm/build/parseChangelog.c 2.36.2.1 +19 -14 rpm/build/parseDescription.c 2.167.2.2 +86 -37 rpm/build/parsePreamble.c 2.110.2.1 +24 -19 rpm/build/parsePrep.c 2.61.2.1 +1 -1 rpm/build/parseScript.c 2.130.2.2 +22 -6 rpm/build/parseSpec.c 2.20.2.3 +2 -8 rpm/build/poptBT.c 1.84.2.1 +5 -4 rpm/build/reqprov.c 2.92.2.2 +9 -2 rpm/build/rpmbuild.h 2.70.2.1 +16 -7 rpm/build/rpmspec.h 2.175.2.3 +91 -49 rpm/build/spec.c 1.140.2.4 +0 -2 rpm/rpmqv.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2054.2.88 -r1.2054.2.89 CHANGES --- rpm/CHANGES 6 Jun 2008 23:26:53 -0000 1.2054.2.88 +++ rpm/CHANGES 8 Jun 2008 16:01:19 -0000 1.2054.2.89 @@ -1,4 +1,12 @@ 5.0.3 -> 5.0.4: + - jbj: merge "explicit-source-fetch-cli-option" patch from OpenPKG. + - jbj: merge "download-source-files-from-original-location" patch from OpenPKG. + - jbj: merge "support-external-download-command" patch from OpenPKG. + - jbj: merge "support-srcdefattr" patch from OpenPKG. + - jbj: permit noarch sub-packages. Pattern match guaranteee next ... + - jbj: parser: inherit group/summary/description if not specified in subpkg. + - jbj: parser: permit identically named sub-pkgs with different versions. + - jbj: parser: trim comments where it makes sense to do so. - jbj: tests: add check-install target to attempt --relocate install. - jbj: tests: enhance the devtool-sanity package with scripts and a file. - jbj: tests: verify -Kv output using popt. @@ . patch -p0 <<'@@ .' Index: rpm/build/build.c ============================================================================ $ cvs diff -u -r2.127 -r2.127.2.1 build.c --- rpm/build/build.c 21 Dec 2007 14:42:20 -0000 2.127 +++ rpm/build/build.c 8 Jun 2008 16:01:20 -0000 2.127.2.1 @@ -110,7 +110,7 @@ pid_t child; int status; rpmRC rc; - int i; + size_t i; switch (what) { case RPMBUILD_PREP: @@ -165,7 +165,7 @@ if (xstrcasecmp(spec->foo[i].str, "track")) continue; sb = spec->foo[i].val; - break; + /[EMAIL PROTECTED]@*/ break; } mTemplate = "%{__spec_track_template}"; mPost = "%{__spec_track_post}"; @@ . patch -p0 <<'@@ .' Index: rpm/build/files.c ============================================================================ $ cvs diff -u -r1.310.2.3 -r1.310.2.4 files.c --- rpm/build/files.c 26 Jan 2008 04:13:33 -0000 1.310.2.3 +++ rpm/build/files.c 8 Jun 2008 16:01:20 -0000 1.310.2.4 @@ -274,7 +274,7 @@ uint32_t currentTime = time(NULL); uint32_t * mtime; int xx; - int i; + size_t i; he->tag = RPMTAG_FILEMTIMES; xx = headerGet(h, he, 0); @@ -344,7 +344,7 @@ } else return RPMRC_OK; - for (pe = p; (pe-p) < strlen(name); pe++) + for (pe = p; (size_t)(pe-p) < strlen(name); pe++) *pe = ' '; SKIPSPACE(pe); @@ -431,7 +431,7 @@ if ((p = strstr(buf, (name = "%dev"))) == NULL) return RPMRC_OK; - for (pe = p; (pe-p) < strlen(name); pe++) + for (pe = p; (size_t)(pe-p) < strlen(name); pe++) *pe = ' '; SKIPSPACE(pe); @@ -474,7 +474,7 @@ if (*pe == '\0') { fl->devmajor = atoi(p); /[EMAIL PROTECTED] @*/ /* LCL: ge is ok */ - if (!(fl->devmajor >= 0 && fl->devmajor < 256)) { + if (!((int)fl->devmajor >= 0 && (int)fl->devmajor < 256)) { errstr = "devmajor"; goto exit; } @@ -540,7 +540,7 @@ } else return RPMRC_OK; - for (pe = p; (pe-p) < strlen(name); pe++) + for (pe = p; (size_t)(pe-p) < strlen(name); pe++) *pe = ' '; SKIPSPACE(pe); @@ -662,7 +662,7 @@ fl->currentFlags |= RPMFILE_CONFIG; /* Erase "%config" token. */ - for (pe = p; (pe-p) < strlen(name); pe++) + for (pe = p; (size_t)(pe-p) < strlen(name); pe++) *pe = ' '; SKIPSPACE(pe); if (*pe != '(') @@ -731,7 +731,7 @@ while ((p = strstr(buf, (name = "%lang"))) != NULL) { - for (pe = p; (pe-p) < strlen(name); pe++) + for (pe = p; (size_t)(pe-p) < strlen(name); pe++) *pe = ' '; SKIPSPACE(pe); @@ -889,8 +889,8 @@ * @retval *fileName file name * @return RPMRC_OK on success */ -static rpmRC parseForSimple(/[EMAIL PROTECTED]@*/Spec spec, Package pkg, char * buf, - FileList fl, /[EMAIL PROTECTED]@*/ const char ** fileName) +static rpmRC parseForSimple(/[EMAIL PROTECTED]@*/ Spec spec, Package pkg, + char * buf, FileList fl, /[EMAIL PROTECTED]@*/ const char ** fileName) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno @*/ /[EMAIL PROTECTED] buf, fl->processingFailed, *fileName, fl->currentFlags, @@ -1409,7 +1409,7 @@ xx = headerPut(h, he, 0); he->append = 0; - ui16 = flp->fl_mode; + ui16 = (uint16_t)flp->fl_mode; he->tag = RPMTAG_FILEMODES; he->t = RPM_UINT16_TYPE; he->p.ui16p = &ui16; @@ -1589,14 +1589,16 @@ he->append = 0; /[EMAIL PROTECTED]@*/ /* observer nocon not modified. */ - if (scon != nocon) + if (scon != nocon) { freecon(scon); + } /[EMAIL PROTECTED]@*/ } } /[EMAIL PROTECTED] -noeffectuncon @*/ - if (sxfn != NULL && *sxfn != '\0') + if (sxfn != NULL && *sxfn != '\0') { matchpathcon_fini(); + } /[EMAIL PROTECTED] =noeffectuncon @*/ sxfn = _free(sxfn); @@ -1608,7 +1610,7 @@ he->append = 1; xx = headerPut(h, he, 0); he->append = 0; - + if (_rpmbuildFlags & 4) { (void) rpmlibNeedsFeature(h, "PayloadFilesHavePrefix", "4.0-1"); (void) rpmlibNeedsFeature(h, "CompressedFileNames", "3.0.4-1"); @@ -1624,9 +1626,9 @@ if (fi == NULL) return; /* XXX can't happen */ /[EMAIL PROTECTED]@*/ - fi->te = xcalloc(1, sizeof(*fi->te)); + fi->te = xcalloc(1, sizeof(*((rpmte)fi->te))); /[EMAIL PROTECTED]@*/ - fi->te->type = TR_ADDED; + ((rpmte)fi->te)->type = TR_ADDED; fi->dnl = _free(fi->dnl); fi->bnl = _free(fi->bnl); @@ -1661,7 +1663,7 @@ /* Make the cpio list */ if (fi->dil != NULL) /* XXX can't happen */ - for (i = 0, flp = fl->fileList; i < fi->fc; i++, flp++) { + for (i = 0, flp = fl->fileList; (unsigned)i < fi->fc; i++, flp++) { char * b; /* Skip (possible) duplicate file entries, use last entry info. */ @@ -2498,7 +2500,7 @@ struct Source *srcPtr; static rpmTag classTag = 0xffffffff; int xx; - int i; + size_t i; if (classTag == 0xffffffff) classTag = tagValue("Class"); @@ -2677,27 +2679,21 @@ struct FileList_s fl; char **files, **fp; int rc; -#if defined(RPM_VENDOR_OPENPKG) /* support-srcdefattr */ /* srcdefattr: needed variables */ char _srcdefattr_buf[BUFSIZ]; char *_srcdefattr; -#endif -#if defined(RPM_VENDOR_OPENPKG) /* support-srcdefattr */ _srcdefattr = rpmExpand("%{?_srcdefattr}", NULL); -#endif *sfp = newStringBuf(); x = initSourceHeader(spec, sfp); -#if defined(RPM_VENDOR_OPENPKG) /* support-srcdefattr */ /* srcdefattr: initialize file list structure */ memset(&fl, 0, sizeof(fl)); if (_srcdefattr && *_srcdefattr) { snprintf(_srcdefattr_buf, sizeof(_srcdefattr_buf), "%%defattr %s", _srcdefattr); parseForAttr(_srcdefattr_buf, &fl); } -#endif /* Construct the SRPM file list. */ fl.fileList = xcalloc((spec->numSources + 1), sizeof(*fl.fileList)); @@ . patch -p0 <<'@@ .' Index: rpm/build/pack.c ============================================================================ $ cvs diff -u -r2.281.2.2 -r2.281.2.3 pack.c --- rpm/build/pack.c 27 May 2008 13:50:40 -0000 2.281.2.2 +++ rpm/build/pack.c 8 Jun 2008 16:01:20 -0000 2.281.2.3 @@ -65,13 +65,16 @@ if (rc == RPMRC_OK && xx) rc = RPMRC_FAIL; if (rc) { + const char * msg = cpioStrerror(rc); if (failedFile) rpmlog(RPMLOG_ERR, _("create archive failed on file %s: %s\n"), - failedFile, cpioStrerror(rc)); + failedFile, msg); else - rpmlog(RPMLOG_ERR, _("create archive failed: %s\n"), - cpioStrerror(rc)); - rc = RPMRC_FAIL; + rpmlog(RPMLOG_ERR, _("create archive failed: %s\n"), msg); +#if 0 /* XXX cpioStrerror() uses static buffer */ + msg = _free(msg); +#endif + rc = RPMRC_FAIL; } failedFile = _free(failedFile); @@ -175,7 +178,7 @@ /** */ -static int addFileToArrayTag(Spec spec, const char *file, Header h, int tag) +static int addFileToArrayTag(Spec spec, const char *file, Header h, rpmTag tag) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] h, rpmGlobalMacroContext, fileSystem, internalState @*/ { @@ -622,6 +625,13 @@ /* Add prereq on rpm version that understands tar payloads */ (void) rpmlibNeedsFeature(h, "PayloadIsUstar", "4.4.4-1"); } +#if defined(SUPPORT_AR_PAYLOADS) + if (!strcmp(payload_format, "ar")) { + /* XXX addition to header is too late to be displayed/sorted. */ + /* Add prereq on rpm version that understands tar payloads */ + (void) rpmlibNeedsFeature(h, "PayloadIsAr", "5.1-1"); + } +#endif he->tag = RPMTAG_PAYLOADFORMAT; he->t = RPM_STRING_TYPE; @@ -963,7 +973,7 @@ } /[EMAIL PROTECTED]@*/ -static uint32_t copyTags[] = { +static rpmTag copyTags[] = { RPMTAG_CHANGELOGTIME, RPMTAG_CHANGELOGNAME, RPMTAG_CHANGELOGTEXT, @@ . patch -p0 <<'@@ .' Index: rpm/build/parseChangelog.c ============================================================================ $ cvs diff -u -r2.43 -r2.43.2.1 parseChangelog.c --- rpm/build/parseChangelog.c 18 Dec 2007 19:40:52 -0000 2.43 +++ rpm/build/parseChangelog.c 8 Jun 2008 16:01:20 -0000 2.43.2.1 @@ -289,5 +289,5 @@ rc = addChangelog(spec->packages->header, sb); sb = freeStringBuf(sb); - return (rc != RPMRC_OK ? rc : nextPart); + return (rc != RPMRC_OK ? rc : (rpmRC)nextPart); } @@ . patch -p0 <<'@@ .' Index: rpm/build/parseDescription.c ============================================================================ $ cvs diff -u -r2.36 -r2.36.2.1 parseDescription.c --- rpm/build/parseDescription.c 18 Dec 2007 19:40:52 -0000 2.36 +++ rpm/build/parseDescription.c 8 Jun 2008 16:01:20 -0000 2.36.2.1 @@ -22,8 +22,8 @@ /[EMAIL PROTECTED]@*/ static struct poptOption optionsTable[] = { - { NULL, 'n', POPT_ARG_STRING, &name, 'n', NULL, NULL}, - { NULL, 'l', POPT_ARG_STRING, &lang, 'l', NULL, NULL}, + { NULL, 'n', POPT_ARG_STRING, &name, 0, NULL, NULL}, + { NULL, 'l', POPT_ARG_STRING, &lang, 0, NULL, NULL}, { 0, 0, 0, 0, 0, NULL, NULL} }; @@ -31,7 +31,7 @@ /[EMAIL PROTECTED] name, lang @*/ /[EMAIL PROTECTED] name, lang @*/ { - rpmParseState nextPart = RPMRC_FAIL; /* assume error */ + rpmParseState nextPart = (rpmParseState) RPMRC_FAIL; /* assume error */ StringBuf sb; int flag = PART_SUBNAME; Package pkg; @@ -41,8 +41,13 @@ poptContext optCon = NULL; spectag t = NULL; - name = NULL; - lang = RPMBUILD_DEFAULT_LANG; + { char * se = strchr(spec->line, '#'); + if (se) { + *se = '\0'; + while (--se >= spec->line && strchr(" \t\n\r", *se) != NULL) + *se = '\0'; + } + } if ((rc = poptParseArgvString(spec->line, &argc, &argv))) { rpmlog(RPMLOG_ERR, _("line %d: Error parsing %%description: %s\n"), @@ -50,12 +55,13 @@ return RPMRC_FAIL; } + name = NULL; + lang = RPMBUILD_DEFAULT_LANG; optCon = poptGetContext(NULL, argc, argv, optionsTable, 0); - while ((arg = poptGetNextOpt(optCon)) > 0) { - if (arg == 'n') { - flag = PART_NAME; - } - } + while ((arg = poptGetNextOpt(optCon)) > 0) + ; + if (name != NULL) + flag = PART_NAME; if (arg < -1) { rpmlog(RPMLOG_ERR, _("line %d: Bad option %s: %s\n"), @@ -70,8 +76,7 @@ name = poptGetArg(optCon); if (poptPeekArg(optCon)) { rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"), - spec->lineNum, - spec->line); + spec->lineNum, spec->line); goto exit; } } @@ -101,7 +106,7 @@ nextPart = PART_NONE; } else { if (rc) { - nextPart = RPMRC_FAIL; + nextPart = (rpmParseState) RPMRC_FAIL; goto exit; } while ((nextPart = isPart(spec)) == PART_NONE) { @@ -113,7 +118,7 @@ break; } if (rc) { - nextPart = RPMRC_FAIL; + nextPart = (rpmParseState) RPMRC_FAIL; goto exit; } } @@ . patch -p0 <<'@@ .' Index: rpm/build/parsePreamble.c ============================================================================ $ cvs diff -u -r2.167.2.1 -r2.167.2.2 parsePreamble.c --- rpm/build/parsePreamble.c 4 Jun 2008 22:46:48 -0000 2.167.2.1 +++ rpm/build/parsePreamble.c 8 Jun 2008 16:01:20 -0000 2.167.2.2 @@ -23,6 +23,9 @@ RPMTAG_VERSION, RPMTAG_RELEASE, RPMTAG_LICENSE, + RPMTAG_GROUP, /* XXX permissive. */ + RPMTAG_SUMMARY, /* XXX permissive. */ + RPMTAG_DESCRIPTION, /* XXX permissive. */ RPMTAG_PACKAGER, RPMTAG_DISTRIBUTION, RPMTAG_DISTURL, @@ -82,40 +85,52 @@ } /* Parse a simple part line that only take -n <pkg> or <pkg> */ -/* <pkg> is return in name as a pointer into a static buffer */ +/* <pkg> is returned in name as a pointer into malloc'd storage. */ /** */ -static int parseSimplePart(char *line, /[EMAIL PROTECTED]@*/char **name, +static int parseSimplePart(Spec spec, /[EMAIL PROTECTED]@*/char ** Np, /[EMAIL PROTECTED]@*/rpmParseState *flag) /[EMAIL PROTECTED] [EMAIL PROTECTED]/ /[EMAIL PROTECTED] *name, *flag, internalState @*/ { - char *tok; - char linebuf[BUFSIZ]; - static char buf[BUFSIZ]; + char * s, * se; + int rc = 0; /* assume failure */ - strcpy(linebuf, line); + if (Np) + *Np = NULL; + se = strchr(spec->line, '#'); + if (se) { + *se = '\0'; + while (--se >= spec->line && strchr(" \t\n\r", *se) != NULL) + *se = '\0'; + } + + s = xstrdup(spec->line); /* Throw away the first token (the %xxxx) */ - (void)strtok(linebuf, " \t\n"); + (void)strtok(s, " \t\n"); - if (!(tok = strtok(NULL, " \t\n"))) { - *name = NULL; - return 0; - } + if (!(se = strtok(NULL, " \t\n"))) + goto exit; - if (!strcmp(tok, "-n")) { - if (!(tok = strtok(NULL, " \t\n"))) - return 1; + if (!strcmp(se, "-n")) { + if (!(se = strtok(NULL, " \t\n"))) { + rc = 1; + goto exit; + } *flag = PART_NAME; - } else { + } else *flag = PART_SUBNAME; - } - strcpy(buf, tok); - *name = buf; - return (strtok(NULL, " \t\n")) ? 1 : 0; + if (Np) + *Np = xstrdup(se); + + rc = (strtok(NULL, " \t\n") ? 1 : 0); + +exit: + s = _free(s); + return rc; } /** @@ -181,7 +196,7 @@ break; for (tb = tokbits; tb->name; tb++) { if (tb->name != NULL && - strlen(tb->name) == (se-s) && !strncmp(tb->name, s, (se-s))) + strlen(tb->name) == (size_t)(se-s) && !strncmp(tb->name, s, (se-s))) /[EMAIL PROTECTED]@*/ break; } if (tb->name == NULL) @@ -204,8 +219,15 @@ { char *se = s + strlen(s); + /* Right trim white space. */ while (--se > s && strchr(" \t\n\r", *se) != NULL) *se = '\0'; + /* Truncate comments. */ + if ((se = strchr(s, '#')) != NULL) { + *se = '\0'; + while (--se > s && strchr(" \t\n\r", *se) != NULL) + *se = '\0'; + } /[EMAIL PROTECTED] -retalias @*/ return se; /[EMAIL PROTECTED] =retalias @*/ @@ -455,7 +477,7 @@ } if (nb >= iconsize) { rpmlog(RPMLOG_ERR, _("Icon %s is too big (max. %d bytes)\n"), - fn, iconsize); + fn, (int)iconsize); goto exit; } @@ -489,7 +511,7 @@ return rc; } -spectag stashSt(Spec spec, Header h, int tag, const char * lang) +spectag stashSt(Spec spec, Header h, rpmTag tag, const char * lang) { HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); spectag t = NULL; @@ -790,18 +812,34 @@ case RPMTAG_EXCLUSIVEOS: addOrAppendListEntry(spec->sourceHeader, tag, field); break; + case RPMTAG_BUILDARCHS: - if ((rc = poptParseArgvString(field, - &(spec->BACount), - &(spec->BANames)))) { + { const char ** BANames = NULL; + int BACount = 0; + if ((rc = poptParseArgvString(field, &BACount, &BANames))) { rpmlog(RPMLOG_ERR, _("line %d: Bad BuildArchitecture format: %s\n"), spec->lineNum, spec->line); return RPMRC_FAIL; } - if (!spec->BACount) - spec->BANames = _free(spec->BANames); - break; + if (spec->toplevel) { + if (BACount > 0 && BANames != NULL) { + spec->BACount = BACount; + spec->BANames = BANames; + BANames = NULL; /* XXX don't free. */ + } + } else { + if (BACount != 1 || strcmp(BANames[0], "noarch")) { + rpmlog(RPMLOG_ERR, + _("line %d: Only \"noarch\" sub-packages are supported: %s\n"), + spec->lineNum, spec->line); + BANames = _free(BANames); + return RPMRC_FAIL; + } + pkg->noarch = 1; + } + BANames = _free(BANames); + } break; default: macro = NULL; @@ -998,7 +1036,7 @@ HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); rpmParseState nextPart; int xx; - char *name, *linep; + char *linep; Package pkg; char NVR[BUFSIZ]; char lang[BUFSIZ]; @@ -1007,22 +1045,32 @@ strcpy(NVR, "(main package)"); pkg = newPackage(spec); - - if (! initialPackage) { + if (spec->packages == NULL) { + spec->packages = pkg; +assert(initialPackage); + } else if (! initialPackage) { + char *name = NULL; rpmParseState flag; + Package lastpkg; + /* There is one option to %package: <pkg> or -n <pkg> */ flag = PART_NONE; - if (parseSimplePart(spec->line, &name, &flag)) { + if (parseSimplePart(spec, &name, &flag)) { rpmlog(RPMLOG_ERR, _("Bad package specification: %s\n"), spec->line); return RPMRC_FAIL; } - if (lookupPackage(spec, name, flag, NULL) == RPMRC_OK) { - rpmlog(RPMLOG_ERR, _("Package already exists: %s\n"), - spec->line); - return RPMRC_FAIL; + lastpkg = NULL; + if (lookupPackage(spec, name, flag, &lastpkg) == RPMRC_OK) { + pkg->next = lastpkg->next; + } else { + /* Add package to end of list */ + for (lastpkg = spec->packages; lastpkg->next != NULL; lastpkg = lastpkg->next) + {}; } +assert(lastpkg != NULL); + lastpkg->next = pkg; /* Construct the package */ if (flag == PART_SUBNAME) { @@ -1032,6 +1080,7 @@ he->p.ptr = _free(he->p.ptr); } else strcpy(NVR, name); + name = _free(name); he->tag = RPMTAG_NAME; he->t = RPM_STRING_TYPE; he->p.str = NVR; @@ -1059,7 +1108,7 @@ } if (handlePreambleTag(spec, pkg, tag, macro, lang)) return RPMRC_FAIL; - if (spec->BANames && !spec->recursing) + if (spec->BANames && !spec->recursing && spec->toplevel) return PART_BUILDARCHITECTURES; } if ((rc = @@ . patch -p0 <<'@@ .' Index: rpm/build/parsePrep.c ============================================================================ $ cvs diff -u -r2.110 -r2.110.2.1 parsePrep.c --- rpm/build/parsePrep.c 23 Dec 2007 21:18:49 -0000 2.110 +++ rpm/build/parsePrep.c 8 Jun 2008 16:01:20 -0000 2.110.2.1 @@ -67,10 +67,11 @@ * @param reverse include -R? * @param removeEmpties include -E? * @param fuzz include -F? + * @param subdir sub-directory (i.e patch -d argument); * @return expanded %patch macro (NULL on error) */ /[EMAIL PROTECTED]@*/ -static char *doPatch(Spec spec, int c, int strip, const char *db, +static char *doPatch(Spec spec, uint32_t c, int strip, const char *db, int reverse, int removeEmpties, int fuzz, const char *subdir) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] rpmGlobalMacroContext, fileSystem, internalState @*/ @@ -200,7 +201,7 @@ * @return expanded %setup macro (NULL on error) */ /[EMAIL PROTECTED]@*/ -static const char *doUntar(Spec spec, int c, int quietly) +static const char *doUntar(Spec spec, uint32_t c, int quietly) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] rpmGlobalMacroContext, fileSystem, internalState @*/ { @@ -290,10 +291,14 @@ t = "%{__lzma} -dc"; break; case COMPRESSED_ZIP: +#if defined(RPM_VENDOR_OPENPKG) /* use-bsdtar-for-zip-files */ + t = "%{__bsdtar} -x -f"; +#else if (rpmIsVerbose() && !quietly) t = "%{__unzip}"; else t = "%{__unzip} -qq"; +#endif needtar = 0; break; } @@ -398,7 +403,7 @@ if (arg < -1) { rpmlog(RPMLOG_ERR, _("line %d: Bad %%setup option %s: %s\n"), spec->lineNum, - poptBadOption(optCon, POPT_BADOPTION_NOALIAS), + poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(arg)); before = freeStringBuf(before); after = freeStringBuf(after); @@ -419,7 +424,7 @@ spec->buildSubdir = xstrdup(buf); } addMacro(spec->macros, "buildsubdir", NULL, spec->buildSubdir, RMIL_SPEC); - + optCon = poptFreeContext(optCon); argv = _free(argv); @@ -432,7 +437,7 @@ appendLineStringBuf(spec->prep, buf); buildDirURL = _free(buildDirURL); } - + /* delete any old sources */ if (!leaveDirs) { sprintf(buf, "rm -rf '%s'", spec->buildSubdir); @@ -473,7 +478,7 @@ return RPMRC_FAIL; appendLineStringBuf(spec->prep, chptr); } - + appendStringBuf(spec->prep, getStringBuf(after)); after = freeStringBuf(after); @@ -491,7 +496,7 @@ fix = _free(fix); } } - + return 0; } @@ -528,7 +533,7 @@ } else { strcpy(buf, line); } - + /[EMAIL PROTECTED]@*/ /* FIX: strtok has state */ for (bp = buf; (s = strtok(bp, " \t\n")) != NULL;) { if (bp) { /* remove 1st token (%patch) */ @@ -631,14 +636,15 @@ return RPMRC_FAIL; appendLineStringBuf(spec->prep, s); } - + return RPMRC_OK; } #endif -static void prepFetchVerbose(struct Source *sp, struct stat *st) +static void prepFetchVerbose(/[EMAIL PROTECTED]@*/ struct Source *sp, + /[EMAIL PROTECTED]@*/ struct stat *st) + /[EMAIL PROTECTED]/ { -#if defined(RPM_VENDOR_OPENPKG) /* explicit-source-fetch-cli-option */ char *buf; size_t buf_len; int i; @@ -659,7 +665,6 @@ snprintf(buf+i, buf_len-i, " ...MISSING\n"); rpmlog(RPMLOG_NOTICE, "%s", buf); buf = _free(buf); -#endif return; } @@ -708,14 +713,12 @@ if (rpmrc != RPMRC_OK) return -1; -#if defined(RPM_VENDOR_OPENPKG) /* explicit-source-fetch-cli-option */ if (rpmIsVerbose() && !quietly && (rpmBTArgs.buildAmount & RPMBUILD_FETCHSOURCE)) rpmlog(RPMLOG_NOTICE, "Checking source and patch file(s):\n"); -#endif ec = 0; for (sp = spec->sources; sp != NULL; sp = sp->next) { - + #if defined(RPM_VENDOR_OPENPKG) /* splitted-source-directory */ Smacro = "%{?_specdir}/"; #endif @@ -750,10 +753,14 @@ Lurlfn = rpmGenPath(NULL, Lmacro, sp->source); rc = Lstat(Lurlfn, &st); if (rc == 0) { +/[EMAIL PROTECTED]@*/ prepFetchVerbose(sp, &st); +/[EMAIL PROTECTED]@*/ goto bottom; } +/[EMAIL PROTECTED]@*/ prepFetchVerbose(sp, NULL); +/[EMAIL PROTECTED]@*/ if (errno != ENOENT) { ec++; rpmlog(RPMLOG_ERR, _("Missing %s%d %s: %s\n"), @@ -782,7 +789,6 @@ } cp = _free(cp); -#if defined(RPM_VENDOR_OPENPKG) /* download-source-files-from-original-location */ /* try to fetch from original location */ rpmlog(RPMLOG_NOTICE, _("Fetching(%s%d): %s\n"), (sp->flags & RPMFILE_SOURCE) ? "Source" : "Patch", sp->num, sp->fullSource); @@ -794,7 +800,6 @@ (sp->flags & RPMFILE_SOURCE) ? "Source" : "Patch", sp->num, ftpStrerror(rc)); ec++; } -#endif rpmlog(RPMLOG_ERR, _("Missing %s%d: %s: %s\n"), ((sp->flags & RPMFILE_SOURCE) ? "Source" : "Patch"), @@ -836,9 +841,9 @@ if (rc) return RPMRC_FAIL; } - + sb = newStringBuf(); - + while ((nextPart = isPart(spec)) == PART_NONE) { /* Need to expand the macros inline. That way we */ /* can give good line number information on error. */ @@ . patch -p0 <<'@@ .' Index: rpm/build/parseScript.c ============================================================================ $ cvs diff -u -r2.61 -r2.61.2.1 parseScript.c --- rpm/build/parseScript.c 18 Dec 2007 19:40:52 -0000 2.61 +++ rpm/build/parseScript.c 8 Jun 2008 16:01:20 -0000 2.61.2.1 @@ -390,7 +390,7 @@ } } } - rc = nextPart; + rc = (rpmRC) nextPart; exit: sb = freeStringBuf(sb); @@ . patch -p0 <<'@@ .' Index: rpm/build/parseSpec.c ============================================================================ $ cvs diff -u -r2.130.2.1 -r2.130.2.2 parseSpec.c --- rpm/build/parseSpec.c 27 May 2008 13:50:41 -0000 2.130.2.1 +++ rpm/build/parseSpec.c 8 Jun 2008 16:01:20 -0000 2.130.2.2 @@ -12,6 +12,7 @@ #include "rpmts.h" #include "debug.h" +/[EMAIL PROTECTED] headerTagIndices @*/ /[EMAIL PROTECTED] FD_t @*/ /* compared with NULL */ /** @@ -123,7 +124,7 @@ SKIPNONSPACE(be); if (be == b) break; - if (toklen != (be-b) || xstrncasecmp(token, b, (be-b))) + if (toklen != (size_t)(be-b) || xstrncasecmp(token, b, (be-b))) continue; rc = 1; break; @@ -155,7 +156,7 @@ /** */ static int restoreFirstChar(Spec spec) - /[EMAIL PROTECTED]/ + /[EMAIL PROTECTED] spec->nextline, spec->nextpeekc @*/ { /* Restore 1st char in (possible) next line */ if (spec->nextline != NULL && spec->nextpeekc != '\0') { @@ -172,6 +173,7 @@ /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem @*/ /[EMAIL PROTECTED] spec->nextline, spec->nextpeekc, spec->lbuf, spec->line, + spec->lbufPtr, ofi->readPtr, rpmGlobalMacroContext, fileSystem @*/ { @@ -244,6 +246,7 @@ /** */ static int copyNextLineFinish(Spec spec, int strip) + /[EMAIL PROTECTED] spec->line, spec->nextline, spec->nextpeekc @*/ { char *last; char ch; @@ -275,7 +278,9 @@ /** */ static int readLineFromOFI(Spec spec, OFI_t *ofi) - /[EMAIL PROTECTED] spec, ofi @*/ + /[EMAIL PROTECTED] h_errno, fileSystem @*/ + /[EMAIL PROTECTED] ofi, spec->fileStack, spec->lineNum, spec->sl, + fileSystem @*/ { retry: /* Make sure the current file is open */ @@ -306,7 +311,9 @@ spec->fileStack = ofi->next; (void) Fclose(ofi->fd); ofi->fileName = _free(ofi->fileName); +/[EMAIL PROTECTED]@*/ ofi = _free(ofi); +/[EMAIL PROTECTED]@*/ /* only on last file do we signal EOF to caller */ ofi = spec->fileStack; @@ -354,7 +361,7 @@ } } - copyNextLineFinish(spec, strip); + (void) copyNextLineFinish(spec, strip); s = spec->line; SKIPSPACE(s); @@ -526,6 +533,7 @@ spec->fileStack->fileName = xstrdup(spec->specFile); spec->recursing = recursing; + spec->toplevel = (!recursing ? 1 : 0); spec->anyarch = anyarch; spec->force = force; @@ -548,6 +556,7 @@ /[EMAIL PROTECTED]@*/ /* LCL: parsePart is modified @*/ while (parsePart > PART_NONE) { int goterror = 0; + switch (parsePart) { default: goterror = 1; @@ -603,7 +612,12 @@ return parsePart; } - if (parsePart == PART_BUILDARCHITECTURES) { + /* Detect whether BuildArch: is toplevel or within %package. */ + if (spec->toplevel && parsePart != PART_BUILDARCHITECTURES) + spec->toplevel = 0; + + /* Restart parse iff toplevel BuildArch: is encountered. */ + if (spec->toplevel && parsePart == PART_BUILDARCHITECTURES) { int index; int x; @@ -680,13 +694,14 @@ for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) { he->tag = RPMTAG_OS; he->t = RPM_STRING_TYPE; + /* XXX todo: really need "noos" like pkg->noarch somewhen. */ he->p.str = os; he->c = 1; xx = headerPut(pkg->header, he, 0); he->tag = RPMTAG_ARCH; he->t = RPM_STRING_TYPE; - he->p.str = arch; + he->p.str = (pkg->noarch ? "noarch" : arch); he->c = 1; xx = headerPut(pkg->header, he, 0); @@ -703,6 +718,7 @@ xx = headerPut(pkg->header, he, 0); if (!headerIsEntry(pkg->header, RPMTAG_DESCRIPTION)) { + char * t; he->tag = RPMTAG_NVRA; xx = headerGet(pkg->header, he, 0); rpmlog(RPMLOG_ERR, _("Package has no %%description: %s\n"), @@ . patch -p0 <<'@@ .' Index: rpm/build/poptBT.c ============================================================================ $ cvs diff -u -r2.20.2.2 -r2.20.2.3 poptBT.c --- rpm/build/poptBT.c 24 Jan 2008 20:03:25 -0000 2.20.2.2 +++ rpm/build/poptBT.c 8 Jun 2008 16:01:20 -0000 2.20.2.3 @@ -36,9 +36,7 @@ #define POPT_BP 0x6270 #define POPT_BS 0x6273 #define POPT_BT 0x6274 /* support "%track" script/section */ -#if defined(RPM_VENDOR_OPENPKG) /* explicit-source-fetch-cli-option */ #define POPT_BF 0x6266 -#endif #define POPT_TA 0x7461 #define POPT_TB 0x7462 #define POPT_TC 0x7463 @@ -82,9 +80,7 @@ case POPT_BP: case POPT_BS: case POPT_BT: /* support "%track" script/section */ -#if defined(RPM_VENDOR_OPENPKG) /* explicit-source-fetch-cli-option */ case POPT_BF: -#endif case POPT_TA: case POPT_TB: case POPT_TC: @@ -93,8 +89,8 @@ case POPT_TP: case POPT_TS: if (rba->buildMode == '\0' && rba->buildChar == '\0') { - rba->buildMode = (((unsigned)opt->val) >> 8) & 0xff; - rba->buildChar = (opt->val ) & 0xff; + rba->buildMode = (char)((((unsigned int)opt->val) >> 8) & 0xff); + rba->buildChar = (char)(opt->val & 0xff); } break; @@ -161,11 +157,9 @@ { "bt", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_BT, N_("track versions of sources from <specfile>"), N_("<specfile>") }, -#if defined(RPM_VENDOR_OPENPKG) /* explicit-source-fetch-cli-option */ { "bf", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_BF, N_("fetch missing source and patch files"), N_("<specfile>") }, -#endif { "tp", 0, POPT_ARGFLAG_ONEDASH, NULL, POPT_TP, N_("build through %prep (unpack sources and apply patches) from <tarball>"), @@ . patch -p0 <<'@@ .' Index: rpm/build/reqprov.c ============================================================================ $ cvs diff -u -r1.84 -r1.84.2.1 reqprov.c --- rpm/build/reqprov.c 16 Dec 2007 23:46:34 -0000 1.84 +++ rpm/build/reqprov.c 8 Jun 2008 16:01:20 -0000 1.84.2.1 @@ -10,7 +10,8 @@ #include "rpmbuild.h" #include "debug.h" -int addReqProv(/[EMAIL PROTECTED]@*/ Spec spec, Header h, /[EMAIL PROTECTED]@*/ rpmTag tagN, +int addReqProv(/[EMAIL PROTECTED]@*/ Spec spec, Header h, + /[EMAIL PROTECTED]@*/ rpmTag tagN, const char * N, const char * EVR, rpmsenseFlags Flags, uint32_t index) { @@ -23,7 +24,7 @@ int len; rpmsenseFlags extra = RPMSENSE_ANY; int xx; - + if (Flags & RPMSENSE_PROVIDES) { nametag = RPMTAG_PROVIDENAME; versiontag = RPMTAG_PROVIDEVERSION; @@ -54,7 +55,7 @@ if (EVR == NULL) EVR = ""; - + /* Check for duplicate dependencies. */ he->tag = nametag; xx = headerGet(h, he, 0); @@ -85,7 +86,7 @@ if (strcmp(names[len], N)) continue; if (flagtag && versions != NULL && - (strcmp(versions[len], EVR) || flags[len] != Flags)) + (strcmp(versions[len], EVR) || (rpmsenseFlags)flags[len] != Flags)) continue; if (indextag && indexes != NULL && indexes[len] != index) continue; @@ . patch -p0 <<'@@ .' Index: rpm/build/rpmbuild.h ============================================================================ $ cvs diff -u -r2.92.2.1 -r2.92.2.2 rpmbuild.h --- rpm/build/rpmbuild.h 24 Jan 2008 20:03:25 -0000 2.92.2.1 +++ rpm/build/rpmbuild.h 8 Jun 2008 16:01:20 -0000 2.92.2.2 @@ -184,6 +184,7 @@ int readLine(Spec spec, int strip) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->fileStack, spec->readStack, spec->line, spec->lineNum, + spec->lbufPtr, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem, internalState @*/; @@ -208,7 +209,7 @@ * @return next parser state */ rpmParseState isPart(Spec spec) - /[EMAIL PROTECTED]/; + /[EMAIL PROTECTED] spec->foo, spec->nfoo @*/; /** \ingroup rpmbuild * Parse a number. @@ -240,7 +241,7 @@ int parseBuildInstallClean(Spec spec, rpmParseState parsePart) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->build, spec->install, spec->check, spec->clean, - spec->macros, + spec->macros, spec->foo, spec->nfoo, spec->lbufPtr, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem, internalState @*/; @@ -253,6 +254,7 @@ int parseChangelog(Spec spec) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->fileStack, spec->readStack, spec->line, spec->lineNum, + spec->foo, spec->nfoo, spec->lbufPtr, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, spec->packages->header, rpmGlobalMacroContext, fileSystem, internalState @*/; @@ -265,6 +267,7 @@ int parseDescription(Spec spec) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->packages, + spec->foo, spec->nfoo, spec->lbufPtr, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, spec->st, @@ -278,6 +281,7 @@ int parseFiles(Spec spec) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->packages, + spec->foo, spec->nfoo, spec->lbufPtr, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem, internalState @*/; @@ -292,6 +296,7 @@ /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->packages, + spec->foo, spec->nfoo, spec->lbufPtr, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->buildSubdir, spec->macros, spec->st, @@ -309,6 +314,7 @@ int parsePrep(Spec spec, int verify) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->prep, spec->buildSubdir, spec->macros, + spec->foo, spec->nfoo, spec->lbufPtr, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, spec->packages->header, @@ -337,6 +343,7 @@ int parseScript(Spec spec, int parsePart) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] spec->packages, + spec->foo, spec->nfoo, spec->lbufPtr, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem, internalState @*/; @@ . patch -p0 <<'@@ .' Index: rpm/build/rpmspec.h ============================================================================ $ cvs diff -u -r2.70 -r2.70.2.1 rpmspec.h --- rpm/build/rpmspec.h 27 Dec 2007 14:16:11 -0000 2.70 +++ rpm/build/rpmspec.h 8 Jun 2008 16:01:20 -0000 2.70.2.1 @@ -117,6 +117,7 @@ /[EMAIL PROTECTED]@*/ struct OpenFileInfo * fileStack; +/[EMAIL PROTECTED]@*/ char *lbuf; size_t lbuf_len; /[EMAIL PROTECTED]@*/ @@ -137,6 +138,7 @@ const char ** BANames; int BACount; int recursing; /*!< parse is recursive? */ + int toplevel; int force; int anyarch; @@ -180,7 +182,7 @@ StringBuf clean; /*!< %clean scriptlet. */ size_t nfoo; -/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ +/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ tagStore_t foo; /[EMAIL PROTECTED]@*/ @@ -200,6 +202,7 @@ int autoReq; int autoProv; + int noarch; /[EMAIL PROTECTED]@*/ const char * preInFile; /*!< %pre scriptlet. */ @@ -242,7 +245,7 @@ * @return spec spec file control structure */ /[EMAIL PROTECTED]@*/ Spec newSpec(void) - /[EMAIL PROTECTED] rpmGlobalMacroContext @*/ + /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno @*/ /[EMAIL PROTECTED] rpmGlobalMacroContext @*/; /** \ingroup rpmbuild @@ -273,32 +276,38 @@ /[EMAIL PROTECTED]/; /** \ingroup rpmbuild + * stashSt. * @param spec spec file control structure * @param h header * @param tag tag * @param lang locale + * @return ptr to saved entry */ -spectag stashSt(Spec spec, Header h, int tag, const char * lang) +spectag stashSt(Spec spec, Header h, rpmTag tag, const char * lang) /[EMAIL PROTECTED] spec->st @*/; /** \ingroup rpmbuild + * addSource. * @param spec spec file control structure * @param pkg package control * @param field field to parse * @param tag tag + * @return 0 on success */ -int addSource(Spec spec, Package pkg, const char * field, int tag) - /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno @*/ +int addSource(Spec spec, Package pkg, const char * field, rpmTag tag) + /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem @*/ /[EMAIL PROTECTED] spec->sources, spec->numSources, spec->st, spec->macros, - rpmGlobalMacroContext @*/; + rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild + * parseNoSource. * @param spec spec file control structure * @param field field to parse * @param tag tag + * @return 0 on success */ -int parseNoSource(Spec spec, const char * field, int tag) +int parseNoSource(Spec spec, const char * field, rpmTag tag) /[EMAIL PROTECTED]/; /** \ingroup rpmbuild @@ . patch -p0 <<'@@ .' Index: rpm/build/spec.c ============================================================================ $ cvs diff -u -r2.175.2.2 -r2.175.2.3 spec.c --- rpm/build/spec.c 5 Jun 2008 15:42:05 -0000 2.175.2.2 +++ rpm/build/spec.c 8 Jun 2008 16:01:20 -0000 2.175.2.3 @@ -11,6 +11,8 @@ #include "rpmfi.h" #include "rpmts.h" +#include "rpmlua.h" + #include "debug.h" /[EMAIL PROTECTED]@*/ @@ -20,8 +22,7 @@ #define SKIPWHITE(_x) {while(*(_x) && (xisspace(*_x) || *(_x) == ',')) (_x)++;} #define SKIPNONWHITE(_x){while(*(_x) &&!(xisspace(*_x) || *(_x) == ',')) (_x)++;} -/[EMAIL PROTECTED] Header @*/ /* compared with NULL */ -/[EMAIL PROTECTED] rpmfi @*/ /* compared with NULL */ +/[EMAIL PROTECTED] rpmluav @*/ /** * @param p trigger entry chain @@ -67,8 +68,10 @@ rpmRC lookupPackage(Spec spec, const char *name, int flag, /[EMAIL PROTECTED]@*/Package *pkg) { HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); - const char *fullName; - Package p; + char *NV = NULL; + char *N = NULL; + char *V = NULL; + Package p, lastp; int xx; /* "main" package */ @@ -79,43 +82,64 @@ } /* Construct package name */ - { char *n; if (flag == PART_SUBNAME) { he->tag = RPMTAG_NAME; xx = headerGet(spec->packages->header, he, 0); - fullName = n = alloca(strlen(he->p.str) + 1 + strlen(name) + 1); - n = stpcpy(n, he->p.str); +assert(xx != 0 && he->p.str != NULL); + N = rpmExpand(he->p.str, "-", name, NULL); he->p.ptr = _free(he->p.ptr); - *n++ = '-'; - *n = '\0'; } else { - fullName = n = alloca(strlen(name)+1); + N = xstrdup(name); + if ((V = strrchr(N, '-')) != NULL) { + NV = xstrdup(N); + *V++ = '\0'; + } } - /[EMAIL PROTECTED]@*/ - strcpy(n, name); - /[EMAIL PROTECTED]@*/ - } - /* Locate package with fullName */ + /* Match last package with same N or same {N,V} */ + lastp = NULL; for (p = spec->packages; p != NULL; p = p->next) { + char *nv, *n, *v; + nv = n = v = NULL; he->tag = RPMTAG_NAME; xx = headerGet(p->header, he, 0); - if (he->p.str && !strcmp(fullName, he->p.str)) { - he->p.ptr = _free(he->p.ptr); - break; + if (xx && he->p.str != NULL) { + n = (char *) he->p.str; + he->p.str = NULL; } - he->p.ptr = _free(he->p.ptr); + if (NV != NULL) { + he->tag = RPMTAG_VERSION; + xx = headerGet(p->header, he, 0); + if (xx && he->p.str != NULL) { + v = (char *) he->p.str; + he->p.str = NULL; + nv = rpmExpand(n, "-", v, NULL); + } + } + + if (NV == NULL) { + if (!strcmp(N, n)) + lastp = p; + } else { + if (!strcmp(NV, nv) + || (!strcmp(N, n) && !strcmp(V, v))) + lastp = p; + } + n = _free(n); + v = _free(v); + nv = _free(nv); } if (pkg) - /[EMAIL PROTECTED]@*/ *pkg = p; /[EMAIL PROTECTED]@*/ - return ((p == NULL) ? RPMRC_FAIL : RPMRC_OK); + /[EMAIL PROTECTED]@*/ *pkg = lastp; /[EMAIL PROTECTED]@*/ + NV = _free(NV); + N = _free(N); + return ((lastp == NULL) ? RPMRC_FAIL : RPMRC_OK); } Package newPackage(Spec spec) { Package p; - Package pp; p = xcalloc(1, sizeof(*p)); @@ -147,14 +171,6 @@ p->specialDoc = NULL; - if (spec->packages == NULL) { - spec->packages = p; - } else { - /* Always add package to end of list */ - for (pp = spec->packages; pp->next != NULL; pp = pp->next) - {}; - pp->next = p; - } p->next = NULL; return p; @@ -175,7 +191,7 @@ pkg->ds = rpmdsFree(pkg->ds); pkg->fileList = freeStringBuf(pkg->fileList); pkg->fileFile = _free(pkg->fileFile); - if (pkg->cpioList) { + if (pkg->cpioList != NULL) { rpmfi fi = pkg->cpioList; pkg->cpioList = NULL; fi = rpmfiFree(fi); @@ -202,7 +218,7 @@ /** */ -static inline /[EMAIL PROTECTED]@*/ struct Source *findSource(Spec spec, int num, int flag) +static inline /[EMAIL PROTECTED]@*/ struct Source *findSource(Spec spec, uint32_t num, int flag) /[EMAIL PROTECTED]/ { struct Source *p; @@ -262,7 +278,7 @@ return source->flags; } -int parseNoSource(Spec spec, const char * field, int tag) +int parseNoSource(Spec spec, const char * field, rpmTag tag) { const char *f, *fe; const char *name; @@ -303,12 +319,16 @@ } - return 0; + return RPMRC_OK; } -int addSource(Spec spec, /[EMAIL PROTECTED]@*/ Package pkg, const char *field, int tag) +int addSource(Spec spec, /[EMAIL PROTECTED]@*/ Package pkg, + const char *field, rpmTag tag) { struct Source *p; +#if defined(RPM_VENDOR_OPENPKG) /* regular-ordered-sources */ + struct Source *p_last; +#endif int flag = 0; const char *name = NULL; const char *mdir = NULL; @@ -377,8 +397,19 @@ else p->source = p->fullSource; +#if defined(RPM_VENDOR_OPENPKG) /* regular-ordered-sources */ + p->next = NULL; + p_last = spec->sources; + while (p_last != NULL && p_last->next != NULL) + p_last = p_last->next; + if (p_last != NULL) + p_last->next = p; + else + spec->sources = p; +#else p->next = spec->sources; spec->sources = p; +#endif spec->numSources++; @@ -395,10 +426,25 @@ sprintf(buf, "%sURL%d", (flag & RPMFILE_PATCH) ? "PATCH" : "SOURCE", num); addMacro(spec->macros, buf, NULL, p->fullSource, RMIL_SPEC); +#ifdef WITH_LUA + { rpmlua lua = NULL; /* global state */ + const char * what = (flag & RPMFILE_PATCH) ? "patches" : "sources"; + rpmluav var = rpmluavNew(); + + rpmluaPushTable(lua, what); + rpmluavSetListMode(var, 1); + rpmluavSetValue(var, RPMLUAV_STRING, body); + rpmluaSetVar(lua, var); +/[EMAIL PROTECTED]@*/ + var = (rpmluav) rpmluavFree(var); +/[EMAIL PROTECTED]@*/ + rpmluaPop(lua); + } +#endif body = _free(body); } - return 0; + return RPMRC_OK; } /** @@ -510,6 +556,7 @@ spec->BANames = NULL; spec->BACount = 0; spec->recursing = 0; + spec->toplevel = 1; spec->BASpecs = NULL; spec->force = 0; @@ -545,19 +592,7 @@ spec->rootURL = _free(spec->rootURL); spec->specFile = _free(spec->specFile); -#ifdef DEAD - { struct OpenFileInfo *ofi; - while (spec->fileStack) { - ofi = spec->fileStack; - spec->fileStack = ofi->next; - ofi->next = NULL; - ofi->fileName = _free(ofi->fileName); - ofi = _free(ofi); - } - } -#else closeSpec(spec); -#endif while (spec->readStack) { rl = spec->readStack; @@ -572,7 +607,7 @@ spec->sourcePkgId = _free(spec->sourcePkgId); spec->sourceHeader = headerFree(spec->sourceHeader); - if (spec->sourceCpioList) { + if (spec->sourceCpioList != NULL) { rpmfi fi = spec->sourceCpioList; spec->sourceCpioList = NULL; fi = rpmfiFree(fi); @@ -595,6 +630,13 @@ spec->passPhrase = _free(spec->passPhrase); spec->cookie = _free(spec->cookie); +#ifdef WITH_LUA + { rpmlua lua = NULL; /* global state */ + rpmluaDelVar(lua, "patches"); + rpmluaDelVar(lua, "sources"); + } +#endif + spec->sources = freeSources(spec->sources); spec->packages = freePackages(spec->packages); @@ . patch -p0 <<'@@ .' Index: rpm/rpmqv.c ============================================================================ $ cvs diff -u -r1.140.2.3 -r1.140.2.4 rpmqv.c --- rpm/rpmqv.c 4 Jun 2008 21:41:23 -0000 1.140.2.3 +++ rpm/rpmqv.c 8 Jun 2008 16:01:19 -0000 1.140.2.4 @@ -857,12 +857,10 @@ rpmDefineMacro(NULL, "patch #", RMIL_CMDLINE); rpmDefineMacro(NULL, "prep %%prep", RMIL_CMDLINE); /[EMAIL PROTECTED]@*/ break; -#if defined(RPM_VENDOR_OPENPKG) /* explicit-source-fetch-cli-option */ case 'f': ba->buildAmount |= RPMBUILD_FETCHSOURCE; ba->noDeps = 1; /[EMAIL PROTECTED]@*/ break; -#endif } if (!poptPeekArg(optCon)) { @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org