[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rpm-cvs
Subject:    [CVS] RPM: rpm/ CHANGES rpm/tools/ rpmdigest.c
From:       "Jeff Johnson" <jbj () rpm5 ! org>
Date:       2008-06-23 23:52:42
Message-ID: 20080623235242.C1357348470 () rpm5 ! org
[Download RAW message or body]

  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   24-Jun-2008 01:52:42
  Branch: HEAD                             Handle: 2008062323524200

  Modified files:
    rpm                     CHANGES
    rpm/tools               rpmdigest.c

  Log:
    - rpmdigest: pull in mtreeCwalk() for 0install dir args tree spewage.

  Summary:
    Revision    Changes     Path
    1.2436      +1  -0      rpm/CHANGES
    2.6         +119 -23    rpm/tools/rpmdigest.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2435 -r1.2436 CHANGES
  --- rpm/CHANGES	23 Jun 2008 20:52:50 -0000	1.2435
  +++ rpm/CHANGES	23 Jun 2008 23:52:42 -0000	1.2436
  @@ -1,5 +1,6 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: rpmdigest: pull in mtreeCwalk() for 0install dir args tree spewage.
       - jbj: rpmdigest: achieve 0install manifest spewage for file args.
       - jbj: rpmdigest: refactor to prepare for 0install manifest spewage.
       - jbj: rpmrepo: put a --stats stopwatch on the mmap digest cost as well.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/tools/rpmdigest.c
  ============================================================================
  $ cvs diff -u -r2.5 -r2.6 rpmdigest.c
  --- rpm/tools/rpmdigest.c	23 Jun 2008 20:52:51 -0000	2.5
  +++ rpm/tools/rpmdigest.c	23 Jun 2008 23:52:42 -0000	2.6
  @@ -19,7 +19,12 @@
   };
   
   struct rpmdc_s {
  -    enum dcFlags_e flags;
  +    int ftsoptions;		/*!< Global Fts(3) traversal options. */
  +    FTS * t;			/*!< Global Fts(3) traversal data. */
  +    FTSENT * p;			/*!< Current node Fts(3) traversal data. */
  +    struct stat sb;		/*!< Current node stat(2) data. */
  +
  +    enum dcFlags_e flags;	/*!< rpmdc control bits. */
       uint32_t algo;		/*!< default digest algorithm. */
       uint32_t dalgo;		/*!< digest algorithm. */
   /*@observer@*/ /*@null@*/
  @@ -28,7 +33,6 @@
       size_t digestlen;
       const char * fn;
       FD_t fd;
  -    struct stat sb;
       int (*parse) (rpmdc dc);
       const char * (*print) (rpmdc dc, int rc);
       const char * ofn;		/*!< output file name */
  @@ -42,6 +46,7 @@
       unsigned char buf[BUFSIZ];
       ssize_t nb;
       int ix;
  +
       size_t ncomputed;		/*!< no. of digests computed. */
       size_t nchecked;		/*!< no. of digests checked. */
       size_t nmatched;		/*!< no. of digests matched. */
  @@ -211,6 +216,7 @@
       size_t nb = 0;
       char _mtime[32];
       char _size[32];
  +    const struct stat * st = &dc->sb;
       const char * _bn;
   
       /* Don't bother formatting if noone cares. */
  @@ -218,10 +224,10 @@
   	return NULL;
   
       snprintf(_mtime, sizeof(_mtime), "%llu",
  -		(unsigned long long) dc->sb.st_mtime);
  +		(unsigned long long) st->st_mtime);
       _mtime[sizeof(_mtime)-1] = '\0';
       snprintf(_size, sizeof(_size), "%llu",
  -		(unsigned long long)dc->sb.st_size);
  +		(unsigned long long) st->st_size);
       _size[sizeof(_size)-1] = '\0';
       if ((_bn = strrchr(dc->fn, '/')) != NULL)
   	_bn++;
  @@ -252,16 +258,29 @@
   	}
   #endif
       } else {
  -	*te++ = 'F';
  -	*te++ = ' ';
  -	te = stpcpy(te, dc->digest);
  -	*te++ = ' ';
  -	te = stpcpy(te, _mtime);
  -	*te++ = ' ';
  -	te = stpcpy(te, _size);
  -	*te++ = ' ';
  -	te = stpcpy(te, _bn);
  -	*te++ = '\n';
  +	if (S_ISDIR(st->st_mode)) {
  +	    *te++ = 'D';
  +	    *te++ = ' ';
  +	    te = stpcpy(te, _mtime);
  +	    *te++ = ' ';
  +	    *te++ = '/';
  +	    te = stpcpy(te, _bn);
  +	    *te++ = '\n';
  +	} else if (S_ISREG(st->st_mode) || S_ISLNK(st->st_mode)) {
  +	    if (S_ISLNK(st->st_mode))
  +		*te++ = 'S';
  +	    else
  +		*te++ = (st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) ? 'X' : 'F';
  +	    *te++ = ' ';
  +	    te = stpcpy(te, dc->digest);
  +	    *te++ = ' ';
  +	    te = stpcpy(te, _mtime);
  +	    *te++ = ' ';
  +	    te = stpcpy(te, _size);
  +	    *te++ = ' ';
  +	    te = stpcpy(te, _bn);
  +	    *te++ = '\n';
  +	}
       }
       *te = '\0';
   
  @@ -402,6 +421,89 @@
       return rc;
   }
   
  +static int
  +rpmdcVisitF(rpmdc dc)
  +	/*@modifies dc @*/
  +{
  +    int rc = 0;
  +    int xx;
  +
  +    if ((xx = rpmdcInitFile(dc)) != 0)
  +	rc = xx;
  +    else {
  +	if ((xx = rpmdcCalcFile(dc)) != 0)
  +	    rc = xx;
  +	if ((xx = rpmdcFiniFile(dc)) != 0)
  +	    rc = xx;
  +    }
  +    return rc;
  +}
  +
  +#ifdef	NOTYET
  +static int
  +rpmdcCWalk(rpmdc dc)
  +{
  +    char *const * paths = dc->paths;
  +    int ftsoptions = dc->ftsoptions;
  +    int rval = 0;
  +
  +    dc->t = Fts_open(paths, ftsoptions, dsort);
  +    if (dc->t == NULL) {
  +	fprintf(stderr, "Fts_open: %s", strerror(errno));
  +	return -1;
  +    }
  +
  +    while ((dc->p = Fts_read(dc->t)) != NULL) {
  +#ifdef	NOTYET
  +	int indent = 0;
  +	if (MF_ISSET(INDENT))
  +	    indent = dc->p->fts_level * 4;
  +	if (rpmdcCheckExcludes(dc->p->fts_name, dc->p->fts_path)) {
  +	    (void) Fts_set(dc->t, dc->p, FTS_SKIP);
  +	    continue;
  +	}
  +#endif
  +	switch(dc->p->fts_info) {
  +	case FTS_D:
  +#ifdef	NOTYET
  +	    if (!MF_ISSET(DIRSONLY))
  +		(void) printf("\n");
  +	    if (!MF_ISSET(NOCOMMENT))
  +		(void) printf("# %s\n", dc->p->fts_path);
  +	    (void) rpmdcVisitD(dc);
  +	    rpmdcVisitF(dc);
  +	    /*@switchbreak@*/ break;
  +#endif
  +	case FTS_DP:
  +#ifdef	NOTYET
  +	    if (!MF_ISSET(NOCOMMENT) && (dc->p->fts_level > 0))
  +		(void) printf("%*s# %s\n", indent, "", dc->p->fts_path);
  +	    (void) printf("%*s..\n", indent, "");
  +	    if (!MF_ISSET(DIRSONLY))
  +		(void) printf("\n");
  +	    /*@switchbreak@*/ break;
  +#endif
  +	case FTS_DNR:
  +	case FTS_ERR:
  +	case FTS_NS:
  +	    (void) fprintf(stderr, "%s: %s: %s\n", __progname,
  +			dc->p->fts_path, strerror(dc->p->fts_errno));
  +	    /*@switchbreak@*/ break;
  +	default:
  +#ifdef	NOTYET
  +	    if (!MF_ISSET(DIRSONLY))
  +#endif
  +		rpmdcVisitF(dc);
  +	    /*@switchbreak@*/ break;
  +	}
  +    }
  +    (void) Fts_close(dc->t);
  +    dc->p = NULL;
  +    dc->t = NULL;
  +    return rval;
  +}
  +#endif
  +
   static int rpmdcLoadManifests(rpmdc dc)
   	/*@globals h_errno, fileSystem, internalState @*/
   	/*@modifies dc, h_errno, fileSystem, internalState @*/
  @@ -557,19 +659,12 @@
   	xx = rpmdcLoadManifests(dc);
   	av = dc->paths;
       }
  -    dc->ix = 0;
   
  +    dc->ix = 0;
       if (av != NULL)
       while ((dc->fn = *av++) != NULL) {
  -	/* XXX TODO: instantiate verify digests for all identical paths. */
  -	if ((xx = rpmdcInitFile(dc)) != 0) {
  +	if ((xx = rpmdcVisitF(dc)) != 0)
   	    rc = xx;
  -	} else {
  -	    if ((xx = rpmdcCalcFile(dc)) != 0)
  -		rc = xx;
  -	    if ((xx = rpmdcFiniFile(dc)) != 0)
  -		rc = xx;
  -	}
   	dc->ix++;
       }
   
  @@ -579,6 +674,7 @@
   		__progname, dc->nfailed, dc->ncomputed);
   
       if (dc->ofd) {
  +	/* Print the output spewage digest for 0install format manifests. */
   	if (F_ISSET(dc, 0INSTALL)) {
   	    static int asAscii = 1;
   	    char *t;
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic