1#!/usr/bin/python 2 3import os 4import os.path 5 6def makeMaintainerXML(leads): 7 maintainer_template = """ 8 <maintainer> 9 <user>%(user)s</user> 10 <name>%(name)s</name> 11 <email>%(email)s</email> 12 <role>lead</role> 13 </maintainer> 14 """ 15 16 return "<maintainers>" + \ 17 "".join([maintainer_template % l for l in leads]) + \ 18 "</maintainers>" 19 20def makeLeadXML(leads): 21 lead_template = """ 22<lead> 23 <name>%(name)s</name> 24 <user>%(user)s</user> 25 <email>%(email)s</email> 26 <active>%(active)s</active> 27</lead> 28 """ 29 30 return "".join([lead_template % l for l in leads]) 31 32INDENT_STRING = " " 33 34def buildContentsXMLFordir(dir_or_file, roles, depth=0, dir_role=None, 35 all_files=False): 36 """ 37 Returns a list of strings, each of which is either a <file> XML 38 element for the given file or a <dir> element which contains other 39 <file> elements. 40 """ 41 42 try: 43 entries = os.listdir(dir_or_file) 44 dir_role_s = '' 45 if dir_role: 46 dir_role_s = ' role="%s"' % (dir_role) 47 lines = ['%s<dir name="%s"%s>' % (INDENT_STRING * depth, 48 os.path.basename(dir_or_file), 49 dir_role_s)] 50 51 for entry in entries: 52 lines += buildContentsXMLFordir(dir_or_file + os.sep + entry, roles, 53 depth + 1, dir_role, all_files) 54 55 lines.append('%s</dir>' % (INDENT_STRING * depth)) 56 57 return lines 58 except OSError: 59 try: 60 extension = dir_or_file.split(".")[-1] 61 except: 62 if not all_files: 63 return [] 64 65 if all_files and dir_role: 66 return ['%s<file name="%s" role="%s" />' % 67 (INDENT_STRING * depth, os.path.basename(dir_or_file), dir_role)] 68 elif extension in roles: # Ends in an extension we care about 69 return ['%s<file name="%s" role="%s" />' % 70 (INDENT_STRING * depth, os.path.basename(dir_or_file), 71 roles[extension])] 72 else: 73 return [] 74 75def buildContentsXML(roles, *dirs): 76 lines = [] 77 78 for directory in dirs: 79 lines.append("\n".join(buildContentsXMLFordir(directory, roles, 1))) 80 81 return "\n".join(lines) 82 83def buildDocsXML(*dirs): 84 lines = [] 85 86 for directory in dirs: 87 lines.append("\n".join(buildContentsXMLFordir(directory, {}, 1, 'doc', 88 all_files=True))) 89 90 return "\n".join(lines) 91 92if __name__ == "__main__": 93 def usage(progname): 94 print "Usage: %s <package version> <xml template file> <release notes file>" % (progname) 95 96 import sys 97 import time 98 99 try: 100 import xmlconfig 101 except: 102 print "Could not import XML configuration module xmlconfig" 103 sys.exit(1) 104 105 # Expect sys.argv[2] to be the name of the XML file template to 106 # use for processing. 107 try: 108 template_f = open(sys.argv[2], 'r') 109 except Exception, e: 110 usage(sys.argv[0]) 111 print "Could not open template file:", str(e) 112 sys.exit(1) 113 114 # Expect sys.argv[1] to be the version number to include in the 115 # package.xml file. 116 try: 117 version = sys.argv[1] 118 except: 119 usage(sys.argv[0]) 120 sys.exit(2) 121 122 # Expect sys.argv[3] to be the name of the release notes file. 123 try: 124 release_file = sys.argv[3] 125 release_file_h = open(release_file, 'r') 126 release_notes = release_file_h.read().strip() 127 release_file_h.close() 128 except Exception, e: 129 usage(sys.argv[0]) 130 print str(e) 131 sys.exit(3) 132 133 data = xmlconfig.__dict__.copy() 134 135 contentsXml = buildContentsXML({'php': 'php'}, *xmlconfig.contents_dirs) 136 docsXml = buildDocsXML(*xmlconfig.docs_dirs) 137 138 contents = '<dir name="/">\n' + contentsXml + \ 139 "\n" + docsXml + '\n </dir>' 140 141 contents_v1 = '<filelist><dir name="/" baseinstalldir="Auth">\n' + contentsXml + \ 142 "\n" + docsXml + '\n </dir></filelist>' 143 144 data['contents'] = contents 145 data['contents_version_1'] = contents_v1 146 data['leads'] = makeLeadXML(xmlconfig.leads) 147 data['maintainers'] = makeMaintainerXML(xmlconfig.leads) 148 data['date'] = time.strftime("%Y-%m-%d") 149 data['version'] = version 150 data['uri'] = "%s%s-%s.tgz" % (data['package_base_uri'], data['package_name'], 151 version) 152 data['release_notes'] = release_notes 153 154 template_data = template_f.read() 155 print template_data % data 156