3 __author__ =
"Marco Clemencic <Marco.Clemencic@cern.ch>"
4 __version__ =
"$Id: update_versions.py,v 1.3 2008/11/10 19:43:31 marcocle Exp $"
6 import os, re, sys, time
11 _req_version_pattern = re.compile(
r"^\s*version\s*(v[0-9]+r[0-9]+(?:p[0-9]+)?)\s*$")
12 _cml_version_pattern = re.compile(
r"^\s*gaudi_subdir\s*\(\s*\S+\s+(v[0-9]+r[0-9]+(?:p[0-9]+)?)\)\s*$")
13 _hwaf_hpyscript_version_pattern = re.compile(
r"^\s*[\"']version[\"']\s*:\s*[\"'](v[0-9]+r[0-9]+(?:p[0-9]+)?)[\"'].*$")
14 _hwaf_ymlscript_version_pattern = re.compile(
r"^\s*version\s*:\s*[\"'](v[0-9]+r[0-9]+(?:p[0-9]+)?)[\"'].*$")
18 Find the version number in a requirements file.
20 global _req_version_pattern
22 m = _req_version_pattern.match(l)
28 if os.path.exists(cml):
32 m = _cml_version_pattern.match(l)
33 if m
and m.group(1) != newversion:
34 print "%s: %s -> %s"%(cml, m.group(1), newversion)
35 l = l.replace(m.group(1), newversion)
39 open(cml,
"w").writelines(out)
42 hname = os.path.join(pkgdir,
"..",
"hscript.py")
43 yname = os.path.join(pkgdir,
"..",
"hscript.yml")
46 if os.path.exists(hname):
47 pat = _hwaf_hpyscript_version_pattern
49 elif os.path.exists(yname):
50 pat = _hwaf_ymlscript_version_pattern
53 print (
"*** package [%s] has no hwaf script" % pkgdir)
60 if m
and m.group(1) != newversion:
61 print "%s: %s -> %s"%(fname, m.group(1), newversion)
62 l = l.replace(m.group(1), newversion)
66 open(fname,
"w").writelines(out)
71 Compare the version of the package with the new one and update the package if
74 Returns true if the package have been modified.
76 global _req_version_pattern
79 req = os.path.join(packagedir,
"requirements")
81 m = _req_version_pattern.match(l)
83 if m.group(1) != newversion:
84 print "%s: %s -> %s"%(packagedir,m.group(1),newversion)
85 l = l.replace(m.group(1),newversion)
89 open(req,
"w").writelines(out)
91 ver = os.path.join(packagedir,
"version.cmt")
92 if os.path.exists(ver):
93 current = open(ver).read().strip()
94 if current != newversion:
95 open(ver,
"w").write(newversion +
"\n")
97 cml = os.path.normpath(os.path.join(packagedir,
"..",
"CMakeLists.txt"))
99 if "GaudiKernel" in packagedir:
100 cml = os.path.normpath(os.path.join(packagedir,
"..",
"src",
"Util",
"CMakeLists.txt"))
107 _use_pattern = re.compile(
r"^\s*use\s*(\w+)\s*(v[0-9]+r[0-9]+(?:p[0-9]+)?)\s*(\w+)?\s*$")
112 m = _use_pattern.match(l)
114 versions[m.group(1)] = m.group(2)
118 changelog_entry = re.compile(
r'^(! [0-9]{4}-[0-9]{2}-[0-9]{2} -)|!?============')
119 separator_entry = re.compile(
r'^!?============')
122 for l
in open(filename):
124 if state ==
"searching":
125 if changelog_entry.match(l):
129 if not separator_entry.match(l):
134 while notes
and not notes[-1].strip(): notes.pop()
135 return "".join(notes)
138 changelog_entry = re.compile(
r'^(! [0-9]{4}-[0-9]{2}-[0-9]{2} -)|============')
139 title =
" %s %s " % (pkg, version)
140 letf_chars = (78 - len(title)) / 2
141 right_chars = 78 - letf_chars - len(title)
142 separator = (
"=" * letf_chars) + title + (
"=" * right_chars) +
"\n"
145 for l
in open(filename):
148 if changelog_entry.match(l):
149 out.append(separator)
154 open(filename,
"w").writelines(out)
156 print "Warning: could not update release.notes in %s" % pkg
161 m = re.search(
"use\s*LCGCMT\s*LCGCMT_(\S*)",open(os.path.join(
"..",
"..",
"cmt",
"project.cmt")).read())
163 LCGCMTVers = m.group(1)
164 print "Using LCGCMT", LCGCMTVers
166 print "Cannot find LCGCMT version"
171 all_packages_tmp = []
172 exec(os.popen(
r"""cmt broadcast 'echo "all_packages_tmp.append((\"<package>\"", \"$PWD\""))"'""",
"r").read())
173 all_packages_names = []
175 for k,v
in all_packages_tmp:
176 all_packages_names.append(k)
180 special_packages = [
"Gaudi",
"GaudiExamples",
"GaudiSys",
"GaudiRelease"]
184 new_version = raw_input(
"The old version of the project is %s, which is the new one? " % old_version)
190 for pkg
in all_packages_names:
191 reqfile = os.path.join(all_packages[pkg],
"requirements")
192 relnotefile = os.path.join(all_packages[pkg],
"..",
"doc",
"release.notes")
194 if os.path.exists(relnotefile):
197 release_notes[pkg] =
""
198 if pkg
in special_packages:
199 new_versions[pkg] = new_version
201 if release_notes[pkg]:
202 new_versions[pkg] = raw_input(
"\nThe old version of %s is %s, this are the changes:\n%s\nWhich version you want (old is %s)? " % (pkg, old_versions[pkg], release_notes[pkg], old_versions[pkg]))
204 new_versions[pkg] = old_versions[pkg]
206 if new_versions[pkg] != old_versions[pkg]:
208 if os.path.exists(relnotefile):
212 reqfile = os.path.join(all_packages[
"GaudiRelease"],
"requirements")
214 for l
in open(reqfile):
215 sl = l.strip().split()
216 if sl
and sl[0] ==
"use":
217 if sl[1]
in new_versions:
218 if sl[2] != new_versions[sl[1]]:
219 l = l.replace(sl[2], new_versions[sl[1]])
221 open(reqfile,
"w").writelines(out)
225 new_lines.append(
"<!-- ====================================================================== -->")
226 data = {
"vers": new_version,
"date": time.strftime(
"%Y-%m-%d") }
227 new_lines.append(
'<h2><a name="%(vers)s">Gaudi %(vers)s</a> (%(date)s)</h2>' % data)
228 data = {
"vers": LCGCMTVers }
229 new_lines.append(
'<h3>Externals version: <a href="http://lcgsoft.cern.ch/index.py?page=cfg_overview&cfg=%(vers)s">LCGCMT_%(vers)s</a></h3>' % data)
230 new_lines.append(
"<h3>General Changes</h3>")
231 new_lines.append(
'<ul>\n<li><br/>\n (<span class="author"></span>)</li>\n</ul>')
232 new_lines.append(
"<h3>Packages Changes</h3>")
233 new_lines.append(
"<ul>")
234 for pkg
in all_packages_names:
235 if release_notes[pkg]:
236 new_lines.append(
'<li>%s (%s):\n<ul>\n<li><br/>\n (<span class="author"></span>)</li>\n</ul>\n<pre>'%(pkg,new_versions[pkg]))
237 new_lines.append(release_notes[pkg].replace(
'&',
'&') \
238 .replace(
'<',
'<') \
239 .replace(
'>',
'>') +
"</pre>")
240 new_lines.append(
"</li>")
241 new_lines.append(
"</ul>")
243 global_rel_notes = os.path.join(
"..",
"doc",
"release.notes.html")
245 separator = re.compile(
"<!-- =+ -->")
247 for l
in open(global_rel_notes):
248 if not block_added
and separator.match(l.strip()):
249 out.append(
"\n".join(new_lines) +
"\n")
252 open(global_rel_notes,
"w").writelines(out)
255 global_cmakelists = os.path.join(
"..",
"..",
"CMakeLists.txt")
257 for l
in open(global_cmakelists):
258 if l.strip().startswith(
'gaudi_project'):
259 l =
'gaudi_project(Gaudi %s)\n' % new_version
261 open(global_cmakelists,
"w").writelines(out)
263 if __name__ ==
'__main__':