[javapackages] [depgenerators] Switch to require java-headless instead java
by Stanislav Ochotnicky
commit 102fee5e1e7661356502ca89d6a73889b826af6b
Author: Stanislav Ochotnicky <sochotnicky(a)redhat.com>
Date: Wed Jan 29 17:23:28 2014 +0100
[depgenerators] Switch to require java-headless instead java
depgenerators/maven.req | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/depgenerators/maven.req b/depgenerators/maven.req
index 5bd6c34..c161e3d 100755
--- a/depgenerators/maven.req
+++ b/depgenerators/maven.req
@@ -158,7 +158,7 @@ class TagBuilder:
"%mvn_package {art} <package_name>\n".format(art=skipped)
raise Exception(skipped_msg)
- reqs = {'java': depmap.get_java_requires(),
+ reqs = {'java-headless': depmap.get_java_requires(),
'java-devel': depmap.get_java_devel_requires()}
for name, version in reqs.iteritems():
self.__process_jvm_req(name, version)
10 years, 3 months
[javapackages/pom_editor.py: 17/17] [pom_editor] implement recursive mode and force option
by Michael Šimáček
commit c6d1b8e46a25092fd2b4997efe5062e631d083e8
Author: Michael Simacek <msimacek(a)redhat.com>
Date: Wed Jan 29 17:26:41 2014 +0100
[pom_editor] implement recursive mode and force option
java-utils/pom_editor.py | 141 ++++++++++++++++++++++++++++++----------------
1 files changed, 92 insertions(+), 49 deletions(-)
---
diff --git a/java-utils/pom_editor.py b/java-utils/pom_editor.py
index ac2443a..98b3b38 100644
--- a/java-utils/pom_editor.py
+++ b/java-utils/pom_editor.py
@@ -3,6 +3,7 @@ import inspect
import re
import shutil
import sys
+import optparse
from lxml import etree
from os import path
@@ -58,6 +59,22 @@ def find_pom(pompath):
raise PomException("Couldn't locate POM file using pattern '{0}'"\
.format(pompath))
+def find_poms_recursive(pomspec):
+ modules = [find_pom(pomspec)]
+ found = set(modules)
+ try:
+ while modules:
+ pompath = find_pom(modules.pop())
+ found.add(pompath)
+ pom_xml = etree.parse(pompath)
+ modules += [path.join(path.dirname(pompath), node.text.strip())
+ for node in pom_xml.xpath('//pom:modules/pom:module',
+ namespaces=Pom.NSMAP)]
+ return found
+
+ except (PomException, IOError):
+ raise PomException("Cannot read POM file '{0}'".format(pompath))
+
def get_indent(node):
if node is None or not node.text:
return ''
@@ -68,46 +85,60 @@ def print_usage(function):
print >> sys.stderr, "Usage: %{name} {doc}".format(name=function.__name__,
doc=function.__doc__)
-def macro(outer_function):
+def parse_args(function, args):
+ (arglist, _, _, defaults) = inspect.getargspec(function)
+ option_parser = optparse.OptionParser()
+ option_parser.add_option('-r', '--recursive', action="store_true")
+ option_parser.add_option('-f', '--force', action="store_true")
+ options, arguments = option_parser.parse_args(list(args))
+ min_arg_count = len(arglist) - len(defaults)
+ fnargs = dict(zip(arglist, arguments[:min_arg_count]))
+ poms = arguments[min_arg_count:]
+ print defaults
+ if len(defaults or [] > 1) and poms:
+ last = poms[-1]
+ if '<' in last:
+ del poms[-1]
+ fnargs[arglist[-1]] = last
+ if not poms:
+ poms = ['.']
+ return options, fnargs, poms
+
+def macro():
def decorator(function):
def decorated(*args):
- (arglist, _, _, defaults) = inspect.getargspec(function)
- maxargcount = len(arglist)
- minargcount = maxargcount - len(defaults or [])
- if len(args) > maxargcount or len(args) < minargcount:
- print_usage(function)
- sys.exit(1)
- pomspec_pos = arglist.index('pom')
- if pomspec_pos < len(args):
- pomspec = args[pomspec_pos]
- else:
- pomspec = 'pom.xml'
-
try:
- pompath = find_pom(pomspec)
- except PomException as exception:
- print >> sys.stderr, exception.message
- print_usage(function)
- sys.exit(2)
-
- try:
- pomdir = path.dirname(pompath) or '.'
- pom = Pom(pompath)
- pom.write(path.join(pomdir, path.basename(pompath) + '.tmp'))
- fnargs = list(args[:pomspec_pos]) + [pom] + list(args[pomspec_pos + 1:])
- function(*fnargs)
- origfile = path.join(pomdir, path.basename(pompath) + '.orig')
- shutil.move(pompath, origfile)
- pom.write(pompath)
- except (PomException, etree.XMLSyntaxError, OSError, IOError) as exception:
- print >> sys.stderr, "Error in processing {0}".format(pompath)
+ pompath = None
+ options, fnargs, poms = parse_args(function, args)
+
+ for pomspec in poms:
+ if options.recursive:
+ pompaths = find_poms_recursive(pomspec)
+ else:
+ pompaths = [find_pom(pomspec)]
+
+ matches = 0
+ for pompath in pompaths:
+ try:
+ pom = Pom(pompath)
+ fnargs['pom'] = pom
+ pom.patch(function, fnargs)
+ matches += 1
+ except PomQueryNoMatch as exception:
+ pass
+ if matches == 0 and not options.force:
+ raise exception
+
+ except Exception as exception:
+ if pompath:
+ print >> sys.stderr, "Error in processing {0}".format(pompath)
print >> sys.stderr, exception.message
print_usage(function)
sys.exit(3)
macros[function.__name__] = decorated
return decorated
- return decorator(outer_function)
+ return decorator
class Pom(object):
NSMAP = {'pom': 'http://maven.apache.org/POM/4.0.0',
@@ -125,6 +156,7 @@ class Pom(object):
with open(pompath) as pomfile:
pom = re.sub(r'\<\s*project\s*\>',
('<project {ns}>').format(ns=self.XMLNS), pomfile.read())
+ self.pompath = pompath
self.root = etree.fromstring(pom)
self.tab = get_indent(self.root)
@@ -133,6 +165,17 @@ class Pom(object):
pomfile.write(etree.tostring(self.root))
pomfile.write('\n')
+ def patch(self, function, fnargs):
+ pomdir = path.dirname(self.pompath)
+ pomfile = path.basename(self.pompath)
+ try:
+ self.write(path.join(pomdir, pomfile + '.tmp'))
+ function(**fnargs)
+ finally:
+ origfile = path.join(pomdir, pomfile + '.orig')
+ shutil.move(self.pompath, origfile)
+ self.write(self.pompath)
+
def inject_xml(self, parent, content):
content = self.subtree_from_string(content)
items = len(content)
@@ -243,31 +286,31 @@ VersionedArtifact = MetaArtifact(artifact_spec)
DefaultVersionedArtifact = MetaArtifact(artifact_spec, version='any')
ScopedArtifact = MetaArtifact(artifact_spec_scoped, version='any')
-@macro
+@macro()
def pom_xpath_inject(where, xml_string, pom=None):
"""<XPath> [XML code] [POM location]"""
for element in pom.xpath_query(where):
pom.inject_xml(element, Pom.comment(xml_string))
-@macro
+@macro()
def pom_xpath_replace(where, xml_string, pom=None):
"""<XPath> <XML code> [POM location]"""
for element in pom.xpath_query(where):
pom.replace_xml(element, Pom.comment(xml_string))
-@macro
+@macro()
def pom_xpath_remove(where, pom=None):
"""<XPath> [POM location]"""
for element in pom.xpath_query(where):
pom.replace_xml(element, "<!-- element removed by maintainer -->")
-@macro
+@macro()
def pom_xpath_set(where, content, pom=None):
"""<XPath> <new contents> [POM location]"""
for element in pom.xpath_query(where):
pom.replace_xml_content(element, Pom.comment(content))
-@macro
+@macro()
def pom_remove_dep(dep, pom=None):
"""[groupId]:[artifactId] [POM location]"""
try:
@@ -277,9 +320,9 @@ def pom_remove_dep(dep, pom=None):
for element in elements:
pom.replace_xml(element, "<!-- dependency removed by maintainer -->")
except PomQueryNoMatch:
- raise PomException("Dependency '{0}' not found.".format(dep))
+ raise PomQueryNoMatch("Dependency '{0}' not found.".format(dep))
-@macro
+@macro()
def pom_remove_plugin(plugin, pom=None):
"""[groupId]:[artifactId] [POM location]"""
try:
@@ -289,9 +332,9 @@ def pom_remove_plugin(plugin, pom=None):
for element in elements:
pom.replace_xml(element, "<!-- plugin removed by maintainer -->")
except PomQueryNoMatch:
- raise PomException("Plugin '{0}' not found.".format(plugin))
+ raise PomQueryNoMatch("Plugin '{0}' not found.".format(plugin))
-@macro
+@macro()
def pom_disable_module(module, pom=None):
"""<module name> [POM location]"""
try:
@@ -300,9 +343,9 @@ def pom_disable_module(module, pom=None):
for element in elements:
pom.replace_xml(element, "<!-- module removed by maintainer -->")
except PomQueryNoMatch:
- raise PomException("Module '{0}' not found.".format(module))
+ raise PomQueryNoMatch("Module '{0}' not found.".format(module))
-@macro
+@macro()
def pom_add_parent(parent, pom=None):
"""groupId:artifactId[:version] [POM location]"""
if pom.root.find('pom:parent', namespaces=Pom.NSMAP) is not None:
@@ -310,16 +353,16 @@ def pom_add_parent(parent, pom=None):
artifact = DefaultVersionedArtifact(parent)
pom.inject_artifact('', 'parent', artifact)
-@macro
+@macro()
def pom_remove_parent(pom=None):
"""[POM location]"""
try:
pom.replace_xml(pom.xpath_query_element("/pom:project/pom:parent"),
"<!-- parent POM reference removed by maintainer -->")
except PomQueryNoMatch:
- raise PomException("POM doesn't specify parent.")
+ raise PomQueryNoMatch("POM doesn't specify parent.")
-@macro
+@macro()
def pom_set_parent(parent, pom=None):
"""groupId:artifactId[:version] [POM location]"""
try:
@@ -327,23 +370,23 @@ def pom_set_parent(parent, pom=None):
element = pom.xpath_query_element("/pom:project/pom:parent")
pom.replace_xml_content(element, artifact.get_xml())
except PomQueryNoMatch:
- raise PomException("POM doesn't specify parent.")
+ raise PomQueryNoMatch("POM doesn't specify parent.")
-@macro
+@macro()
def pom_add_dep(dep, pom=None, xml_string=''):
"""groupId:artifactId[:version[:scope]] [POM location] [extra XML]"""
artifact = ScopedArtifact(dep)
pom.inject_artifact('pom:dependencies', 'dependency', artifact,
xml_string)
-@macro
+@macro()
def pom_add_dep_mgmt(dep, pom=None, xml_string=''):
"""groupId:artifactId[:version[:scope]] [POM location] [extra XML]"""
artifact = ScopedArtifact(dep)
pom.inject_artifact('pom:dependencyManagement/pom:dependencies',
'dependency', artifact, xml_string)
-@macro
+@macro()
def pom_add_plugin(plugin, pom=None, xml_string=''):
"""groupId:artifactId[:version] [POM location] [extra XML]"""
artifact = MetaArtifact(artifact_spec, version='any',
10 years, 3 months
[javapackages/pom_editor.py: 16/17] [test] add tests for recursive mode and force option
by Michael Šimáček
commit dc2286a0aeeffd82fc7cc5bb56f4b744dbcd30a6
Author: Michael Simacek <msimacek(a)redhat.com>
Date: Wed Jan 29 17:25:01 2014 +0100
[test] add tests for recursive mode and force option
.../want/example_common_removed_commons_io.xml | 5 --
.../want/example_common_removed_commons_iox.xml | 32 +++++++++++++++
.../want/example_common_removed_junit.xml | 6 ---
.../want/minimal_add_plugin_resource.xml | 21 ++++++----
test/pom_editor_paths_test.py | 42 +++++++++++++++++++-
5 files changed, 84 insertions(+), 22 deletions(-)
---
diff --git a/test/data/pom_editor/want/example_common_removed_commons_io.xml b/test/data/pom_editor/want/example_common_removed_commons_io.xml
index fc74358..7727864 100644
--- a/test/data/pom_editor/want/example_common_removed_commons_io.xml
+++ b/test/data/pom_editor/want/example_common_removed_commons_io.xml
@@ -17,11 +17,6 @@
<version>3.8.1</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>commons-ioX</groupId>
- <artifactId>commons-io</artifactId>
- <version>1.2</version>
- </dependency>
</dependencies>
</project>
diff --git a/test/data/pom_editor/want/example_common_removed_commons_iox.xml b/test/data/pom_editor/want/example_common_removed_commons_iox.xml
new file mode 100644
index 0000000..6e9ac8e
--- /dev/null
+++ b/test/data/pom_editor/want/example_common_removed_commons_iox.xml
@@ -0,0 +1,32 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>common</artifactId>
+ <version>2.6</version>
+ <name>Example common</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/want/example_common_removed_junit.xml b/test/data/pom_editor/want/example_common_removed_junit.xml
index d223355..d006e68 100644
--- a/test/data/pom_editor/want/example_common_removed_junit.xml
+++ b/test/data/pom_editor/want/example_common_removed_junit.xml
@@ -17,12 +17,6 @@
<version>1.2</version>
</dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3</version>
diff --git a/test/data/pom_editor/want/minimal_add_plugin_resource.xml b/test/data/pom_editor/want/minimal_add_plugin_resource.xml
index 45a9276..55d0329 100644
--- a/test/data/pom_editor/want/minimal_add_plugin_resource.xml
+++ b/test/data/pom_editor/want/minimal_add_plugin_resource.xml
@@ -1,4 +1,16 @@
<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">
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-remote-resources-plugin</artifactId>
+ <version>any</version>
+ <goal>generate-resources</goal>
+ </plugin>
+ </plugins>
+ </build>
+
<parent>
<groupId>org.apache.commons</groupId>
<artifactId>commons-parent</artifactId>
@@ -10,13 +22,4 @@
<version>2.6</version>
<name>Commons Lang</name>
- <plugins>
- <plugin>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-remote-resources-plugin</artifactId>
- <version>any</version>
- <goal>generate-resources</goal>
- </plugin>
- </plugins>
-
</project>
diff --git a/test/pom_editor_paths_test.py b/test/pom_editor_paths_test.py
index d04c040..f3abd25 100644
--- a/test/pom_editor_paths_test.py
+++ b/test/pom_editor_paths_test.py
@@ -174,12 +174,50 @@ class TestRecursive(WorkdirTestCase):
self.assertEqual('', report, report)
def test_recursive_no_match(self):
- return_value, stderr, _ = exec_pom_macro('%pom_remove_dep -r :junit',
+ return_value, stderr, _ = exec_pom_macro('%pom_remove_dep -r :not-there',
poms_tree=self.example_tree)
self.assertIn("Error", stderr)
- self.assertIn("not fount", stderr)
+ self.assertIn("not found", stderr)
+ self.assertNotEqual(0, return_value)
+
+ def test_recursive_missing(self):
+ poms_tree = dict(self.example_tree)
+ del poms_tree['intermediate/schemas']
+ return_value, stderr, _ = exec_pom_macro('%pom_remove_dep -r :commons-io',
+ poms_tree=poms_tree)
+ self.assertIn("Cannot read", stderr)
+ self.assertNotEqual(0, return_value)
+
+ def test_recursive_subpom(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_dep -r :junit intermediate',
+ poms_tree=self.example_tree,
+ want_tree={'intermediate/schemas': 'example_schemas_removed_junit.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_recursive_multiple(self):
+ poms_tree = dict(self.example_tree)
+ return_value, stderr, report = exec_pom_macro('%pom_remove_dep -r :junit intermediate common',
+ poms_tree=poms_tree,
+ want_tree={'intermediate/schemas': 'example_schemas_removed_junit.xml',
+ 'common': 'example_common_removed_junit.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_recursive_partial_match(self):
+ return_value, stderr, _ = exec_pom_macro('%pom_remove_dep -r commons-ioX intermediate common',
+ poms_tree=self.example_tree)
+ self.assertIn("Error", stderr)
+ self.assertIn("not found", stderr)
self.assertNotEqual(0, return_value)
+ def test_recursive_partial_match_forced(self):
+ return_value, stderr, report = exec_pom_macro(\
+ '%pom_remove_dep -rf commons-ioX:commons-io intermediate common',
+ poms_tree=self.example_tree,
+ want_tree={'common': 'example_common_removed_commons_iox.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
class TestAttributeRecognition(WorkdirTestCase):
def test_default_extra_xml(self):
10 years, 3 months
[javapackages/pom_editor.py: 15/17] [macros] pass -r (recursive) and -f (force) options to pom_editor
by Michael Šimáček
commit 9b12d1889c8f46e5a8ce82a945b0447994bff089
Author: Michael Simacek <msimacek(a)redhat.com>
Date: Fri Jan 17 15:23:12 2014 +0100
[macros] pass -r (recursive) and -f (force) options to pom_editor
Options added only to macros where it makes sense.
etc/macros.fjava | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
---
diff --git a/etc/macros.fjava b/etc/macros.fjava
index 3485eea..56e5f72 100644
--- a/etc/macros.fjava
+++ b/etc/macros.fjava
@@ -113,7 +113,7 @@ sort -u -o ${_filelist} ${_filelist} \
# directory containing pom.xml. If POM location is not given then pom.xml from
# current working directory is used.
#
-%pom_remove_dep() %{expand: %{__pom_call}remove_dep %*
+%pom_remove_dep(rf) %{expand: %{__pom_call}remove_dep %**
}
@@ -132,7 +132,7 @@ sort -u -o ${_filelist} ${_filelist} \
# directory containing pom.xml. If POM location is not given then pom.xml from
# current working directory is used.
#
-%pom_remove_plugin() %{expand: %{__pom_call}remove_plugin %*
+%pom_remove_plugin(rf) %{expand: %{__pom_call}remove_plugin %**
}
@@ -175,7 +175,7 @@ sort -u -o ${_filelist} ${_filelist} \
# because it selects nodes from pom namespace, but "environment/os" won't find
# anything because it looks for nodes that don't belong to any XML namespace.
#
-%pom_xpath_remove() %{expand: %{__pom_call}xpath_remove %*
+%pom_xpath_remove(rf) %{expand: %{__pom_call}xpath_remove %**
}
@@ -213,7 +213,7 @@ sort -u -o ${_filelist} ${_filelist} \
# directory containing pom.xml. If POM location is not given then pom.xml from
# current working directory is used.
#
-%pom_xpath_replace() %{expand: %{__pom_call}xpath_replace %*
+%pom_xpath_replace(rf) %{expand: %{__pom_call}xpath_replace %**
}
@@ -232,7 +232,7 @@ sort -u -o ${_filelist} ${_filelist} \
# directory containing pom.xml. If POM location is not given then pom.xml from
# current working directory is used.
#
-%pom_xpath_set() %{expand: %{__pom_call}xpath_set %*
+%pom_xpath_set(rf) %{expand: %{__pom_call}xpath_set %**
}
10 years, 3 months
[javapackages/pom_editor.py: 14/17] [test] Add tests for pom paths specification
by Michael Šimáček
commit 25690e1f1782291823e2b0814c950348f6827d9c
Author: Michael Simacek <msimacek(a)redhat.com>
Date: Thu Jan 16 16:49:20 2014 +0100
[test] Add tests for pom paths specification
Note: it tests features that are not implemented/broken at the moment.
test/data/pom_editor/example_common.xml | 37 +++
test/data/pom_editor/example_intermediate.xml | 26 +++
test/data/pom_editor/example_parent.xml | 26 +++
test/data/pom_editor/example_parent_profile.xml | 29 +++
test/data/pom_editor/example_schemas.xml | 67 ++++++
test/data/pom_editor/intermediate_pom.xml | 26 +++
test/data/pom_editor/minimal_pom.xml | 13 +
test/data/pom_editor/minimal_pom_nons.xml | 13 +
test/data/pom_editor/simple_pom.xml | 37 +++
.../want/example_common_removed_commons_io.xml | 27 +++
.../want/example_common_removed_junit.xml | 37 +++
.../example_intermediate_removed_commons_io.xml | 20 ++
.../want/example_schemas_removed_junit.xml | 60 +++++
.../pom_editor/want/minimal_add_dep_mgmt_scope.xml | 22 ++
.../data/pom_editor/want/minimal_add_dep_scope.xml | 20 ++
.../want/minimal_add_plugin_resource.xml | 22 ++
.../pom_editor/want/minimal_removed_parent.xml | 9 +
.../pom_editor/want/simple_removed_commons_io.xml | 22 ++
.../data/pom_editor/want/simple_removed_parent.xml | 32 +++
test/pom_editor_paths_test.py | 238 ++++++++++++++++++++
test/test_common.py | 25 ++-
test/test_rpmbuild.py | 31 ++--
22 files changed, 823 insertions(+), 16 deletions(-)
---
diff --git a/test/data/pom_editor/example_common.xml b/test/data/pom_editor/example_common.xml
new file mode 100644
index 0000000..d223355
--- /dev/null
+++ b/test/data/pom_editor/example_common.xml
@@ -0,0 +1,37 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>common</artifactId>
+ <version>2.6</version>
+ <name>Example common</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-ioX</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/example_intermediate.xml b/test/data/pom_editor/example_intermediate.xml
new file mode 100644
index 0000000..aa33c5a
--- /dev/null
+++ b/test/data/pom_editor/example_intermediate.xml
@@ -0,0 +1,26 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>intermediate</artifactId>
+ <version>2.6</version>
+ <name>Intermediate</name>
+ <modules>
+ <module>
+ schemas
+ </module>
+ </modules>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/example_parent.xml b/test/data/pom_editor/example_parent.xml
new file mode 100644
index 0000000..dff1bc8
--- /dev/null
+++ b/test/data/pom_editor/example_parent.xml
@@ -0,0 +1,26 @@
+<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">
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modules>
+ <module>intermediate</module>
+ <module>common</module>
+ </modules>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>2.6</version>
+ <name>Example parent</name>
+
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>4.0</version>
+ </plugin>
+ </plugins>
+
+
+</project>
diff --git a/test/data/pom_editor/example_parent_profile.xml b/test/data/pom_editor/example_parent_profile.xml
new file mode 100644
index 0000000..cd5c62e
--- /dev/null
+++ b/test/data/pom_editor/example_parent_profile.xml
@@ -0,0 +1,29 @@
+<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">
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>2.6</version>
+ <name>Example parent</name>
+
+ <profile>
+ <name>release</name>
+ <modules>
+ <module>intermediate</module>
+ <module>common</module>
+ </modules>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>4.0</version>
+ </plugin>
+ </plugins>
+ </profile>
+
+
+</project>
diff --git a/test/data/pom_editor/example_schemas.xml b/test/data/pom_editor/example_schemas.xml
new file mode 100644
index 0000000..e8aee7d
--- /dev/null
+++ b/test/data/pom_editor/example_schemas.xml
@@ -0,0 +1,67 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>intermediate</artifactId>
+ <version>1.4</version>
+ <relativePath>../intermediate</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>schemas</artifactId>
+ <version>3.1.M0</version>
+ <name>Example Schemas</name>
+ <packaging>jar</packaging>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>artifact-jar</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>test-jar</id>
+ <goals>
+ <goal>test-jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <archive>
+ <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>bundle-manifest</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>manifest</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/test/data/pom_editor/intermediate_pom.xml b/test/data/pom_editor/intermediate_pom.xml
new file mode 100644
index 0000000..aa33c5a
--- /dev/null
+++ b/test/data/pom_editor/intermediate_pom.xml
@@ -0,0 +1,26 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>intermediate</artifactId>
+ <version>2.6</version>
+ <name>Intermediate</name>
+ <modules>
+ <module>
+ schemas
+ </module>
+ </modules>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/minimal_pom.xml b/test/data/pom_editor/minimal_pom.xml
new file mode 100644
index 0000000..8708515
--- /dev/null
+++ b/test/data/pom_editor/minimal_pom.xml
@@ -0,0 +1,13 @@
+<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">
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+</project>
diff --git a/test/data/pom_editor/minimal_pom_nons.xml b/test/data/pom_editor/minimal_pom_nons.xml
new file mode 100644
index 0000000..f47bef3
--- /dev/null
+++ b/test/data/pom_editor/minimal_pom_nons.xml
@@ -0,0 +1,13 @@
+<project>
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+</project>
diff --git a/test/data/pom_editor/simple_pom.xml b/test/data/pom_editor/simple_pom.xml
new file mode 100644
index 0000000..8a9851d
--- /dev/null
+++ b/test/data/pom_editor/simple_pom.xml
@@ -0,0 +1,37 @@
+<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">
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-ioX</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/want/example_common_removed_commons_io.xml b/test/data/pom_editor/want/example_common_removed_commons_io.xml
new file mode 100644
index 0000000..fc74358
--- /dev/null
+++ b/test/data/pom_editor/want/example_common_removed_commons_io.xml
@@ -0,0 +1,27 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>common</artifactId>
+ <version>2.6</version>
+ <name>Example common</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-ioX</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/want/example_common_removed_junit.xml b/test/data/pom_editor/want/example_common_removed_junit.xml
new file mode 100644
index 0000000..d223355
--- /dev/null
+++ b/test/data/pom_editor/want/example_common_removed_junit.xml
@@ -0,0 +1,37 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>common</artifactId>
+ <version>2.6</version>
+ <name>Example common</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-ioX</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/want/example_intermediate_removed_commons_io.xml b/test/data/pom_editor/want/example_intermediate_removed_commons_io.xml
new file mode 100644
index 0000000..218cb5a
--- /dev/null
+++ b/test/data/pom_editor/want/example_intermediate_removed_commons_io.xml
@@ -0,0 +1,20 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>intermediate</artifactId>
+ <version>2.6</version>
+ <name>Intermediate</name>
+ <modules>
+ <module>
+ schemas
+ </module>
+ </modules>
+
+ <dependencies/>
+
+</project>
diff --git a/test/data/pom_editor/want/example_schemas_removed_junit.xml b/test/data/pom_editor/want/example_schemas_removed_junit.xml
new file mode 100644
index 0000000..055450a
--- /dev/null
+++ b/test/data/pom_editor/want/example_schemas_removed_junit.xml
@@ -0,0 +1,60 @@
+<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">
+ <parent>
+ <groupId>com.example</groupId>
+ <artifactId>intermediate</artifactId>
+ <version>1.4</version>
+ <relativePath>../intermediate</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.example</groupId>
+ <artifactId>schemas</artifactId>
+ <version>3.1.M0</version>
+ <name>Example Schemas</name>
+ <packaging>jar</packaging>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>artifact-jar</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>test-jar</id>
+ <goals>
+ <goal>test-jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <archive>
+ <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>bundle-manifest</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>manifest</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+
+ </build>
+ <dependencies/>
+</project>
diff --git a/test/data/pom_editor/want/minimal_add_dep_mgmt_scope.xml b/test/data/pom_editor/want/minimal_add_dep_mgmt_scope.xml
new file mode 100644
index 0000000..02a5827
--- /dev/null
+++ b/test/data/pom_editor/want/minimal_add_dep_mgmt_scope.xml
@@ -0,0 +1,22 @@
+<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">
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.uimaj</groupId>
+ <artifactId>uimaj-core</artifactId>
+ <version>any</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+</project>
diff --git a/test/data/pom_editor/want/minimal_add_dep_scope.xml b/test/data/pom_editor/want/minimal_add_dep_scope.xml
new file mode 100644
index 0000000..621c984
--- /dev/null
+++ b/test/data/pom_editor/want/minimal_add_dep_scope.xml
@@ -0,0 +1,20 @@
+<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">
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.uimaj</groupId>
+ <artifactId>uimaj-core</artifactId>
+ <version>any</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+</project>
diff --git a/test/data/pom_editor/want/minimal_add_plugin_resource.xml b/test/data/pom_editor/want/minimal_add_plugin_resource.xml
new file mode 100644
index 0000000..45a9276
--- /dev/null
+++ b/test/data/pom_editor/want/minimal_add_plugin_resource.xml
@@ -0,0 +1,22 @@
+<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">
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-remote-resources-plugin</artifactId>
+ <version>any</version>
+ <goal>generate-resources</goal>
+ </plugin>
+ </plugins>
+
+</project>
diff --git a/test/data/pom_editor/want/minimal_removed_parent.xml b/test/data/pom_editor/want/minimal_removed_parent.xml
new file mode 100644
index 0000000..e1045f8
--- /dev/null
+++ b/test/data/pom_editor/want/minimal_removed_parent.xml
@@ -0,0 +1,9 @@
+<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">
+ <!-- parent POM reference removed by maintainer -->
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+</project>
diff --git a/test/data/pom_editor/want/simple_removed_commons_io.xml b/test/data/pom_editor/want/simple_removed_commons_io.xml
new file mode 100644
index 0000000..a36129f
--- /dev/null
+++ b/test/data/pom_editor/want/simple_removed_commons_io.xml
@@ -0,0 +1,22 @@
+<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">
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-parent</artifactId>
+ <version>17</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/data/pom_editor/want/simple_removed_parent.xml b/test/data/pom_editor/want/simple_removed_parent.xml
new file mode 100644
index 0000000..774007a
--- /dev/null
+++ b/test/data/pom_editor/want/simple_removed_parent.xml
@@ -0,0 +1,32 @@
+<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>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ <name>Commons Lang</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-ioX</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/test/pom_editor_paths_test.py b/test/pom_editor_paths_test.py
new file mode 100644
index 0000000..d04c040
--- /dev/null
+++ b/test/pom_editor_paths_test.py
@@ -0,0 +1,238 @@
+from os import path
+from test_rpmbuild import Package
+from test_common import DIRPATH, WorkdirTestCase
+from xml_compare import compare_xml_files
+
+DATADIR = path.join(DIRPATH, 'data', 'pom_editor')
+
+def exec_pom_macro(line, poms_tree, want_tree=None):
+ """
+ Parameters:
+ line::
+ A line of spec code injected to %prep
+ poms_tree::
+ dictionary that maps subpackage directory paths to input poms
+ want_tree::
+ dictionary that maps subpackage directory paths to wanted poms
+ (in want directory)
+ It creates a directory structure corresponding to keys in poms_tree and
+ copies pom files into it. Then it executes prep and compares altered poms
+ to wanted ones from want_tree (if not specified in want_tree it is assumed
+ to remain unchanged and is compared with the original pom). Returns tuple
+ of rpmbuild's return value, stderr and report of differences in xml files.
+ """
+ pack = Package('test')
+ pack.append_to_prep(line)
+ for destpath, sourcepath in poms_tree.iteritems():
+ pack.add_source(path.join(DATADIR, sourcepath), path.join(destpath, 'pom.xml'))
+ _, stderr, return_value = pack.run_prep()
+ reports = []
+ if return_value == 0:
+ for filepath, pom in poms_tree.iteritems():
+ if want_tree and filepath in want_tree:
+ expected_pom = path.join('want', want_tree[filepath])
+ else:
+ expected_pom = pom
+ expected_pom = path.join(DATADIR, expected_pom)
+ actual_pom = path.join(pack.buildpath, filepath, 'pom.xml')
+ reports.append(compare_xml_files(actual_pom, expected_pom))
+ return return_value, stderr, '\n'.join(reports).strip()
+
+class TestPomPath(WorkdirTestCase):
+ def test_sanity(self):
+ return_value, stderr, report = exec_pom_macro('', {
+ 'submodule': 'minimal_pom.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_default_nonexistent(self):
+ return_value, stderr, _ = exec_pom_macro('%pom_remove_parent', {})
+ self.assertIn("Couldn't locate POM file", stderr)
+ self.assertNotEqual(0, return_value)
+
+ def test_submodule_nonexistent(self):
+ return_value, stderr, _ = exec_pom_macro('%pom_remove_parent submodule', {})
+ self.assertIn("Couldn't locate POM file", stderr)
+ self.assertNotEqual(0, return_value)
+
+ def test_default(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent',
+ poms_tree={'': 'minimal_pom.xml'},
+ want_tree={'': 'minimal_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_explicit(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent pom.xml',
+ poms_tree={'': 'minimal_pom.xml'},
+ want_tree={'': 'minimal_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodule_default(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent submodule',
+ poms_tree={'submodule': 'minimal_pom.xml'},
+ want_tree={'submodule': 'minimal_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodule_explicit(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent submodule',
+ poms_tree={'submodule': 'minimal_pom.xml'},
+ want_tree={'submodule': 'minimal_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodule_more_levels(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent submodule/something',
+ poms_tree={'submodule/something': 'minimal_pom.xml'},
+ want_tree={'submodule/something': 'minimal_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+class TestMorePoms(WorkdirTestCase):
+ def test_submodules_default(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent submodule1 submodule2',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'simple_pom.xml'},
+ want_tree={'submodule1': 'minimal_removed_parent.xml',
+ 'submodule2': 'simple_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodules_different_levels(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_parent . submodule2',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'simple_pom.xml',
+ '': 'minimal_pom.xml'},
+ want_tree={'submodule2': 'simple_removed_parent.xml',
+ '': 'minimal_removed_parent.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_many_submodules(self):
+ poms = ['submodule{0}'.format(i) for i in range(10)]
+ command = '%pom_remove_parent ' + ' '.join(poms)
+ poms_tree = {'untouched': 'minimal_pom.xml'}
+ want_tree = {}
+ for pom in poms:
+ poms_tree[pom] = 'simple_pom.xml'
+ want_tree[pom] = 'simple_removed_parent.xml'
+ return_value, stderr, report = exec_pom_macro(command, poms_tree, want_tree)
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodules_partial_match(self):
+ return_value, stderr, _ = exec_pom_macro(\
+ '%pom_remove_dep :commons-io submodule1 submodule2',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'simple_pom.xml'})
+ self.assertIn("Error", stderr)
+ self.assertIn("not found", stderr)
+ self.assertNotEqual(0, return_value)
+
+ def test_submodules_partial_match_force(self):
+ return_value, stderr, report = exec_pom_macro(\
+ '%pom_remove_dep -f :commons-io submodule1 submodule2',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'simple_pom.xml'},
+ want_tree={'submodule2': 'simple_removed_commons_io.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+class TestRecursive(WorkdirTestCase):
+ example_tree = {
+ '': 'example_parent.xml',
+ 'common': 'example_common.xml',
+ 'intermediate': 'example_intermediate.xml',
+ 'intermediate/schemas': 'example_schemas.xml'}
+
+ def test_default_recursive1(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_dep -r :commons-io',
+ poms_tree=self.example_tree,
+ want_tree={'intermediate': 'example_intermediate_removed_commons_io.xml',
+ 'common': 'example_common_removed_commons_io.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_default_recursive2(self):
+ return_value, stderr, report = exec_pom_macro('%pom_remove_dep -r :junit',
+ poms_tree=self.example_tree,
+ want_tree={'intermediate/schemas': 'example_schemas_removed_junit.xml',
+ 'common': 'example_common_removed_junit.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_default_recursive_profile(self):
+ poms_tree = dict(self.example_tree)
+ poms_tree[''] = 'example_parent_profile.xml'
+ return_value, stderr, report = exec_pom_macro('%pom_remove_dep -r :commons-io',
+ poms_tree=poms_tree,
+ want_tree={'intermediate': 'example_intermediate_removed_commons_io.xml',
+ 'common': 'example_common_removed_commons_io.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_recursive_no_match(self):
+ return_value, stderr, _ = exec_pom_macro('%pom_remove_dep -r :junit',
+ poms_tree=self.example_tree)
+ self.assertIn("Error", stderr)
+ self.assertIn("not fount", stderr)
+ self.assertNotEqual(0, return_value)
+
+
+class TestAttributeRecognition(WorkdirTestCase):
+ def test_default_extra_xml(self):
+ return_value, stderr, report = exec_pom_macro('\
+ %pom_add_dep org.apache.uimaj:uimaj-core "<scope>test</scope>"',
+ poms_tree={'': 'minimal_pom.xml'},
+ want_tree={'': 'minimal_add_dep_scope.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_explicit_extra_xml(self):
+ return_value, stderr, report = exec_pom_macro('\
+ %pom_add_dep org.apache.uimaj:uimaj-core pom.xml "<scope>test</scope>"',
+ poms_tree={'': 'minimal_pom.xml'},
+ want_tree={'': 'minimal_add_dep_scope.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodule_extra_xml(self):
+ return_value, stderr, report = exec_pom_macro('\
+ %pom_add_dep org.apache.uimaj:uimaj-core submodule "<scope>test</scope>"',
+ poms_tree={'submodule': 'minimal_pom.xml'},
+ want_tree={'submodule': 'minimal_add_dep_scope.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_submodules_extra_xml(self):
+ return_value, stderr, report = exec_pom_macro(\
+ '%pom_add_dep org.apache.uimaj:uimaj-core submodule1 submodule2 "<scope>test</scope>"',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'minimal_pom.xml'},
+ want_tree={'submodule1': 'minimal_add_dep_scope.xml',
+ 'submodule2': 'minimal_add_dep_scope.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_dep_mgmt_extra_xml(self):
+ return_value, stderr, report = exec_pom_macro(\
+ '%pom_add_dep_mgmt org.apache.uimaj:uimaj-core submodule1 submodule2 "<scope>test</scope>"',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'minimal_pom.xml'},
+ want_tree={'submodule1': 'minimal_add_dep_mgmt_scope.xml',
+ 'submodule2': 'minimal_add_dep_mgmt_scope.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
+
+ def test_plugin_extra_xml(self):
+ return_value, stderr, report = exec_pom_macro(\
+ '%pom_add_plugin org.apache.maven:maven-remote-resources-plugin \
+ submodule1 submodule2 "<goal>generate-resources</goal>"',
+ poms_tree={'submodule1': 'minimal_pom.xml',
+ 'submodule2': 'minimal_pom.xml'},
+ want_tree={'submodule1': 'minimal_add_plugin_resource.xml',
+ 'submodule2': 'minimal_add_plugin_resource.xml'})
+ self.assertEqual(0, return_value, stderr)
+ self.assertEqual('', report, report)
diff --git a/test/test_common.py b/test/test_common.py
index b9f694c..c8a8075 100644
--- a/test/test_common.py
+++ b/test/test_common.py
@@ -1,8 +1,9 @@
import os
+import re
import shutil
-import sys
import subprocess
-import re
+import sys
+import unittest
DIRPATH = os.path.dirname(os.path.realpath(__file__))
PYTHONPATH = os.path.join(DIRPATH, '../python')
@@ -140,3 +141,23 @@ def mvn_artifact(pom, jar=None):
fun(self, stdout, stderr, return_value)
return test_decorated
return test_decorator
+
+class WorkdirTestCase(unittest.TestCase):
+ olddir = os.getcwd()
+ WORKDIR = '.workdir'
+
+ def setUp(self):
+ self.olddir = os.getcwd()
+ try:
+ shutil.rmtree(self.WORKDIR)
+ except OSError:
+ pass
+ os.mkdir(self.WORKDIR)
+ os.chdir(self.WORKDIR)
+
+ def tearDown(self):
+ try:
+ shutil.rmtree(self.WORKDIR)
+ except OSError:
+ pass
+ os.chdir(self.olddir)
diff --git a/test/test_rpmbuild.py b/test/test_rpmbuild.py
index 11c833e..14a45e1 100644
--- a/test/test_rpmbuild.py
+++ b/test/test_rpmbuild.py
@@ -19,7 +19,7 @@ class Package(object):
"""
def __init__(self, name):
self.__name = name
- self.__sources = {}
+ self.__sources = []
self.__begin = ''
self.__prep = ''
self.__build = ''
@@ -46,7 +46,7 @@ class Package(object):
sourcepath = os.path.join(DIRPATH, sourcepath)
if not newname:
newname = os.path.basename(sourcepath)
- self.__sources[sourcepath] = newname
+ self.__sources.append((sourcepath, newname))
def prepend(self, to_prepend):
"""Prepends given string to spec file"""
@@ -70,9 +70,9 @@ class Package(object):
return self.__invoke_rpmbuild(['-bp'] + (args or []))
def run_build(self, args=None):
- """Runs rpmbuild -bb (stop after build phase) with current settings."""
+ """Runs rpmbuild -bc (stop after build phase) with current settings."""
self.__prepare_all()
- return self.__invoke_rpmbuild(['-bb'] + (args or []))
+ return self.__invoke_rpmbuild(['-bc'] + (args or []))
def run_install(self, args=None):
"""Runs rpmbuild -bi (stop after install) with current settings."""
@@ -113,10 +113,7 @@ class Package(object):
pass
_prepare_macros()
self.__prepare_spec()
- try:
- self.__prepare_sources()
- except IOError:
- pass
+ self.__prepare_sources()
def __prepare_spec(self):
header = self.__begin + dedent("""
@@ -127,8 +124,9 @@ class Package(object):
License: GPL
URL: www.example.com
""".format(name=self.__name))
- for index, filename in enumerate(self.__sources.values() or []):
- header += 'Source{index}: {filename}\n'.format(filename=filename,
+ for index, (_, filename) in enumerate(self.__sources):
+ filename = os.path.basename(filename)
+ header += 'Source{index}: {filename}{index}\n'.format(filename=filename,
index=index)
header += dedent("""\
@@ -142,8 +140,12 @@ class Package(object):
mkdir %{name}-%{version}
cd %{name}-%{version}
""")
- for i in range(len(self.__sources)):
- prep_section += 'cp -p %SOURCE{index} .\n'.format(index=i)
+ for index, (_, filename) in enumerate(self.__sources):
+ directory = os.path.dirname(filename)
+ prep_section += 'mkdir -p ./{d}\n'.format(d=directory)
+ prep_section += 'cp -p %SOURCE{index} ./{d}/{f}\n'.format(index=index,
+ d=directory, f=os.path.basename(filename))
+
prep_section += self.__prep
build_section = dedent("""\
@@ -168,8 +170,9 @@ class Package(object):
def __prepare_sources(self):
destpath = os.path.join('rpmbuild', 'SOURCES')
- for sourcepath, targetname in self.__sources.iteritems():
- shutil.copy(sourcepath, os.path.join(destpath, targetname))
+ for index, (sourcepath, targetname) in enumerate(self.__sources):
+ target = os.path.join(destpath, os.path.basename(targetname))
+ shutil.copy(sourcepath, '{0}{1}'.format(target, index))
def _prepare_macros():
etcpath = os.path.join(DIRPATH, '..', 'etc')
10 years, 3 months
[javapackages/pom_editor.py] (17 commits) ...[pom_editor] implement recursive mode and force option
by Michael Šimáček
Summary of changes:
61c9ae9... Allow ZIP files in /usr/share/java (*)
322ef52... Fix XMVn config related to ZIP files (*)
2d34232... Really merge branch 'pom_editor.py' (*)
57012a1... Add support for XMvn 2.0.0 logging options (*)
9706f61... Add Ivy local settings (*)
12e232a... Set default Ivy mode to upstream (*)
ce0cd0f... Fix tests to reflect changes in XMvn 2.0.0 logging (*)
81b474a... Prep for 3.5.0 release (*)
3067ad7... Post release version bump: 3.6.0-SNAPSHOT (*)
d370124... Update ivy-local settings for XMvn 2.0.0 (*)
5eb4ce0... [pom_editor] fix regression - replacing non-element nodes (*)
86b7c5a... [pom.py] wrap IOError (*)
e4d3eba... [test] expect wrapped expection in pom.py (*)
25690e1... [test] Add tests for pom paths specification
9b12d18... [macros] pass -r (recursive) and -f (force) options to pom_
dc2286a... [test] add tests for recursive mode and force option
c6d1b8e... [pom_editor] implement recursive mode and force option
(*) This commit already existed in another branch; no separate mail sent
10 years, 3 months