From a41d5e31583356656d608bf5546ac64dbdbe9e14 Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sat, 14 Dec 2013 14:47:34 +0100 Subject: [PATCH 1/3] Fix #6 Implement packageDirectoryAndContentsMapping feature --- .../typesafe/sbt/packager/linux/LinuxPlugin.scala | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala index c7802870b..714b3c0e3 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -36,6 +36,18 @@ trait LinuxPlugin extends Plugin { */ def packageTemplateMapping(files: String*)(dir: File = new File(sys.props("java.io.tmpdir"))) = LinuxPackageMapping(files map ((dir, _))) + /** + * This method skips directories. So empty directories + * don't appear in the mapping + * @param dirs - directories to map + */ + def packageDirectoryAndContentsMapping(dirs: (File, String)*) = LinuxPackageMapping( + for { + (src, dest) <- dirs + path <- (src ***).get + if !path.isDirectory + } yield path -> path.toString.replaceFirst(src.toString, dest)) + // TODO - we'd like a set of conventions to take universal mappings and create linux package mappings. /** Create a ascii friendly string for a man page. */ From 36fba35bb35b5bbaf7b9a4d22922423bd96e0101 Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sun, 15 Dec 2013 18:13:31 +0100 Subject: [PATCH 2/3] Fix #6 Adding withContents() method --- .../packager/linux/LinuxPackageMapping.scala | 65 ++++++++++--------- .../sbt/packager/linux/LinuxPlugin.scala | 13 ++-- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala index 2c579ddc9..85fe21437 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala @@ -10,11 +10,11 @@ case class LinuxFileMetaData( permissions: String = "755", config: String = "false", docs: Boolean = false) { - + def withUser(u: String) = copy(user = u) def withGroup(g: String) = copy(group = g) def withPerms(p: String) = copy(permissions = p) - def withConfig(value:String = "true") = copy(config = value) + def withConfig(value: String = "true") = copy(config = value) def asDocs() = copy(docs = true) } @@ -22,14 +22,15 @@ case class LinuxPackageMapping( mappings: Traversable[(File, String)], fileData: LinuxFileMetaData = LinuxFileMetaData(), zipped: Boolean = false) { - + def withUser(user: String) = copy(fileData = fileData withUser user) def withGroup(group: String) = copy(fileData = fileData withGroup group) def withPerms(perms: String) = copy(fileData = fileData withPerms perms) def withConfig(c: String = "true") = copy(fileData = fileData withConfig c) + def withContents() = copy(mappings = SbtNativePackager.mapDirectoryAndContents(mappings.toSeq: _*)) def asDocs() = copy(fileData = fileData asDocs ()) - - /** Modifies the current package mapping to have gzipped data. */ + + /** Modifies the current package mapping to have gzipped data. */ def gzipped = copy(zipped = true) } @@ -37,14 +38,14 @@ case class LinuxPackageMapping( // Maybe it should share an ancestor with LinuxPackageMapping so we can configure symlinks the same time as normal files? case class LinuxSymlink(link: String, destination: String) object LinuxSymlink { - + def makeRelative(from: String, to: String): String = { val partsFrom: Seq[String] = from split "/" filterNot (_.isEmpty) val partsTo: Seq[String] = to split "/" filterNot (_.isEmpty) - + val prefixAndOne = (1 to partsFrom.length).map(partsFrom.take).dropWhile(seq => partsTo.startsWith(seq)).headOption getOrElse sys.error("Cannot symlink to yourself!") - val prefix = prefixAndOne dropRight 1 - if(prefix.length > 0) { + val prefix = prefixAndOne dropRight 1 + if (prefix.length > 0) { val escapeCount = (partsTo.length - 1) - prefix.length val escapes = (0 until escapeCount) map (i => "..") val remainder = partsFrom drop prefix.length @@ -53,29 +54,29 @@ object LinuxSymlink { } // TODO - Does this belong here? def makeSymLinks(symlinks: Seq[LinuxSymlink], pkgDir: File, relativeLinks: Boolean = true): Unit = { - for(link <- symlinks) { - // TODO - drop preceeding '/' - def dropFirstSlash(n: String): String = - if(n startsWith "/") n drop 1 - else n - def addFirstSlash(n: String): String = - if(n startsWith "/") n - else "/" + n - val to = pkgDir / dropFirstSlash(link.link) - val linkDir = to.getParentFile - if(!linkDir.isDirectory) IO.createDirectory(linkDir) - val name = IO.relativize(linkDir, to).getOrElse { - sys.error("Could not relativize names ("+to+") ("+linkDir+")!!! *(logic error)*") - } - val linkFinal = - if(relativeLinks) makeRelative(link.destination, link.link) - else addFirstSlash(link.destination) - // from ln man page - // -f --force remove existing destination files - if(!to.exists) Process(Seq("ln", "-sf", linkFinal, name), linkDir).! match { - case 0 => () - case n => sys.error("Failed to symlink " + link.destination + " to " + to) - } + for (link <- symlinks) { + // TODO - drop preceeding '/' + def dropFirstSlash(n: String): String = + if (n startsWith "/") n drop 1 + else n + def addFirstSlash(n: String): String = + if (n startsWith "/") n + else "/" + n + val to = pkgDir / dropFirstSlash(link.link) + val linkDir = to.getParentFile + if (!linkDir.isDirectory) IO.createDirectory(linkDir) + val name = IO.relativize(linkDir, to).getOrElse { + sys.error("Could not relativize names (" + to + ") (" + linkDir + ")!!! *(logic error)*") + } + val linkFinal = + if (relativeLinks) makeRelative(link.destination, link.link) + else addFirstSlash(link.destination) + // from ln man page + // -f --force remove existing destination files + if (!to.exists) Process(Seq("ln", "-sf", linkFinal, name), linkDir).! match { + case 0 => () + case n => sys.error("Failed to symlink " + link.destination + " to " + to) } + } } } diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala index 714b3c0e3..cd707b4e0 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -41,12 +41,13 @@ trait LinuxPlugin extends Plugin { * don't appear in the mapping * @param dirs - directories to map */ - def packageDirectoryAndContentsMapping(dirs: (File, String)*) = LinuxPackageMapping( - for { - (src, dest) <- dirs - path <- (src ***).get - if !path.isDirectory - } yield path -> path.toString.replaceFirst(src.toString, dest)) + def packageDirectoryAndContentsMapping(dirs: (File, String)*) = LinuxPackageMapping(mapDirectoryAndContents(dirs: _*)) + + def mapDirectoryAndContents(dirs: (File, String)*): Seq[(File, String)] = for { + (src, dest) <- dirs + path <- (src ***).get + if !path.isDirectory + } yield path -> path.toString.replaceFirst(src.toString, dest) // TODO - we'd like a set of conventions to take universal mappings and create linux package mappings. From e42a58afc0a259e21fc71f0c45e143a3a41fc8fd Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Thu, 19 Dec 2013 15:21:09 +0100 Subject: [PATCH 3/3] Removing directory filter #6 --- .../com/typesafe/sbt/packager/linux/LinuxPlugin.scala | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala index cd707b4e0..829cdcf81 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -37,16 +37,19 @@ trait LinuxPlugin extends Plugin { def packageTemplateMapping(files: String*)(dir: File = new File(sys.props("java.io.tmpdir"))) = LinuxPackageMapping(files map ((dir, _))) /** - * This method skips directories. So empty directories - * don't appear in the mapping + * @see #mapDirectoryAndContents * @param dirs - directories to map */ def packageDirectoryAndContentsMapping(dirs: (File, String)*) = LinuxPackageMapping(mapDirectoryAndContents(dirs: _*)) + /** + * This method includes files and directories. + * + * @param dirs - directories to map + */ def mapDirectoryAndContents(dirs: (File, String)*): Seq[(File, String)] = for { (src, dest) <- dirs path <- (src ***).get - if !path.isDirectory } yield path -> path.toString.replaceFirst(src.toString, dest) // TODO - we'd like a set of conventions to take universal mappings and create linux package mappings.