diff treepkg/subversion.py @ 273:4b700b39c32f

Refactoring: Move the TagDetector class into the treepkg.subversion module
author Bernhard Herzog <bh@intevation.de>
date Thu, 07 May 2009 14:25:10 +0000
parents 97fd2584df5f
children f58f9adb7dc3
line wrap: on
line diff
--- a/treepkg/subversion.py	Thu May 07 14:11:14 2009 +0000
+++ b/treepkg/subversion.py	Thu May 07 14:25:10 2009 +0000
@@ -9,6 +9,7 @@
 
 import os
 import shutil
+import re
 
 import run
 from cmdexpand import cmdexpand
@@ -163,3 +164,70 @@
     def last_changed_revision(self):
         """Always returns 0"""
         return 0
+
+
+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
+
+    The subdir parameter is there to cope with the kdepim enterprise
+    tags.  The URL for a tag is of the form
+    .../tags/kdepim/enterprise4.0.<date>.<rev> .  Each such tag has
+    subdirectories for kdepim, kdelibs, etc.  The url and pattern are
+    used to match the URL for the tag, and the subdir is used to select
+    which part of the tag is meant.
+
+    The subdir also determines which SVN directory's revision number is
+    used.  Normally, just appending the subdir to the tag URL would be
+    enough for this, but the situation is more complex for
+    kdebase_workspace and kdebase_runtime, whose code comes from
+    different subdirectories of the kdebase-4.X-branch subdirectory (for
+    enterprise4 tags).  Here the revision number must be taken from
+    kdebase-4.X-branch, but the URL to use when exporting the sources,
+    must refer to e.g. kdebase-4.1-branch/kdebase_workspace.  To achieve
+    that, subdir may contain slashes to indicate subdirectories of
+    subdirectories, but only the first part of subdir (up to the first
+    slash) is used when determining the 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 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()
+        urlrev = (None, None)
+        if candidates:
+            newest = candidates[-1]
+            urlrev = self.determine_revision(self.url + "/" + newest,
+                                             self.subdir)
+        return urlrev
+
+    def determine_revision(self, baseurl, subdir):
+        urlrev = (None, None)
+        revision_url = baseurl + "/" + subdir.split("/")[0]
+        try:
+            revision = last_changed_revision(revision_url)
+            urlrev = (baseurl + "/" + subdir, revision)
+        except SubversionError:
+            pass
+        return urlrev
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)