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

Reply via email to