# HG changeset patch # User Bernhard Herzog # Date 1241023980 0 # Node ID 9c0131d2e0e11436067bbadc473c8d1d9455a3eb # Parent ea3abd1aa652cb5ecac191bc4874e6aa4da7d8dc Add automatic detection and builds of svn tags for the kdepim enterprise4 packages. Doesn't work for kde-l10n yet. diff -r ea3abd1aa652 -r 9c0131d2e0e1 recipes/kde_enterprise_4/base.py --- 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):