blob: 00abd645a71d6cae9b5cbe627d6f6ecbd74f4eee [file] [log] [blame]
mikesamuel633821a2011-06-16 04:14:31 +00001#!/usr/bin/python
2
3"""
4Packages a new maven release.
5"""
6
7import os
8import re
9import shutil
10import subprocess
11import sys
12import xml.dom.minidom
13
14def mime_type_from_path(path):
15 if path.endswith(".pom"):
16 return "text/xml;charset=UTF-8"
17 elif path.endswith(".jar"):
18 return "application/java-archive"
19 return None
20
21if "__main__" == __name__:
22 # Compute directories relative to tools.
23 trunk_directory_path = os.path.realpath(os.path.join(
24 os.path.dirname(sys.argv[0]),
25 ".."))
26 maven_directory_path = os.path.realpath(os.path.join(
27 os.path.dirname(sys.argv[0]),
28 "..",
29 "..",
30 "maven",
31 "owasp-java-html-sanitizer",
32 "owasp-java-html-sanitizer"))
33 maven_metadata_path = os.path.join(
34 maven_directory_path,
35 "maven-metadata.xml")
36 version_template_directory_path = os.path.join(
37 maven_directory_path,
38 "+++version+++")
39 jar_path = os.path.join(
40 trunk_directory_path,
41 "distrib",
42 "lib",
43 "owasp-java-html-sanitizer.jar")
44 src_jar_path = os.path.join(
45 trunk_directory_path,
46 "distrib",
47 "lib",
48 "owasp-java-html-sanitizer-src.jar")
49
50 # Make sure the directory_structures we expect exist.
51 assert os.path.isdir(maven_directory_path)
52 assert os.path.isdir(trunk_directory_path)
53 assert os.path.isfile(maven_metadata_path)
54 assert os.path.isdir(version_template_directory_path)
55 assert os.path.isfile(jar_path)
56 assert os.path.isfile(src_jar_path)
57
58 # Get svn info of the trunk directory.
59 svn_info_xml = (
60 subprocess.Popen(["svn", "info", "--xml", trunk_directory_path],
61 stdout=subprocess.PIPE)
62 .communicate()[0])
63 svn_info = xml.dom.minidom.parseString(svn_info_xml)
64
65 # Process SVN output XML to find fields.
66 date_element = svn_info.getElementsByTagName("date")[0]
67 entry_element = svn_info.getElementsByTagName("entry")[0]
68 def inner_text(node):
69 if node.nodeType == 3: return node.nodeValue
70 if node.nodeType == 1:
71 return "".join([inner_text(child) for child in node.childNodes])
72 return ""
73
74 # Create a list of fields to use in substitution.
75 fields = {
76 "version": "r%s" % entry_element.getAttribute("revision"),
77 "timestamp": re.sub(r"[^.\d]|\.\d+", "", inner_text(date_element))
78 }
79
80 def replace_fields(s):
81 return re.sub(r"\+\+\+(\w+)\+\+\+", lambda m: fields[m.group(1)], s)
82
83 # List of files that need to have ##DUPE## and ##REPLACE## sections expanded
84 files_to_rewrite = [maven_metadata_path]
85 new_file_paths = []
86
87 def copy_directory_structure_template(src_path, container_path):
88 dest_path = os.path.join(
89 container_path,
90 replace_fields(os.path.basename(src_path)))
91 if os.path.isdir(src_path):
92 os.mkdir(dest_path)
93 for child in os.listdir(src_path):
94 # Skip .svn directories.
95 if "." == child[0:1]: continue
96 copy_directory_structure_template(
97 os.path.join(src_path, child), dest_path)
98 else:
99 shutil.copyfile(src_path, dest_path)
100 mime_type = mime_type_from_path(dest_path)
101 if mime_type is None or mime_type.startswith("text/"):
102 files_to_rewrite.append(dest_path)
103 new_file_paths.append(dest_path)
104 return dest_path
105
106 def rewrite_file(path):
107 lines = []
108 in_file = open(path, "r")
109 try:
110 file_content = in_file.read()
111 finally:
112 in_file.close()
113 for line in file_content.split("\n"):
114 indentation = re.match(r"^\s*", line).group()
115 matches = re.findall(r"(<!--##REPLACE##(.*)##END##-->)", line)
116 if len(matches) >= 2: raise Error("%s: %s" % (path, line))
117 if len(matches):
118 match = matches[0]
119 line = "%s%s %s" % (indentation, replace_fields(match[1]), match[0])
120 else:
121 matches = re.findall("##DUPE##(.*)##END##", line)
122 if len(matches) >= 2: raise Error("%s: %s" % (path, line))
123 if len(matches):
124 match = matches[0]
125 lines.append("%s%s" % (indentation, replace_fields(match)))
126 lines.append(line)
127 out_file = open(path, "w")
128 try:
129 out_file.write("\n".join(lines))
130 finally:
131 out_file.close()
132
133 versioned_jar_path = os.path.join(
134 version_template_directory_path,
135 "owasp-java-html-sanitizer-+++version+++.jar")
136 versioned_src_jar_path = os.path.join(
137 version_template_directory_path,
138 "owasp-java-html-sanitizer-+++version+++-src.jar")
139
140 shutil.copyfile(jar_path, versioned_jar_path)
141 shutil.copyfile(src_jar_path, versioned_src_jar_path)
142 ok = False
143 version_directory_path = None
144 try:
145 version_directory_path = copy_directory_structure_template(
146 version_template_directory_path, maven_directory_path)
147 for file_to_rewrite in files_to_rewrite:
148 rewrite_file(file_to_rewrite)
149 ok = True
150 finally:
151 os.unlink(versioned_jar_path)
152 os.unlink(versioned_src_jar_path)
153 if not ok and version_directory_path is not None:
154 shutil.rmtree(version_directory_path)
155
156 print "svn add '%s'" % version_directory_path
157
158 for new_file_path in new_file_paths:
159 mime_type = mime_type_from_path(new_file_path)
160 if mime_type is not None:
161 print "svn propset svn:mime-type '%s' '%s'" % (mime_type, new_file_path)