Skip to content

Commit

Permalink
Merge pull request #268 from jaunis/master
Browse files Browse the repository at this point in the history
Support for changelog and .changes file generation
  • Loading branch information
muuki88 committed Jun 6, 2014
2 parents 03473a6 + 3f5b573 commit 342704d
Show file tree
Hide file tree
Showing 20 changed files with 118 additions and 23 deletions.
5 changes: 3 additions & 2 deletions src/main/scala/com/typesafe/sbt/PackagerPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.typesafe.sbt

import packager._

import Keys.packageMsi
import debian.Keys.genChanges
import Keys.packageZipTarball
import Keys.packageXzTarball
import sbt._
Expand Down Expand Up @@ -40,7 +40,8 @@ object SbtNativePackager extends Plugin
makeDeploymentSettings(Universal, packageBin in Universal, "zip") ++
addPackage(Universal, packageZipTarball in Universal, "tgz") ++
makeDeploymentSettings(UniversalDocs, packageBin in UniversalDocs, "zip") ++
addPackage(UniversalDocs, packageXzTarball in UniversalDocs, "txz")
addPackage(UniversalDocs, packageXzTarball in UniversalDocs, "txz") ++
makeDeploymentSettings(Debian, genChanges in Debian, "changes")

object packageArchetype {
private[this] def genericMappingSettings: Seq[Setting[_]] = packagerSettings ++ mapGenericFilesToLinux ++ mapGenericFilesToWindows
Expand Down
53 changes: 43 additions & 10 deletions src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
debianMakePrermScript := None,
debianMakePostinstScript := None,
debianMakePostrmScript := None,
debianChangelog := None,

debianMaintainerScripts <++= (debianMakePrermScript, debianControlScriptsDirectory) map scriptMapping(Names.Prerm),
debianMaintainerScripts <++= (debianMakePreinstScript, debianControlScriptsDirectory) map scriptMapping(Names.Preinst),
Expand Down Expand Up @@ -145,8 +146,8 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
chmod(cfile, "0644")
cfile
},
debianExplodedPackage <<= (linuxPackageMappings, debianControlFile, debianMaintainerScripts, debianConffilesFile, daemonShell in Linux, linuxScriptReplacements, linuxPackageSymlinks, target, streams)
map { (mappings, _, maintScripts, _, shell, replacements, symlinks, t, streams) =>
debianExplodedPackage <<= (linuxPackageMappings, debianControlFile, debianMaintainerScripts, debianConffilesFile, debianChangelog, daemonShell in Linux, linuxScriptReplacements, linuxPackageSymlinks, target, streams)
map { (mappings, _, maintScripts, _, changelog, shell, replacements, symlinks, t, streams) =>

// Create files and directories
mappings foreach {
Expand Down Expand Up @@ -235,14 +236,16 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
chmod(md5file, "0644")
md5file
},
packageBin <<= (debianExplodedPackage, debianMD5sumsFile, target, streams) map { (pkgdir, _, tdir, s) =>
// Make the package. We put this in fakeroot, so we can build the package with root owning files.
Process(Seq("fakeroot", "--", "dpkg-deb", "--build", pkgdir.getAbsolutePath), Some(tdir)) ! s.log match {
case 0 => ()
case x => sys.error("Failure packaging debian file. Exit code: " + x)
}
file(tdir.getAbsolutePath + ".deb")
},
packageBin <<= (debianExplodedPackage, debianMD5sumsFile, debianSection, debianPriority, name, version, packageArchitecture, target, streams)
map { (pkgdir, _, section, priority, name, version, arch, tdir, s) =>
// Make the package. We put this in fakeroot, so we can build the package with root owning files.
val archive = name + "_" + version + "_" + arch + ".deb"
Process(Seq("fakeroot", "--", "dpkg-deb", "--build", pkgdir.getAbsolutePath, "../" + archive), Some(tdir)) ! s.log match {
case 0 => ()
case x => sys.error("Failure packaging debian file. Exit code: " + x)
}
tdir / ".." / archive
},
debianSign <<= (packageBin, debianSignRole, streams) map { (deb, role, s) =>
Process(Seq("dpkg-sig", "-s", role, deb.getAbsolutePath), Some(deb.getParentFile())) ! s.log match {
case 0 => ()
Expand All @@ -252,12 +255,39 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
},
lintian <<= packageBin map { file =>
Process(Seq("lintian", "-c", "-v", file.getName), Some(file.getParentFile)).!
},
genChanges <<= (packageBin, target, debianChangelog, name, version, debianPackageMetadata) map {
(pkg, tdir, changelog, name, version, data) =>
changelog match {
case None => sys.error("Cannot generate .changes file without a changelog")
case Some(chlog) => {
// dpkg-genchanges needs a debian "source" directory, different from the DEBIAN "binary" directory
val debSrc = tdir / "../tmp" / Names.DebianSource
debSrc.mkdirs()
copyAndFixPerms(chlog, debSrc / Names.Changelog, LinuxFileMetaData("0644"))
IO.writeLines(debSrc / Names.Files, List(pkg.getName + " " + data.section + " " + data.priority))
// dpkg-genchanges needs a "source" control file, located in a "debian" directory
IO.writeLines(debSrc / Names.Control, List(data.makeSourceControl()))
val changesFileName = name + "_" + version + "_" + data.architecture + ".changes"
val changesFile: File = tdir / ".." / changesFileName
try {
val changes = Process(Seq("dpkg-genchanges", "-b"), Some(tdir / "../tmp")) !!
val allChanges = List(changes)
IO.writeLines(changesFile, allChanges)
} catch {
case e: Exception => sys.error("Failure generating changes file." + e.getStackTraceString)
}
changesFile
}
}

}))

}

object DebianPlugin {
object Names {
val DebianSource = "debian"
val Debian = "DEBIAN"

//maintainer script names
Expand All @@ -268,6 +298,9 @@ object DebianPlugin {

val Control = "control"
val Conffiles = "conffiles"

val Changelog = "changelog"
val Files = "files"
}

private def postinstGroupaddTemplateSource: java.net.URL = getClass.getResource("postinst-groupadd")
Expand Down
2 changes: 2 additions & 0 deletions src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ trait DebianKeys {
val debianPackageRecommends = SettingKey[Seq[String]]("debian-package-recommends", "Packages recommended to use with the currently packaged one.")
val debianPackageInfo = SettingKey[PackageInfo]("debian-package-info", "Information (name, version, etc.) about a debian package.")
val debianPackageMetadata = SettingKey[PackageMetaData]("debian-package-metadata", "Meta data used when constructing a debian package.")
val debianChangelog = SettingKey[Option[File]]("debian-changelog", "The changelog for this deb file")
// Package building
val debianControlFile = TaskKey[File]("debian-control-file", "Makes the debian package control file.")
val debianMaintainerScripts = TaskKey[Seq[(File, String)]]("debian-maintainer-scripts", "Makes the debian maintainer scripts.")
Expand All @@ -27,6 +28,7 @@ trait DebianKeys {
val lintian = TaskKey[Unit]("lintian", "runs the debian lintian tool on the current package.")
val debianSign = TaskKey[File]("debian-sign", "runs the dpkg-sig command to sign the generated deb file.")
val debianSignRole = SettingKey[String]("debian-sign-role", "The role to use when signing a debian file (defaults to 'builder').")
val genChanges = TaskKey[File]("gen-changes", "runs the dpkg-genchanges command to generate the .changes file.")

// Debian control scripts
val debianControlScriptsDirectory = SettingKey[File]("debian-control-scripts-directory",
Expand Down
20 changes: 20 additions & 0 deletions src/main/scala/com/typesafe/sbt/packager/debian/metadata.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ case class PackageMetaData(
def makeContent(installSizeEstimate: Long = 0L): String = {
// TODO: Pretty print with line wrap.
val sb = new StringBuilder
sb append ("Source: %s\n" format info.name)
sb append ("Package: %s\n" format info.name)
sb append ("Version: %s\n" format info.version)
sb append ("Section: %s\n" format section)
Expand All @@ -34,6 +35,25 @@ case class PackageMetaData(
sb append ("Description: %s\n %s\n" format (info.summary, info.description))
sb toString
}

def makeSourceControl(): String = {
val sb = new StringBuilder
sb append ("Source: %s\n" format info.name)
sb append ("Maintainer: %s\n" format info.maintainer)
sb append ("Section: %s\n" format section)
sb append ("Priority: %s\n\n" format priority)

sb append ("Package: %s\n" format info.name)
sb append ("Architecture: %s\n" format architecture)
sb append ("Section: %s\n" format section)
sb append ("Priority: %s\n" format priority)
if (!depends.isEmpty)
sb append ("Depends: %s\n" format (depends mkString ", "))
if (!recommends.isEmpty)
sb append ("Recommends: %s\n" format (recommends mkString ", "))
sb append ("Description: %s\n %s\n" format (info.summary, info.description))
sb toString
}
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/daemon-user-deb/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

$ exists target/debian-test-0.1.0/etc
$ exists target/debian-test-0.1.0/etc/init/debian-test.conf
Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/daemon-user-shell-deb/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

# Check defaults
$ exists target/debian-test-0.1.0/DEBIAN/prerm
Expand Down
22 changes: 22 additions & 0 deletions src/sbt-test/debian/gen-changes/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import NativePackagerKeys._

packagerSettings

mapGenericFilesToLinux

name := "debian-test"

version := "0.1.0"

maintainer := "Josh Suereth <joshua.suereth@typesafe.com>"

packageSummary := "Test debian package"

packageDescription := """A fun package description of our software,
with multiple lines."""

debianPackageDependencies in Debian ++= Seq("java2-runtime", "bash (>= 2.05a-11)")

debianPackageRecommends in Debian += "git"

debianChangelog in Debian := Some(file("debian/changelog"))
5 changes: 5 additions & 0 deletions src/sbt-test/debian/gen-changes/debian/changelog
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
debian-test (0.1.0) UNRELEASED; urgency=low

* Initial release.

-- John Doe <john.doe@somedomain.com> Wed, 04 Jun 2014 15:31:10 +0200
1 change: 1 addition & 0 deletions src/sbt-test/debian/gen-changes/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/debian/gen-changes/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Run the debian packaging.
> debian:gen-changes
$ exists target/debian-test_0.1.0_all.deb
$ exists target/debian-test_0.1.0_all.changes
2 changes: 1 addition & 1 deletion src/sbt-test/debian/java-app-archetype/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb
> stage
$ exists target/universal/stage/bin/debian-test
> check-script
2 changes: 1 addition & 1 deletion src/sbt-test/debian/log-directory/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

$ exists target/debian-test-0.1.0/etc
$ exists target/debian-test-0.1.0/etc/default/debian-test
Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/override-control-files/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

$ exists target/debian-test-0.1.0/etc
$ exists target/debian-test-0.1.0/etc/default/debian-test
Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/simple-deb/test
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb
2 changes: 1 addition & 1 deletion src/sbt-test/debian/systemd-deb/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

$ exists target/debian-test-0.1.0/usr/lib/systemd/system/debian-test.service

Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/sysvinit-deb/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

$ exists target/debian-test-0.1.0/etc
$ exists target/debian-test-0.1.0/etc/default/debian-test
Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/test-mapping-helpers/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

# Template directories
$ exists target/debian-test-0.1.0/opt/test/debian-test
Expand Down
2 changes: 1 addition & 1 deletion src/sbt-test/debian/test-mapping/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb


# TODO - Test that the generic mapping did the right thing.
2 changes: 1 addition & 1 deletion src/sbt-test/debian/upstart-deb/test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Run the debian packaging.
> debian:package-bin
$ exists target/debian-test-0.1.0.deb
$ exists target/debian-test_0.1.0_all.deb

$ exists target/debian-test-0.1.0/etc
$ exists target/debian-test-0.1.0/etc/default/debian-test
Expand Down
7 changes: 7 additions & 0 deletions src/sphinx/DetailedTopics/debian.rst
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ Debian requires the following specific settings:
for example when using a package archetype, like server_application. Howeve, any autogenerated file
can be overridden by placing your own files in the ``src/debian/DEBIAN`` directory.

``changelog in Debian``
This is the changelog used by ``dpkg-genchanges`` to create the .changes file. This will allow you to
upload the debian package to a mirror.


Tasks
-----
Expand All @@ -49,6 +53,9 @@ The Debian support grants the following commands:

``debian:lintian``
Generates the ``.deb`` file and runs the ``lintian`` command to look for issues in the package. Useful for debugging.

``debian:gen-changes``
Generates the ``.changes``, and therefore the ``.deb`` package for this project.


Examples
Expand Down

0 comments on commit 342704d

Please sign in to comment.