summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-01-11 16:28:05 +0200
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-04-03 10:11:41 +0300
commit3045dfdbc805738167c39f67622e0f7950d4c0be (patch)
tree7d2158b1aebbd1f8a2a8c4e1ec5c5917ecc2b08a
parentf324c18af92025c3a439e2dc93ea1371fc2ddae5 (diff)
downloadgit-buildpackage-3045dfdbc805738167c39f67622e0f7950d4c0be.tar.gz
git-buildpackage-3045dfdbc805738167c39f67622e0f7950d4c0be.tar.bz2
git-buildpackage-3045dfdbc805738167c39f67622e0f7950d4c0be.zip
rpm helpers: implement _set/delete_special_macro() methods
Currently intended for updating '%patch' macros. Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-rw-r--r--gbp/rpm/__init__.py44
-rw-r--r--tests/test_rpm.py12
-rw-r--r--tests/test_rpm_data/specs/gbp-test-updates-reference.spec3
-rw-r--r--tests/test_rpm_data/specs/gbp-test-updates.spec6
4 files changed, 63 insertions, 2 deletions
diff --git a/gbp/rpm/__init__.py b/gbp/rpm/__init__.py
index 469ee404..d70b90ec 100644
--- a/gbp/rpm/__init__.py
+++ b/gbp/rpm/__init__.py
@@ -516,6 +516,50 @@ class SpecFile(object):
else:
raise GbpError("Setting '%s:' tag not supported" % tagname)
+ def _delete_special_macro(self, name, identifier):
+ """Delete a special macro line in spec file content"""
+ if name != 'patch':
+ raise GbpError("Deleting '%s:' macro not supported" % name)
+
+ key = name.lower()
+ fullname = '%%%s%s' % (name, identifier)
+ sparedlines = []
+ prev = None
+ for line in self._special_directives[key]:
+ if line['id'] == identifier:
+ gbp.log.debug("Removing '%s' macro from spec" % fullname)
+ prev = self._content.delete(line['line'])
+ else:
+ sparedlines.append(line)
+ self._special_directives[key] = sparedlines
+ if not prev:
+ gbp.log.warn("Tried to delete non-existent macro '%s'" % fullname)
+ return prev
+
+ def _set_special_macro(self, name, identifier, args, insertafter):
+ """Update a special macro line in spec file content"""
+ key = name.lower()
+ fullname = '%%%s%s' % (name, identifier)
+ if key != 'patch':
+ raise GbpError("Setting '%s' macro not supported" % name)
+
+ updated = 0
+ text = "%%%s%d %s\n" % (name, identifier, args)
+ for line in self._special_directives[key]:
+ if line['id'] == identifier:
+ gbp.log.debug("Updating '%s' macro in spec" % fullname)
+ line['args'] = args
+ line['line'].set_data(text)
+ ret = line['line']
+ updated += 1
+ if not updated:
+ gbp.log.debug("Adding '%s' macro after '%s...' line in spec" %
+ (fullname, str(insertafter)[0:20]))
+ ret = self._content.insert_after(insertafter, text)
+ linerec = {'line': ret, 'id': identifier, 'args': args}
+ self._special_directives[key].append(linerec)
+ return ret
+
def update_patches(self, patchfilenames):
"""Update spec with new patch tags and patch macros"""
# Remove non-ignored patches
diff --git a/tests/test_rpm.py b/tests/test_rpm.py
index 88eb571f..ec2c834a 100644
--- a/tests/test_rpm.py
+++ b/tests/test_rpm.py
@@ -197,8 +197,8 @@ class TestSpecFile(object):
prev = spec.protected('_delete_tag')('Vendor', None)
spec.protected('_set_tag')('License', None, 'new license', prev)
spec.protected('_delete_tag')('source', 0)
+ spec.protected('_delete_tag')('patch', 1)
spec.protected('_delete_tag')('patch', 0)
- spec.protected('_delete_tag')('patch', -1)
prev = spec.protected('_delete_tag')('invalidtag', None)
with assert_raises(GbpError):
@@ -208,6 +208,16 @@ class TestSpecFile(object):
# Check that setting invalid tag with public method fails
spec.set_tag('invalidtag', None, 'value')
+ # Mangle macros
+ prev = spec.protected('_delete_special_macro')('patch', 0)
+ spec.protected('_delete_special_macro')('patch', 123)
+ spec.protected('_set_special_macro')('patch', 1, 'my new args', prev)
+ with assert_raises(GbpError):
+ spec.protected('_delete_special_macro')('invalidmacro', 0)
+ with assert_raises(GbpError):
+ spec.protected('_set_special_macro')('invalidmacro', 0, 'args',
+ prev)
+
# Check resulting spec file
spec.write_spec_file()
assert filecmp.cmp(tmp_spec, reference_spec) is True
diff --git a/tests/test_rpm_data/specs/gbp-test-updates-reference.spec b/tests/test_rpm_data/specs/gbp-test-updates-reference.spec
index 557f8b77..e6e6846c 100644
--- a/tests/test_rpm_data/specs/gbp-test-updates-reference.spec
+++ b/tests/test_rpm_data/specs/gbp-test-updates-reference.spec
@@ -33,6 +33,9 @@ Collections: my_collections
Package for testing GBP.
%prep
+%setup -n my_prefix
+
+%patch1 my new args
%build
diff --git a/tests/test_rpm_data/specs/gbp-test-updates.spec b/tests/test_rpm_data/specs/gbp-test-updates.spec
index 1cdcb212..19912442 100644
--- a/tests/test_rpm_data/specs/gbp-test-updates.spec
+++ b/tests/test_rpm_data/specs/gbp-test-updates.spec
@@ -18,7 +18,7 @@ Url: my_url
Vcs: my_vcs
Source: my_source
Patch: my_%patch_fn_base
-Patch0: my_%{patch_fn_base}0
+Patch1: my_%{patch_fn_base}1
BuildRoot: my_buildroot
Provides: my_provides
Requires: my_requires
@@ -37,6 +37,10 @@ Collections: my_collections
Package for testing GBP.
%prep
+%setup -n my_prefix
+
+%patch -b my_patch
+%patch -P1 -b my_patch0
%build