# HG changeset patch # User Bernhard Herzog # Date 1241706310 0 # Node ID 4b700b39c32fb533d9ac5e75a7cf28d24007f88e # Parent 026dd728643178632b699627ab0b586fc5c07f9d Refactoring: Move the TagDetector class into the treepkg.subversion module diff -r 026dd7286431 -r 4b700b39c32f recipes/kde_enterprise_3_5/base.py --- a/recipes/kde_enterprise_3_5/base.py Thu May 07 14:11:14 2009 +0000 +++ b/recipes/kde_enterprise_3_5/base.py Thu May 07 14:25:10 2009 +0000 @@ -9,79 +9,11 @@ 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 - - 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.. . 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 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() - 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 = treepkg.subversion.last_changed_revision(revision_url) - urlrev = (baseurl + "/" + subdir, revision) - except treepkg.subversion.SubversionError: - pass - return urlrev - class BaseSourcePackager(treepkg.packager.SourcePackager): @@ -127,7 +59,9 @@ 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) + self.tag_detector = treepkg.subversion.TagDetector(tags_url, + tags_pattern, + tags_subdir) def packager_for_new_revision(self): logging.info("Checking tags") diff -r 026dd7286431 -r 4b700b39c32f recipes/kde_enterprise_4/base.py --- a/recipes/kde_enterprise_4/base.py Thu May 07 14:11:14 2009 +0000 +++ b/recipes/kde_enterprise_4/base.py Thu May 07 14:25:10 2009 +0000 @@ -10,80 +10,12 @@ 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 - - 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.. . 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 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() - 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 = treepkg.subversion.last_changed_revision(revision_url) - urlrev = (baseurl + "/" + subdir, revision) - except treepkg.subversion.SubversionError: - pass - return urlrev - - class BaseSourcePackager(treepkg.packager.SourcePackager): def __init__(self, *args, **kw): @@ -127,7 +59,9 @@ 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) + self.tag_detector = treepkg.subversion.TagDetector(tags_url, + tags_pattern, + tags_subdir) def packager_for_new_revision(self): logging.info("Checking tags") diff -r 026dd7286431 -r 4b700b39c32f treepkg/subversion.py --- 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.. . 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