From 7ee2664e40addeb4c1bfa5e04f76c44b406cf280 Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sat, 27 May 2017 15:13:50 +0200 Subject: [PATCH 1/2] Implement stage command for rpm --- .../typesafe/sbt/packager/rpm/RpmHelper.scala | 55 +++++++++++++------ .../typesafe/sbt/packager/rpm/RpmPlugin.scala | 8 +-- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala index 52616178f..8bfc35d63 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala @@ -11,16 +11,35 @@ object RpmHelper { def hostVendor = Process(Seq("rpm", "-E", "%{_host_vendor}")) !! - def buildRpm(spec: RpmSpec, workArea: File, log: sbt.Logger): File = { - // TODO - check the spec for errors. + /** + * Prepares the staging directory for the rpm build command. + * + * @param spec The RpmSpec + * @param workArea The target + * @param log Logger + * @return the `workArea` + */ + def stage(spec: RpmSpec, workArea: File, log: sbt.Logger): File = { buildWorkArea(workArea) copyFiles(spec, workArea, log) writeSpecFile(spec, workArea, log) + spec.validate(log) + workArea + } - buildPackage(workArea, spec, log) + /** + * Build the rpm package + * + * @param spec The RpmSpec + * @param stagingArea Prepared staging area + * @param log Logger + * @return The rpm package + */ + def buildRpm(spec: RpmSpec, stagingArea: File, log: sbt.Logger): File = { + buildPackage(stagingArea, spec, log) // We should probably return the File that was created. val rpmname = "%s-%s-%s.%s.rpm" format (spec.meta.name, spec.meta.version, spec.meta.release, spec.meta.arch) - workArea / "RPMS" / spec.meta.arch / rpmname + stagingArea / "RPMS" / spec.meta.arch / rpmname } private[this] def copyFiles(spec: RpmSpec, workArea: File, log: sbt.Logger): Unit = { @@ -70,20 +89,20 @@ object RpmHelper { case Some(arch) => Seq("setarch", arch) case None => Seq() }) ++ Seq( - "rpmbuild", - "-bb", - "--target", - spec.meta.arch + '-' + spec.meta.vendor + '-' + spec.meta.os, - "--buildroot", - buildRoot.getAbsolutePath, - "--define", - "_topdir " + workArea.getAbsolutePath, - "--define", - "_tmppath " + tmpRpmBuildDir.getAbsolutePath - ) ++ ( - if (gpg) Seq("--define", "_gpg_name " + "", "--sign") - else Seq.empty - ) ++ Seq(spec.meta.name + ".spec") + "rpmbuild", + "-bb", + "--target", + spec.meta.arch + '-' + spec.meta.vendor + '-' + spec.meta.os, + "--buildroot", + buildRoot.getAbsolutePath, + "--define", + "_topdir " + workArea.getAbsolutePath, + "--define", + "_tmppath " + tmpRpmBuildDir.getAbsolutePath + ) ++ ( + if (gpg) Seq("--define", "_gpg_name " + "", "--sign") + else Seq.empty + ) ++ Seq(spec.meta.name + ".spec") log.debug("Executing rpmbuild with: " + args.mkString(" ")) (Process(args, Some(specsDir)) ! log) match { case 0 => () diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala index 53b0a0c37..eb18eecd2 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala @@ -154,12 +154,8 @@ object RpmPlugin extends AutoPlugin { (linuxPackageSymlinks in Rpm).value, (defaultLinuxInstallLocation in Rpm).value ), - packageBin in Rpm := { - val log = streams.value.log - val spec = rpmSpecConfig.value - spec.validate(log) - RpmHelper.buildRpm(spec, (target in Rpm).value, log) - }, + stage in Rpm := RpmHelper.stage(rpmSpecConfig.value, (target in Rpm).value, streams.value.log), + packageBin in Rpm := RpmHelper.buildRpm(rpmSpecConfig.value, (stage in Rpm).value, streams.value.log), rpmLint := { Process(Seq("rpmlint", "-v", (packageBin in Rpm).value.getAbsolutePath)) ! streams.value.log match { case 0 => () From 99c73fae061a92a0bd61967fb2bf9453e32ef48b Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sat, 27 May 2017 15:20:07 +0200 Subject: [PATCH 2/2] Add tests for rpm:stage --- src/sbt-test/rpm/simple-rpm/build.sbt | 5 ----- src/sbt-test/rpm/simple-rpm/test | 9 ++++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/sbt-test/rpm/simple-rpm/build.sbt b/src/sbt-test/rpm/simple-rpm/build.sbt index 634c86980..75e963ab7 100644 --- a/src/sbt-test/rpm/simple-rpm/build.sbt +++ b/src/sbt-test/rpm/simple-rpm/build.sbt @@ -33,11 +33,6 @@ linuxPackageSymlinks in Rpm := Seq(LinuxSymlink("/etc/link1", "destination1"), L defaultLinuxInstallLocation in Rpm := "/opt/foo" -TaskKey[Unit]("unzip") <<= (packageBin in Rpm, streams) map { (rpmFile, streams) => - val rpmPath = Seq(rpmFile.getAbsolutePath) - Process("rpm2cpio", rpmPath) #| Process("cpio -i --make-directories") ! streams.log -} - TaskKey[Unit]("checkSpecFile") <<= (target, streams) map { (target, out) => val spec = IO.read(target / "rpm" / "SPECS" / "rpm-test.spec") assert(spec contains "Name: rpm-test", "Contains project name") diff --git a/src/sbt-test/rpm/simple-rpm/test b/src/sbt-test/rpm/simple-rpm/test index e6620db76..3ed170d50 100644 --- a/src/sbt-test/rpm/simple-rpm/test +++ b/src/sbt-test/rpm/simple-rpm/test @@ -1,7 +1,6 @@ -# Run the debian packaging. +> rpm:stage +$ exists target/rpm +> checkSpecFile +# Run the rpm packaging. > rpm:package-bin $ exists target/rpm/RPMS/x86_64/rpm-test-0.1.0-1.x86_64.rpm - -> unzip - -> checkSpecFile \ No newline at end of file