![]() |
|
|
Generated: 8 Jan 2009 |
00001 #!/usr/bin/env python 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 url = "svn+ssh://svn.cern.ch/reps/gaudi" 00044 puburl = "https://svnweb.cern.ch/guest/gaudi" 00045 packages = gather_new_versions("requirements") 00046 packages["GaudiRelease"] = extract_version("requirements") 00047 tempdir = tempfile.mkdtemp() 00048 try: 00049 os.chdir(tempdir) 00050 # prepare root dir 00051 svn("co","-N", url, "gaudi").wait() 00052 os.chdir("gaudi") 00053 00054 pvers = packages["GaudiRelease"] 00055 00056 to_commit = [] 00057 00058 # prepare project tag 00059 if (pvers + "/") not in svn_ls("%s/projects/GAUDI/tags" % url): 00060 svn("co", "-N", "%s/projects/GAUDI/tags" % url, "ProjTags").wait() 00061 svn("cp", "%s/projects/GAUDI/trunk" % url, os.path.join("ProjTags",pvers)).wait() 00062 to_commit.append("ProjTags") 00063 00064 # prepare package tags 00065 for p in packages: 00066 tagsdir = "%s/packages/%s/tags" % (url, p) 00067 tags = svn_ls(tagsdir) 00068 if (packages[p]+"/") not in tags: 00069 svn("co", "-N", tagsdir, "%s_Tags" % p).wait() 00070 svn("cp", "%s/packages/%s/trunk" % (url, p), "%s_Tags/%s" % (p, packages[p])).wait() 00071 to_commit.append("%s_Tags" % p) 00072 00073 # prepare "distribution" dir 00074 distvers = pvers 00075 if len(sys.argv) > 1 and 'pre' in sys.argv: 00076 distvers += '-pre' 00077 if ("GAUDI_%s/" % distvers) not in svn_ls("%s/distribution/tags/GAUDI" % url): 00078 svn("co","-N", "%s/distribution/tags/GAUDI" % url, "DistTags").wait() 00079 svn("mkdir", os.path.join("DistTags", "GAUDI_%s" % distvers)).wait() 00080 externals = open(os.path.join(tempdir, "svn_externals"), "w") 00081 pks = packages.keys() 00082 pks.sort() 00083 for p in pks: 00084 externals.write("%(pack)-20s %(url)s/packages/%(pack)s/tags/%(vers)s\n" % { "pack": p, 00085 "vers": packages[p], 00086 "url" : puburl }) 00087 externals.write("%(dir)-20s %(url)s/projects/%(proj)s/tags/%(vers)s\n" % { "dir" : "cmt", 00088 "proj": "GAUDI", 00089 "vers": pvers, 00090 "url" : puburl }) 00091 externals.close() 00092 svn("ps", "-F", externals.name, "svn:externals", os.path.join("DistTags", "GAUDI_%s" % distvers)).wait() 00093 to_commit.append("DistTags") 00094 00095 if to_commit: 00096 apply(svn, ["ci"] + to_commit).wait() 00097 else: 00098 print "Nothing to commit" 00099 00100 finally: 00101 shutil.rmtree(tempdir, ignore_errors = True) 00102 00103 return 0 00104 00105 if __name__ == '__main__': 00106 sys.exit(main())