changeset 406:52e3c3976e53 treepkg-status

inital checkin for new publishpackages processing
author Bjoern Ricks <bricks@intevation.de>
date Tue, 13 Jul 2010 16:46:17 +0000
parents eaf04fc0f615
children fb473f67345b
files bin/publishdebianpackages.py treepkg/info/status.py
diffstat 2 files changed, 157 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/publishdebianpackages.py	Tue Jul 13 16:46:17 2010 +0000
@@ -0,0 +1,156 @@
+#! /usr/bin/python
+# Copyright (C) 2007 - 2010 by Intevation GmbH
+# Authors:
+# Bernhard Herzog <bh@intevation.de>
+# Bjoern Ricks    <bjoern.ricks@intevation.de>
+#
+# This program is free software under the GPL (>=v2)
+# Read the file COPYING coming with the software for details.
+
+"""Publishes selected packages created by treepkg"""
+
+import os
+import sys
+import shlex
+
+from optparse import OptionParser
+from ConfigParser import SafeConfigParser
+
+import treepkgcmd
+from treepkg.readconfig import read_config_section, convert_bool
+from treepkg.run import call, capture_output
+from treepkg.cmdexpand import cmdexpand
+from treepkg.publish import *
+from treepkg.util import md5sum
+from treepkg.info.status import TreepkgInfo
+
+config_desc = ["distribution", "section", "num_newest",
+               "build_user", "build_host", "build_listpackages",
+               "publish_user", "publish_host",
+               ("architectures", shlex.split, "i386, source"),
+               ("after_upload_hook", shlex.split),
+               ("publish_remove_old_packages", convert_bool),
+               ("publish_dir", remove_trailing_slashes),
+               ("cachedir",
+                lambda s: expand_filename(remove_trailing_slashes(s)))]
+
+def read_config(filename):
+    if not os.path.exists(filename):
+        print >>sys.stderr, "Config file %s does not exist" % filename
+        sys.exit(1)
+    parser = SafeConfigParser()
+    parser.read([filename])
+    return read_config_section(parser, "publishpackages", config_desc)
+
+def parse_commandline():
+    parser = OptionParser()
+    parser.set_defaults(config_file=os.path.join(treepkgcmd.topdir,
+                                                 "publishpackages.cfg"),
+                        quiet=False)
+    parser.add_option("--config-file",
+                      help=("The configuration file."
+                            " Default is publishpackages.cfg"))
+    parser.add_option("--dist",
+                      help=("The debian distribution name to use on"
+                            " the publishing system"))
+    parser.add_option("--section",
+                      help=("The debian distribution section name to use on"
+                            " the publishing system"))
+    parser.add_option("--track",
+                      help=("The package track whose files are to be"
+                            " published. If not given, files of all tracks"
+                            " will be published"))
+    parser.add_option("--quiet", action="store_true",
+                      help=("Do not print progress meters or other"
+                            " informational output"))
+    return parser.parse_args()
+
+def get_treepkg_info(variables):
+    runremote = prefix_for_remote_command(variables["build_user"],
+                                          variables["build_host"])
+    xml = capture_output(cmdexpand("@runremote $build_listpackages"
+                                     " --newest=$num_newest",
+                                     #runremote=runremote,
+                                     runremote="",
+                                     **variables)).splitlines()
+    treepkginfo = TreepkgInfo.fromxml(xml)
+
+def get_binary_arch(arch): 
+    if not arch == "source":
+        if not arch.startswith("binary"):
+            arch = "binary-" + arch
+    return arch
+
+def check_package_is_new(packagename, destdir, packagemd5sum):
+    destpackage = os.path.join(destdir, packagename)
+    if not os.path.isfile(destpackage):
+        return True
+    destmd5sum = md5sum(destpackage)
+    return destmd5sum == packagemd5sum
+
+def copy_to_cache(variables, track, revision, quiet, architectures=None):
+    scp_flags = []
+    if quiet:
+        scp_flags.append("-q")
+    treepkginfo = get_treepkg_info(variables)
+    treepkgroot = treepkginfo.root
+    binaryarchs = []
+    # change e.g. armel in binary-armel
+    for arch in architectures:
+        binaryarchs.append(get_binary_arch(arch))
+    # add binary-all to requested packages
+    if not binaryarchs is None:
+        binaryarchs.append("binary-all")
+    
+    for track in treepkgroot.tracks:
+        files = []
+        for rev in track.revisions:
+            for package in rev.packages:
+                # only copy requested archs (+ all)
+                if not binaryarchs is None and \
+                   not package.arch in binaryarchs:
+                    break
+                destdir = os.path.join(variables["cachedir"],
+                                       package.arch,
+                                       track.name)
+                print "package: %s, destdir: %s" % (package.name, destdir)
+                md5sum = ""
+                for checksum in package.checksums:
+                    if checksum.type == "md5":
+                        md5sum = checksum.checksum
+                        break
+                # update only if the packages differ
+                if check_package_is_new(package.name, destdir, md5sum):
+                    files.append(package.path)
+         # scp the packages of a track to the cache dir 
+         #call(cmdexpand("scp -p @scp_flags @files $cachedir/", files=files,
+         #                scp_flags=scp_flagsd, cachedir=destdir))
+
+def publish_packages_arch(variables, track, revision, dist, section, 
+                          quiet, architectures):
+    copy_to_cache(variables, track, revision, quiet, architectures)
+#    copy_to_publishdir(variables, dist, section, arch, quiet)
+
+def publish_packages(config_filename, track, revision, dist, section, quiet):
+    config = read_config(config_filename)
+
+    if dist is None:
+        dist = config["distribution"]
+    if section is None:
+        section = config["section"]
+
+    architectures = config["architectures"]
+    publish_packages_arch(config, track, revision, dist, section,
+                          quiet, architectures)
+
+    # update apt archive
+#    call(config["after_upload_hook"])
+
+def main():
+    options, args = parse_commandline()
+    revision = None # for future use cases
+    publish_packages(options.config_file, options.track, revision,
+                     options.dist, options.section, options.quiet)
+
+if __name__ == "__main__":
+    main()
--- a/treepkg/info/status.py	Tue Jul 13 14:26:11 2010 +0000
+++ b/treepkg/info/status.py	Tue Jul 13 16:46:17 2010 +0000
@@ -44,7 +44,7 @@
         return self.tpkgroot.toxml()
 
     @staticmethod
-    def fromxml(xml):
+    def fromxml(xml): #FIXME
         pass
 
     def add_revisions(self, track, trackinfo):
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)