commit 689ac32af0105bebcac1b8b73a924e40d68ed160
Author: Michael Simacek <msimacek(a)redhat.com>
Date: Fri May 16 16:05:39 2014 +0200
[maven.req] Make Java requires generation configurable
depgenerators/maven.req | 87 +++++++++++++++++++++--------------------
test/data/config/default.json | 16 +++++++
test/test_common.py | 6 ++-
3 files changed, 64 insertions(+), 45 deletions(-)
---
diff --git a/depgenerators/maven.req b/depgenerators/maven.req
index e6e313e..4804666 100755
--- a/depgenerators/maven.req
+++ b/depgenerators/maven.req
@@ -32,6 +32,7 @@
# Stanislav Ochotnicky <sochotnicky(a)redhat.com>
#
+import json
import os
import sys
import signal
@@ -43,56 +44,64 @@ from javapackages import POM
from javapackages.depmap import Depmap, MetadataInvalidException
from javapackages.artifact import Artifact, ProvidedArtifact, SkippedArtifact,
Dependency
-class TagBuilder:
- def __init__ (self, filelist=None):
+def process_java_version(version_string):
+ version = version_string.split('.')
+ if len(version) != 2:
+ # if we don't have major.minor format, just ignore version
+ raise ValueError("Required Java version not in major.minor format")
+ major = int(version[0])
+ minor = int(version[1])
+ if major > 1 or minor > 5:
+ return "1:{0}.{1}".format(major, minor)
+ else:
+ return "{0}.{1}".format(major, minor)
+
+class TagBuilder(object):
+ def __init__(self, filelist=None):
if filelist == None:
filelist = sys.stdin
- paths = map (lambda x: x.rstrip (), filelist.readlines ())
+
+ config_path = os.environ.get('JAVAPACKAGES_CONFIG',
'/etc/javapackages/config.json')
+ try:
+ with open(config_path) as config_file:
+ self.config = json.load(config_file)
+ except (OSError, IOError):
+ raise Exception('Cannot load config file.')
+
+ paths = [line.rstrip() for line in filelist.readlines()]
self.provided_artifacts = []
self.skipped_artifacts = []
if paths:
# let's first read all fragment files for provided artifacts
self.fragment_dir = os.path.dirname(paths[0])
fpaths = []
- for dirname, dirnames, filenames in os.walk(self.fragment_dir):
+ for dirname, _, filenames in os.walk(self.fragment_dir):
for filename in filenames:
if filename.endswith(".pom"):
continue
fpaths.append(os.path.join(dirname, filename))
- try:
- depmap = Depmap(fpaths)
- self.provided_artifacts.extend(depmap.get_provided_artifacts())
- self.skipped_artifacts.extend(depmap.get_skipped_artifacts())
- except MetadataInvalidException:
- # let's ignore if some other files are incorrect'
- print >> sys.stderr, "Failed to load:
{fpath}".format(fpath=fpath)
+ depmap = Depmap(fpaths)
+ self.provided_artifacts.extend(depmap.get_provided_artifacts())
+ self.skipped_artifacts.extend(depmap.get_skipped_artifacts())
for path in paths:
if path.endswith(".pom"):
continue
self.print_mvn_requires(path)
- def __process_jvm_req(self, name, version):
- if not version:
- return ""
- try:
- jsplit = version.split('.')
- if len(jsplit) != 2:
- # if we don't have major.minor format, just ignore version
- raise ValueError("Required Java version not in major.minor
format")
- major = int(jsplit[0])
- minor = int(jsplit[1])
- if major > 1 or minor > 5:
- return "{name} >= 1:{major}.{minor}".format(name=name,
- major=major,
- minor=minor)
- else:
- return "{name} >= {major}.{minor}".format(name=name,
- major=major,
- minor=minor)
- except ValueError:
- # what? not a numbered major/minor java release?
- return name
-
+ def __generate_java_requires(self, depmap):
+ for rule_name, fn in (('java_requires', Depmap.get_java_requires),
+ ('java_devel_requires',
Depmap.get_java_devel_requires)):
+ rules = self.config[rule_name]
+ if not rules.get('skip', False):
+ required_version = fn(depmap)
+ if required_version:
+ version_string = process_java_version(required_version)
+ parts = {'pkg': rules['package_name'],
+ 'op': rules.get('cmp_operator',
'>='),
+ 'version': version_string}
+ print("{pkg} {op} {version}".format(**parts))
+ elif rules['always_generate']:
+ print(rules['package_name'])
def __is_dep_on_same_package(self, dependency, depmap):
# TODO: what about requires on same compat and non-compat deps in same
@@ -121,7 +130,7 @@ class TagBuilder:
def print_mvn_requires(self, path):
depmap = Depmap(path)
skipped_but_required = []
- base_package_requires=set()
+ base_package_requires = set()
for provided in depmap.get_provided_artifacts():
if provided.namespace:
@@ -209,15 +218,7 @@ class TagBuilder:
"in %prep.\n"
raise Exception(skipped_msg)
- java_req = self.__process_jvm_req('java-headless',
depmap.get_java_requires())
- java_devel_req = self.__process_jvm_req('java-devel',
- depmap.get_java_devel_requires())
- if java_req:
- print(java_req)
- else:
- print('java-headless')
- if java_devel_req:
- print(java_devel_req)
+ self.__generate_java_requires(depmap)
def find_what_requires(self, artifact):
"""
diff --git a/test/data/config/default.json b/test/data/config/default.json
new file mode 100644
index 0000000..1c145c8
--- /dev/null
+++ b/test/data/config/default.json
@@ -0,0 +1,16 @@
+{
+ "java_requires": {
+ "package_name": "java-headless",
+ "always_generate": true,
+ "skip": false
+ },
+ "java_devel_requires": {
+ "package_name": "java-devel",
+ "always_generate": false,
+ "skip": false
+ },
+ "filter_requires": [
+ "com.sun:tools",
+ "sun.jdk:jconsole"
+ ]
+}
diff --git a/test/test_common.py b/test/test_common.py
index e466522..d880f2b 100644
--- a/test/test_common.py
+++ b/test/test_common.py
@@ -131,13 +131,15 @@ def osgiprov(filelist):
return test_decorated
return test_decorator
-def mavenreq(filelist):
+def mavenreq(filelist, config='default'):
def test_decorator(fun):
def test_decorated(self):
scriptpath = path.join(DIRPATH, '..', 'depgenerators',
'maven.req')
stdin = build_depmap_paths(filelist)
+ config_path = os.path.join(DIRPATH, 'data', 'config', config
+ '.json')
+ env = {'JAVAPACKAGES_CONFIG': config_path}
(stdout, stderr, return_value) = call_script(scriptpath,
- [], stdin=stdin, wrapped=True)
+ [], stdin=stdin, wrapped=True, extra_env=env)
fun(self, stdout, stderr, return_value)
return test_decorated
return test_decorator