RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Ralf S. Engelschall Root: /v/rpm/cvs Email: [EMAIL PROTECTED] Module: rpm Date: 21-Jun-2007 20:08:38 Branch: HEAD Handle: 2007062119083701 Modified files: rpm CHANGES rpm/build parsePrep.c Log: Improve %setup and %patch: 1. Let %setup use the existing %{__tar} macro (instead of hard-coding a simple "tar") and let %patch use the existing %{__patch} macro (instead of hard-coding a simple "patch") in order to allow one to specify particular absolute paths to tar(1) and patch(1) via "macros" file. 2. Add support for patch(1)'s "-d" option (for changing into a sub-dir before applying the patch) in %patch macros. PS: The expansion of %{__tar} and %{__patch} soon might be replaced with a more elegant approach, too. Summary: Revision Changes Path 1.1388 +2 -0 rpm/CHANGES 2.74 +42 -10 rpm/build/parsePrep.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.1387 -r1.1388 CHANGES --- rpm/CHANGES 21 Jun 2007 15:55:29 -0000 1.1387 +++ rpm/CHANGES 21 Jun 2007 18:08:37 -0000 1.1388 @@ -1,4 +1,6 @@ 4.5 -> 5.0: + - rse: allow actually used tar(1) and patch(1) tools to be set via %__tar and %__patch + - rse: add support for patch(1)'s "-d" option to internal macro %patch - fray: allow -bb --short-circuit - rse: allow leading whitespaces on %setup and %patch lines in *.spec files - rse: resolve portability issue related to double definition of mergesort(3) @@ . patch -p0 <<'@@ .' Index: rpm/build/parsePrep.c ============================================================================ $ cvs diff -u -r2.73 -r2.74 parsePrep.c --- rpm/build/parsePrep.c 21 Jun 2007 13:53:44 -0000 2.73 +++ rpm/build/parsePrep.c 21 Jun 2007 18:08:38 -0000 2.74 @@ -68,7 +68,7 @@ /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ static char *doPatch(Spec spec, int c, int strip, const char *db, - int reverse, int removeEmpties, int fuzz) + int reverse, int removeEmpties, int fuzz, const char *subdir) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] rpmGlobalMacroContext, fileSystem, internalState @*/ { @@ -78,6 +78,7 @@ struct Source *sp; rpmCompressedMagic compressed = COMPRESSED_NOT; int urltype; + const char *patch; *t = '\0'; if (db) { @@ -86,6 +87,8 @@ #endif t = stpcpy( stpcpy(t, "--suffix "), db); } + if (subdir) + t = stpcpy( stpcpy(t, "-d "), subdir); if (fuzz) { t = stpcpy(t, "-F "); sprintf(t, "%10.10d", fuzz); @@ -129,6 +132,10 @@ /[EMAIL PROTECTED]@*/ break; } + patch = rpmGetPath("%{__patch}", NULL); + if (strcmp(patch, "%{__patch}") == 0) + patch = "patch"; + if (compressed) { const char *zipper; @@ -153,22 +160,23 @@ sprintf(buf, "echo \"Patch #%d (%s):\"\n" - "%s -d < '%s' | patch -p%d %s -s\n" + "%s -d < '%s' | %s -p%d %s -s\n" "STATUS=$?\n" "if [ $STATUS -ne 0 ]; then\n" " exit $STATUS\n" "fi", c, /[EMAIL PROTECTED]@*/ (const char *) basename(fn), /[EMAIL PROTECTED]@*/ zipper, - fn, strip, args); + fn, patch, strip, args); zipper = _free(zipper); } else { sprintf(buf, "echo \"Patch #%d (%s):\"\n" - "patch -p%d %s -s < '%s'", c, (const char *) basename(fn), - strip, args, fn); + "%s -p%d %s -s < '%s'", c, (const char *) basename(fn), + patch, strip, args, fn); } + patch = _free(patch); Lurlfn = _free(Lurlfn); return buf; } @@ -194,6 +202,7 @@ struct Source *sp; rpmCompressedMagic compressed = COMPRESSED_NOT; int urltype; + const char *tar; for (sp = spec->sources; sp != NULL; sp = sp->next) { if ((sp->flags & RPMFILE_SOURCE) && (sp->num == c)) { @@ -233,6 +242,10 @@ /[EMAIL PROTECTED]@*/ break; } + tar = rpmGetPath("%{_tarbin}", NULL); + if (strcmp(tar, "%{_tarbin}") == 0) + tar = "tar"; + if (compressed != COMPRESSED_NOT) { const char *zipper; int needtar = 1; @@ -267,8 +280,13 @@ *t++ = '\''; t = stpcpy(t, fn); *t++ = '\''; - if (needtar) - t = stpcpy( stpcpy( stpcpy(t, " | tar "), taropts), " -"); + if (needtar) { + t = stpcpy(t, " | "); + t = stpcpy(t, tar); + t = stpcpy(t, " "); + t = stpcpy(t, taropts); + t = stpcpy(t, " -"); + } t = stpcpy(t, "\n" "STATUS=$?\n" @@ -277,11 +295,14 @@ "fi"); } else { buf[0] = '\0'; - t = stpcpy( stpcpy(buf, "tar "), taropts); + t = stpcpy(buf, tar); + t = stpcpy(t, " "); + t = stpcpy(t, taropts); *t++ = ' '; t = stpcpy(t, fn); } + tar = _free(tar); Lurlfn = _free(Lurlfn); return buf; } @@ -457,6 +478,7 @@ fileSystem, internalState @*/ { char *opt_b; + char *opt_d; int opt_P, opt_p, opt_R, opt_E, opt_F; char *s; char buf[BUFSIZ], *bp; @@ -466,6 +488,7 @@ 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])) { @@ -518,6 +541,15 @@ 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])) { @@ -556,14 +588,14 @@ /* All args processed */ if (! opt_P) { - s = doPatch(spec, 0, opt_p, opt_b, opt_R, opt_E, opt_F); + 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); + 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); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org