3 import os, os.path, re, sys
4 from warnings import warn
6 sys.path.append("/usr/share/linux-support-2.6.36-trunk/lib/python")
8 from debian_linux.patches import PatchSeries, PatchSeriesList
10 _default_home = "/usr/src/kernel-patches/all/2.6.36/debian"
11 revisions = "orig base 1~experimental.1 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11".split()
14 class MatchExtra(object):
15 def __init__(self, arch, featureset):
16 self.arch, self.featureset = arch, featureset
18 self.matched_arch = self.matched_featureset = False
20 def __call__(self, obj):
29 if i.startswith("arch="):
30 match_arch.append(i[5:])
31 elif i.startswith("featureset="):
32 match_featureset.append(i[11:])
34 raise RuntimeError('Ignored unknown modifier: %s' % i)
36 ret_arch = ret_featureset = False
39 if self.arch is not None:
40 if self.arch in match_arch:
41 self.matched_arch = True
48 if self.featureset is not None:
49 if self.featureset in match_featureset:
50 self.matched_featureset = True
56 return ret_arch and ret_featureset
58 def __nonzero__(self):
59 return self.arch is not None or self.featureset is not None
64 ret.append("arch=%s" % self.arch)
65 if self.matched_featureset:
66 ret.append("featureset=%s" % self.featureset)
71 class version_file(object):
72 _file = 'version.Debian'
76 def __init__(self, upstream = None):
77 if os.path.exists(self._file):
78 s = file(self._file).readline().strip()
81 warn('No %s file, assuming Debian Linux %s' % (self._file, upstream))
82 self.upstream = upstream
83 self.revision = 'orig'
85 raise RuntimeError, "Not possible to determine version"
90 ret = [self.upstream, self.revision]
91 if self.extra is not None:
92 ret.extend(self.extra.info())
97 raise RuntimeError("Tree is in an unstable condition. Can't continue!")
99 self.upstream, self.revision = list[0:2]
101 arch = featureset = None
103 if i.startswith("arch="):
105 elif i.startswith("featureset="):
108 raise RuntimeError("Can't parse extra information")
109 self.extra = MatchExtra(arch, featureset)
112 if os.path.lexists(self._file):
113 os.unlink(self._file)
114 file(self._file, 'w').write('%s\n' % self)
117 self.in_progress = True
120 def commit(self, revision, extra = _marker):
121 self.in_progress = False
122 self.revision = revision
123 if extra is not _marker:
128 options, args = parse_options()
131 print "Too much arguments"
136 vfile = version_file(upstream)
137 current_revision = vfile.revision
138 current_extra = vfile.extra
141 target_revision = args[0]
143 target_revision = revisions[-1]
144 target_extra = MatchExtra(options.arch, options.featureset)
146 if vfile.upstream != upstream:
147 raise RuntimeError("Upstream version differs between tree (%s) and package (%s)" % (vfile.upstream, upstream))
148 if current_revision not in revisions:
149 raise RuntimeError, "Current revision is not in our list of revisions"
150 if target_revision not in revisions:
151 raise RuntimeError, "Target revision is not in our list of revisions"
153 if current_revision == target_revision and current_extra == target_extra:
154 print "Nothing to do"
157 current_index = revisions.index(current_revision)
158 target_index = revisions.index(target_revision)
161 if current_revision != revisions[-1]:
162 raise RuntimeError, "Can't patch from %s with options %s" % (current, ' '.join(current_extra))
163 consider = ['%s-extra' % i for i in revisions[1:current_index + 1]]
164 s = PatchSeriesList.read(home, consider)
166 s(cond = current_extra, reverse = True)
167 vfile.commit(current_revision, None)
169 if current_index < target_index:
170 consider = revisions[current_index + 1:target_index + 1]
171 s = PatchSeriesList.read(home, consider)
174 vfile.commit(target_revision)
175 elif current_index > target_index:
176 consider = revisions[target_index + 1:current_index + 1]
177 s = PatchSeriesList.read(home, consider)
180 vfile.commit(target_revision)
183 consider = ['%s-extra' % i for i in revisions[1:target_index + 1]]
184 s = PatchSeriesList.read(home, consider)
186 s(cond = target_extra)
187 vfile.commit(target_revision, target_extra)
190 from optparse import OptionParser
191 parser = OptionParser(
192 usage = "%prog [OPTION]... [TARGET]",
200 '-f', '--featureset',
205 '-H', '--overwrite-home',
206 default = _default_home, dest = 'home',
207 help = "overwrite home [default: %default]",
210 options, args = parser.parse_args()
212 if options.arch is None and options.featureset is not None:
213 raise RuntimeError('You specified a featureset without an arch, this is not really working')
217 if __name__ == '__main__':
218 def showwarning(message, category, filename, lineno):
219 sys.stderr.write("Warning: %s\n" % message)
221 warnings.showwarning = showwarning
224 except RuntimeError, e:
225 sys.stderr.write("Error: %s\n" % e)