[Treepkg-commits] r59 - in trunk/recipes: . gnupg

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon May 26 17:01:01 CEST 2008


Author: bh
Date: 2008-05-26 17:01:00 +0200 (Mon, 26 May 2008)
New Revision: 59

Added:
   trunk/recipes/gnupg/
   trunk/recipes/gnupg/__init__.py
   trunk/recipes/gnupg/base.py
   trunk/recipes/gnupg/dirmngr.py
   trunk/recipes/gnupg/gnupg2.py
   trunk/recipes/gnupg/gpgme1_0.py
   trunk/recipes/gnupg/libassuan.py
   trunk/recipes/gnupg/libgcrypt.py
   trunk/recipes/gnupg/libgpg_error.py
   trunk/recipes/gnupg/libksba.py
   trunk/recipes/gnupg/pinentry.py
Log:
Add recipes for gnupg and related packages


Added: trunk/recipes/gnupg/__init__.py
===================================================================


Property changes on: trunk/recipes/gnupg/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/base.py
===================================================================
--- trunk/recipes/gnupg/base.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/base.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,208 @@
+# Copyright (C) 2007, 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Base classes for all gnupg packagers"""
+
+import os
+import re
+import inspect
+import new
+
+import treepkg.util
+import treepkg.packager
+import treepkg.run as run
+from treepkg.cmdexpand import cmdexpand
+
+
+class BaseSourcePackager(treepkg.packager.SourcePackager):
+
+    def orig_source_version(self, directory):
+        """Determines the version from the configure.ac file in directory"""
+        filename = os.path.join(directory, "configure.ac")
+        for line in open(filename):
+
+            # Matches lines like
+            # m4_define(my_version, [1.1.7])
+            # used by most of the gnupg packages
+            match = re.match(r"m4_define\(\[?my_version\]?, \[([0-9.]+)\]\)",
+                             line)
+            if match:
+                return match.group(1)
+
+            # Matches lines like.
+            # AC_INIT(pinentry, 0.7.6-cvs, [gnupg-devel at gnupg.org])
+            # pinentry is the GnuPG package that actually needs this
+            match = re.match(r"AC_INIT\([a-zA-Z_]+, ([0-9.]+)", line)
+            if match:
+                return match.group(1)
+
+        raise RuntimeError("Could not determine the version number from %s"
+                           % filename)
+
+    def determine_package_version(self, directory):
+        return "%s+svn%d" % (self.orig_source_version(directory), self.revision)
+
+    def do_package(self):
+        pkgbaseversion, pkgbasedir = self.export_sources()
+
+        run.call(cmdexpand("/bin/sh autogen.sh"), cwd=pkgbasedir,
+                 suppress_output=True)
+        orig_version = self.orig_source_version(pkgbasedir)
+
+        # patch the version number in the newly generated configure
+        # file.  autogen.sh normally determines it from svn, but here it
+        # ran on a copy that did not include the .svn subdirectories and
+        # thus could not find the svn revision.
+        treepkg.util.replace_in_file(os.path.join(pkgbasedir, "configure"),
+                                     re.escape(orig_version) + "-svn0",
+                                     orig_version + "-svn%d" % self.revision)
+
+        pkgbasename = self.pkg_basename + "_" + pkgbaseversion
+        origtargz = os.path.join(self.work_dir,
+                                 pkgbasename + ".orig.tar.gz")
+        self.create_tarball(origtargz, self.work_dir,
+                            os.path.basename(pkgbasedir))
+
+        changemsg = ("Update to SVN rev. %d" % (self.revision,))
+        self.copy_debian_directory(pkgbasedir, pkgbaseversion,
+                                   changemsg)
+
+        self.create_source_package(pkgbasedir, origtargz)
+        self.move_source_package(pkgbasename)
+
+
+class SmartSourcePackager(BaseSourcePackager):
+
+    """SourcePackager that uses pbuilder to create the source tarball.
+
+    We try to create source tarballs that are as close to the tarballs
+    created by the upstream maintainers.  For the gnupg software this
+    means need to run 'make dist' in a configured SVN working copy with
+    some additional software installed like autoconf and texinfo.  We
+    want to avoid running code from a working copy outside of the
+    pbuilder environment and to have to install recipe specific
+    additional software packages in the treepkg host system.  Therefore
+    we create the source tarball using 'pbuilder execute' with a script.
+    """
+
+    createtarball_script = """\
+#! /bin/bash
+set -e
+
+apt-get --assume-yes --force-yes install %(builddeps)s
+
+# copy the source tree to a directory that's under pbuilder control so
+# that it gets removed along with the build environment.  Otherwise we
+# end up with a directory containing files that cannot be removed by
+# treepkg
+workdir=/tmp/work
+cp -a %(basedir)s $workdir
+cd $workdir
+
+# tweak autoconf settings so that make dist produces a tar.gz, not a
+# tar.bz2. Removing all options whose names contain 'dist' should
+# achieve that.
+cp Makefile.am Makefile.am.orig
+sed -e '/AUTOMAKE_OPTIONS/ s/[a-zA-Z0-9-]*dist[a-zA-Z0-9-]*//g' \
+    Makefile.am.orig > Makefile.am
+
+./autogen.sh
+./configure --enable-maintainer-mode
+
+# revert autoconf changes, so that the original Makefile.am ends up in
+# the tarball
+mv Makefile.am.orig Makefile.am
+
+%(make_dist_command)s
+
+mv *.tar.gz %(origtargz)s
+"""
+
+    make_dist_command = "make dist"
+
+    def __init__(self, *args):
+        super(SmartSourcePackager, self).__init__(*args)
+        self.pkgbasename = None
+        self.pkgbaseversion = None
+        self.origtargz = None
+
+    def copy_workingcopy(self, dest):
+        treepkg.util.copytree(self.track.checkout_dir, dest)
+
+    def create_original_tarball(self):
+        copied_working_copy = os.path.join(self.work_dir, "copied_working_copy")
+        self.copy_workingcopy(copied_working_copy)
+
+        self.pkgbaseversion = \
+                            self.determine_package_version(copied_working_copy)
+        self.pkgbasename = self.pkg_basename + "_" + self.pkgbaseversion
+        self.origtargz = os.path.join(self.work_dir,
+                                      self.pkgbasename + ".orig.tar.gz")
+
+        script = (self.createtarball_script
+                  % dict(builddeps=" ".join(self.track.dependencies_required()
+                                            | self.tarball_dependencies),
+                         basedir=copied_working_copy,
+                         origtargz=self.origtargz,
+                         make_dist_command=self.make_dist_command))
+        script_name = os.path.join(self.work_dir, "createtarball")
+        treepkg.util.writefile(script_name, script, 0755)
+
+        treepkg.util.ensure_directory(self.src_dir)
+        self.track.builder.run_script(script_name,
+                                      logfile=os.path.join(self.src_dir,
+                                                           "tarball.log"),
+                                      bindmounts=[self.work_dir, self.src_dir])
+
+    def create_orig_dir(self):
+        """Unpacks the tarball created by create_original_tarball into work_dir
+        """
+        unpack_dir = os.path.join(self.work_dir, "unpack")
+        treepkg.util.ensure_directory(unpack_dir)
+        run.call(cmdexpand("tar xzf $origtargz -C $unpack_dir",
+                           unpack_dir=unpack_dir, origtargz=self.origtargz))
+        unpacked_files = treepkg.util.listdir_abs(unpack_dir)
+        if len(unpacked_files) != 1:
+            raise RuntimeError("%s should have extracted to a single directory",
+                               origtargz)
+        unpacked_dir = unpacked_files[0]
+
+        orig_dir = os.path.join(self.work_dir, os.path.basename(unpacked_dir))
+        os.rename(unpacked_dir, orig_dir)
+        return orig_dir
+
+    def do_package(self):
+        self.create_original_tarball()
+        orig_dir = self.create_orig_dir()
+
+        changemsg = ("Update to SVN rev. %d" % (self.revision,))
+        self.copy_debian_directory(orig_dir, self.pkgbaseversion, changemsg)
+
+        self.create_source_package(orig_dir, self.origtargz)
+        self.move_source_package(self.pkgbasename)
+
+
+def define_gnupg_packager(pkg_basename,
+                          tarball_dependencies=("autoconf", "automake",
+                                                "texinfo", "subversion"),
+                          make_dist_command=None):
+    """Create a SourcePackager for a GnuPG package in the caller's globals().
+    This is a helper function for the modules in the recipe.gnupg package.
+    """
+    base_class = BaseSourcePackager
+    class_attributes = dict(pkg_basename=pkg_basename)
+    if tarball_dependencies is not None:
+        base_class = SmartSourcePackager
+        class_attributes["tarball_dependencies"] = set(tarball_dependencies)
+    if make_dist_command is not None:
+        base_class = SmartSourcePackager
+        class_attributes["make_dist_command"] = make_dist_command
+
+    caller_globals = inspect.currentframe().f_back.f_globals
+    caller_globals["SourcePackager"] = new.classobj("SourcePackager",
+                                                    (base_class,),
+                                                    class_attributes)


Property changes on: trunk/recipes/gnupg/base.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/dirmngr.py
===================================================================
--- trunk/recipes/gnupg/dirmngr.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/dirmngr.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build dirmngr from SVN"""
+
+import base
+base.define_gnupg_packager("dirmngr")


Property changes on: trunk/recipes/gnupg/dirmngr.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/gnupg2.py
===================================================================
--- trunk/recipes/gnupg/gnupg2.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/gnupg2.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build gnugp2 from SVN"""
+
+import base
+base.define_gnupg_packager("gnupg2")


Property changes on: trunk/recipes/gnupg/gnupg2.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/gpgme1_0.py
===================================================================
--- trunk/recipes/gnupg/gpgme1_0.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/gpgme1_0.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build gpgme from SVN"""
+
+import base
+base.define_gnupg_packager("gpgme1.0")


Property changes on: trunk/recipes/gnupg/gpgme1_0.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/libassuan.py
===================================================================
--- trunk/recipes/gnupg/libassuan.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/libassuan.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build libassuan from SVN"""
+
+import base
+base.define_gnupg_packager("libassuan")


Property changes on: trunk/recipes/gnupg/libassuan.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/libgcrypt.py
===================================================================
--- trunk/recipes/gnupg/libgcrypt.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/libgcrypt.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build libgrypt from SVN"""
+
+import base
+base.define_gnupg_packager("libgcrypt11")


Property changes on: trunk/recipes/gnupg/libgcrypt.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/libgpg_error.py
===================================================================
--- trunk/recipes/gnupg/libgpg_error.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/libgpg_error.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build libgpg-error from SVN"""
+
+import base
+base.define_gnupg_packager("libgpg-error")


Property changes on: trunk/recipes/gnupg/libgpg_error.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/libksba.py
===================================================================
--- trunk/recipes/gnupg/libksba.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/libksba.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,15 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build libksba from SVN"""
+
+import base
+
+# The libksba sources require a full build before a make dist --
+# otherwise make dist fails.  So run make without arguments once before
+# 'make dist'
+base.define_gnupg_packager("libksba", make_dist_command="make\nmake dist")


Property changes on: trunk/recipes/gnupg/libksba.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native

Added: trunk/recipes/gnupg/pinentry.py
===================================================================
--- trunk/recipes/gnupg/pinentry.py	2008-05-23 19:29:42 UTC (rev 58)
+++ trunk/recipes/gnupg/pinentry.py	2008-05-26 15:01:00 UTC (rev 59)
@@ -0,0 +1,11 @@
+# Copyright (C) 2008 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh at intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Recipe to build pinentry from SVN"""
+
+import base
+base.define_gnupg_packager("pinentry")


Property changes on: trunk/recipes/gnupg/pinentry.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + native



More information about the Treepkg-commits mailing list