rpm: support for getting/setting changelog in spec
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Wed, 5 Feb 2014 10:12:38 +0000 (12:12 +0200)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Thu, 5 Jun 2014 11:20:07 +0000 (14:20 +0300)
SpecFile objects now support reading and writing of the %changelog
section.

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp/rpm/__init__.py
tests/test_rpm.py
tests/test_rpm_data/rpmbuild/SPECS/gbp-test2.spec
tests/test_rpm_data/specs/gbp-test-reference2.spec
tests/test_rpm_data/specs/gbp-test2-reference.spec
tests/test_rpm_data/specs/gbp-test2-reference2.spec

index 7aa7ba4..0e04b4d 100644 (file)
@@ -563,6 +563,49 @@ class SpecFile(object):
             self._special_directives[key].append(linerec)
         return ret
 
+    def _set_section(self, name, text):
+        """Update/create a complete section in spec file."""
+        if name not in self.section_identifiers:
+            raise GbpError("Not a valid section directive: '%s'" % name)
+        # Delete section, if it exists
+        if name in self._special_directives:
+            if len(self._special_directives[name]) > 1:
+                raise GbpError("Multiple %%%s sections found, don't know "
+                               "which to update" % name)
+            line = self._special_directives[name][0]['line']
+            gbp.log.debug("Removing content of %s section" % name)
+            while line.next:
+                match = self.directive_re.match(str(line.next))
+                if match and match.group('name') in self.section_identifiers:
+                    break
+                self._content.delete(line.next)
+        else:
+            gbp.log.debug("Adding %s section to the end of spec file" % name)
+            line = self._content.append('%%%s\n' % name)
+            linerec = {'line': line, 'id': None, 'args': None}
+            self._special_directives[name] = [linerec]
+        # Add new lines
+        gbp.log.debug("Updating content of %s section" % name)
+        for linetext in text.splitlines():
+            line = self._content.insert_after(line, linetext + '\n')
+
+    def set_changelog(self, text):
+        """Update or create the %changelog section"""
+        self._set_section('changelog', text)
+
+    def get_changelog(self):
+        """Get the %changelog section"""
+        text = ''
+        if 'changelog' in self._special_directives:
+            line = self._special_directives['changelog'][0]['line']
+            while line.next:
+                line = line.next
+                match = self.directive_re.match(str(line))
+                if match and match.group('name') in self.section_identifiers:
+                    break
+                text += str(line)
+        return text
+
     def update_patches(self, patches, commands):
         """Update spec with new patch tags and patch macros"""
         # Remove non-ignored patches
index 69ab85b..1379926 100644 (file)
@@ -20,7 +20,7 @@ import filecmp
 import os
 import shutil
 import tempfile
-from nose.tools import assert_raises
+from nose.tools import assert_raises, eq_
 
 from gbp.errors import GbpError
 from gbp.rpm import (SrcRpmFile, SpecFile, parse_srpm, NoSpecError, guess_spec,
@@ -181,15 +181,16 @@ class TestSpecFile(object):
         spec.write_spec_file()
         assert filecmp.cmp(tmp_spec, reference_spec) is True
 
-        # Test adding the VCS tag
+        # Test adding the VCS tag and adding changelog
         reference_spec = os.path.join(SPEC_DIR, 'gbp-test-reference2.spec')
         spec.set_tag('VCS', None, 'myvcstag')
+        spec.set_changelog("* Wed Feb 05 2014 Name <email> 1\n- New entry\n")
         spec.write_spec_file()
         assert filecmp.cmp(tmp_spec, reference_spec) is True
 
     def test_update_spec2(self):
         """Another test for spec autoupdate functionality"""
-        tmp_spec = os.path.join(self.tmpdir, 'gbp-test.spec')
+        tmp_spec = os.path.join(self.tmpdir, 'gbp-test2.spec')
         shutil.copy2(os.path.join(SPEC_DIR, 'gbp-test2.spec'), tmp_spec)
 
         reference_spec = os.path.join(SPEC_DIR, 'gbp-test2-reference2.spec')
@@ -201,10 +202,12 @@ class TestSpecFile(object):
         spec.write_spec_file()
         assert filecmp.cmp(tmp_spec, reference_spec) is True
 
-        # Test updating patches again and removing the VCS tag
+        # Test updating patches again, removing the VCS tag and re-writing
+        # changelog
         reference_spec = os.path.join(SPEC_DIR, 'gbp-test2-reference.spec')
         spec.update_patches(['new.patch'], {'new.patch': {'if': '1'}})
         spec.set_tag('VCS', None, '')
+        spec.set_changelog("* Wed Feb 05 2014 Name <email> 2\n- New entry\n\n")
         spec.write_spec_file()
         assert filecmp.cmp(tmp_spec, reference_spec) is True
 
@@ -247,6 +250,33 @@ class TestSpecFile(object):
         spec.write_spec_file()
         assert filecmp.cmp(tmp_spec, reference_spec) is True
 
+    def test_modifying_err(self):
+        """Test error conditions of modification methods"""
+        spec_filepath = os.path.join(SPEC_DIR, 'gbp-test2.spec')
+        spec = SpecFileTester(spec_filepath)
+
+        # Unknown/invalid section name
+        with assert_raises(GbpError):
+            spec.protected('_set_section')('patch', 'new content\n')
+
+        # Multiple sections with the same name
+        with assert_raises(GbpError):
+            spec.protected('_set_section')('files', '%{_sysconfdir}/foo\n')
+
+    def test_changelog(self):
+        """Test changelog methods"""
+        spec_filepath = os.path.join(SPEC_DIR, 'gbp-test2.spec')
+        spec = SpecFile(spec_filepath)
+
+        # Read changelog
+        eq_(spec.get_changelog(),
+            "* Tue Feb 04 2014 Name <email> 1\n- My change\n\n\n")
+
+        # Set changelog and check again
+        new_text = "* Wed Feb 05 2014 Name <email> 2\n- New entry\n\n\n"
+        spec.set_changelog(new_text)
+        eq_(spec.get_changelog(), new_text)
+
     def test_quirks(self):
         """Test spec that is broken/has anomalities"""
         spec_filepath = os.path.join(SPEC_DIR, 'gbp-test-quirks.spec')
index dd9e2ec..8a92725 100644 (file)
@@ -18,6 +18,12 @@ VCS:        myoldvcstag
 %description
 Package for testing the RPM functionality of git-buildpackage.
 
+%package empty
+Summary:    Empty subpackage
+
+%description empty
+Empty subpackage for the %{name} test package.
+
 
 %prep
 %setup -T -n %{name}-%{version} -c -a 10
@@ -40,8 +46,15 @@ cp -R * %{buildroot}/%{_datadir}/%{name}
 install %{SOURCE0} %{buildroot}/%{_datadir}/%{name}
 
 
+%changelog
+* Tue Feb 04 2014 Name <email> 1
+- My change
+
 
 %files
 %defattr(-,root,root,-)
 %dir %{_datadir}/%{name}
 %{_datadir}/%{name}
+
+%files empty
+%defattr(-,root,root,-)
index 1cd922b..0fbe026 100644 (file)
@@ -42,3 +42,6 @@ install %{SOURCE0} %{buildroot}/%{_datadir}/%{name}
 %defattr(-,root,root,-)
 %dir %{_datadir}/%{name}
 %{_datadir}/%{name}
+%changelog
+* Wed Feb 05 2014 Name <email> 1
+- New entry
index dfd4b91..1882131 100644 (file)
@@ -17,6 +17,12 @@ Packager:   Markus Lehtonen <markus.lehtonen@linux.intel.com>
 %description
 Package for testing the RPM functionality of git-buildpackage.
 
+%package empty
+Summary:    Empty subpackage
+
+%description empty
+Empty subpackage for the %{name} test package.
+
 
 %prep
 %setup -T -n %{name}-%{version} -c -a 10
@@ -42,8 +48,14 @@ cp -R * %{buildroot}/%{_datadir}/%{name}
 install %{SOURCE0} %{buildroot}/%{_datadir}/%{name}
 
 
+%changelog
+* Wed Feb 05 2014 Name <email> 2
+- New entry
 
 %files
 %defattr(-,root,root,-)
 %dir %{_datadir}/%{name}
 %{_datadir}/%{name}
+
+%files empty
+%defattr(-,root,root,-)
index 0b93f0f..d41f450 100644 (file)
@@ -19,6 +19,12 @@ VCS:        myvcstag
 %description
 Package for testing the RPM functionality of git-buildpackage.
 
+%package empty
+Summary:    Empty subpackage
+
+%description empty
+Empty subpackage for the %{name} test package.
+
 
 %prep
 %setup -T -n %{name}-%{version} -c -a 10
@@ -48,8 +54,15 @@ cp -R * %{buildroot}/%{_datadir}/%{name}
 install %{SOURCE0} %{buildroot}/%{_datadir}/%{name}
 
 
+%changelog
+* Tue Feb 04 2014 Name <email> 1
+- My change
+
 
 %files
 %defattr(-,root,root,-)
 %dir %{_datadir}/%{name}
 %{_datadir}/%{name}
+
+%files empty
+%defattr(-,root,root,-)