Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refresh PR: Treat symlinks as normal files in spec file #1039

Merged
merged 1 commit into from
Oct 22, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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 = {
Expand Down
92 changes: 20 additions & 72 deletions src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand All @@ -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
}
43 changes: 0 additions & 43 deletions src/sbt-test/rpm/scriptlets-rpm/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
()
}
Expand Down
14 changes: 0 additions & 14 deletions src/sbt-test/rpm/simple-rpm/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -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") := {
Expand All @@ -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")
()
}
31 changes: 31 additions & 0 deletions src/sbt-test/rpm/symlink-rpm/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import com.typesafe.sbt.packager.linux.{LinuxPackageMapping, LinuxSymlink}

enablePlugins(JavaAppPackaging)

name := "rpm-test"
version := "0.1.0"
maintainer := "David Pennell <[email protected]>"
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")
()
}
1 change: 1 addition & 0 deletions src/sbt-test/rpm/symlink-rpm/project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version"))
4 changes: 4 additions & 0 deletions src/sbt-test/rpm/symlink-rpm/test
Original file line number Diff line number Diff line change
@@ -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