#!/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)