diff --git a/build b/build index 8e676f2d..e728aeaf 100755 --- a/build +++ b/build @@ -66,6 +66,7 @@ expand etc/java.conf expand etc/eclipse.conf expand macros.d/macros.jpackage expand macros.d/macros.fjava +expand macros.d/macros.javapackages-compat expand java-utils/java-functions expand depgenerators/maven.req expand depgenerators/maven.prov diff --git a/install b/install index e80db4cf..52c714f4 100755 --- a/install +++ b/install @@ -187,6 +187,12 @@ inst_data target/pom_xpath_remove.7 "${mandir}/man7" inst_data target/pom_xpath_replace.7 "${mandir}/man7" inst_data target/pom_xpath_set.7 "${mandir}/man7" +exec >files-compat + +inst_data java-utils/install_pom.py "${javadir}-utils" +inst_data java-utils/maven_depmap.py "${javadir}-utils" + +inst_data target/macros.javapackages-compat "${rpmmacrodir}" exec >files-extra diff --git a/java-utils/install_pom.py b/java-utils/install_pom.py new file mode 100644 index 00000000..e0282773 --- /dev/null +++ b/java-utils/install_pom.py @@ -0,0 +1,261 @@ +# +# Copyright (c) 2014-2016, Red Hat, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the +# distribution. +# 3. Neither the name of Red Hat nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Michal Srb + +from javapackages.maven.pom import POM, PomLoadingException + +from javapackages.xmvn.xmvn_resolve import (XMvnResolve, ResolutionRequest, + XMvnResolveException) +from javapackages.common.exception import JavaPackagesToolsException + +import sys +import os +from xml.etree import ElementTree +from optparse import OptionParser + + +usage = "usage: %prog " +epilog = """ +Resolves pom file from its parents and sanitizes its +dependencies so that it includes only those that have +compile or runtime scope. + +Source POM: +Path where POM file is located. + +Output POM: +Path where the sanitized POM file will be written to. +""" + + +def get_parent_pom(pom): + + req = ResolutionRequest(pom.groupId, pom.artifactId, + extension="pom", version=pom.version) + result = XMvnResolve.process_raw_request([req])[0] + if not result: + raise XMvnResolveException("Unable to resolve parent POM {g}:{a}:{e}:{v}" + .format(g=pom.groupId, a=pom.artifactId, + e="pom", v=pom.version)) + + return POM(result.artifactPath) + + +def merge_sections(main, update): + for upd in update: + for curr in main: + if curr.compare_to(upd): + curr.merge_with(upd) + break + else: + main.append(upd) + + +def get_model_variables(pom): + props = {} + if pom.groupId: + props["project.groupId"] = pom.groupId + if pom.artifactId: + props["project.artifactId"] = pom.artifactId + if pom.version: + props["project.version"] = pom.version + return props + + +def expand_props(deps, props): + for d in deps: + d.interpolate(props) + +def gather_dependencies(pom_path): + pom = POM(pom_path) + pom_props = get_model_variables(pom) + deps, depm, props = _get_dependencies(pom) + # expand project model variables + expand_props(deps, pom_props) + expand_props(depm, pom_props) + + curr_pom = pom + parent = pom.parent + while parent: + ppom = None + if hasattr(parent, "relativePath") and parent.relativePath != "": + try: + ppom_path = os.path.join(os.path.dirname(curr_pom._path), + parent.relativePath) + if os.path.isdir(ppom_path): + ppom_path = os.path.join(ppom_path, 'pom.xml') + ppom = POM(ppom_path) + except PomLoadingException: + pass + else: + try: + ppom_path = os.path.join(os.path.dirname(curr_pom._path), '..') + if os.path.isdir(ppom_path): + ppom_path = os.path.join(ppom_path, 'pom.xml') + ppom = POM(ppom_path) + except PomLoadingException: + pass + + if not ppom: + try: + ppom = get_parent_pom(parent) + except XMvnResolveException: + break + + parent = ppom.parent + pom_props = get_model_variables(ppom) + pdeps, pdepm, pprops = _get_dependencies(ppom) + expand_props(pdeps, pom_props) + expand_props(pdepm, pom_props) + + # merge "dependencies" sections + merge_sections(deps, pdeps) + # merge "dependencyManagement" sections + merge_sections(depm, pdepm) + + # merge "properties" sections + for pkey in pprops: + if pkey not in props: + props[pkey] = pprops[pkey] + + curr_pom = ppom + + for d in deps: + d.interpolate(props) + + for dm in depm: + dm.interpolate(props) + + # apply dependencyManagement on deps + for d in deps: + for dm in depm: + if d.compare_to(dm): + d.merge_with(dm) + break + + # only deps with scope "compile" or "runtime" are interesting + deps = [x for x in deps if x.scope in ["", "compile", "runtime"]] + + return deps + + +def _get_dependencies(pom): + deps = [] + depm = [] + props = {} + + for x in pom.dependencies: + if hasattr(x, "version") and x.version == "any": + x.version = None + deps.append(x) + depm.extend([x for x in pom.dependencyManagement]) + props = pom.properties + + return deps, depm, props + + +def _main(): + OptionParser.format_epilog = lambda self, formatter: self.epilog + parser = OptionParser(usage=usage, + epilog=epilog) + + (options, args) = parser.parse_args() + if len(args) != 2: + parser.error("2 argument2 are required") + + if not os.path.exists(args[0]): + message = ("The first argument '{0}' doesn't point to an existing file ").format(args[0]) + parser.error(message) + + if not os.path.exists(os.path.dirname(os.path.abspath(args[1]))): + message = ("The path '{0}' doesn't exist ").format(os.path.dirname(args[1])) + parser.error(message) + + if not os.path.isdir(os.path.dirname(os.path.abspath(args[1]))): + message = ("The path '{0}' is not a directory ").format(os.path.dirname(args[1])) + parser.error(message) + + if os.path.exists(args[1]): + message = ("The path '{0}' exists. Refusing to overwrite ").format(args[1]) + parser.error(message) + + pom_path = args[0] + uart = POM(pom_path) + + tree = None + ElementTree.register_namespace('',"http://maven.apache.org/POM/4.0.0") + if uart.packaging and uart.packaging.lower() == 'pom': + tree = ElementTree.parse(args[0]) + else: + result_pom = "\n" + result_pom += "\n" + result_pom += " 4.0.0\n" + result_pom += (" {0}\n" ).format(uart.groupId) + result_pom += (" {0}\n" ).format(uart.artifactId) + result_pom += (" {0}\n").format(uart.version) + + if hasattr(uart, "packaging") and uart.packaging != 'jar': + result_pom += (" {0}\n").format(uart.packaging) + if hasattr(uart, "extension") and uart.extension != 'jar': + result_pom += (" {0}\n").format(uart.extension) + if hasattr(uart, "classifier") and uart.classifiler != '': + result_pom += (" {0}\n").format(uart.classifier) + + mvn_deps = gather_dependencies(pom_path) + if mvn_deps: + result_pom += " \n" + for d in mvn_deps: + result_pom += " \n" + result_pom += (" {0}\n").format(d.groupId) + result_pom += (" {0}\n" ).format(d.artifactId) + if hasattr(d, "version"): + result_pom += (" {0}\n" ).format(d.version) + if hasattr(d, "extension") and d.extension != 'jar': + result_pom += (" {0}\n").format(d.extension) + if hasattr(d, "classifier") and d.classifier != '': + result_pom += (" {0}\n").format(d.classifier) + if hasattr(d, "type") and d.type != '': + result_pom += (" {0}\n").format(d.type) + if hasattr(d, "optional") and d.optional.lower() == "true": + result_pom += (" {0}\n").format(d.optional.lower()) + result_pom += " \n" + result_pom += " \n" + + result_pom += "\n" + tree = ElementTree.ElementTree(ElementTree.XML(result_pom)) + tree.write(args[1],encoding="UTF-8",xml_declaration=True) + os.chmod(args[1], 0o0644) + +if __name__ == "__main__": + try: + _main() + except JavaPackagesToolsException as e: + sys.exit(e) diff --git a/java-utils/maven_depmap.py b/java-utils/maven_depmap.py new file mode 100644 index 00000000..6a0520fa --- /dev/null +++ b/java-utils/maven_depmap.py @@ -0,0 +1,357 @@ +# +# Copyright (c) 2014, Red Hat, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the +# distribution. +# 3. Neither the name of Red Hat nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Stanislav Ochotnicky +# +# this script is used by add_maven_depmap rpm macro to generate +# mapping between maven groupId:artifactId and jar file in our local +# filesystem (i.e. %{_javadir}) +# rpm macro expects to find this file as %{_javadir}-utils/maven_depmap.py + + +from optparse import OptionParser +import os +import shutil +import sys + +from os.path import basename, dirname +import zipfile +from time import gmtime, strftime +from copy import deepcopy + +from javapackages.maven.pom import POM +from javapackages.metadata.artifact import MetadataArtifact +from javapackages.metadata.alias import MetadataAlias +from javapackages.metadata.dependency import MetadataDependency +from javapackages.metadata.metadata import Metadata + +from javapackages.common.exception import JavaPackagesToolsException + + +class PackagingTypeMissingFile(JavaPackagesToolsException): + def __init__(self, pom_path): + self.args=("Packaging type is not 'pom' and no artifact path has been provided for POM %s" % pom_path,) + +class IncompatibleFilenames(JavaPackagesToolsException): + def __init__(self, pom_path, jar_path): + self.args=("Filenames of POM %s and JAR %s does not match properly. Check that JAR subdirectories matches '.' in pom name." % (pom_path, jar_path),) + +class ExtensionsDontMatch(JavaPackagesToolsException): + def __init__(self, coordinates_ext, file_ext): + self.args=("Extensions don't match: '%s' != '%s'" % (coordinates_ext, file_ext),) + +class MissingJarFile(JavaPackagesToolsException): + def __init__(self): + self.args=("JAR seems to be missing in standard directories. Make sure you have installed it",) + +class UnknownFileExtension(JavaPackagesToolsException): + def __init__(self, jar_path): + self.args=("Unknown file extension: %s" % (jar_path),) + + +def _print_path_with_dirs(path, base): + print(path) + path = dirname(path) + while path != base and path != '/': + print("%dir " + path) + path = dirname(path) + + +def _make_files_versioned(versions, pom_path, jar_path, pom_base, jar_base): + """Make pom and jar file versioned""" + versions = sorted(set(versions.split(','))) + + vpom_path = pom_path + vjar_path = jar_path + + ret_pom_path = pom_path + ret_jar_path = jar_path + + # pom + if ':' not in vpom_path: + root, ext = os.path.splitext(vpom_path) + symlink = False + for ver in sorted(versions): + dest = "%s-%s%s" % (root, ver, ext) + if not symlink: + shutil.copy(os.path.realpath(vpom_path), dest) + symlink = True + vpom_path = dest + ret_pom_path = dest + else: + os.symlink(basename(vpom_path), dest) + # output file path for file lists + _print_path_with_dirs(dest, pom_base) + # remove unversioned pom + os.remove(pom_path) + + # jar + if vjar_path: + root, ext = os.path.splitext(vjar_path) + symlink = False + for ver in sorted(versions): + dest = "%s-%s%s" % (root, ver, ext) + if not symlink: + shutil.copy(os.path.realpath(vjar_path), dest) + symlink = True + vjar_path = dest + ret_jar_path = dest + else: + os.symlink(basename(vjar_path), dest) + # output file path for file lists + _print_path_with_dirs(dest, jar_base) + # remove unversioned jar + os.remove(jar_path) + + # return paths to versioned, but regular files (not symlinks) + return ret_pom_path, ret_jar_path + +def _resolve_deps(pom): + deps = [] + depm = [] + props = {} + + deps.extend([x for x in pom.dependencies]) + depm.extend([x for x in pom.dependencyManagement]) + props = pom.properties + if pom.groupId: + props["project.groupId"] = pom.groupId + if pom.artifactId: + props["project.artifactId"] = pom.artifactId + if pom.version: + props["project.version"] = pom.version + + for d in deps: + d.interpolate(props) + + for dm in depm: + dm.interpolate(props) + + # apply dependencyManagement on deps + for d in deps: + for dm in depm: + if d.compare_to(dm): + d.merge_with(dm) + break + + # only deps with scope "compile" or "runtime" are interesting + deps = [x for x in deps if x.scope in ["", "compile", "runtime"]] + + return deps + +# Add a file to a ZIP archive (or JAR, WAR, ...) unless the file +# already exists in the archive. Provided by Tomas Radej. +def append_if_missing(archive_name, file_name, file_contents): + archive = zipfile.ZipFile(archive_name, 'a') + try: + if file_name not in archive.namelist(): + archive.writestr(file_name, file_contents) + finally: + archive.close() + + +# Inject pom.properties if JAR doesn't have one. This is necessary to +# identify the origin of JAR files that are present in the repository. +def inject_pom_properties(jar_path, artifact): + if not zipfile.is_zipfile(jar_path): + return + props_path = "META-INF/maven/{a.groupId}/{a.artifactId}/pom.properties".format(a=artifact) + properties = """#Generated by Java Packages Tools +version={a.version} +groupId={a.groupId} +artifactId={a.artifactId} +""".format(a=artifact) + + if artifact.extension: + properties = properties + \ + "extension={ext}\n".format(ext=artifact.extension) + if artifact.classifier: + properties = properties + \ + "classifier={clas}\n".format(clas=artifact.classifier) + + append_if_missing(jar_path, props_path, properties) + + +def add_compat_versions(artifact, versions): + if not versions: + return artifact + + artifact.compatVersions = versions.split(',') + return artifact + + +def add_aliases(artifact, additions): + if not additions: + return artifact + + aliases = additions.split(',') + result = list() + for a in sorted(aliases): + alias = MetadataAlias.from_mvn_str(a) + alias.extension = artifact.extension + result.append(alias) + + artifact.aliases = result + return artifact + + +def write_metadata(metadata_file, artifacts): + if os.path.exists(metadata_file): + metadata = Metadata.create_from_file(metadata_file) + else: + metadata = Metadata() + + # pylint:disable=E1103 + metadata.artifacts += deepcopy(artifacts) + + metadata.write_to_file(metadata_file) + + +def _main(): + usage="usage: %prog [options] metadata_path pom_path| [jar_path]" + parser = OptionParser(usage=usage) + parser.add_option("-a","--append",type="str", + help="Additional depmaps to add (gid:aid) [default: %default]") + parser.add_option('-r', '--versions', type="str", + help='Additional versions to add for each depmap') + parser.add_option('-n', '--namespace', type="str", + help='Namespace to use for generated fragments', default="") + parser.add_option('--pom-base', type="str", + help='Base path under which POM files are installed', default="") + parser.add_option('--jar-base', type="str", + help='Base path under which JAR files are installed', default="") + + parser.set_defaults(append=None) + + (options, args) = parser.parse_args() + append_deps = options.append + add_versions = options.versions + namespace = options.namespace + pom_base = options.pom_base + jar_base = options.jar_base + + if len(args) < 2: + parser.error("Incorrect number of arguments") + # These will fail when incorrect number of arguments is given. + metadata_path = args[0].strip() + pom_path = args[1].strip() + jar_path = None + + artifact = None + have_pom = False + + if len(args) == 3: + jar_path = args[2].strip() + if ':' in pom_path: + pom_str = pom_path.rsplit('/')[-1] + artifact = MetadataArtifact.from_mvn_str(pom_str) + artifact_ext = artifact.extension or "jar" + file_ext = os.path.splitext(jar_path)[1][1:] + if artifact_ext != file_ext: + raise ExtensionsDontMatch(artifact_ext, file_ext) + + if artifact.extension == 'jar': + artifact.extension = '' + + if not artifact.version: + parser.error("Artifact definition has to include version") + else: + artifact = MetadataArtifact.from_pom(pom_path) + ext = os.path.splitext(jar_path)[1][1:] + if ext != "jar": + artifact.extension = ext + have_pom = True + if artifact: + inject_pom_properties(jar_path, artifact) + else: + # looks like POM only artifact + if ':' not in pom_path: + artifact = MetadataArtifact.from_pom(pom_path) + have_pom = True + + if POM(pom_path).packaging != "pom": + raise PackagingTypeMissingFile(pom_path) + else: + sys.exit("JAR file path must be specified when using artifact coordinates") + + + # output file path for file lists + print(metadata_path) + + artifact = add_compat_versions(artifact, add_versions) + if add_versions: + pom_path, jar_path = _make_files_versioned(add_versions, pom_path, jar_path, pom_base, jar_base) + + if namespace: + artifact.namespace = namespace + + if have_pom: + pom = POM(pom_path) + if pom.parent or pom.packaging == "pom": + artifact.properties["xmvn.resolver.disableEffectivePom"] = "true" + else: + deps = [] + for d in _resolve_deps(pom): + deps.append(MetadataDependency.from_mvn_dependency(d)) + if deps: + artifact.dependencies = set(deps) + + + buildroot = os.environ.get('RPM_BUILD_ROOT') + am = [] + if jar_path: + metadata_jar_path = os.path.abspath(jar_path) + artifact.path = metadata_jar_path.replace(buildroot, "") if buildroot else metadata_jar_path + artifact = add_aliases(artifact, append_deps) + if artifact.extension == "jar": + artifact.extension = "" + am.append(artifact.copy()) + # output file path for file list (if it's not versioned) + if not add_versions: + _print_path_with_dirs(jar_path, jar_base) + if have_pom: + metadata_pom_path = os.path.abspath(pom_path) + artifact.path = metadata_pom_path.replace(buildroot, "") if buildroot else metadata_pom_path + artifact.extension = "pom" + artifact.aliases = None + artifact = add_aliases(artifact, append_deps) + am.append(artifact.copy()) + # output file path for file list (if it's not versioned) + if not add_versions: + _print_path_with_dirs(pom_path, pom_base) + + write_metadata(metadata_path, am) + + +if __name__ == "__main__": + try: + _main() + except JavaPackagesToolsException as e: + sys.exit(e) diff --git a/javapackages-tools.spec b/javapackages-tools.spec index d2b6a235..65ac4e17 100644 --- a/javapackages-tools.spec +++ b/javapackages-tools.spec @@ -72,6 +72,14 @@ Provides: %{?scl_prefix}eclipse-filesystem = %{version}-%{release} This package provides some basic directories into which Java packages install their content. +%package -n %{?scl_prefix}javapackages-compat +Summary: Previously deprecated macros and scripts for Java packaging support +Requires: %{?scl_prefix}javapackages-local = %{version}-%{release} + +%description -n %{?scl_prefix}javapackages-compat +This package provides previously deprecated macros and scripts to +support Java packaging as well as some additions to them. + %package -n %{?scl_prefix}maven-local Summary: Macros and scripts for Maven packaging support Requires: %{name} = %{version}-%{release} @@ -173,6 +181,8 @@ rm -rf %{buildroot}%{_mandir}/man7/gradle_build.7 %files -n %{?scl_prefix}javapackages-filesystem -f files-filesystem +%files -n %{?scl_prefix}javapackages-compat -f files-compat + %files -n %{?scl_prefix}javapackages-local -f files-local %files -n %{?scl_prefix}maven-local diff --git a/macros.d/macros.javapackages-compat b/macros.d/macros.javapackages-compat new file mode 100644 index 00000000..6570156e --- /dev/null +++ b/macros.d/macros.javapackages-compat @@ -0,0 +1,95 @@ +# Copyright (c) 2012-2016, Red Hat, Inc +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the +# distribution. +# 3. Neither the name of Red Hat nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Stanislav Ochotnicky +# Mikolaj Izdebski + + +# %mvn_install_pom - Resolve the pom as much as possible and install it +# +# Usage: %mvn_install_pom +# +%mvn_install_pom @{pyinterpreter} @{javadir}-utils/install_pom.py + +#============================================================================== +# +# add_maven_depmap is simplified version of jpackage-style add_to_maven_depmap +# -f addition to fragment name +# -a is "g1:a1,g2:a2" formatted string with additional depmaps (groupId:artifactId,...) +# -v is "v1,v2" formatted string with additional compatibility versions +# supposed to be provided (jar,pom will be renamed to -%{version} variants +# and additional symlinks optionally created) +# %1 is the pom filename relative to mavenpomdir +# %2 is the path to jar file (when omitted we deal with parent pom file without jar) +# +# add_maven_depmap automatically parses pom file and it will fail with incorrect pom +# or jar filename +# +# in the end add_maven_depmap optionally moves jar and pom file to +# -%{version} variant and can create additional versioned symlinks + +%add_maven_depmap(f:a:v:) \ +set -e \ +# default values \ +%if %# == 0 \ + _pompart="JPP-%{name}.pom" \ + _jarpart="%{name}.jar" \ +%else \ + _pompart="%1" \ + _jarpart="%2" \ +%endif \ +_filelist=".mfiles%{-f*:-%{-f*}}" \ +install -dm 755 %{buildroot}%{_datadir}/maven-metadata \ +_jbase= \ +_jpath= \ +for _dir in %{_jnidir} %{_javadir}; do \ + if [ -f %{buildroot}$_dir/$_jarpart ]; then \ + _jbase="%{buildroot}$_dir" \ + _jpath="$_jbase/$_jarpart" \ + fi \ +done \ +%if %# != 1 \ + [ -z "$_jpath" ] && (echo "%0 error: $_jarpart - file not found" 1>&2; exit 1) \ +%endif \ +@{pyinterpreter} @{javadir}-utils/maven_depmap.py %{-a} %{-v*:-r %{-v*}} \\\ + --pom-base %{buildroot}%{_mavenpomdir} \\\ + --jar-base "$_jbase" \\\ + %{buildroot}%{_datadir}/maven-metadata/%{name}%{-f*:-%{-f*}}.xml \\\ + %{buildroot}%{_mavenpomdir}/$_pompart \\\ +%if %# == 2 \ + "${_jpath}" \\\ +%endif \ +%if %# == 0 \ + "${_jpath}" \\\ +%endif \ + >> ${_filelist} \ +sed -i 's:%{buildroot}::' ${_filelist} \ +sort -u -o ${_filelist} ${_filelist} \ +\ +%{nil} diff --git a/test/data/install_pom/JPP-apache-commons-io.pom b/test/data/install_pom/JPP-apache-commons-io.pom new file mode 100644 index 00000000..9349ebdd --- /dev/null +++ b/test/data/install_pom/JPP-apache-commons-io.pom @@ -0,0 +1,22 @@ + + + org.apache.commons + commons-parent + 17 + + 4.0.0 + commons-io + commons-io + 2 + Commons Lang + pom + + + + G + G + 1000 + + + + diff --git a/test/data/install_pom/JPP-bndlib.pom b/test/data/install_pom/JPP-bndlib.pom new file mode 100644 index 00000000..bf1efe5e --- /dev/null +++ b/test/data/install_pom/JPP-bndlib.pom @@ -0,0 +1,72 @@ + + + + 4.0.0 + + + biz.aQute + + + bndlib + + + 1.50.0 + + + A Swiss Army Knife for OSGi + + + bnd - Bundle Tool + + + http://www.aQute.biz/Code/Bnd + + + + git://github.com/bndtools/bnd.git + + + git://github.com/bndtools/bnd.git + + + git://github.com/bndtools/bnd.git + + + + + aQute SARL + + + http://www.aQute.biz + + + + + + Peter.Kriens@aQute.biz + + + Peter.Kriens + + + Peter.Kriens@aQute.biz + + + aQute + + + + + + + Apache Software License 2.0 + + + http://www.opensource.org/licenses/apache2.0.php + + + repo + + + + \ No newline at end of file diff --git a/test/data/install_pom/JPP-noversion-pom.pom b/test/data/install_pom/JPP-noversion-pom.pom new file mode 100644 index 00000000..a789d1b6 --- /dev/null +++ b/test/data/install_pom/JPP-noversion-pom.pom @@ -0,0 +1,9 @@ + + 4.0.0 + org.apache.commons + commons-io + commons-io + Commons Lang + pom + + diff --git a/test/data/install_pom/JPP-noversion.pom b/test/data/install_pom/JPP-noversion.pom new file mode 100644 index 00000000..bd87edea --- /dev/null +++ b/test/data/install_pom/JPP-noversion.pom @@ -0,0 +1,8 @@ + + 4.0.0 + org.apache.commons + commons-io + commons-io + Commons Lang + + diff --git a/test/data/install_pom/JPP-parent-version.pom b/test/data/install_pom/JPP-parent-version.pom new file mode 100644 index 00000000..4e40fa2a --- /dev/null +++ b/test/data/install_pom/JPP-parent-version.pom @@ -0,0 +1,9 @@ + + 4.0.0 + a + + g + p + 1 + + diff --git a/test/data/install_pom/a_binary_file.pom b/test/data/install_pom/a_binary_file.pom new file mode 100644 index 00000000..5b3a2335 Binary files /dev/null and b/test/data/install_pom/a_binary_file.pom differ diff --git a/test/data/install_pom/cglib/cglib-integration-test/pom.xml b/test/data/install_pom/cglib/cglib-integration-test/pom.xml new file mode 100644 index 00000000..1c717477 --- /dev/null +++ b/test/data/install_pom/cglib/cglib-integration-test/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + + + + + cglib + cglib-parent + 3.3.0 + + + + + + cglib-integration-test + jar + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + integration-test + verify + + + + + + + + + src/main/resources + + + ${basedir}/.. + META-INF + + LICENSE + NOTICE + README + + + + + + + + + + + ${project.groupId} + cglib + + + ${project.groupId} + cglib-sample + + + + junit + junit + + + + diff --git a/test/data/install_pom/cglib/cglib/pom.xml b/test/data/install_pom/cglib/cglib/pom.xml new file mode 100644 index 00000000..4563e67f --- /dev/null +++ b/test/data/install_pom/cglib/cglib/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + + + + + cglib + cglib-parent + 3.3.0 + + + + + + cglib + jar + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + + + src/main/resources + + + ${basedir}/.. + META-INF + + LICENSE + NOTICE + README + + + + + + + + + + + org.ow2.asm + asm + + + org.apache.ant + ant + true + + + + junit + junit + + + + diff --git a/test/data/install_pom/cglib/pom.xml b/test/data/install_pom/cglib/pom.xml new file mode 100644 index 00000000..b4468689 --- /dev/null +++ b/test/data/install_pom/cglib/pom.xml @@ -0,0 +1,246 @@ + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + + + + cglib + cglib-parent + 3.3.0 + pom + + Code Generation Library + https://github.com/cglib/cglib + cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime. + + + scm:git:git://github.com/cglib/cglib.git + scm:git:ssh://git@github.com/cglib/cglib.git + https://github.com/cglib/cglib + + + + Github Issues + https://github.com/cglib/cglib/issues + + + + Travis + https://travis-ci.org/cglib/cglib + + + + + ASF 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + + UTF-8 + UTF-8 + + 1.5 + 1.5 + 7.1 + 1.10.3 + 1.21 + 3.7.0 + 3.1.0 + 3.0.1 + 3.1.0 + + + ${java.compiler.argument} + true + + + + + + + cglib + cglib-nodep + cglib-sample + cglib-integration-test + cglib-jmh + + + + + + + + java8 + + [1.8,) + + + -parameters + + + + java9 + + [1.9,) + + + 1.6 + 1.6 + -parameters + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version.source} + ${java.version.target} + ${java.compiler.argument} + ${java.specification.version} + ${java.specification.version} + ${java.test.compiler.argument} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + + net.sf.cglib.test.stressHashCodes + true + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.21.0 + + + + net.sf.cglib.test.stressHashCodes + true + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + true + false + false + + false + none + + + org.ow2.asm + asm + ${asm.version} + + + org.apache.ant + ant + ${ant.version} + + + + + + attach-javadocs + + jar + + + + + + org.sonatype.plugins + jarjar-maven-plugin + 1.9 + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + + + ${project.groupId} + cglib + ${project.version} + + + ${project.groupId} + cglib-sample + ${project.version} + + + + org.ow2.asm + asm + ${asm.version} + + + org.apache.ant + ant + ${ant.version} + + + + junit + junit + 4.12 + test + + + + + diff --git a/test/data/install_pom/fakedir b/test/data/install_pom/fakedir new file mode 100644 index 00000000..e69de29b diff --git a/test/data/install_pom/languagetool/languagetool-language-modules/ja/pom.xml b/test/data/install_pom/languagetool/languagetool-language-modules/ja/pom.xml new file mode 100644 index 00000000..1df2ead4 --- /dev/null +++ b/test/data/install_pom/languagetool/languagetool-language-modules/ja/pom.xml @@ -0,0 +1,104 @@ + + 4.0.0 + + + org.languagetool + languagetool-parent + 4.8 + ../../pom.xml + + + language-ja + http://www.languagetool.org + Japanese module for LanguageTool + + + + GNU Lesser General Public License + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt + repo + The license refers to the source code, resources may be under different licenses + + + + jar + + + + Daniel Naber + Maintainer + + + Marcin MiƂkowski + Maintainer + + + + + + + maven-compiler-plugin + + + maven-surefire-plugin + + + + + + + org.languagetool + languagetool-core + ${languagetool.version} + + + + com.github.lucene-gosen + lucene-gosen + 6.2.1 + ipadic + + + org.apache.lucene + lucene-core + + + org.apache.solr + solr-core + + + org.apache.solr + solr-solrj + + + org.apache.lucene + lucene-codecs + + + org.apache.lucene + lucene-analyzers + + + org.apache.lucene + lucene-analyzers-common + + + + + + + org.languagetool + languagetool-core + ${languagetool.version} + test-jar + test + + + junit + junit + ${junit.version} + test + + + + \ No newline at end of file diff --git a/test/data/install_pom/languagetool/languagetool-standalone/pom.xml b/test/data/install_pom/languagetool/languagetool-standalone/pom.xml new file mode 100644 index 00000000..37c51753 --- /dev/null +++ b/test/data/install_pom/languagetool/languagetool-standalone/pom.xml @@ -0,0 +1,163 @@ + + 4.0.0 + + + org.languagetool + languagetool-parent + 4.8 + ../pom.xml + + + languagetool-standalone + http://www.languagetool.org + LanguageTool stand-alone GUI + + + + GNU Lesser General Public License + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt + repo + + + + jar + + + + + src/main/resources + + + ${basedir} + META-INF + + CHANGES.txt + COPYING.txt + README.txt + + + + + + maven-compiler-plugin + + + maven-surefire-plugin + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin} + + + + true + custom + libs/$${artifact.artifactId}$${dashClassifier?}.$${artifact.extension} + + + + ./ languagetool-server.jar + org.languagetool.gui.Main + ${project.version} + ${maven.build.timestamp} + + + + + + maven-assembly-plugin + ${maven.assemby.plugin} + + src/main/assembly/zip.xml + LanguageTool-${project.version} + false + + + true + false + + + + + + make-assembly + package + + single + + + + + + + + + + + org.languagetool + languagetool-core + ${languagetool.version} + + + org.languagetool + languagetool-gui-commons + ${languagetool.version} + + + org.languagetool + languagetool-commandline + ${languagetool.version} + + + org.languagetool + languagetool-server + ${languagetool.version} + + + + org.languagetool + language-all + ${languagetool.version} + + + + org.languagetool + languagetool-tools + ${languagetool.version} + + + + org.apache.commons + commons-collections4 + 4.1 + + + + org.slf4j + slf4j-api + 1.7.25 + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + org.languagetool + languagetool-core + ${languagetool.version} + test-jar + + + junit + junit + ${junit.version} + + + + + diff --git a/test/data/install_pom/languagetool/pom.xml b/test/data/install_pom/languagetool/pom.xml new file mode 100644 index 00000000..a47b9b01 --- /dev/null +++ b/test/data/install_pom/languagetool/pom.xml @@ -0,0 +1,233 @@ + + 4.0.0 + + + 3.04 + + + + org.sonatype.oss + oss-parent + 7 + + + + scm:git:git@github.com:languagetool-org/languagetool.git + scm:git:git@github.com:languagetool-org/languagetool.git + git@github.com:languagetool-org/languagetool.git + HEAD + + + org.languagetool + languagetool-parent + 4.8 + pom + + + 4.8 + UTF-8 + 1.8 + 1.8 + yyyy-MM-dd HH:mm + 2.6 + 2.6 + 4.12 + 2.1.6 + 2.9.10 + 5.5.5 + + + + + + + + org.apache.maven.wagon + wagon-webdav + 1.0-beta-2 + + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M2 + + + enforce + + + + + + + enforce + + + + + + + pl.project13.maven + git-commit-id-plugin + 2.2.6 + + + get-the-git-infos + + revision + + initialize + + + + true + ${project.build.outputDirectory}/git.properties + + + + + maven-compiler-plugin + 3.8.0 + + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + maven-surefire-plugin + 2.22.0 + + false + -Xms256m -Xmx1550m + failedfirst + + **/*ConcurrencyTest.java + **/Abstract*.java + + false + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.1 + + + org.languagetool.dev.conversion* + + + + + + + org.codehaus.mojo + license-maven-plugin + + + + + + + + + community-release + dav:https://repository-languagetool.forge.cloudbees.com/release/ + + + community-snapshot + dav:https://repository-languagetool.forge.cloudbees.com/snapshot/ + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + true + + + + sign-artifacts + verify + + sign + + + + + + + + + + + languagetool-core + languagetool-language-modules/en + languagetool-language-modules/fa + languagetool-language-modules/fr + languagetool-language-modules/de + languagetool-language-modules/pl + languagetool-language-modules/ca + languagetool-language-modules/it + languagetool-language-modules/br + languagetool-language-modules/nl + languagetool-language-modules/pt + languagetool-language-modules/ru + languagetool-language-modules/ast + languagetool-language-modules/be + languagetool-language-modules/zh + languagetool-language-modules/da + languagetool-language-modules/eo + languagetool-language-modules/gl + languagetool-language-modules/el + languagetool-language-modules/is + languagetool-language-modules/ja + languagetool-language-modules/km + languagetool-language-modules/lt + languagetool-language-modules/ml + languagetool-language-modules/ro + languagetool-language-modules/sk + languagetool-language-modules/sl + + languagetool-language-modules/es + languagetool-language-modules/sv + languagetool-language-modules/ta + languagetool-language-modules/tl + languagetool-language-modules/uk + languagetool-language-modules/de-DE-x-simple-language + languagetool-language-modules/all + languagetool-gui-commons + languagetool-commandline + languagetool-standalone + languagetool-office-extension + languagetool-wikipedia + languagetool-server + languagetool-http-client + languagetool-tools + languagetool-dev + languagetool-rpm-package + + + + diff --git a/test/data/install_pom/test_any_not_final-want.xml b/test/data/install_pom/test_any_not_final-want.xml new file mode 100644 index 00000000..0e34c3f9 --- /dev/null +++ b/test/data/install_pom/test_any_not_final-want.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + org.fedoraproject.xmvn + xmvn-resolve + 4.0.0 + + + com.beust + jcommander + 1.82 + + + org.fedoraproject.xmvn + xmvn-api + 4.0.0 + + + org.fedoraproject.xmvn + xmvn-core + 4.0.0 + + + \ No newline at end of file diff --git a/test/data/install_pom/test_basic-want.xml b/test/data/install_pom/test_basic-want.xml new file mode 100644 index 00000000..2b7ed5cd --- /dev/null +++ b/test/data/install_pom/test_basic-want.xml @@ -0,0 +1,7 @@ + + + 4.0.0 + biz.aQute + bndlib + 1.50.0 + \ No newline at end of file diff --git a/test/data/install_pom/test_dep_classifier-want.xml b/test/data/install_pom/test_dep_classifier-want.xml new file mode 100644 index 00000000..e78f92e6 --- /dev/null +++ b/test/data/install_pom/test_dep_classifier-want.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + org.languagetool + language-ja + 4.8 + + + org.languagetool + languagetool-core + 4.8 + + + com.github.lucene-gosen + lucene-gosen + 6.2.1 + ipadic + + + \ No newline at end of file diff --git a/test/data/install_pom/test_dep_type-want.xml b/test/data/install_pom/test_dep_type-want.xml new file mode 100644 index 00000000..0074c18b --- /dev/null +++ b/test/data/install_pom/test_dep_type-want.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + org.languagetool + languagetool-standalone + 4.8 + + + org.languagetool + languagetool-core + 4.8 + + + org.languagetool + languagetool-gui-commons + 4.8 + + + org.languagetool + languagetool-commandline + 4.8 + + + org.languagetool + languagetool-server + 4.8 + + + org.languagetool + language-all + 4.8 + + + org.languagetool + languagetool-tools + 4.8 + + + org.apache.commons + commons-collections4 + 4.1 + + + org.slf4j + slf4j-api + 1.7.25 + + + ch.qos.logback + logback-classic + 1.2.3 + + + org.languagetool + languagetool-core + 4.8 + test-jar + + + junit + junit + 4.12 + + + \ No newline at end of file diff --git a/test/data/install_pom/test_interpolate_from_model-want.xml b/test/data/install_pom/test_interpolate_from_model-want.xml new file mode 100644 index 00000000..7dd835c4 --- /dev/null +++ b/test/data/install_pom/test_interpolate_from_model-want.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + cglib + cglib-integration-test + 3.3.0 + + + cglib + cglib + 3.3.0 + + + cglib + cglib-sample + 3.3.0 + + + \ No newline at end of file diff --git a/test/data/install_pom/test_interpolate_from_parent-want.xml b/test/data/install_pom/test_interpolate_from_parent-want.xml new file mode 100644 index 00000000..2f53c963 --- /dev/null +++ b/test/data/install_pom/test_interpolate_from_parent-want.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + cglib + cglib + 3.3.0 + + + org.ow2.asm + asm + 7.1 + + + org.apache.ant + ant + 1.10.3 + true + + + \ No newline at end of file diff --git a/test/data/install_pom/test_packaging_pom-want.xml b/test/data/install_pom/test_packaging_pom-want.xml new file mode 100644 index 00000000..79ad0972 --- /dev/null +++ b/test/data/install_pom/test_packaging_pom-want.xml @@ -0,0 +1,23 @@ + + + + org.apache.commons + commons-parent + 17 + + 4.0.0 + commons-io + commons-io + 2 + Commons Lang + pom + + + + G + G + 1000 + + + + \ No newline at end of file diff --git a/test/data/install_pom/test_packaging_pom_missing_version-want.xml b/test/data/install_pom/test_packaging_pom_missing_version-want.xml new file mode 100644 index 00000000..f3f66652 --- /dev/null +++ b/test/data/install_pom/test_packaging_pom_missing_version-want.xml @@ -0,0 +1,10 @@ + + + 4.0.0 + org.apache.commons + commons-io + commons-io + Commons Lang + pom + + \ No newline at end of file diff --git a/test/data/install_pom/test_parent_chain-want.xml b/test/data/install_pom/test_parent_chain-want.xml new file mode 100644 index 00000000..3fe9faf2 --- /dev/null +++ b/test/data/install_pom/test_parent_chain-want.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + org.fedoraproject.xmvn + xmvn-install + 4.0.0 + + + com.beust + jcommander + 1.82 + + + org.fedoraproject.xmvn + xmvn-api + 4.0.0 + + + org.fedoraproject.xmvn + xmvn-core + 4.0.0 + + + org.slf4j + slf4j-api + 2.0.0-alpha7 + + + org.slf4j + slf4j-simple + 2.0.0-alpha7 + + + org.ow2.asm + asm + 9.3 + + + org.apache.commons + commons-compress + 1.21 + + + \ No newline at end of file diff --git a/test/data/install_pom/test_parent_install-want.xml b/test/data/install_pom/test_parent_install-want.xml new file mode 100644 index 00000000..64931178 --- /dev/null +++ b/test/data/install_pom/test_parent_install-want.xml @@ -0,0 +1,245 @@ + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + + + + cglib + cglib-parent + 3.3.0 + pom + + Code Generation Library + https://github.com/cglib/cglib + cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime. + + + scm:git:git://github.com/cglib/cglib.git + scm:git:ssh://git@github.com/cglib/cglib.git + https://github.com/cglib/cglib + + + + Github Issues + https://github.com/cglib/cglib/issues + + + + Travis + https://travis-ci.org/cglib/cglib + + + + + ASF 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + + UTF-8 + UTF-8 + + 1.5 + 1.5 + 7.1 + 1.10.3 + 1.21 + 3.7.0 + 3.1.0 + 3.0.1 + 3.1.0 + + + ${java.compiler.argument} + true + + + + + + + cglib + cglib-nodep + cglib-sample + cglib-integration-test + cglib-jmh + + + + + + + + java8 + + [1.8,) + + + -parameters + + + + java9 + + [1.9,) + + + 1.6 + 1.6 + -parameters + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version.source} + ${java.version.target} + ${java.compiler.argument} + ${java.specification.version} + ${java.specification.version} + ${java.test.compiler.argument} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + + net.sf.cglib.test.stressHashCodes + true + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.21.0 + + + + net.sf.cglib.test.stressHashCodes + true + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + true + false + false + + false + none + + + org.ow2.asm + asm + ${asm.version} + + + org.apache.ant + ant + ${ant.version} + + + + + + attach-javadocs + + jar + + + + + + org.sonatype.plugins + jarjar-maven-plugin + 1.9 + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + + + ${project.groupId} + cglib + ${project.version} + + + ${project.groupId} + cglib-sample + ${project.version} + + + + org.ow2.asm + asm + ${asm.version} + + + org.apache.ant + ant + ${ant.version} + + + + junit + junit + 4.12 + test + + + + + \ No newline at end of file diff --git a/test/data/install_pom/test_parent_relpath-want.xml b/test/data/install_pom/test_parent_relpath-want.xml new file mode 100644 index 00000000..98a5c980 --- /dev/null +++ b/test/data/install_pom/test_parent_relpath-want.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + org.fedoraproject.xmvn + xmvn-mojo + 4.0.0 + maven-plugin + + + org.fedoraproject.xmvn + xmvn-api + 4.0.0 + + + org.fedoraproject.xmvn + xmvn-core + 4.0.0 + + + org.apache.maven.resolver + maven-resolver-util + 1.8.1 + + + \ No newline at end of file diff --git a/test/data/install_pom/test_parent_version-want.xml b/test/data/install_pom/test_parent_version-want.xml new file mode 100644 index 00000000..4f5734e6 --- /dev/null +++ b/test/data/install_pom/test_parent_version-want.xml @@ -0,0 +1,7 @@ + + + 4.0.0 + g + a + 1 + \ No newline at end of file diff --git a/test/data/install_pom/xmvn/xmvn-mojo/pom.xml b/test/data/install_pom/xmvn/xmvn-mojo/pom.xml new file mode 100644 index 00000000..c73f92a7 --- /dev/null +++ b/test/data/install_pom/xmvn/xmvn-mojo/pom.xml @@ -0,0 +1,113 @@ + + + + 4.0.0 + + xmvn-parent + org.fedoraproject.xmvn + 4.0.0 + ../xmvn-parent + + xmvn-mojo + maven-plugin + XMvn MOJO + + XMvn MOJO is a Maven plugin, which consists of several MOJOs. + Some goals of these MOJOs are intended to be attached to default + Maven lifecycle when building packages, others can be called + directly from Maven command line. + + + + org.apache.maven + maven-core + provided + + + org.apache.maven + maven-artifact + provided + + + org.apache.maven + maven-model + provided + + + org.apache.maven + maven-plugin-api + provided + + + org.codehaus.plexus + plexus-classworlds + provided + + + org.codehaus.plexus + plexus-utils + provided + + + org.apache.maven.plugin-tools + maven-plugin-annotations + provided + + + org.fedoraproject.xmvn + xmvn-api + + + org.fedoraproject.xmvn + xmvn-core + runtime + + + org.codehaus.plexus + plexus-container-default + provided + + + org.apache.maven.resolver + maven-resolver-util + + + + + + maven-plugin-plugin + + + mojo-descriptor + + descriptor + + + + + true + + 3.0 + + + + + + diff --git a/test/data/install_pom/xmvn/xmvn-parent/pom.xml b/test/data/install_pom/xmvn/xmvn-parent/pom.xml new file mode 100644 index 00000000..030923f9 --- /dev/null +++ b/test/data/install_pom/xmvn/xmvn-parent/pom.xml @@ -0,0 +1,585 @@ + + + + 4.0.0 + org.fedoraproject.xmvn + xmvn-parent + 4.0.0 + pom + XMvn Parent + + XMvn Parent is project model from which all other XMvn modules are + inheriting. It defines settings common to all XMvn modules. + + https://fedora-java.github.io/xmvn/ + 2012 + + Red Hat, Inc. + http://www.redhat.com/ + + + + Apache License Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + mizdebsk + Mikolaj Izdebski + mizdebsk@redhat.com + Red Hat, Inc. + http://www.redhat.com/ + +1 + + + + + Fedora Java development List + java-devel@lists.fedoraproject.org + http://lists.fedoraproject.org/pipermail/java-devel/ + https://admin.fedoraproject.org/mailman/listinfo/java-devel + https://admin.fedoraproject.org/mailman/listinfo/java-devel + + + + https://github.com/fedora-java/xmvn + scm:git:https://github.com/fedora-java/xmvn.git + scm:git:git@github.com:fedora-java/xmvn.git + + + Github + https://github.com/fedora-java/xmvn/issues/ + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + + US-ASCII + + 9.3 + 1.82 + 3.2.0 + 1.8.1 + 3.8.6 + 2.6.0 + 3.4.2 + 3.6.4 + 2.0.0-alpha7 + 1.21 + + + 1.3.2.GA + 3.3.0 + 3.3.0 + 9.3 + 3.1.2 + 3.2.0 + 3.10.1 + 3.3.0 + 3.0.0-M2 + 4.3 + 3.0.1 + 3.0.0-M1 + 0.8.8 + 3.2.2 + 3.4.0 + 5.8.2 + 2.3 + 1.0 + 2.0.0 + 1.6.13 + 3.0.1 + 3.0.0 + 2.1.1 + 0.14 + 3.2.0 + 3.12.0 + 3.2.1 + 3.0.0-M7 + 2.9.0 + + + + + + org.apache.maven + maven-artifact + ${mavenVersion} + + + org.apache.maven + maven-core + ${mavenVersion} + + + org.apache.maven + maven-model + ${mavenVersion} + + + org.apache.maven + maven-model-builder + ${mavenVersion} + + + org.apache.maven + maven-plugin-api + ${mavenVersion} + + + org.apache.maven.resolver + maven-resolver-api + ${mavenResolverVersion} + + + org.apache.maven.resolver + maven-resolver-util + ${mavenResolverVersion} + + + org.apache.maven.plugin-tools + maven-plugin-annotations + ${pluginToolsVersion} + + + org.codehaus.plexus + plexus-classworlds + ${plexusClassworldsVersion} + + + org.codehaus.plexus + plexus-utils + ${plexusUtilsVersion} + + + org.fedoraproject.xmvn + xmvn-api + ${project.version} + + + org.fedoraproject.xmvn + xmvn-core + ${project.version} + + + org.fedoraproject.xmvn + xmvn-connector + ${project.version} + + + org.fedoraproject.xmvn + xmvn-install + ${project.version} + + + org.fedoraproject.xmvn + xmvn-resolve + ${project.version} + + + org.fedoraproject.xmvn + xmvn-subst + ${project.version} + + + org.fedoraproject.xmvn + xmvn-it + ${project.version} + + + org.junit.jupiter + junit-jupiter + ${junitVersion} + + + org.xmlunit + xmlunit-assertj3 + ${xmlunitVersion} + + + org.easymock + easymock + ${easymockVersion} + + + com.beust + jcommander + ${jcommanderVersion} + + + org.apache.maven.shared + maven-invoker + ${mavenInvokerVersion} + + + org.slf4j + slf4j-api + ${slf4jVersion} + + + org.slf4j + slf4j-simple + ${slf4jVersion} + + + org.ow2.asm + asm + ${asmVersion} + + + org.codehaus.plexus + plexus-component-annotations + ${plexusVersion} + + + org.codehaus.plexus + plexus-container-default + ${plexusVersion} + + + org.apache.commons + commons-compress + ${commonsCompressVersion} + + + + + + org.junit.jupiter + junit-jupiter + test + + + org.xmlunit + xmlunit-assertj3 + test + + + org.easymock + easymock + test + + + org.slf4j + slf4j-simple + test + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${buildHelperPluginVersion} + + + maven-compiler-plugin + ${compilerPluginVersion} + + 1.8 + 1.8 + + + + maven-site-plugin + ${sitePluginVersion} + + + maven-dependency-plugin + ${dependencyPluginVersion} + + + maven-plugin-plugin + ${pluginToolsVersion} + + + org.codehaus.modello + modello-maven-plugin + ${modelloVersion} + + + maven-assembly-plugin + ${assemblyPluginVersion} + + + maven-clean-plugin + ${cleanPluginVersion} + + + maven-deploy-plugin + ${deployPluginVersion} + + + maven-install-plugin + ${installPluginVersion} + + + maven-jar-plugin + ${jarPluginVersion} + + true + + + + maven-resources-plugin + ${resourcesPluginVersion} + + + maven-surefire-plugin + ${surefireVersion} + + + maven-checkstyle-plugin + ${checkstylePluginVersion} + + + com.puppycrawl.tools + checkstyle + ${checkstyleVersion} + + + + + src/main/java + + true + ../aux/checkstyle.xml + ../aux/checkstyle-suppressions.xml + ../aux/license-header.txt + **/package-info.java + false + + + + org.apache.rat + apache-rat-plugin + ${ratPluginVersion} + + + src/test/resources/** + + + + + maven-javadoc-plugin + ${javadocPluginVersion} + + + none + + + + maven-source-plugin + ${sourcePluginVersion} + + + maven-gpg-plugin + ${gpgPluginVersion} + + + org.sonatype.plugins + nexus-staging-maven-plugin + ${nexusStagingPluginVersion} + + ossrh + https://oss.sonatype.org/ + false + + + + org.jacoco + jacoco-maven-plugin + ${jacocoVersion} + + + org.codehaus.plexus + plexus-component-metadata + ${plexusVersion} + + + + generate-metadata + + + + + + + + + + quality + + true + + + + + maven-checkstyle-plugin + + + checkstyle-check + + check + + + + + + org.jacoco + jacoco-maven-plugin + + + + prepare-agent + + + + jacoco-report + post-integration-test + + report + + + + + + + + + release + + + + maven-assembly-plugin + + + org.apache.apache.resources + apache-source-release-assembly-descriptor + 1.0.6 + + + + + source-release-assembly + package + + single + + + true + + source-release + + gnu + + + + + + maven-javadoc-plugin + + + attach-javadoc + + jar + + + + + + maven-source-plugin + + + attach-sources + + jar-no-fork + + + + + + maven-gpg-plugin + + + sign-artifacts + package + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + true + + + org.apache.rat + apache-rat-plugin + + + rat-check + + check + + + + + + maven-site-plugin + + true + true + + + + + + + jdk9+ + + [9,) + + + + + maven-compiler-plugin + + 8 + + + + maven-surefire-plugin + + --add-opens java.base/java.lang=ALL-UNNAMED + + + + + + + diff --git a/test/data/install_pom/xmvn/xmvn-tools/pom.xml b/test/data/install_pom/xmvn/xmvn-tools/pom.xml new file mode 100644 index 00000000..43abc443 --- /dev/null +++ b/test/data/install_pom/xmvn/xmvn-tools/pom.xml @@ -0,0 +1,58 @@ + + + + 4.0.0 + + xmvn-parent + org.fedoraproject.xmvn + 4.0.0 + ../xmvn-parent + + xmvn-tools + pom + XMvn Tools + + XMvn Tools is parent POM for all XMvn tools. It holds + configuration common to all XMvn tools. + + + xmvn-resolve + xmvn-subst + xmvn-install + + + + + + maven-jar-plugin + ${jarPluginVersion} + + + + true + ${mainClass} + + + + + + + + diff --git a/test/data/install_pom/xmvn/xmvn-tools/xmvn-install/pom.xml b/test/data/install_pom/xmvn/xmvn-tools/xmvn-install/pom.xml new file mode 100644 index 00000000..8c423069 --- /dev/null +++ b/test/data/install_pom/xmvn/xmvn-tools/xmvn-install/pom.xml @@ -0,0 +1,69 @@ + + + + 4.0.0 + + org.fedoraproject.xmvn + xmvn-tools + 4.0.0 + + xmvn-install + XMvn Install + + XMvn Install is a command-line interface to XMvn installer. The + installer reads reactor metadata and performs artifact + installation according to specified configuration. + + + org.fedoraproject.xmvn.tools.install.cli.InstallerCli + + + + com.beust + jcommander + + + org.fedoraproject.xmvn + xmvn-api + + + org.fedoraproject.xmvn + xmvn-core + runtime + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-simple + runtime + + + org.ow2.asm + asm + + + org.apache.commons + commons-compress + + + diff --git a/test/data/install_pom/xmvn/xmvn-tools/xmvn-resolve/pom.xml b/test/data/install_pom/xmvn/xmvn-tools/xmvn-resolve/pom.xml new file mode 100644 index 00000000..8cabc13f --- /dev/null +++ b/test/data/install_pom/xmvn/xmvn-tools/xmvn-resolve/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + xmvn-tools + org.fedoraproject.xmvn + 4.0.0 + .. + + xmvn-resolve + XMvn Resolver + + XMvn Resolver is a very simple commald-line tool to resolve Maven + artifacts from system repositories. Basically it's just an + interface to artifact resolution mechanism implemented by XMvn + Core. The primary intended use case of XMvn Resolver is debugging + local artifact repositories. + + + org.fedoraproject.xmvn.tools.resolve.ResolverCli + + + + com.beust + jcommander + any + + org.fedoraproject.xmvn + xmvn-api + any + + org.fedoraproject.xmvn + xmvn-core + runtime + any + + diff --git a/test/data/maven_depmap/JPP-depmngmnt.pom b/test/data/maven_depmap/JPP-depmngmnt.pom new file mode 100644 index 00000000..ec86bb3d --- /dev/null +++ b/test/data/maven_depmap/JPP-depmngmnt.pom @@ -0,0 +1,33 @@ + + + 4.0.0 + org.fedoraproject.xmvn + 4.0.0 + xmvn-subst + XMvn Subst + + XMvn Subst is a tool that can substitute Maven artifact files with + symbolic links to corresponding files in artifact repository. + + + 1.82 + + + + + com.beust + jcommander + ${jcommanderVersion} + + + + + + com.beust + jcommander + + + diff --git a/test/data/maven_depmap/JPP-modelexpansion.pom b/test/data/maven_depmap/JPP-modelexpansion.pom new file mode 100644 index 00000000..3feced96 --- /dev/null +++ b/test/data/maven_depmap/JPP-modelexpansion.pom @@ -0,0 +1,33 @@ + + + 4.0.0 + org.fedoraproject.xmvn + 4.0.0 + xmvn-subst + XMvn Subst + + XMvn Subst is a tool that can substitute Maven artifact files with + symbolic links to corresponding files in artifact repository. + + + 1.82 + + + + + org.fedoraproject.xmvn + xmvn-api + ${project.version} + + + + + + org.fedoraproject.xmvn + xmvn-api + + + diff --git a/test/data/maven_depmap/test_alias_extension-want.xml b/test/data/maven_depmap/test_alias_extension-want.xml index 6b0d1aee..d502fdf8 100644 --- a/test/data/maven_depmap/test_alias_extension-want.xml +++ b/test/data/maven_depmap/test_alias_extension-want.xml @@ -13,9 +13,6 @@ %s/usr/share/java/commons-io.jar - - true - alias @@ -30,9 +27,6 @@ %s/JPP-alias.pom - - true - diff --git a/test/data/maven_depmap/test_append-want.xml b/test/data/maven_depmap/test_append-want.xml index 65d420e6..0ca20911 100644 --- a/test/data/maven_depmap/test_append-want.xml +++ b/test/data/maven_depmap/test_append-want.xml @@ -12,9 +12,6 @@ y - - true - diff --git a/test/data/maven_depmap/test_append_and_namespace-want.xml b/test/data/maven_depmap/test_append_and_namespace-want.xml index 88b1f816..368863bf 100644 --- a/test/data/maven_depmap/test_append_and_namespace-want.xml +++ b/test/data/maven_depmap/test_append_and_namespace-want.xml @@ -13,9 +13,6 @@ y - - true - diff --git a/test/data/maven_depmap/test_basic-want.xml b/test/data/maven_depmap/test_basic-want.xml index 540f076a..200044bf 100644 --- a/test/data/maven_depmap/test_basic-want.xml +++ b/test/data/maven_depmap/test_basic-want.xml @@ -6,9 +6,6 @@ bndlib 1.50.0 %s/usr/share/java/bndlib.jar - - true - biz.aQute @@ -16,9 +13,6 @@ pom 1.50.0 %s/JPP-bndlib.pom - - true - diff --git a/test/data/maven_depmap/test_buildroot-want.xml b/test/data/maven_depmap/test_buildroot-want.xml index 604046a5..9fa588d4 100644 --- a/test/data/maven_depmap/test_buildroot-want.xml +++ b/test/data/maven_depmap/test_buildroot-want.xml @@ -7,9 +7,6 @@ 17 war %s/usr/share/java/commons-war.war - - true - commons @@ -17,9 +14,6 @@ 17 pom /usr/share/maven-poms/JPP-commons-war.pom - - true - diff --git a/test/data/maven_depmap/test_classifier-want.xml b/test/data/maven_depmap/test_classifier-want.xml index 6a6f74ae..8fa90b01 100644 --- a/test/data/maven_depmap/test_classifier-want.xml +++ b/test/data/maven_depmap/test_classifier-want.xml @@ -14,9 +14,6 @@ c - - true - diff --git a/test/data/maven_depmap/test_expansion-want.xml b/test/data/maven_depmap/test_expansion-want.xml new file mode 100644 index 00000000..10c34449 --- /dev/null +++ b/test/data/maven_depmap/test_expansion-want.xml @@ -0,0 +1,35 @@ + + + + org.fedoraproject.xmvn + xmvn-subst + 4.0.0 + %s/usr/share/java/depmngmnt.jar + + + com.beust + jcommander + jar + false + 1.82 + + + + + org.fedoraproject.xmvn + xmvn-subst + pom + 4.0.0 + %s/JPP-depmngmnt.pom + + + com.beust + jcommander + jar + false + 1.82 + + + + + diff --git a/test/data/maven_depmap/test_expansion_model-want.xml b/test/data/maven_depmap/test_expansion_model-want.xml new file mode 100644 index 00000000..6237358c --- /dev/null +++ b/test/data/maven_depmap/test_expansion_model-want.xml @@ -0,0 +1,35 @@ + + + + org.fedoraproject.xmvn + xmvn-subst + 4.0.0 + %s/usr/share/java/depmngmnt.jar + + + org.fedoraproject.xmvn + xmvn-api + jar + false + 4.0.0 + + + + + org.fedoraproject.xmvn + xmvn-subst + pom + 4.0.0 + %s/JPP-modelexpansion.pom + + + org.fedoraproject.xmvn + xmvn-api + jar + false + 4.0.0 + + + + + diff --git a/test/data/maven_depmap/test_mvn_spec-want.xml b/test/data/maven_depmap/test_mvn_spec-want.xml index d2c03ec7..dd49eb83 100644 --- a/test/data/maven_depmap/test_mvn_spec-want.xml +++ b/test/data/maven_depmap/test_mvn_spec-want.xml @@ -6,9 +6,6 @@ b 12 %s/usr/share/java/commons-io.jar - - true - diff --git a/test/data/maven_depmap/test_mvn_spec_buildroot-want.xml b/test/data/maven_depmap/test_mvn_spec_buildroot-want.xml index 0f7dcd5f..0efeddb8 100644 --- a/test/data/maven_depmap/test_mvn_spec_buildroot-want.xml +++ b/test/data/maven_depmap/test_mvn_spec_buildroot-want.xml @@ -7,9 +7,6 @@ 1 war %s/usr/share/java/commons-war.war - - true - diff --git a/test/data/maven_depmap/test_mvn_spec_war-want.xml b/test/data/maven_depmap/test_mvn_spec_war-want.xml index deae16ff..1dde1a95 100644 --- a/test/data/maven_depmap/test_mvn_spec_war-want.xml +++ b/test/data/maven_depmap/test_mvn_spec_war-want.xml @@ -7,9 +7,6 @@ war 1 %s/usr/share/java/commons-war.war - - true - diff --git a/test/data/maven_depmap/test_namespace-want.xml b/test/data/maven_depmap/test_namespace-want.xml index da36a475..adf5b2cc 100644 --- a/test/data/maven_depmap/test_namespace-want.xml +++ b/test/data/maven_depmap/test_namespace-want.xml @@ -7,9 +7,6 @@ 12 %s/usr/share/java/commons-io.jar myns - - true - diff --git a/test/data/maven_depmap/test_version-want.xml b/test/data/maven_depmap/test_version-want.xml index 06e02bc8..297d0ca9 100644 --- a/test/data/maven_depmap/test_version-want.xml +++ b/test/data/maven_depmap/test_version-want.xml @@ -11,9 +11,6 @@ 2 3 - - true - diff --git a/test/data/maven_depmap/test_version_append-want.xml b/test/data/maven_depmap/test_version_append-want.xml index 33e688cd..028ad54f 100644 --- a/test/data/maven_depmap/test_version_append-want.xml +++ b/test/data/maven_depmap/test_version_append-want.xml @@ -17,9 +17,6 @@ b - - true - diff --git a/test/data/maven_depmap/test_version_namespace-want.xml b/test/data/maven_depmap/test_version_namespace-want.xml index 65e331a5..958725d2 100644 --- a/test/data/maven_depmap/test_version_namespace-want.xml +++ b/test/data/maven_depmap/test_version_namespace-want.xml @@ -18,9 +18,6 @@ b - - true - diff --git a/test/data/maven_depmap/test_versioned-want.xml b/test/data/maven_depmap/test_versioned-want.xml index 8885ff1a..981ba85c 100644 --- a/test/data/maven_depmap/test_versioned-want.xml +++ b/test/data/maven_depmap/test_versioned-want.xml @@ -10,9 +10,6 @@ 2.0.0 %s/usr/share/java/versioned-2.0.0.war - - true - diff --git a/test/data/maven_depmap/test_versioned2-want.xml b/test/data/maven_depmap/test_versioned2-want.xml index ea1b24cf..e94fed23 100644 --- a/test/data/maven_depmap/test_versioned2-want.xml +++ b/test/data/maven_depmap/test_versioned2-want.xml @@ -9,9 +9,6 @@ 1.2 %s/usr/share/java/versioned2-1.2.jar - - true - diff --git a/test/data/maven_depmap/test_versioned_classifier-want.xml b/test/data/maven_depmap/test_versioned_classifier-want.xml index c3891caa..d2aca331 100644 --- a/test/data/maven_depmap/test_versioned_classifier-want.xml +++ b/test/data/maven_depmap/test_versioned_classifier-want.xml @@ -11,9 +11,6 @@ 1.2 %s/usr/share/java/versioned-3-tests-1.jar - - true - diff --git a/test/data/maven_depmap/test_versioned_with_pom-want.xml b/test/data/maven_depmap/test_versioned_with_pom-want.xml index c2b344e1..8d259ab9 100644 --- a/test/data/maven_depmap/test_versioned_with_pom-want.xml +++ b/test/data/maven_depmap/test_versioned_with_pom-want.xml @@ -9,9 +9,6 @@ 2013.10 %s/usr/share/java/testversioned-2013.10.jar - - true - alias @@ -22,9 +19,6 @@ 2013.10 %s/JPP-testversioned-2013.10.pom - - true - diff --git a/test/data/maven_depmap/test_war-want.xml b/test/data/maven_depmap/test_war-want.xml index cac27a84..e8e2e56b 100644 --- a/test/data/maven_depmap/test_war-want.xml +++ b/test/data/maven_depmap/test_war-want.xml @@ -7,9 +7,6 @@ 17 war %s/usr/share/java/commons-war.war - - true - commons @@ -17,9 +14,6 @@ pom 17 %s/JPP-commons-war.pom - - true - diff --git a/test/data/maven_depmap/usr/share/java/depmngmnt.jar b/test/data/maven_depmap/usr/share/java/depmngmnt.jar new file mode 100644 index 00000000..db960407 Binary files /dev/null and b/test/data/maven_depmap/usr/share/java/depmngmnt.jar differ diff --git a/test/install_pom_test.py b/test/install_pom_test.py new file mode 100644 index 00000000..c6acc644 --- /dev/null +++ b/test/install_pom_test.py @@ -0,0 +1,166 @@ +import inspect +import os +import unittest +import shutil + +from test_common import (DIRPATH, install_pom, call_script, assertIn) + +from lxml import etree +from xml_compare import compare_lxml_etree + + +class TestInstallPom(unittest.TestCase): + + maxDiff = 2048 + + def setUp(self): + try: + self.olddir = os.getcwd() + self.datadir = os.path.join(DIRPATH, + 'data', + 'install_pom') + self.workdir = os.path.realpath(os.path.join(self.datadir, "..", + "install_pom_workdir")) + + shutil.copytree(self.datadir, self.workdir) + os.chdir(self.workdir) + except OSError: + pass + + def tearDown(self): + try: + shutil.rmtree(self.workdir) + os.chdir(self.olddir) + except OSError: + pass + + def check_result(self, test_name, result): + got = etree.parse(result).getroot() + want = etree.parse(os.path.join(self.workdir, + test_name+"-want.xml")).getroot() + report = compare_lxml_etree(got, want) + if report: + report = '\n' + report + return report + + @install_pom('JPP-bndlib.pom') + def test_basic(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom('JPP-apache-commons-io.pom') + def test_packaging_pom(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom('JPP-noversion.pom') + def test_missing_version(self, stdout, stderr, return_value, result): + self.assertNotEqual(return_value, 0) + + @install_pom('JPP-noversion-pom.pom') + def test_packaging_pom_missing_version(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom('JPP-parent-version.pom') + def test_parent_version(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('cglib', 'pom.xml')) + def test_parent_install(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('cglib', 'cglib', 'pom.xml')) + def test_interpolate_from_parent(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('cglib', 'cglib-integration-test', 'pom.xml')) + def test_interpolate_from_model(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('xmvn', 'xmvn-mojo', 'pom.xml')) + def test_parent_relpath(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('xmvn', 'xmvn-tools', 'xmvn-install', 'pom.xml')) + def test_parent_chain(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('xmvn', 'xmvn-tools', 'xmvn-resolve', 'pom.xml')) + def test_any_not_final(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('languagetool', 'languagetool-standalone', 'pom.xml')) + def test_dep_type(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom(os.path.join('languagetool', 'languagetool-language-modules', 'ja', 'pom.xml')) + def test_dep_classifier(self, stdout, stderr, return_value, result): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + result) + self.assertEqual(report, '', report) + + @install_pom('a_binary_file.pom') + def test_not_pom(self, stdout, stderr, return_value, result): + self.assertNotEqual(return_value, 0) + + @install_pom('a_file_that_does_not_exist.pom') + def test_no_pom(self, stdout, stderr, return_value, result): + self.assertNotEqual(return_value, 0) + + def test_no_args(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'install_pom.py'), []) + self.assertNotEqual(return_value, 0) + + def test_no_directory(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'install_pom.py'), + ['JPP-bndlib.pom', os.path.join('missingdir', 'JPP-bndlib.pom')]) + self.assertNotEqual(return_value, 0) + + def test_not_directory(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'install_pom.py'), + ['JPP-bndlib.pom', os.path.join('fakedir', 'JPP-bndlib.pom')]) + self.assertNotEqual(return_value, 0) + + def test_no_overwrite(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'install_pom.py'), + ['JPP-bndlib.pom', 'fakedir']) + self.assertNotEqual(return_value, 0) + +if __name__ == '__main__': + unittest.main() diff --git a/test/maven_depmap_test.py b/test/maven_depmap_test.py new file mode 100644 index 00000000..41b2c014 --- /dev/null +++ b/test/maven_depmap_test.py @@ -0,0 +1,354 @@ +import inspect +from zipfile import ZipFile +import os +import unittest +import shutil +from test_common import (DIRPATH, mvn_depmap, call_script, + prepare_metadata, assertIn) +from test_rpmbuild import Package + +from lxml import etree +from xml_compare import compare_lxml_etree + + +class TestMavenDepmap(unittest.TestCase): + + maxDiff = 2048 + + def setUp(self): + try: + self.olddir = os.getcwd() + self.datadir = os.path.join(DIRPATH, + 'data', + 'maven_depmap') + self.workdir = os.path.realpath(os.path.join(self.datadir, "..", + "maven_depmap_workdir")) + + shutil.copytree(self.datadir, self.workdir) + os.chdir(self.workdir) + except OSError: + pass + + prepare_metadata(self.workdir) + + def tearDown(self): + try: + shutil.rmtree(self.workdir) + os.chdir(self.olddir) + except OSError: + pass + + def check_result(self, test_name, depmap): + got = etree.fromstring(depmap) + want = etree.parse(os.path.join(self.workdir, + test_name+"-want.xml")).getroot() + report = compare_lxml_etree(got, want, unordered=['artifact', 'maven']) + if report: + report = '\n' + report + return report + + def check_archive(self, test_name, archive_path, keep_comments=False): + got = ZipFile(archive_path, 'r') + want = ZipFile('{name}-want.{ext}'.format(name=test_name, + ext=archive_path.split('.')[-1])) + try: + if got.testzip() is not None: + return ("Not valid zip file", "") + got_mf = self.read_archive(got, keep_comments) + want_mf = self.read_archive(want, keep_comments) + finally: + got.close() + want.close() + return (got_mf, want_mf) + + def read_archive(self, archive, keep_comments=False): + res = {} + for filename in archive.namelist(): + mf_file = archive.open(filename) + try: + if (keep_comments): + res[str(filename)] = mf_file.readlines() + else: + res[str(filename)] = \ + [line for line in mf_file.readlines() + if not line.startswith(b'#')] + finally: + mf_file.close() + return res + + @mvn_depmap('JPP-bndlib.pom', 'usr/share/java/bndlib.jar') + def test_basic(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('JPP-commons-io.pom') + def test_missing_jar_arg(self, stdout, stderr, return_value, depmap): + self.assertNotEqual(return_value, 0) + + @mvn_depmap('JPP-apache-commons-io.pom') + def test_packaging_pom_no_jar(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('JPP-noversion.pom') + def test_missing_version(self, stdout, stderr, return_value, depmap): + self.assertNotEqual(return_value, 0) + + @mvn_depmap('JPP-parent-version.pom') + def test_parent_version(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('JPP-commons-war.pom', 'usr/share/java/commons-war.war') + def test_war(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + def test_not_pom(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'maven_depmap.py'), + ['.out', 'usr/share/java/commons-io.jar', + 'usr/share/java/commons-io.jar']) + self.assertNotEqual(return_value, 0) + + def test_no_pom(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'maven_depmap.py'), + ['.out']) + self.assertNotEqual(return_value, 0) + + def test_no_args(self): + stdout, stderr, return_value = call_script(os.path.join(DIRPATH, '..', + 'java-utils', 'maven_depmap.py'), + []) + self.assertNotEqual(return_value, 0) + + @mvn_depmap('a:b:12', 'usr/share/java/commons-io.jar') + def test_mvn_spec(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('a:b:war::1', 'usr/share/java/commons-war.war') + def test_mvn_spec_war(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('/builddir/build/BUILDROOT/pkg-2.5.2-2.fc21.x86_64/a:b:war::1', + 'usr/share/java/commons-war.war') + def test_mvn_spec_buildroot(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('builddir/build/BUILDROOT/usr/share/maven-poms/JPP-commons-war.pom', + 'usr/share/java/commons-war.war') + def test_buildroot(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('a:b:12', 'usr/share/java/commons-io.jar', ['-a', 'x:y']) + def test_append(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + # FIXME: aliases cause trouble + #@mvn_depmap('a:b:12', 'usr/share/java/commons-io.jar', ['-a', 'x:y,z:w']) + #def test_append_multiple(self, stdout, stderr, return_value, depmap): + # self.assertEqual(return_value, 0, stderr) + # report = self.check_result(inspect.currentframe().f_code.co_name, + # depmap) + # self.assertEqual(report, '', report) + + @mvn_depmap('a:b:12', 'usr/share/java/commons-io.jar', ['-n', 'myns']) + def test_namespace(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('a:b:12', 'usr/share/java/commons-io.jar', ['--namespace=myns', + '--append=x:y']) + def test_append_and_namespace(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('a:b:12', 'usr/foo/share/java/compare_jar.jar') + def test_compare_jar(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + got, want = self.check_archive(inspect.currentframe().f_code.co_name, + 'usr/foo/share/java/compare_jar.jar') + self.assertEqual(got, want) + + #test case for rhbz#1012982 + @mvn_depmap('x:y:war:z:0.1', 'usr/foo/share/java/compare_jar_class_ext.war') + def test_compare_jar_class_ext(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + got, want = self.check_archive(inspect.currentframe().f_code.co_name, + 'usr/foo/share/java/compare_jar_class_ext.war') + self.assertEqual(got, want) + + @mvn_depmap('a:b:12', 'usr/share/java/already-has-pom-properties.jar') + def test_compare_jar_unmodified(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + got, want = self.check_archive(inspect.currentframe().f_code.co_name, + 'usr/share/java/already-has-pom-properties.jar', keep_comments=True) + self.assertEqual(got, want) + + @mvn_depmap('x:y:0.1', 'usr/share/java/already-has-pom-properties.jar') + def test_compare_jar_modified(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + got, want = self.check_archive(inspect.currentframe().f_code.co_name, + 'usr/share/java/already-has-pom-properties.jar') + self.assertEqual(got, want) + + @mvn_depmap('/builddir/build/BUILDROOT/pkg-2.5.2-2.fc21.x86_64/x:y:0.1', + 'usr/share/java/already-has-pom-properties.jar') + def test_rhbz1012245(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + got, want = self.check_archive('test_compare_jar_modified', + 'usr/share/java/already-has-pom-properties.jar') + self.assertEqual(got, want) + + @mvn_depmap('x:y:jar:z:0.1', 'usr/share/java/commons-io-z.jar', + ['-a', 'a:b:jar:c:12']) + def test_classifier(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('x:y:0.1', 'usr/share/java/commons-io.jar', ['-r', '1,2,3']) + def test_version(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('JPP/x:y:0.1', 'usr/share/java/commons-io.jar', + ['--versions', '1,2,3']) + def test_version2(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result('test_version', depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('x:y:0.1', 'usr/share/java/commons-io.jar', + ['-r', '1,2,3', '-a', 'a:b:32']) + def test_version_append(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('x:y:0.1', 'usr/share/java/commons-io.jar', + ['-r', '1,2,3', '-n', 'ns', '-a', 'a:b:32']) + def test_version_namespace(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('x:y', 'usr/share/java/commons-io.jar') + def test_missing_version2(self, stdout, stderr, return_value, depmap): + self.assertNotEqual(return_value, 0) + + @mvn_depmap('x:y:war:1', 'usr/share/java/commons-io.jar') + def test_incorrect_extension(self, stdout, stderr, return_value, depmap): + self.assertNotEqual(return_value, 0) + + @mvn_depmap('evil:', 'usr/share/java/commons-io.jar') + def test_incorrect_artifact(self, stdout, stderr, return_value, depmap): + self.assertNotEqual(return_value, 0) + + @mvn_depmap('JPP-cdata.pom') + def test_cdata(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('g:a:war:1.2.3', 'usr/share/java/versioned.war', ['-r', '2.0.0']) + def test_versioned(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + self.assertEqual(False, os.path.exists('usr/share/java/versioned.war')) + self.assertEqual(True, os.path.exists('usr/share/java/versioned-2.0.0.war')) + + @mvn_depmap('g:a:1.2', 'usr/share/java/versioned2.jar', ['-r', '1.2']) + def test_versioned2(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + self.assertEqual(False, os.path.exists('usr/share/java/versioned2.jar')) + self.assertEqual(True, os.path.exists('usr/share/java/versioned2-1.2.jar')) + + @mvn_depmap('g:a:jar:tests:1', 'usr/share/java/versioned-3-tests.jar', ['-r', '1,1.2']) + def test_versioned_classifier(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + self.assertEqual(False, os.path.exists('usr/share/java/versioned-3-tests.jar')) + self.assertEqual(True, os.path.exists('usr/share/java/versioned-3-tests-1.jar')) + self.assertEqual(True, os.path.exists('usr/share/java/versioned-3-tests-1.2.jar')) + + @mvn_depmap('JPP-testversioned.pom', 'usr/share/java/testversioned.jar', ['-r', '2013.10']) + def test_versioned_with_pom(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + self.assertEqual(False, os.path.exists('usr/share/java/testversioned.jar')) + self.assertEqual(True, os.path.exists('usr/share/java/testversioned-2013.10.jar')) + + @mvn_depmap('JPP-alias.pom', 'usr/share/java/commons-io.jar', ['-a', 'a:b']) + def test_alias_extension(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('JPP-depmngmnt.pom', 'usr/share/java/depmngmnt.jar') + def test_expansion(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + @mvn_depmap('JPP-modelexpansion.pom', 'usr/share/java/depmngmnt.jar') + def test_expansion_model(self, stdout, stderr, return_value, depmap): + self.assertEqual(return_value, 0, stderr) + report = self.check_result(inspect.currentframe().f_code.co_name, + depmap) + self.assertEqual(report, '', report) + + def test_missing_jar(self): + p = Package('test') + p.append_to_prep("%add_maven_depmap g:a:1 this/file/doesnt/exist.jar") + _, stderr, return_value = p.run_prep() + self.assertEqual(1, return_value, 'bad return value') + assertIn(self, 'file not found', stderr) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_common.py b/test/test_common.py index d694046a..d3b699f2 100644 --- a/test/test_common.py +++ b/test/test_common.py @@ -266,6 +266,47 @@ def rpmgen_process_args(args, kwargs): return args, kwargs +def install_pom(pom): + def test_decorator(fun): + @wraps(fun) + def test_decorated(self): + os.chdir(self.workdir) + buildroot = os.path.join(self.workdir, "builddir/build/BUILDROOT") + env = {'RPM_BUILD_ROOT': buildroot} + scriptpath = path.join(DIRPATH, '..', 'java-utils', 'install_pom.py') + args = [pom, '.result_file'] + (stdout, stderr, return_value) = call_script(scriptpath, args, extra_env=env) + res_file = None + if return_value == 0: + res_file = open('.result_file','r') + fun(self, stdout, stderr, return_value, result=res_file) + if res_file != None: + os.remove('.result_file') + return test_decorated + return test_decorator + +def mvn_depmap(pom, jar=None, fnargs=None): + def test_decorator(fun): + @wraps(fun) + def test_decorated(self): + os.chdir(self.workdir) + buildroot = os.path.join(self.workdir, "builddir/build/BUILDROOT") + env = {'RPM_BUILD_ROOT': buildroot} + scriptpath = path.join(DIRPATH, '..', 'java-utils', 'maven_depmap.py') + args = ['.fragment_data', pom] + if jar: + args.append(path.join(os.getcwd(), jar)) + args.extend(fnargs or []) + (stdout, stderr, return_value) = call_script(scriptpath, args, extra_env=env) + frag = None + if return_value == 0: + with open('.fragment_data','r') as frag_file: + frag = frag_file.read() + os.remove('.fragment_data') + fun(self, stdout, stderr, return_value, depmap=frag) + return test_decorated + return test_decorator + def mvn_artifact(pom, jar=None): def test_decorator(fun): @wraps(fun)