diff -urpa rpm-4.5.orig/build/parsePrep.c rpm-4.5/build/parsePrep.c --- rpm-4.5.orig/build/parsePrep.c 2007-11-08 00:26:48.000000000 +0000 +++ rpm-4.5/build/parsePrep.c 2018-02-23 11:51:54.161446282 +0000 @@ -189,11 +189,13 @@ static const char *doUntar(Spec spec, in { const char *fn, *Lurlfn; static char buf[BUFSIZ]; - char *taropts; + char taropts[8]; char *t = NULL; struct Source *sp; rpmCompressedMagic compressed = COMPRESSED_NOT; int urltype; + const char *tar; + int rubygem = 0; for (sp = spec->sources; sp != NULL; sp = sp->next) { if ((sp->flags & RPMFILE_SOURCE) && (sp->num == c)) { @@ -205,8 +207,18 @@ static const char *doUntar(Spec spec, in return NULL; } + t = strrchr(sp->source, '.'); + if(t && !strcasecmp(t, ".gem")) + rubygem = 1; + + t = stpcpy(taropts, "-x"); /*@-internalglobs@*/ /* FIX: shrug */ - taropts = ((rpmIsVerbose() && !quietly) ? "-xvvf" : "-xf"); + if(rpmIsVerbose() && !quietly) + t = stpcpy(t, "vv"); + if(rubygem) + t = stpcpy(t, "m"); + + t = stpcpy(t, "f"); /*@=internalglobs@*/ Lurlfn = rpmGenPath(NULL, "%{_sourcedir}/", sp->source); @@ -233,6 +245,12 @@ static const char *doUntar(Spec spec, in /*@notreached@*/ break; } + tar = rpmGetPath("%{?__tar}", NULL); + if (!(tar && *tar != '\0')) { + tar = _free(tar); + tar = xstrdup("tar"); + } + if (compressed != COMPRESSED_NOT) { const char *zipper; int needtar = 1; @@ -267,8 +285,13 @@ static const char *doUntar(Spec spec, in *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 +300,24 @@ static const char *doUntar(Spec spec, in "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); + if(rubygem) { + t = stpcpy(t, + "\n" + "if [ -f data.tar.gz ]; then\n" + " tar "); + t = stpcpy(t, taropts); + t = stpcpy(t, + " data.tar.gz\n" + "fi"); + } } + tar = _free(tar); Lurlfn = _free(Lurlfn); return buf; } @@ -390,6 +426,20 @@ static int doSetupMacro(Spec spec, char appendLineStringBuf(spec->prep, buf); } + /* check if source is a ruby gem */ + { struct Source *sp; + for (sp = spec->sources; sp != NULL; sp = sp->next) { + if ((sp->flags & RPMFILE_SOURCE) && (sp->num == 0)) { + break; + } + } + if (sp != NULL) { + char *t = strrchr(sp->source, '.'); + if(t && !strcasecmp(t, ".gem")) + createDir = 1; + } + } + /* if necessary, create and cd into the proper dir */ if (createDir) { sprintf(buf, MKDIR_P " '%s'\ncd '%s'",