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 b6d40c95f..4c1a3afc9 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala @@ -2,6 +2,7 @@ package com.typesafe.sbt.packager.rpm import sbt._ import com.typesafe.sbt.packager.Compat._ +import com.typesafe.sbt.packager.linux.LinuxSymlink object RpmHelper { @@ -65,6 +66,8 @@ object RpmHelper { if file.exists && !file.isDirectory() target = buildroot / dest } copyWithZip(file, target, mapping.zipped) + + LinuxSymlink.makeSymLinks(spec.symlinks, buildroot, relativeLinks = false) } private[this] def writeSpecFile(spec: RpmSpec, workArea: File, log: sbt.Logger): File = { diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala index 9d3f6fdf1..d6cfd89b5 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala @@ -60,35 +60,22 @@ case class RpmScripts(pretrans: Option[String] = None, preun: Option[String] = None, postun: Option[String] = None) { - def pretransContent(): String = - pretrans.fold("")("\n%pretrans\n" + _ + "\n\n") - - def preContent(): String = - pre.fold("")("\n%pre\n" + _ + "\n\n") - - def postContent(buildSymlinkScript: Option[String]): String = { - val scripts = Seq(post, buildSymlinkScript).flatten - if (scripts.isEmpty) - "" - else - "\n%post\n" + scripts.mkString("\n") + "\n\n" - } - - def posttransContent(): String = - posttrans.fold("")("\n%posttrans\n" + _ + "\n\n") - - def verifyscriptContent(): String = - verifyscript.fold("")("\n%verifyscript\n" + _ + "\n\n") - - def preunContent(): String = - preun.fold("")("\n%preun\n" + _ + "\n\n") - - def postunContent(tearDownSymlinkScript: Option[String]): String = { - val scripts = Seq(postun, tearDownSymlinkScript).flatten - if (scripts.isEmpty) - "" - else - "\n%postun\n" + scripts.mkString("\n") + "\n\n" + def pretransContent(): String = buildScript("pretrans", pretrans) + def preContent(): String = buildScript("pre", pre) + def postContent(): String = buildScript("post", post) + def posttransContent(): String = buildScript("posttrans", posttrans) + def verifyscriptContent(): String = buildScript("verifyscript", verifyscript) + def preunContent(): String = buildScript("preun", preun) + def postunContent(): String = buildScript("postun", postun) + + private def buildScript(name: String, script: Option[String]): String = { + script.map { code => + s""" + |%$name + |$code + | + |""".stripMargin + } getOrElse "" } @deprecated( @@ -207,6 +194,8 @@ case class RpmSpec(meta: RpmMetadata, mapping <- mappings (file, dest) <- mapping.mappings } sb append makeFilesLine(dest, mapping.fileData, file.isDirectory) + + symlinks foreach (l => sb append s"${l.link}\n") sb.toString } @@ -276,11 +265,11 @@ case class RpmSpec(meta: RpmMetadata, // write scriptlets sb append scriptlets.pretransContent() sb append scriptlets.preContent() - sb append scriptlets.postContent(buildSymlinkScript(meta.name, installDir, symlinks)) + sb append scriptlets.postContent() sb append scriptlets.verifyscriptContent() sb append scriptlets.posttransContent() sb append scriptlets.preunContent() - sb append scriptlets.postunContent(teardownSymlinkScript(meta.name, installDir, symlinks)) + sb append scriptlets.postunContent() // Write file mappings sb append fileSection @@ -296,45 +285,4 @@ case class RpmSpec(meta: RpmMetadata, } sb.toString } - - private def buildSymlinkScript(appName: String, installDir: String, symlinks: Seq[LinuxSymlink]): Option[String] = - if (symlinks.isEmpty) - None - else { - val relocateLinks = symlinks - .map { symlink => - s"""rm -rf $$(relocateLink ${symlink.link} $installDir $appName $$RPM_INSTALL_PREFIX) && ln -s $$(relocateLink ${symlink.destination} $installDir $appName $$RPM_INSTALL_PREFIX) $$(relocateLink ${symlink.link} $installDir $appName $$RPM_INSTALL_PREFIX)""" - } - .mkString("\n") - - Some(relocateLinkFunction + "\n" + relocateLinks) - } - - private def teardownSymlinkScript(appName: String, installDir: String, symlinks: Seq[LinuxSymlink]): Option[String] = - if (symlinks.isEmpty) - None - else { - val checkUninstall = "if [ $1 -eq 0 ] ;\nthen" - val sourceAppConfig = - s""" [ -e /etc/sysconfig/$appName ] && . /etc/sysconfig/$appName""" - val cleanupLinks = symlinks - .map { symlink => - s""" rm -rf $$(relocateLink ${symlink.link} $installDir $appName $$PACKAGE_PREFIX)""" - } - .mkString("\n") - - Some(relocateLinkFunction + "\n" + checkUninstall + "\n" + sourceAppConfig + "\n" + cleanupLinks + "\nfi") - } - - private def relocateLinkFunction: String = - """ - |relocateLink() { - | if [ -n "$4" ] ; - | then - | RELOCATED_INSTALL_DIR="$4/$3" - | echo "${1/$2/$RELOCATED_INSTALL_DIR}" - | else - | echo "$1" - | fi - |}""".stripMargin } diff --git a/src/sbt-test/rpm/scriptlets-rpm/build.sbt b/src/sbt-test/rpm/scriptlets-rpm/build.sbt index 70cc14f59..e3618b94d 100644 --- a/src/sbt-test/rpm/scriptlets-rpm/build.sbt +++ b/src/sbt-test/rpm/scriptlets-rpm/build.sbt @@ -36,53 +36,10 @@ TaskKey[Unit]("checkSpecFile") := { val spec = IO.read(target.value / "rpm" / "SPECS" / "rpm-test.spec") assert(spec contains "%pre\necho \"pre-install\"", "Spec doesn't contain %pre scriptlet") assert(spec contains "%post\necho \"post-install\"", "Spec doesn't contain %post scriptlet") - assert( - spec contains - """ - |%post - |echo "post-install" - | - |relocateLink() { - | if [ -n "$4" ] ; - | then - | RELOCATED_INSTALL_DIR="$4/$3" - | echo "${1/$2/$RELOCATED_INSTALL_DIR}" - | else - | echo "$1" - | fi - |} - |rm -rf $(relocateLink /etc/rpm-test /usr/share/rpm-test rpm-test $RPM_INSTALL_PREFIX) && ln -s $(relocateLink /usr/share/rpm-test/conf /usr/share/rpm-test rpm-test $RPM_INSTALL_PREFIX) $(relocateLink /etc/rpm-test /usr/share/rpm-test rpm-test $RPM_INSTALL_PREFIX) - |""".stripMargin, - "%post scriptlet does not contain relocateLink" - ) - assert(spec contains "%pretrans\necho \"pretrans\"", "Spec doesn't contain %pretrans scriptlet") assert(spec contains "%posttrans\necho \"posttrans\"", "Spec doesn't contain %posttrans scriptlet") assert(spec contains "%preun\necho \"pre-uninstall\"", "Spec doesn't contain %preun scriptlet") assert(spec contains "%postun\necho \"post-uninstall\"", "Spec doesn't contain %postun scriptlet") - assert( - spec contains - """ - |%postun - |echo "post-uninstall" - | - |relocateLink() { - | if [ -n "$4" ] ; - | then - | RELOCATED_INSTALL_DIR="$4/$3" - | echo "${1/$2/$RELOCATED_INSTALL_DIR}" - | else - | echo "$1" - | fi - |} - |if [ $1 -eq 0 ] ; - |then - | [ -e /etc/sysconfig/rpm-test ] && . /etc/sysconfig/rpm-test - | rm -rf $(relocateLink /etc/rpm-test /usr/share/rpm-test rpm-test $PACKAGE_PREFIX) - |fi - |""".stripMargin, - "%postun scriptlet does not contain relocate link" - ) streams.value.log.success("Successfully tested rpm test file") () } diff --git a/src/sbt-test/rpm/simple-rpm/build.sbt b/src/sbt-test/rpm/simple-rpm/build.sbt index 5919a5162..735e12740 100644 --- a/src/sbt-test/rpm/simple-rpm/build.sbt +++ b/src/sbt-test/rpm/simple-rpm/build.sbt @@ -29,8 +29,6 @@ linuxPackageMappings in Rpm := { Seq(LinuxPackageMapping(Seq(mapping1, mapping2))) } -linuxPackageSymlinks in Rpm := Seq(LinuxSymlink("/etc/link1", "destination1"), LinuxSymlink("link2", "destination2")) - defaultLinuxInstallLocation in Rpm := "/opt/foo" TaskKey[Unit]("checkSpecFile") := { @@ -56,18 +54,6 @@ TaskKey[Unit]("checkSpecFile") := { "Contains package mappings" ) - assert( - spec contains - "ln -s $(relocateLink destination1 /opt/foo/rpm-test rpm-test $RPM_INSTALL_PREFIX) $(relocateLink /etc/link1 /opt/foo/rpm-test rpm-test $RPM_INSTALL_PREFIX)", - "Contains package symlink link (1)" - ) - - assert( - spec contains - "ln -s $(relocateLink destination2 /opt/foo/rpm-test rpm-test $RPM_INSTALL_PREFIX) $(relocateLink link2 /opt/foo/rpm-test rpm-test $RPM_INSTALL_PREFIX)", - "Contains package symlink link (2)" - ) - streams.value.log.success("Successfully tested rpm test file") () } diff --git a/src/sbt-test/rpm/symlink-rpm/build.sbt b/src/sbt-test/rpm/symlink-rpm/build.sbt new file mode 100644 index 000000000..fadfeacdf --- /dev/null +++ b/src/sbt-test/rpm/symlink-rpm/build.sbt @@ -0,0 +1,31 @@ +import com.typesafe.sbt.packager.linux.{LinuxPackageMapping, LinuxSymlink} + +enablePlugins(JavaAppPackaging) + +name := "rpm-test" +version := "0.1.0" +maintainer := "David Pennell " +packageSummary := "Test rpm package" +packageName in Linux := "rpm-package" +packageDescription := + """A fun package description of our software, + with multiple lines.""" + +rpmRelease := "1" +rpmVendor := "typesafe" +rpmUrl := Some("http://github.com/sbt/sbt-native-packager") +rpmLicense := Some("BSD") + +linuxPackageSymlinks := { + val helloSymlink = LinuxSymlink(((file(defaultLinuxInstallLocation.value) / (packageName in Linux).value / "lib") / "hello.link").toString, "/fake/hello.tx") + Seq(helloSymlink) +} + +TaskKey[Unit]("check-spec-file") := { + val spec = IO.read(target.value / "rpm" / "SPECS" / "rpm-package.spec") + streams.value.log.success(spec) + assert(spec contains "%attr(0644,root,root) /usr/share/rpm-package/lib/rpm-test.rpm-test-0.1.0.jar", "Wrong installation path") + assert(spec contains "/usr/share/rpm-package/lib/hello.link", "Missing or incorrect symbolic link") + streams.value.log.success("Successfully tested rpm-package file") + () +} diff --git a/src/sbt-test/rpm/symlink-rpm/project/plugins.sbt b/src/sbt-test/rpm/symlink-rpm/project/plugins.sbt new file mode 100644 index 000000000..b53de154c --- /dev/null +++ b/src/sbt-test/rpm/symlink-rpm/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version")) diff --git a/src/sbt-test/rpm/symlink-rpm/test b/src/sbt-test/rpm/symlink-rpm/test new file mode 100644 index 000000000..c9d0ddc80 --- /dev/null +++ b/src/sbt-test/rpm/symlink-rpm/test @@ -0,0 +1,4 @@ +> rpm:packageBin +$ exists target/rpm/RPMS/noarch/rpm-package-0.1.0-1.noarch.rpm +$ exists target/rpm/SPECS/rpm-package.spec +> checkSpecFile