00001
00002 """
00003 Small script to prepare the tags and the distribution special directory for a
00004 release of Gaudi.
00005 See https://twiki.cern.ch/twiki/bin/view/Gaudi/GaudiSVNRepository for a
00006 description of the repository structure.
00007 """
00008 __author__ = "Marco Clemencic <Marco.Clemencic@cern.ch>"
00009
00010 import os, re, sys, tempfile, shutil
00011 from subprocess import Popen, PIPE
00012
00013 _req_version_pattern = re.compile(r"^\s*version\s*(v[0-9]+r[0-9]+(?:p[0-9]+)?)\s*$")
00014 def extract_version(f):
00015 """
00016 Find the version number in a requirements file.
00017 """
00018 global _req_version_pattern
00019 for l in open(f):
00020 m = _req_version_pattern.match(l)
00021 if m:
00022 return m.group(1)
00023 return None
00024
00025 _use_pattern = re.compile(r"^\s*use\s*(\w+)\s*(v[0-9]+r[0-9]+(?:p[0-9]+)?)\s*(\w+)?\s*$")
00026 def gather_new_versions(f):
00027 global _use_pattern
00028 versions = {}
00029 for l in open(f):
00030 m = _use_pattern.match(l)
00031 if m:
00032 versions[m.group(1)] = m.group(2)
00033 return versions
00034
00035 def svn(*args, **kwargs):
00036 print "> svn", " ".join(args)
00037 return apply(Popen, (["svn"] + list(args),), kwargs)
00038
00039 def svn_ls(url):
00040 return svn("ls", url, stdout = PIPE).communicate()[0].splitlines()
00041
00042 def main():
00043 use_pre = len(sys.argv) > 1 and 'pre' in sys.argv
00044 url = "svn+ssh://svn.cern.ch/reps/gaudi"
00045 puburl = "https://svnweb.cern.ch/guest/gaudi"
00046 packages = gather_new_versions("requirements")
00047 packages["GaudiRelease"] = extract_version("requirements")
00048 tempdir = tempfile.mkdtemp()
00049 try:
00050 os.chdir(tempdir)
00051
00052 svn("co","-N", url, "gaudi").wait()
00053 os.chdir("gaudi")
00054
00055 pvers = packages["GaudiRelease"]
00056 if use_pre:
00057 pvers += "-pre"
00058
00059 to_commit = []
00060
00061
00062 if (pvers + "/") not in svn_ls("%s/projects/GAUDI/tags" % url):
00063 svn("co", "-N", "%s/projects/GAUDI/tags" % url, "ProjTags").wait()
00064 svn("cp", "%s/projects/GAUDI/trunk" % url, os.path.join("ProjTags",pvers)).wait()
00065 to_commit.append("ProjTags")
00066
00067
00068 for p in packages:
00069 tagsdir = "%s/packages/%s/tags" % (url, p)
00070 tags = svn_ls(tagsdir)
00071 tag = packages[p]
00072 pre_tag = tag + "-pre"
00073
00074
00075 make_tag = (tag+"/") not in tags and (use_pre and (pre_tag+"/") not in tags)
00076 if make_tag:
00077 svn("co", "-N", tagsdir, "%s_Tags" % p).wait()
00078 if use_pre:
00079 tag = pre_tag
00080 svn("cp", "%s/packages/%s/trunk" % (url, p), "%s_Tags/%s" % (p, tag)).wait()
00081 to_commit.append("%s_Tags" % p)
00082
00083
00084 distvers = pvers
00085 if ("GAUDI_%s/" % distvers) not in svn_ls("%s/distribution/tags/GAUDI" % url):
00086 svn("co","-N", "%s/distribution/tags/GAUDI" % url, "DistTags").wait()
00087 svn("mkdir", os.path.join("DistTags", "GAUDI_%s" % distvers)).wait()
00088 externals = open(os.path.join(tempdir, "svn_externals"), "w")
00089 pks = packages.keys()
00090 pks.sort()
00091 for p in pks:
00092 externals.write("%(pack)-20s %(url)s/packages/%(pack)s/tags/%(vers)s\n" % { "pack": p,
00093 "vers": packages[p],
00094 "url" : puburl })
00095 externals.write("%(dir)-20s %(url)s/projects/%(proj)s/tags/%(vers)s\n" % { "dir" : "cmt",
00096 "proj": "GAUDI",
00097 "vers": pvers,
00098 "url" : puburl })
00099 externals.close()
00100 svn("ps", "-F", externals.name, "svn:externals", os.path.join("DistTags", "GAUDI_%s" % distvers)).wait()
00101 to_commit.append("DistTags")
00102
00103 if to_commit:
00104 apply(svn, ["ci"] + to_commit).wait()
00105 else:
00106 print "Nothing to commit"
00107
00108 finally:
00109 shutil.rmtree(tempdir, ignore_errors = True)
00110
00111 return 0
00112
00113 if __name__ == '__main__':
00114 sys.exit(main())