comparison recipes/kde/maemo/tags.py @ 351:4afea047520e

added a maemo packager for tags
author Bjoern Ricks <bricks@intevation.de>
date Tue, 11 May 2010 09:48:59 +0000
parents
children ab08a415a102
comparison
equal deleted inserted replaced
350:b41f54880572 351:4afea047520e
1 # Copyright (C) 2007 - 2010 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <bh@intevation.de>
4 # Bjoern Ricks <bjoern.ricks@intevation.de>
5 #
6 # This program is free software under the GPL (>=v2)
7 # Read the file COPYING coming with the software for details.
8
9 """Base classes for kde maemo tag packagers"""
10
11 import re
12 import time
13 import logging
14
15 import treepkg.packager
16 import treepkg.subversion as subversion
17 import treepkg.sbuilder
18
19
20 class SourcePackager(treepkg.packager.SourcePackager):
21
22 def __init__(self, *args, **kw):
23 super(SourcePackager, self).__init__(*args, **kw)
24 self.enterprise_version = (self.parent.pkg_date + "."
25 + str(self.revision))
26 self.maemo_version = "%s.%s" % (self.revision,
27 self.parent.pkg_date)
28
29 def determine_package_version(self, directory):
30 enterprise_version = self.enterprise_version
31 maemo_version = self.maemo_version
32 revision = self.revision
33 rules_revision = self.parent.rules_revision
34 pkg_revision = self.parent.pkg_revision
35 pkg_date = self.parent.pkg_date
36
37 return self.track.version_template % locals()
38
39 def prepare_sources_for_tarball(self, pkgbasedir, pkgbaseversion):
40 self.update_version_numbers(pkgbasedir)
41
42 def update_version_numbers(self, pkgbasedir):
43 """Updates the version numbers in the code in pkgbasedir.
44 The default implementation does nothing. Derived classes should
45 override this method if necessary.
46 """
47
48 def get_change_msg(self):
49 return self.changemsg_template % dict(revision=self.revision,
50 pkg_date=self.parent.pkg_date,
51 rules_revision=self.parent.rules_revision)
52
53
54 class RevisionPackager(treepkg.packager.RevisionPackager):
55
56 source_packager_cls = SourcePackager
57
58 def __init__(self, *args, **kw):
59 self.pkg_date = kw.pop("pkg_date",
60 time.strftime("%Y%m%d", time.localtime()))
61 super(RevisionPackager, self).__init__(*args, **kw)
62
63
64 class PackageTrack(treepkg.packager.PackageTrack):
65
66 revision_packager_cls = RevisionPackager
67 builder_cls = treepkg.sbuilder.SbdmockBuilder
68
69 extra_config_desc = [("tags_url", str, ""),
70 ("tags_pattern", str, ""),
71 ("tags_subdir", str, ""),
72 ("tags_rules_subdir", str, "")]
73
74 def __init__(self, *args, **kw):
75 tags_url = kw.pop("tags_url")
76 tags_pattern = kw.pop("tags_pattern")
77 tags_subdir = kw.pop("tags_subdir")
78 tags_rules_subdir = kw.pop("tags_rules_subdir")
79 super(PackageTrack, self).__init__(*args, **kw)
80 self.tag_detector = subversion.TagDetector(tags_url, tags_pattern,
81 tags_subdir)
82 self.tag_rules_detector = subversion.TagDetector(tags_url, tags_pattern,
83 tags_rules_subdir)
84 self.use_tag_rules = False
85 if tags_rules_subdir:
86 self.use_tag_rules = True
87
88 def packager_for_new_revision(self):
89 logging.info("Checking tags")
90 self.tag_url = None
91 tag_url, tag_revision = self.tag_detector.newest_tag_revision()
92 tag_rules_url, tag_rules_revision = self.tag_rules_detector.newest_tag_revision()
93 logging.info("Found: %s: %s", tag_url, tag_revision)
94 if self.use_tag_rules and tag_rules_url is None:
95 self.use_tag_rules = False
96 if tag_url is not None:
97 if not self.use_tag_rules:
98 tag_rules_revision = self.rules_working_copy.last_changed_revision()
99 revision = (tag_revision, tag_rules_revision)
100 logging.info("New revision is %s", revision)
101 if revision not in self.get_revision_numbers():
102 logging.info("Revision %s has not been packaged yet",
103 revision)
104 self.tag_url = tag_url
105 self.tag_revision = tag_revision
106 self.tag_rules_url = tag_rules_url
107 self.tag_rules_revision = tag_rules_revision
108 tag_date, tag_change_count = self.tag_pkg_parameters(tag_url)
109 pkg_revision = (self.pkg_revision_template
110 % dict(pkg_revision=tag_change_count))
111 return self.revision_packager_cls(self, tag=tag_url,
112 pkg_revision=pkg_revision,
113 pkg_date=tag_date,
114 *revision)
115 else:
116 logging.info("Revision %s has already been packaged.",
117 revision)
118
119 return super(PackageTrack, self).packager_for_new_revision()
120
121 def export_sources(self, to_dir):
122 if self.tag_url is not None:
123 logging.info("Exporting sources for tarball from %r to %r",
124 self.tag_url, to_dir)
125 self.working_copy.export_tag(self.tag_url, to_dir,
126 revision=self.tag_revision)
127 else:
128 super(PackageTrack, self).export_sources(to_dir)
129
130 def copy_debian_directory(self, to_dir):
131 if self.use_tag_rules:
132 logging.info("Exporting debian package description from %s to %s",
133 self.tag_rules_url, to_dir)
134 self.rules_working_copy.export_tag(self.tag_rules_url, to_dir)
135 else:
136 super(PackageTrack, self).copy_debian_directory(to_dir)
137
138 def tag_pkg_parameters(self, tag_url):
139 match = re.search(r"/enterprise[^.]*\.[^.]*\."
140 r"(?P<date>[0-9]{8})\.(?P<baserev>[0-9]+)/",
141 tag_url)
142 if match:
143 date = match.group("date")
144 baserev = match.group("baserev")
145 xml_log = subversion.log_xml(tag_url, baserev)
146 revisions = subversion.extract_tag_revisions(xml_log)
147 tag_change_count = len(revisions)
148 return (date, tag_change_count)
149 else:
150 raise RuntimeError("Cannot determine tag parameters from %r"
151 % tag_url)
152
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)