blob: 05a154ecf188390520afcd85b30bf6bcb00b721d [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",
mikesamuel70acc6e2012-11-06 17:24:53 +000048 "owasp-java-html-sanitizer-sources.jar")
49 doc_jar_path = os.path.join(
50 trunk_directory_path,
51 "distrib",
52 "lib",
53 "owasp-java-html-sanitizer-javadoc.jar")
mikesamuel633821a2011-06-16 04:14:31 +000054
55 # Make sure the directory_structures we expect exist.
mikesamuel39e734a2012-09-22 22:52:28 +000056 assert os.path.isdir(maven_directory_path), maven_directory_path
57 assert os.path.isdir(trunk_directory_path), trunk_directory_path
58 assert os.path.isfile(maven_metadata_path), maven_metadata_path
59 assert os.path.isdir(version_template_directory_path), (
60 version_template_directory_path)
61 assert os.path.isfile(jar_path), jar_path
62 assert os.path.isfile(src_jar_path), src_jar_path
mikesamuel70acc6e2012-11-06 17:24:53 +000063 assert os.path.isfile(doc_jar_path), doc_jar_path
mikesamuel633821a2011-06-16 04:14:31 +000064
65 # Get svn info of the trunk directory.
66 svn_info_xml = (
67 subprocess.Popen(["svn", "info", "--xml", trunk_directory_path],
68 stdout=subprocess.PIPE)
69 .communicate()[0])
70 svn_info = xml.dom.minidom.parseString(svn_info_xml)
71
72 # Process SVN output XML to find fields.
73 date_element = svn_info.getElementsByTagName("date")[0]
74 entry_element = svn_info.getElementsByTagName("entry")[0]
75 def inner_text(node):
76 if node.nodeType == 3: return node.nodeValue
77 if node.nodeType == 1:
78 return "".join([inner_text(child) for child in node.childNodes])
79 return ""
80
81 # Create a list of fields to use in substitution.
82 fields = {
83 "version": "r%s" % entry_element.getAttribute("revision"),
84 "timestamp": re.sub(r"[^.\d]|\.\d+", "", inner_text(date_element))
85 }
86
87 def replace_fields(s):
88 return re.sub(r"\+\+\+(\w+)\+\+\+", lambda m: fields[m.group(1)], s)
89
90 # List of files that need to have ##DUPE## and ##REPLACE## sections expanded
91 files_to_rewrite = [maven_metadata_path]
92 new_file_paths = []
93
94 def copy_directory_structure_template(src_path, container_path):
95 dest_path = os.path.join(
96 container_path,
97 replace_fields(os.path.basename(src_path)))
98 if os.path.isdir(src_path):
99 os.mkdir(dest_path)
100 for child in os.listdir(src_path):
101 # Skip .svn directories.
102 if "." == child[0:1]: continue
103 copy_directory_structure_template(
104 os.path.join(src_path, child), dest_path)
105 else:
106 shutil.copyfile(src_path, dest_path)
107 mime_type = mime_type_from_path(dest_path)
108 if mime_type is None or mime_type.startswith("text/"):
109 files_to_rewrite.append(dest_path)
110 new_file_paths.append(dest_path)
111 return dest_path
112
113 def rewrite_file(path):
114 lines = []
115 in_file = open(path, "r")
116 try:
117 file_content = in_file.read()
118 finally:
119 in_file.close()
120 for line in file_content.split("\n"):
121 indentation = re.match(r"^\s*", line).group()
122 matches = re.findall(r"(<!--##REPLACE##(.*)##END##-->)", line)
123 if len(matches) >= 2: raise Error("%s: %s" % (path, line))
124 if len(matches):
125 match = matches[0]
126 line = "%s%s %s" % (indentation, replace_fields(match[1]), match[0])
127 else:
128 matches = re.findall("##DUPE##(.*)##END##", line)
129 if len(matches) >= 2: raise Error("%s: %s" % (path, line))
130 if len(matches):
131 match = matches[0]
132 lines.append("%s%s" % (indentation, replace_fields(match)))
133 lines.append(line)
134 out_file = open(path, "w")
135 try:
136 out_file.write("\n".join(lines))
137 finally:
138 out_file.close()
139
140 versioned_jar_path = os.path.join(
141 version_template_directory_path,
142 "owasp-java-html-sanitizer-+++version+++.jar")
143 versioned_src_jar_path = os.path.join(
144 version_template_directory_path,
mikesamuel70acc6e2012-11-06 17:24:53 +0000145 "owasp-java-html-sanitizer-+++version+++-sources.jar")
146 versioned_doc_jar_path = os.path.join(
147 version_template_directory_path,
148 "owasp-java-html-sanitizer-+++version+++-javadoc.jar")
mikesamuel633821a2011-06-16 04:14:31 +0000149
150 shutil.copyfile(jar_path, versioned_jar_path)
151 shutil.copyfile(src_jar_path, versioned_src_jar_path)
mikesamuel70acc6e2012-11-06 17:24:53 +0000152 shutil.copyfile(doc_jar_path, versioned_doc_jar_path)
mikesamuel633821a2011-06-16 04:14:31 +0000153 ok = False
154 version_directory_path = None
155 try:
156 version_directory_path = copy_directory_structure_template(
157 version_template_directory_path, maven_directory_path)
158 for file_to_rewrite in files_to_rewrite:
159 rewrite_file(file_to_rewrite)
160 ok = True
161 finally:
162 os.unlink(versioned_jar_path)
163 os.unlink(versioned_src_jar_path)
mikesamuel70acc6e2012-11-06 17:24:53 +0000164 os.unlink(versioned_doc_jar_path)
mikesamuel633821a2011-06-16 04:14:31 +0000165 if not ok and version_directory_path is not None:
166 shutil.rmtree(version_directory_path)
167
168 print "svn add '%s'" % version_directory_path
169
170 for new_file_path in new_file_paths:
171 mime_type = mime_type_from_path(new_file_path)
172 if mime_type is not None:
173 print "svn propset svn:mime-type '%s' '%s'" % (mime_type, new_file_path)