blob: 43c0132ecfe41c2d2c1c4977b36674202014a9f2 [file] [log] [blame]
#!/usr/bin/python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
import sys, re, os, mllib, optparse
def die(msg):
print >> sys.stderr, msg
sys.exit(1)
parser = optparse.OptionParser(usage="usage: %prog [options] JARs ...",
description="Generates a pom.")
parser.add_option("-n", "--name")
parser.add_option("-g", "--group")
parser.add_option("-a", "--artifact")
parser.add_option("-v", "--version")
parser.add_option("-d", "--description", default="")
parser.add_option("-u", "--url", default="")
parser.add_option("-m", "--modules", help="modules dependencies")
parser.add_option("-p", "--prefix", help="prefix of the project's artifacts names")
parser.add_option("-i", "--ignore", action="store_true", help="ignore missing deps")
parser.add_option("-s", "--search-path", action="append",
help="the path to search for deps")
parser.add_option("-S", "--scope", metavar="ARTIFACT=SCOPE", action="append",
default=[],
help="specify scope for an artifact")
parser.add_option("-O", "--optional", action="append", default=[],
help="specify dependencies that are optional")
parser.add_option("-o", "--output")
parser.add_option("-t", "--type", default="jar", help="packaging type")
opts, jars = parser.parse_args()
if opts.search_path is None:
path=["%s/.m2" % os.environ["HOME"]]
else:
path = []
for p in opts.search_path:
path.extend(p.split(os.pathsep))
expanded_path = []
for p in path:
os.path.walk(p, lambda a, d, fs: expanded_path.append(d), None)
if opts.group is None:
die("the group option is required")
if opts.version is None:
die("the version option is required")
if opts.name is None and opts.artifact is None:
die("one of name or artifact must be supplied")
if opts.prefix is not None:
opts.artifact = opts.prefix + "-" + opts.artifact
if opts.name is None:
opts.name = opts.artifact
if opts.artifact is None:
opts.artifact = opts.name
def lookup(doc, attr):
nd = doc[attr]
if nd is None:
return None
return nd.text()
def lookupElement(doc, attr):
return doc[attr]
def search(path, file):
for d in path:
f = os.path.join(d, file)
if os.path.exists(f):
return mllib.xml_parse(f)
scopes = {}
for s in opts.scope:
m = re.match(r"(.*)=(.*)", s)
if not m:
die("bad scope specifier: %s" % s)
scopes[m.group(1)] = m.group(2)
deps = []
module_depends = []
if opts.modules is not None:
module_depends = opts.modules.replace("/", "-").split();
for module in module_depends:
if opts.prefix is None:
artifactId = module
else:
artifactId = opts.prefix + "-" + module
deps.append("""
<dependency>
<groupId>%s</groupId>
<artifactId>%s</artifactId>
<version>%s</version>
<scope>%s</scope>
""" % (opts.group, artifactId, opts.version,
scopes.get(artifactId, "compile")))
if artifactId in opts.optional:
deps.append(""" <optional>true</optional>
""")
deps.append(""" </dependency>
""")
for jar in jars:
base, ext = os.path.splitext(os.path.basename(jar))
dep = search(expanded_path, "%s.xml" % base)
if dep is None:
if opts.ignore:
continue
else:
die("unable to locate xml for %s" % jar)
dep = dep["dep"]
group = lookup(dep, "groupId")
artifactId = lookup(dep, "artifactId")
version = lookup(dep, "version")
deps.append("""
<dependency>
<groupId>%s</groupId>
<artifactId>%s</artifactId>
<version>%s</version>
<scope>%s</scope>""" % (group, artifactId, version,
scopes.get(artifactId, "compile")))
exclusions = lookupElement(dep, "exclusions")
if exclusions is not None:
deps.append("""
<exclusions>""")
for exclusion in list(exclusions.query["exclusion"]):
group = lookup(exclusion, "groupId")
artifactId = lookup(exclusion, "artifactId")
deps.append("""
<exclusion>
<groupId>%s</groupId>
<artifactId>%s</artifactId>
</exclusion>""" % (group, artifactId))
deps.append("""
</exclusions>""")
deps.append("""
</dependency>
""")
TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
<modelVersion>4.0.0</modelVersion>
<packaging>%(type)s</packaging>
<groupId>%(group)s</groupId>
<artifactId>%(artifact)s</artifactId>
<version>%(version)s</version>
<name>%(name)s</name>
<url>%(url)s</url>
<description>%(description)s</description>
<organization>
<name>The Apache Software Foundation</name>
<url>http://www.apache.org</url>
</organization>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
</license>
</licenses>
<dependencies>
%(dependencies)s
</dependencies>
</project>
"""
vars = {}
vars.update(opts.__dict__)
vars["dependencies"] = "".join(deps)
if opts.output is None:
out = sys.stdout
else:
out = open(opts.output, "w")
out.write(TEMPLATE % vars)
out.close()