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