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:   18-Aug-2007 23:32:31
  Branch: HEAD                             Handle: 2007081822322803

  Modified files:
    rpm                     CHANGES
    rpm/build               files.c
    rpm/lib                 depends.c psm.c rpmfi.c rpmfi.h rpminstall.c
                            transaction.c
    rpm/rpmdb               hdrNVR.c rpmdb.c

  Log:
    - permit mixed binary/source installation transactions.

  Summary:
    Revision    Changes     Path
    1.1586      +1  -0      rpm/CHANGES
    1.261       +2  -1      rpm/build/files.c
    1.339       +10 -5      rpm/lib/depends.c
    2.220       +1  -0      rpm/lib/psm.c
    2.74        +56 -1      rpm/lib/rpmfi.c
    2.38        +11 -1      rpm/lib/rpmfi.h
    1.160       +6  -51     rpm/lib/rpminstall.c
    1.330       +9  -0      rpm/lib/transaction.c
    1.8         +6  -0      rpm/rpmdb/hdrNVR.c
    1.152       +8  -0      rpm/rpmdb/rpmdb.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1585 -r1.1586 CHANGES
  --- rpm/CHANGES       18 Aug 2007 16:45:02 -0000      1.1585
  +++ rpm/CHANGES       18 Aug 2007 21:32:28 -0000      1.1586
  @@ -1,4 +1,5 @@
   4.5 -> 5.0:
  +    - jbj: permit mixed binary/source installation transactions.
       - jbj: re-add rpmcache/rpmcmp/rpmdigest tools.
       - jbj: more rpmInstall refactoring.
       - jbj: use rpmgi for --addsign/--checksig arg iteration.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/files.c
  ============================================================================
  $ cvs diff -u -r1.260 -r1.261 files.c
  --- rpm/build/files.c 17 Aug 2007 18:53:05 -0000      1.260
  +++ rpm/build/files.c 18 Aug 2007 21:32:29 -0000      1.261
  @@ -1523,7 +1523,8 @@
                freecon(scon);
        }
       }
  -    matchpathcon_fini();
  +    if (sxfn != NULL && *sxfn != '\0')
  +     matchpathcon_fini();
       sxfn = _free(sxfn);
   
       (void) headerAddEntry(h, RPMTAG_SIZE, RPM_INT32_TYPE,
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/depends.c
  ============================================================================
  $ cvs diff -u -r1.338 -r1.339 depends.c
  --- rpm/lib/depends.c 3 Aug 2007 18:29:53 -0000       1.338
  +++ rpm/lib/depends.c 18 Aug 2007 21:32:29 -0000      1.339
  @@ -391,7 +391,6 @@
       if (!(upgrade & 0x1))
        goto exit;
   
  -    /* XXX binary rpms always have RPMTAG_SOURCERPM, source rpms do not */
       if (isSource)
        goto exit;
   
  @@ -2351,10 +2350,16 @@
            ? rpmteDS(p, RPMTAG_REQUIRENAME) : NULL);
        conflicts = (!(depFlags & RPMDEPS_FLAG_NOCONFLICTS)
            ? rpmteDS(p, RPMTAG_CONFLICTNAME) : NULL);
  -     dirnames = (!(depFlags & RPMDEPS_FLAG_NOPARENTDIRS)
  -         ? rpmteDS(p, RPMTAG_DIRNAMES) : NULL);
  -     linktos = (!(depFlags & RPMDEPS_FLAG_NOLINKTOS)
  -         ? rpmteDS(p, RPMTAG_FILELINKTOS) : NULL);
  +     /* XXX srpm's don't have directory paths. */
  +     if (p->isSource) {
  +         dirnames = NULL;
  +         linktos = NULL;
  +     } else {
  +         dirnames = (!(depFlags & RPMDEPS_FLAG_NOPARENTDIRS)
  +             ? rpmteDS(p, RPMTAG_DIRNAMES) : NULL);
  +         linktos = (!(depFlags & RPMDEPS_FLAG_NOLINKTOS)
  +             ? rpmteDS(p, RPMTAG_FILELINKTOS) : NULL);
  +     }
   
        rc = checkPackageDeps(ts, rpmteNEVRA(p),
                        requires, conflicts, dirnames, linktos,
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/psm.c
  ============================================================================
  $ cvs diff -u -r2.219 -r2.220 psm.c
  --- rpm/lib/psm.c     17 Aug 2007 16:04:51 -0000      2.219
  +++ rpm/lib/psm.c     18 Aug 2007 21:32:29 -0000      2.220
  @@ -2273,6 +2273,7 @@
        break;
       case PSM_RPMDB_ADD:
        if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)        break;
  +     if (fi->isSource)       break;  /* XXX never add SRPM's */
        if (fi->h == NULL)      break;  /* XXX can't happen */
   
        /* Add header to db, doing header check if requested */
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmfi.c
  ============================================================================
  $ cvs diff -u -r2.73 -r2.74 rpmfi.c
  --- rpm/lib/rpmfi.c   17 Aug 2007 18:50:20 -0000      2.73
  +++ rpm/lib/rpmfi.c   18 Aug 2007 21:32:29 -0000      2.74
  @@ -105,6 +105,11 @@
       return j;
   }
   
  +int rpmfiIsSource(rpmfi fi)
  +{
  +    return (fi != NULL ? fi->isSource : 0);
  +}
  +
   const char * rpmfiBN(rpmfi fi)
   {
       const char * BN = NULL;
  @@ -1219,7 +1224,8 @@
            fi->fddictx = _free(fi->fddictx);
            fi->fddictn = _free(fi->fddictn);
   
  -     }
  +     } else if (fi->isSource)        /* XXX SRPM's always re-alloc fi->dil */
  +         fi->dil = _free(fi->dil);
        /[EMAIL PROTECTED]@*/
       }
       /[EMAIL PROTECTED]@*/
  @@ -1318,6 +1324,7 @@
       fi->hfd = headerFreeData;
   
       fi->h = (h != NULL && scareMem ? headerLink(h) : NULL);
  +    fi->isSource = (headerIsEntry(h, RPMTAG_SOURCERPM) == 0);
   
       if (fi->fsm == NULL)
        fi->fsm = newFSM();
  @@ -1518,6 +1525,54 @@
        _fdupe(fi, fddictn);
   
        fi->h = headerFree(fi->h);
  +    } else if (fi->isSource) /* XXX SRPM's always re-alloc fi->dil */
  +     _fdupe(fi, dil);
  +
  +    if (fi->isSource && fi->dc == 1 && *fi->dnl[0] == '\0') {
  +     const char ** av = xcalloc(4+1, sizeof(*av));
  +     char * te;
  +     size_t nb;
  +
  +     av[0] = rpmGenPath(rpmtsRootDir(ts), "%{_sourcedir}", "");
  +     av[1] = rpmGenPath(rpmtsRootDir(ts), "%{_specdir}", "");
  +     av[2] = rpmGenPath(rpmtsRootDir(ts), "%{_patchdir}", "");
  +     av[3] = rpmGenPath(rpmtsRootDir(ts), "%{_icondir}", "");
  +     av[4] = NULL;
  +
  +     /* Hack up a header RPM_STRING_ARRAY_TYPE array. */
  +     fi->dnl = hfd(fi->dnl, -1);
  +     fi->dc = 4;
  +     nb = fi->dc * sizeof(*av);
  +     for (i = 0; i < fi->dc; i++)
  +         nb += strlen(av[i]) + sizeof("/");
  +
  +     fi->dnl = xmalloc(nb);
  +     te = (char *) (&fi->dnl[fi->dc]);
  +     *te = '\0';
  +     for (i = 0; i < fi->dc; i++) {
  +         fi->dnl[i] = te;
  +         te = stpcpy( stpcpy(te, av[i]), "/");
  +         *te++ = '\0';
  +     }
  +     av = argvFree(av);
  +
  +     /* Map basenames to appropriate directories. */
  +     for (i = 0; i < fi->fc; i++) {
  +         if (fi->fflags[i] & RPMFILE_SOURCE)
  +             fi->dil[i] = 0;
  +         else if (fi->fflags[i] & RPMFILE_SPECFILE)
  +             fi->dil[i] = 1;
  +         else if (fi->fflags[i] & RPMFILE_PATCH)
  +             fi->dil[i] = 2;
  +         else if (fi->fflags[i] & RPMFILE_ICON)
  +             fi->dil[i] = 3;
  +         else {
  +             const char * b = fi->bnl[i];
  +             const char * be = b + strlen(b) - sizeof(".spec") - 1;
  +
  +             fi->dil[i] = (be > b && !strcmp(be, ".spec") ? 1 : 0);
  +         }
  +     }
       }
   
       dnlmax = -1;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmfi.h
  ============================================================================
  $ cvs diff -u -r2.37 -r2.38 rpmfi.h
  --- rpm/lib/rpmfi.h   19 Jun 2007 02:32:42 -0000      2.37
  +++ rpm/lib/rpmfi.h   18 Aug 2007 21:32:29 -0000      2.38
  @@ -130,7 +130,7 @@
   
   /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
       char * fn;                       /*!< File name buffer. */
  -    int fnlen;                       /*!< FIle name buffer length. */
  +    int fnlen;                       /*!< File name buffer length. */
   
       int astriplen;
       int striplen;
  @@ -148,6 +148,8 @@
       int keep_header;         /*!< Keep header? */
       uint_32 color;           /*!< Color bit(s) from file color union. */
   
  +    int isSource;            /*!< Is this a SRPM? */
  +
   /[EMAIL PROTECTED]@*/
       uint_32 * replacedSizes; /*!< (TR_ADDED) */
   
  @@ -270,6 +272,14 @@
        /[EMAIL PROTECTED] fi @*/;
   
   /**
  + * Return source rpm marker from file info set.
  + * @param fi         file info set
  + * @return           source rpm?
  + */
  +int rpmfiIsSource(/[EMAIL PROTECTED]@*/ rpmfi fi)
  +     /[EMAIL PROTECTED]/;
  +
  +/**
    * Return current base name from file info set.
    * @param fi         file info set
    * @return           current base name, NULL on invalid
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpminstall.c
  ============================================================================
  $ cvs diff -u -r1.159 -r1.160 rpminstall.c
  --- rpm/lib/rpminstall.c      18 Aug 2007 16:29:21 -0000      1.159
  +++ rpm/lib/rpminstall.c      18 Aug 2007 21:32:29 -0000      1.160
  @@ -310,7 +310,6 @@
   {
       int numFailed = 0;
       int numRPMS = 0;
  -    ARGV_t sourceURL = NULL;
       rpmRelocation relocations = NULL;
       rpmRC rpmrc = RPMRC_OK;
       rpmVSFlags vsflags, ovsflags;
  @@ -405,7 +404,6 @@
       while (rpmgiNext(gi) == RPMRC_OK) {
        Header h = rpmgiHeader(gi);
        const char * fn;
  -     int isSource;
   
        if (h == NULL) {
            numFailed++;
  @@ -413,15 +411,6 @@
        }
        fn = rpmgiHdrPath(gi);
   
  -     /* === Check for source package, saving for delayed installs. */
  -     isSource = (headerIsEntry(h, RPMTAG_SOURCERPM) == 0);
  -     if (isSource) {
  -         rpmMessage(RPMMESS_DEBUG, D_("\tadded source package [%d]: %s\n"),
  -             argvCount(sourceURL), fn);
  -         argvAdd(&sourceURL, fn);
  -         continue;
  -     }
  -
        /* === Check for relocatable package. */
        if (relocations) {
            const char ** paths;
  @@ -468,16 +457,13 @@
        }
   
        /* === Add binary package to transaction set. */
  -     rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fn,
  +     rc = rpmtsAddInstallElement(ts, h, (fnpyKey)xstrdup(fn),
                        (ia->installInterfaceFlags & INSTALL_UPGRADE) != 0,
                        ia->relocations);
   
        if (relocations)
            relocations->oldPath = _free(relocations->oldPath);
   
  -     rpmMessage(RPMMESS_DEBUG, D_("\tadded binary package [%d]: %s\n"),
  -                     numRPMS, fn);
  -
        numRPMS++;
       }
   
  @@ -485,66 +471,35 @@
   
   }    /* end-of-transaction-build */
   
  -    rpmMessage(RPMMESS_DEBUG, D_("found %d source and %d binary packages\n"),
  -             argvCount(sourceURL), numRPMS);
  -
       if (numFailed) goto exit;
   
  -    rpmcliPackagesTotal += argvCount(sourceURL);
  -
       if (numRPMS) {
        if (!(ia->installInterfaceFlags & INSTALL_NODEPS)
         && (rc = rpmcliInstallCheck(ts)) != 0) {
  -         numFailed = (numRPMS + argvCount(sourceURL));
  +         numFailed = numRPMS;
            (void) rpmcliInstallSuggests(ts);
        }
   
        if (!(ia->installInterfaceFlags & INSTALL_NOORDER)
         && (rc = rpmcliInstallOrder(ts)) != 0)
  -         numFailed = (numRPMS + argvCount(sourceURL));
  +         numFailed = numRPMS;
   
        /* Drop added/available package indices and dependency sets. */
        rpmtsClean(ts);
   
        if (numFailed == 0
         && (rc = rpmcliInstallRun(ts, NULL, ia->probFilter)) != 0)
  -         numFailed += (rc < 0 ? numRPMS : rc) + argvCount(sourceURL);
  +         numFailed += (rc < 0 ? numRPMS : rc);
       }
   
       if (numFailed) goto exit;
   
  -    if (sourceURL) {
  -     int numSRPMS = argvCount(sourceURL);
  -     FD_t fd;
  -
  -     for (i = 0; i < numSRPMS; i++) {
  -         if (sourceURL[i] == NULL) continue;
  -         fd = Fopen(sourceURL[i], "r.fdio");
  -         if (fd == NULL || Ferror(fd)) {
  -             rpmMessage(RPMMESS_ERROR, _("cannot open file %s: %s\n"),
  -                        sourceURL[i], Fstrerror(fd));
  -             if (fd != NULL) {
  -                 xx = Fclose(fd);
  -                 fd = NULL;
  -             }
  -             continue;
  -         }
  -
  -         if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)) {
  -             rpmrc = rpmInstallSourcePackage(ts, fd, NULL, NULL);
  -             if (rpmrc != RPMRC_OK) numFailed++;
  -         }
  -
  -         xx = Fclose(fd);
  -         fd = NULL;
  -     }
  -    }
  -
   exit:
  -    sourceURL = argvFree(sourceURL);
   
  +#ifdef       NOTYET  /* XXX grrr, segfault in selabel_close */
       if (!(ia->transFlags & RPMTRANS_FLAG_NOCONTEXTS))
        matchpathcon_fini();
  +#endif
   
       rpmtsEmpty(ts);
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/transaction.c
  ============================================================================
  $ cvs diff -u -r1.329 -r1.330 transaction.c
  --- rpm/lib/transaction.c     3 Aug 2007 18:29:53 -0000       1.329
  +++ rpm/lib/transaction.c     18 Aug 2007 21:32:29 -0000      1.330
  @@ -990,6 +990,7 @@
   
        tsi = rpmtsiInit(rbts);
        while((te = rpmtsiNext(tsi, TR_REMOVED)) != NULL) {
  +         if (te->isSource) continue;
            if(!te->u.removed.dboffset)
                continue;
            rc = rpmdbRemove(rpmtsGetRdb(rbts),
  @@ -1243,6 +1244,7 @@
        rpmdbMatchIterator mi;
        int fc;
   
  +     if (p->isSource) continue;
        if ((fi = rpmtsiFi(pi)) == NULL)
            continue;   /* XXX can't happen */
        fc = rpmfiFC(fi);
  @@ -1292,6 +1294,7 @@
       while ((p = rpmtsiNext(pi, TR_REMOVED)) != NULL) {
        int fc;
   
  +     if (p->isSource) continue;
        if ((fi = rpmtsiFi(pi)) == NULL)
            continue;   /* XXX can't happen */
        fc = rpmfiFC(fi);
  @@ -1310,6 +1313,7 @@
        rpmMessage(RPMMESS_DEBUG, D_("running pre-transaction scripts\n"));
        pi = rpmtsiInit(ts);
        while ((p = rpmtsiNext(pi, TR_ADDED)) != NULL) {
  +         if (p->isSource) continue;
            if ((fi = rpmtsiFi(pi)) == NULL)
                continue;       /* XXX can't happen */
   
  @@ -1389,6 +1393,7 @@
       while ((p = rpmtsiNext(pi, 0)) != NULL) {
        int fc;
   
  +     if (p->isSource) continue;
        if ((fi = rpmtsiFi(pi)) == NULL)
            continue;   /* XXX can't happen */
        fc = rpmfiFC(fi);
  @@ -1443,6 +1448,7 @@
   
        (void) rpmdbCheckSignals();
   
  +     if (p->isSource) continue;
        if ((fi = rpmtsiFi(pi)) == NULL)
            continue;   /* XXX can't happen */
        fc = rpmfiFC(fi);
  @@ -1483,6 +1489,7 @@
   
        (void) rpmdbCheckSignals();
   
  +     if (p->isSource) continue;
        if ((fi = rpmtsiFi(pi)) == NULL)
            continue;   /* XXX can't happen */
        fc = rpmfiFC(fi);
  @@ -1635,6 +1642,7 @@
        */
       pi = rpmtsiInit(ts);
       while ((p = rpmtsiNext(pi, 0)) != NULL) {
  +     if (p->isSource) continue;
        if ((fi = rpmtsiFi(pi)) == NULL)
            continue;   /* XXX can't happen */
        if (rpmfiFC(fi) == 0)
  @@ -1670,6 +1678,7 @@
   
            (void) rpmdbCheckSignals();
   
  +         if (p->isSource) continue;
            if ((fi = rpmtsiFi(pi)) == NULL)
                continue;       /* XXX can't happen */
            switch (rpmteType(p)) {
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrNVR.c
  ============================================================================
  $ cvs diff -u -r1.7 -r1.8 hdrNVR.c
  --- rpm/rpmdb/hdrNVR.c        3 Aug 2007 18:29:54 -0000       1.7
  +++ rpm/rpmdb/hdrNVR.c        18 Aug 2007 21:32:31 -0000      1.8
  @@ -164,6 +164,12 @@
                *rp = NULL;
       }
       if (ap) {
  +     if (!headerIsEntry(h, RPMTAG_ARCH))
  +         *ap = "pubkey";
  +     else
  +     if (!headerIsEntry(h, RPMTAG_SOURCERPM))
  +         *ap = "src";
  +     else
        if (!(headerGetEntry(h, RPMTAG_ARCH, &type, ap, &count)
            && type == RPM_STRING_TYPE && count == 1))
                *ap = NULL;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.151 -r1.152 rpmdb.c
  --- rpm/rpmdb/rpmdb.c 17 Aug 2007 05:36:05 -0000      1.151
  +++ rpm/rpmdb/rpmdb.c 18 Aug 2007 21:32:31 -0000      1.152
  @@ -4013,6 +4013,14 @@
                        _RECNUM);
                continue;
            }
  +         if (!headerIsEntry(h, RPMTAG_SOURCERPM)
  +          &&  headerIsEntry(h, RPMTAG_ARCH))
  +         {
  +             rpmError(RPMERR_INTERNAL,
  +                     _("header #%u in the database is SRPM -- skipping.\n"),
  +                     _RECNUM);
  +             continue;
  +         }
   
            /* Filter duplicate entries ? (bug in pre rpm-3.0.4) */
            if (_db_filter_dups || newdb->db_filter_dups) {
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to