summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-09-06 17:15:52 +0300
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>2014-01-14 13:49:53 +0200
commit92a38f51b6f90106a8cbadca11cafab89ec5fad6 (patch)
treed8017606f9435a2c0a1dc3738f550b8eafc63b77
parentd55f1137d800d44c8fad41ec21c37074d73b7e38 (diff)
downloadgit-buildpackage-92a38f51b6f90106a8cbadca11cafab89ec5fad6.tar.gz
git-buildpackage-92a38f51b6f90106a8cbadca11cafab89ec5fad6.tar.bz2
git-buildpackage-92a38f51b6f90106a8cbadca11cafab89ec5fad6.zip
rpm.SpecFile: support parsing spec as raw text data
Instead of reading from a file. Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-rw-r--r--gbp/rpm/__init__.py33
-rw-r--r--tests/test_rpm.py17
2 files changed, 40 insertions, 10 deletions
diff --git a/gbp/rpm/__init__.py b/gbp/rpm/__init__.py
index d3078867..19cf1fa5 100644
--- a/gbp/rpm/__init__.py
+++ b/gbp/rpm/__init__.py
@@ -112,18 +112,31 @@ class SpecFile(object):
gbptag_re = re.compile(r'^\s*#\s*gbp-(?P<name>[a-z-]+)'
'(\s*:\s*(?P<args>\S.*))?$', flags=re.I)
- def __init__(self, specfile):
+ def __init__(self, filename=None, filedata=None):
- # Load spec file into our special data structure
- self.specfile = os.path.basename(specfile)
- self.specdir = os.path.dirname(os.path.abspath(specfile))
self._content = LinkedList()
- try:
- with open(specfile) as spec_file:
- for line in spec_file.readlines():
- self._content.append(line)
- except IOError as err:
- raise NoSpecError("Unable to read spec file: %s" % err)
+
+ # Check args: only filename or filedata can be given, not both
+ if filename is None and filedata is None:
+ raise NoSpecError("No filename or raw data given for parsing!")
+ elif filename and filedata:
+ raise NoSpecError("Both filename and raw data given, don't know "
+ "which one to parse!")
+ elif filename:
+ # Load spec file into our special data structure
+ self.specfile = os.path.basename(filename)
+ self.specdir = os.path.dirname(os.path.abspath(filename))
+ try:
+ with open(filename) as spec_file:
+ for line in spec_file.readlines():
+ self._content.append(line)
+ except IOError as err:
+ raise NoSpecError("Unable to read spec file: %s" % err)
+ else:
+ self.specfile = None
+ self.specdir = None
+ for line in filedata.splitlines():
+ self._content.append(line + '\n')
# Use rpm-python to parse the spec file content
self._filtertags = ("excludearch", "excludeos", "exclusivearch",
diff --git a/tests/test_rpm.py b/tests/test_rpm.py
index 63c9e8c3..c4174665 100644
--- a/tests/test_rpm.py
+++ b/tests/test_rpm.py
@@ -147,6 +147,23 @@ class TestSpecFile(object):
assert spec.name == 'gbp-test-native2'
assert spec.orig_src is None
+ def test_parse_raw(self):
+ """Test parsing of a valid spec file"""
+ with assert_raises(NoSpecError):
+ SpecFile(None, None)
+ with assert_raises(NoSpecError):
+ SpecFile('filename', 'filedata')
+
+ spec_filepath = os.path.join(SPEC_DIR, 'gbp-test.spec')
+ with open(spec_filepath, 'r') as spec_fd:
+ spec_data = spec_fd.read()
+ spec = SpecFile(filedata=spec_data)
+
+ # Test basic properties
+ assert spec.specfile == None
+ assert spec.specdir == None
+ assert spec.name == 'gbp-test'
+
def test_update_spec(self):
"""Test spec autoupdate functionality"""
# Create temporary spec file