changeset 265:9c0131d2e0e1

Add automatic detection and builds of svn tags for the kdepim enterprise4 packages. Doesn't work for kde-l10n yet.
author Bernhard Herzog <bh@intevation.de>
date Wed, 29 Apr 2009 16:53:00 +0000
parents ea3abd1aa652
children e201ea1f6d0e
files recipes/kde_enterprise_4/base.py
diffstat 1 files changed, 84 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/recipes/kde_enterprise_4/base.py	Wed Apr 29 14:37:22 2009 +0000
+++ b/recipes/kde_enterprise_4/base.py	Wed Apr 29 16:53:00 2009 +0000
@@ -10,8 +10,56 @@
 import os
 import time
 import inspect
+import re
+import logging
 
 import treepkg.packager
+import treepkg.subversion
+
+
+class TagDetector(object):
+
+    """Class to automatically find SVN tags and help package them
+
+    The tags are found using three parameters:
+      url -- The base url of the SVN tags directory to use
+      pattern -- A regular expression matching the subdirectories to
+                 consider in the tag directory specified by the url
+      subdir -- A subdirectory of the directory matched by pattern to
+                export and use to determine revision number
+    """
+
+    def __init__(self, url, pattern, subdir):
+        self.url = url
+        self.pattern = re.compile(pattern)
+        self.subdir = subdir
+
+    def list_tags(self):
+        matches = []
+        if self.url:
+            for tag in treepkg.subversion.list_url(self.url):
+                if self.pattern.match(tag.rstrip("/")):
+                    matches.append(tag)
+        return sorted(matches)
+
+    def newest_tag_revision(self):
+        """Determines the newest tag revision and returns (tagurl, revno)
+        If no tag can be found, the method returns the tuple (None, None).
+        """
+        candidates = self.list_tags()
+        if candidates:
+            newest = candidates[-1]
+            subdir = self.subdir
+            if not subdir.endswith("/"):
+                subdir += "/"
+            tag_url = self.url + "/" + newest
+            tag_subdirs = treepkg.subversion.list_url(tag_url)
+            if subdir in tag_subdirs:
+                subdir_url = tag_url + "/" + subdir
+                revision = treepkg.subversion.last_changed_revision(subdir_url)
+                return subdir_url, revision
+        return None, None
+
 
 
 class BaseSourcePackager(treepkg.packager.SourcePackager):
@@ -46,11 +94,46 @@
 
 class BasePackageTrack(treepkg.packager.PackageTrack):
 
-    extra_config_desc = ["version_template"]
+    extra_config_desc = ["version_template",
+                         ("tags_url", str, ""),
+                         ("tags_pattern", str, ""),
+                         ("tags_subdir", str, "")]
 
     def __init__(self, *args, **kw):
         self.version_template = kw.pop("version_template")
+        tags_url = kw.pop("tags_url")
+        tags_pattern = kw.pop("tags_pattern")
+        tags_subdir = kw.pop("tags_subdir")
         super(BasePackageTrack, self).__init__(*args, **kw)
+        self.tag_detector = TagDetector(tags_url, tags_pattern, tags_subdir)
+
+    def packager_for_new_revision(self):
+        logging.info("Checking tags")
+        self.tag_url = None
+        tag_url, tag_revision = self.tag_detector.newest_tag_revision()
+        logging.info("Found: %s: %s", tag_url, tag_revision)
+        if tag_url is not None:
+            revision = (tag_revision,
+                        self.rules_working_copy.last_changed_revision())
+            logging.info("New revision is %s", revision)
+            if revision not in self.get_revision_numbers():
+                logging.info("Revision %s has not been packaged yet",
+                             revision)
+                self.tag_url = tag_url
+                return self.revision_packager_cls(self, tag=tag_url, *revision)
+            else:
+                logging.info("Revision %s has already been packaged.",
+                             revision)
+
+        return super(BasePackageTrack, self).packager_for_new_revision()
+
+    def export_sources(self, to_dir):
+        if self.tag_url is not None:
+            logging.info("Exporting sources from %s to %r",
+                         self.tag_url, to_dir)
+            treepkg.subversion.export(self.tag_url, to_dir)
+        else:
+            super(BasePackageTrack, self).export_sources(to_dir)
 
 
 def define_kdepim_packager(basename=None, external_subdirs=None):
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)