Mercurial > treepkg > treepkg
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