RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/build/ parsePrep.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Sun 22 Jul 2007 - 03:39:29 CEST
Message-Id: <20070722013929.547D43484F4@rpm5.org>
  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:   22-Jul-2007 03:39:29
  Branch: HEAD                             Handle: 2007072202392900

  Modified files:
    rpm/build               parsePrep.c

  Log:
    revert 2.79.

  Summary:
    Revision    Changes     Path
    2.86        +276 -2     rpm/build/parsePrep.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/build/parsePrep.c
  ============================================================================
  $ cvs diff -u -r2.85 -r2.86 parsePrep.c
  --- rpm/build/parsePrep.c	22 Jul 2007 01:20:04 -0000	2.85
  +++ rpm/build/parsePrep.c	22 Jul 2007 01:39:29 -0000	2.86
  @@ -54,6 +54,132 @@
       return 0;
   }
   
  +#ifdef	DYING
  +/**
  + * Expand %patchN macro into %prep scriptlet.
  + * @param spec		build info
  + * @param c		patch index
  + * @param strip		patch level (i.e. patch -p argument)
  + * @param db		saved file suffix (i.e. patch --suffix argument)
  + * @param reverse	include -R?
  + * @param removeEmpties	include -E?
  + * @param fuzz		include -F?
  + * @return		expanded %patch macro (NULL on error)
  + */
  +/*@-boundswrite@*/
  +/*@observer@*/
  +static char *doPatch(Spec spec, int c, int strip, const char *db,
  +		     int reverse, int removeEmpties, int fuzz, const char *subdir)
  +	/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
  +	/*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/
  +{
  +    const char *fn, *Lurlfn;
  +    static char buf[BUFSIZ];
  +    char args[BUFSIZ], *t = args;
  +    struct Source *sp;
  +    rpmCompressedMagic compressed = COMPRESSED_NOT;
  +    int urltype;
  +    const char *patch;
  +
  +    *t = '\0';
  +    if (db)
  +	t = stpcpy( stpcpy(t, "-b --suffix "), db);
  +    if (subdir)
  +	t = stpcpy( stpcpy(t, "-d "), subdir);
  +    if (fuzz) {
  +	t = stpcpy(t, "-F ");
  +	sprintf(t, "%10.10d", fuzz);
  +	t += strlen(t);
  +    }
  +    if (reverse)
  +	t = stpcpy(t, " -R");
  +    if (removeEmpties)
  +	t = stpcpy(t, " -E");
  +
  +    for (sp = spec->sources; sp != NULL; sp = sp->next) {
  +	if ((sp->flags & RPMFILE_PATCH) && (sp->num == c))
  +	    break;
  +    }
  +    if (sp == NULL) {
  +	rpmError(RPMERR_BADSPEC, _("No patch number %d\n"), c);
  +	return NULL;
  +    }
  +
  +    Lurlfn = rpmGenPath(NULL, "%{_patchdir}/", sp->source);
  +
  +    /* XXX On non-build parse's, file cannot be stat'd or read */
  +    if (!spec->force && (isCompressed(Lurlfn, &compressed) || checkOwners(Lurlfn))) {
  +	Lurlfn = _free(Lurlfn);
  +	return NULL;
  +    }
  +
  +    fn = NULL;
  +    urltype = urlPath(Lurlfn, &fn);
  +    switch (urltype) {
  +    case URL_IS_HTTPS:	/* XXX WRONG WRONG WRONG */
  +    case URL_IS_HTTP:	/* XXX WRONG WRONG WRONG */
  +    case URL_IS_FTP:	/* XXX WRONG WRONG WRONG */
  +    case URL_IS_HKP:	/* XXX WRONG WRONG WRONG */
  +    case URL_IS_PATH:
  +    case URL_IS_UNKNOWN:
  +	break;
  +    case URL_IS_DASH:
  +	Lurlfn = _free(Lurlfn);
  +	return NULL;
  +	/*@notreached@*/ break;
  +    }
  +
  +    patch = rpmGetPath("%{__patch}", NULL);
  +    if (strcmp(patch, "%{__patch}") == 0)
  +        patch = xstrdup("patch");
  +
  +    if (compressed) {
  +	const char *zipper;
  +
  +	switch (compressed) {
  +	default:
  +	case COMPRESSED_NOT:	/* XXX can't happen */
  +	case COMPRESSED_OTHER:
  +	case COMPRESSED_ZIP:	/* XXX wrong */
  +	    zipper = "%{__gzip}";
  +	    break;
  +	case COMPRESSED_BZIP2:
  +	    zipper = "%{__bzip2}";
  +	    break;
  +	case COMPRESSED_LZOP:
  +	    zipper = "%{__lzop}";
  +	    break;
  +	case COMPRESSED_LZMA:
  +	    zipper = "%{__lzma}";
  +	    break;
  +	}
  +	zipper = rpmGetPath(zipper, NULL);
  +
  +	sprintf(buf,
  +		"echo \"Patch #%d (%s):\"\n"
  +		"%s -d < '%s' | %s -p%d %s -s\n"
  +		"STATUS=$?\n"
  +		"if [ $STATUS -ne 0 ]; then\n"
  +		"  exit $STATUS\n"
  +		"fi",
  +		c, /*@-unrecog@*/ (const char *) basename(fn), /*@=unrecog@*/
  +		zipper,
  +		fn, patch, strip, args);
  +	zipper = _free(zipper);
  +    } else {
  +	sprintf(buf,
  +		"echo \"Patch #%d (%s):\"\n"
  +		"%s -p%d %s -s < '%s'", c, (const char *) basename(fn),
  +		patch, strip, args, fn);
  +    }
  +
  +    patch = _free(patch);
  +    Lurlfn = _free(Lurlfn);
  +    return buf;
  +}
  +/*@=boundswrite@*/
  +#endif
  +
   /**
    * Expand %setup macro into %prep scriptlet.
    * @param spec		build info
  @@ -341,6 +467,149 @@
       return 0;
   }
   
  +#ifdef	DYING
  +/**
  + * Parse %patch line.
  + * @param spec		build info
  + * @param line		current line from spec file
  + * @return		0 on success
  + */
  +/*@-boundswrite@*/
  +static int doPatchMacro(Spec spec, char *line)
  +	/*@globals rpmGlobalMacroContext, h_errno,
  +		fileSystem, internalState @*/
  +	/*@modifies spec->prep, rpmGlobalMacroContext,
  +		fileSystem, internalState  @*/
  +{
  +    char *s;
  +    char *opt_b;
  +    char *opt_d;
  +    int opt_P, opt_p, opt_R, opt_E, opt_F;
  +    char buf[BUFSIZ], *bp;
  +    int patch_nums[1024];  /* XXX - we can only handle 1024 patches! */
  +    int patch_index, x;
  +
  +    memset(patch_nums, 0, sizeof(patch_nums));
  +    opt_P = opt_p = opt_R = opt_E = opt_F = 0;
  +    opt_b = NULL;
  +    opt_d = NULL;
  +    patch_index = 0;
  +
  +    if (! strchr(" \t\n", line[6])) {
  +	/* %patchN */
  +	sprintf(buf, "%%patch -P %s", line + 6);
  +    } else {
  +	strcpy(buf, line);
  +    }
  +    
  +    /*@-internalglobs@*/	/* FIX: strtok has state */
  +    for (bp = buf; (s = strtok(bp, " \t\n")) != NULL;) {
  +	if (bp) {	/* remove 1st token (%patch) */
  +	    bp = NULL;
  +	    continue;
  +	}
  +	if (!strcmp(s, "-P")) {
  +	    opt_P = 1;
  +	} else if (!strcmp(s, "-R")) {
  +	    opt_R = 1;
  +	} else if (!strcmp(s, "-E")) {
  +	    opt_E = 1;
  +	} else if (!strcmp(s, "-b")) {
  +	    /* orig suffix */
  +	    opt_b = strtok(NULL, " \t\n");
  +	    if (! opt_b) {
  +		rpmError(RPMERR_BADSPEC,
  +			_("line %d: Need arg to %%patch -b: %s\n"),
  +			spec->lineNum, spec->line);
  +		return RPMERR_BADSPEC;
  +	    }
  +	} else if (!strcmp(s, "-z")) {
  +	    /* orig suffix */
  +	    opt_b = strtok(NULL, " \t\n");
  +	    if (! opt_b) {
  +		rpmError(RPMERR_BADSPEC,
  +			_("line %d: Need arg to %%patch -z: %s\n"),
  +			spec->lineNum, spec->line);
  +		return RPMERR_BADSPEC;
  +	    }
  +	} else if (!strcmp(s, "-F")) {
  +	    /* fuzz factor */
  +	    const char * fnum = (!strchr(" \t\n", s[2])
  +				? s+2 : strtok(NULL, " \t\n"));
  +	    char * end = NULL;
  +
  +	    opt_F = (fnum ? strtol(fnum, &end, 10) : 0);
  +	    if (! opt_F || *end) {
  +		rpmError(RPMERR_BADSPEC,
  +			_("line %d: Bad arg to %%patch -F: %s\n"),
  +			spec->lineNum, spec->line);
  +		return RPMERR_BADSPEC;
  +	    }
  +	} else if (!strcmp(s, "-d")) {
  +	    /* subdirectory */
  +	    opt_d = strtok(NULL, " \t\n");
  +	    if (! opt_d) {
  +		rpmError(RPMERR_BADSPEC,
  +			_("line %d: Need arg to %%patch -d: %s\n"),
  +			spec->lineNum, spec->line);
  +		return RPMERR_BADSPEC;
  +	    }
  +	} else if (!strncmp(s, "-p", sizeof("-p")-1)) {
  +	    /* unfortunately, we must support -pX */
  +	    if (! strchr(" \t\n", s[2])) {
  +		s = s + 2;
  +	    } else {
  +		s = strtok(NULL, " \t\n");
  +		if (s == NULL) {
  +		    rpmError(RPMERR_BADSPEC,
  +			     _("line %d: Need arg to %%patch -p: %s\n"),
  +			     spec->lineNum, spec->line);
  +		    return RPMERR_BADSPEC;
  +		}
  +	    }
  +	    if (parseNum(s, &opt_p)) {
  +		rpmError(RPMERR_BADSPEC,
  +			_("line %d: Bad arg to %%patch -p: %s\n"),
  +			spec->lineNum, spec->line);
  +		return RPMERR_BADSPEC;
  +	    }
  +	} else {
  +	    /* Must be a patch num */
  +	    if (patch_index == 1024) {
  +		rpmError(RPMERR_BADSPEC, _("Too many patches!\n"));
  +		return RPMERR_BADSPEC;
  +	    }
  +	    if (parseNum(s, &(patch_nums[patch_index]))) {
  +		rpmError(RPMERR_BADSPEC, _("line %d: Bad arg to %%patch: %s\n"),
  +			 spec->lineNum, spec->line);
  +		return RPMERR_BADSPEC;
  +	    }
  +	    patch_index++;
  +	}
  +    }
  +    /*@=internalglobs@*/
  +
  +    /* All args processed */
  +
  +    if (! opt_P) {
  +	s = doPatch(spec, 0, opt_p, opt_b, opt_R, opt_E, opt_F, opt_d);
  +	if (s == NULL)
  +	    return RPMERR_BADSPEC;
  +	appendLineStringBuf(spec->prep, s);
  +    }
  +
  +    for (x = 0; x < patch_index; x++) {
  +	s = doPatch(spec, patch_nums[x], opt_p, opt_b, opt_R, opt_E, opt_F, opt_d);
  +	if (s == NULL)
  +	    return RPMERR_BADSPEC;
  +	appendLineStringBuf(spec->prep, s);
  +    }
  +    
  +    return 0;
  +}
  +/*@=boundswrite@*/
  +#endif
  +
   /**
    * Check that all sources/patches/icons exist locally, fetching if necessary.
    */
  @@ -485,10 +754,15 @@
   	for (cp = *lines; *cp == ' ' || *cp == '\t'; cp++)
   	    ;
   /*@-boundsread@*/
  -	if (! strncmp(cp, "%setup", sizeof("%setup")-1))
  +	if (! strncmp(cp, "%setup", sizeof("%setup")-1)) {
   	    res = doSetupMacro(spec, cp);
  -	else
  +#ifdef	DYING
  +	} else if (! strncmp(cp, "%patch", sizeof("%patch")-1)) {
  +	    res = doPatchMacro(spec, cp);
  +#endif
  +	} else {
   	    appendLineStringBuf(spec->prep, *lines);
  +	}
   /*@=boundsread@*/
   	if (res && !spec->force) {
   	    freeSplitString(saveLines);
  @@ .
Received on Sun Jul 22 03:39:29 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.