179 lines
5.9 KiB
Python
Executable file
179 lines
5.9 KiB
Python
Executable file
#!/usr/bin/python
|
|
|
|
"""
|
|
Packages a new maven release.
|
|
"""
|
|
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import xml.dom.minidom
|
|
|
|
def mime_type_from_path(path):
|
|
if path.endswith(".pom"):
|
|
return "text/xml;charset=UTF-8"
|
|
elif path.endswith(".jar"):
|
|
return "application/java-archive"
|
|
return None
|
|
|
|
if "__main__" == __name__:
|
|
# Compute directories relative to tools.
|
|
trunk_directory_path = os.path.realpath(os.path.join(
|
|
os.path.dirname(sys.argv[0]),
|
|
".."))
|
|
maven_directory_path = os.path.realpath(os.path.join(
|
|
os.path.dirname(sys.argv[0]),
|
|
"..",
|
|
"..",
|
|
"maven",
|
|
"owasp-java-html-sanitizer",
|
|
"owasp-java-html-sanitizer"))
|
|
maven_metadata_path = os.path.join(
|
|
maven_directory_path,
|
|
"maven-metadata.xml")
|
|
version_template_directory_path = os.path.join(
|
|
maven_directory_path,
|
|
"+++version+++")
|
|
jar_path = os.path.join(
|
|
trunk_directory_path,
|
|
"distrib",
|
|
"lib",
|
|
"owasp-java-html-sanitizer.jar")
|
|
src_jar_path = os.path.join(
|
|
trunk_directory_path,
|
|
"distrib",
|
|
"lib",
|
|
"owasp-java-html-sanitizer-sources.jar")
|
|
doc_jar_path = os.path.join(
|
|
trunk_directory_path,
|
|
"distrib",
|
|
"lib",
|
|
"owasp-java-html-sanitizer-javadoc.jar")
|
|
|
|
# Make sure the directory_structures we expect exist.
|
|
assert os.path.isdir(maven_directory_path), maven_directory_path
|
|
assert os.path.isdir(trunk_directory_path), trunk_directory_path
|
|
assert os.path.isfile(maven_metadata_path), maven_metadata_path
|
|
assert os.path.isdir(version_template_directory_path), (
|
|
version_template_directory_path)
|
|
assert os.path.isfile(jar_path), jar_path
|
|
assert os.path.isfile(src_jar_path), src_jar_path
|
|
assert os.path.isfile(doc_jar_path), doc_jar_path
|
|
|
|
# Get svn info of the trunk directory.
|
|
svn_info_xml = (
|
|
subprocess.Popen(["svn", "info", "--xml", trunk_directory_path],
|
|
stdout=subprocess.PIPE)
|
|
.communicate()[0])
|
|
svn_info = xml.dom.minidom.parseString(svn_info_xml)
|
|
|
|
# Process SVN output XML to find fields.
|
|
date_element = svn_info.getElementsByTagName("date")[0]
|
|
entry_element = svn_info.getElementsByTagName("entry")[0]
|
|
def inner_text(node):
|
|
if node.nodeType == 3: return node.nodeValue
|
|
if node.nodeType == 1:
|
|
return "".join([inner_text(child) for child in node.childNodes])
|
|
return ""
|
|
|
|
# Create a list of fields to use in substitution.
|
|
fields = {
|
|
"version": "r%s" % entry_element.getAttribute("revision"),
|
|
"timestamp": re.sub(r"[^.\d]|\.\d+", "", inner_text(date_element))
|
|
}
|
|
|
|
def replace_fields(s):
|
|
return re.sub(r"\+\+\+(\w+)\+\+\+", lambda m: fields[m.group(1)], s)
|
|
|
|
# List of files that need to have ##DUPE## and ##REPLACE## sections expanded
|
|
# NOTE(12 February 2013): We no longer rewrite maven_metadata_path since this
|
|
# project is now hosted in Maven Central, and maven_metadata used a
|
|
# groupId/artifactId pair that is incompatible with the convention used by
|
|
# Maven Central.
|
|
# All maven versions after 12 February are undiscoverable by looking at
|
|
# maven_metadata.
|
|
files_to_rewrite = []
|
|
new_file_paths = []
|
|
|
|
def copy_directory_structure_template(src_path, container_path):
|
|
dest_path = os.path.join(
|
|
container_path,
|
|
replace_fields(os.path.basename(src_path)))
|
|
if os.path.isdir(src_path):
|
|
os.mkdir(dest_path)
|
|
for child in os.listdir(src_path):
|
|
# Skip .svn directories.
|
|
if "." == child[0:1]: continue
|
|
copy_directory_structure_template(
|
|
os.path.join(src_path, child), dest_path)
|
|
else:
|
|
shutil.copyfile(src_path, dest_path)
|
|
mime_type = mime_type_from_path(dest_path)
|
|
if mime_type is None or mime_type.startswith("text/"):
|
|
files_to_rewrite.append(dest_path)
|
|
new_file_paths.append(dest_path)
|
|
return dest_path
|
|
|
|
def rewrite_file(path):
|
|
lines = []
|
|
in_file = open(path, "r")
|
|
try:
|
|
file_content = in_file.read()
|
|
finally:
|
|
in_file.close()
|
|
for line in file_content.split("\n"):
|
|
indentation = re.match(r"^\s*", line).group()
|
|
matches = re.findall(r"(<!--##REPLACE##(.*)##END##-->)", line)
|
|
if len(matches) >= 2: raise Error("%s: %s" % (path, line))
|
|
if len(matches):
|
|
match = matches[0]
|
|
line = "%s%s %s" % (indentation, replace_fields(match[1]), match[0])
|
|
else:
|
|
matches = re.findall("##DUPE##(.*)##END##", line)
|
|
if len(matches) >= 2: raise Error("%s: %s" % (path, line))
|
|
if len(matches):
|
|
match = matches[0]
|
|
lines.append("%s%s" % (indentation, replace_fields(match)))
|
|
lines.append(line)
|
|
out_file = open(path, "w")
|
|
try:
|
|
out_file.write("\n".join(lines))
|
|
finally:
|
|
out_file.close()
|
|
|
|
versioned_jar_path = os.path.join(
|
|
version_template_directory_path,
|
|
"owasp-java-html-sanitizer-+++version+++.jar")
|
|
versioned_src_jar_path = os.path.join(
|
|
version_template_directory_path,
|
|
"owasp-java-html-sanitizer-+++version+++-sources.jar")
|
|
versioned_doc_jar_path = os.path.join(
|
|
version_template_directory_path,
|
|
"owasp-java-html-sanitizer-+++version+++-javadoc.jar")
|
|
|
|
shutil.copyfile(jar_path, versioned_jar_path)
|
|
shutil.copyfile(src_jar_path, versioned_src_jar_path)
|
|
shutil.copyfile(doc_jar_path, versioned_doc_jar_path)
|
|
ok = False
|
|
version_directory_path = None
|
|
try:
|
|
version_directory_path = copy_directory_structure_template(
|
|
version_template_directory_path, maven_directory_path)
|
|
for file_to_rewrite in files_to_rewrite:
|
|
rewrite_file(file_to_rewrite)
|
|
ok = True
|
|
finally:
|
|
os.unlink(versioned_jar_path)
|
|
os.unlink(versioned_src_jar_path)
|
|
os.unlink(versioned_doc_jar_path)
|
|
if not ok and version_directory_path is not None:
|
|
shutil.rmtree(version_directory_path)
|
|
|
|
print "svn add '%s'" % version_directory_path
|
|
|
|
for new_file_path in new_file_paths:
|
|
mime_type = mime_type_from_path(new_file_path)
|
|
if mime_type is not None:
|
|
print "svn propset svn:mime-type '%s' '%s'" % (mime_type, new_file_path)
|