Blob Blame History Raw
diff --git a/rel-eng/packages/subscription-manager b/rel-eng/packages/subscription-manager
index f9393db..69983e3 100644
--- a/rel-eng/packages/subscription-manager
+++ b/rel-eng/packages/subscription-manager
@@ -1 +1 @@
-1.10.14-8 ./
+1.10.14-9 ./
diff --git a/src/subscription_manager/repolib.py b/src/subscription_manager/repolib.py
index fa0913d..6afdfc8 100644
--- a/src/subscription_manager/repolib.py
+++ b/src/subscription_manager/repolib.py
@@ -15,7 +15,7 @@
 # in this software or its documentation.
 #

-from iniparse import ConfigParser
+from iniparse import RawConfigParser as ConfigParser
 import logging
 import os
 import string
@@ -542,16 +542,36 @@ class RepoFile(ConfigParser):
     def read(self):
         ConfigParser.read(self, self.path)

+    def _configparsers_equal(self, otherparser):
+        if set(otherparser.sections()) != set(self.sections()):
+            return False
+
+        for section in self.sections():
+            # Sometimes we end up with ints, but values must be strings to compare
+            current_items = dict([(str(k), str(v)) for (k, v) in self.items(section)])
+            if current_items != dict(otherparser.items(section)):
+                return False
+        return True
+
+    def _has_changed(self):
+        '''
+        Check if the version on disk is different from what we have loaded
+        '''
+        on_disk = ConfigParser()
+        on_disk.read(self.path)
+        return not self._configparsers_equal(on_disk)
+
     def write(self):
         if not self.manage_repos:
             log.debug("Skipping write due to manage_repos setting: %s" %
                     self.path)
             return
-        f = open(self.path, 'w')
-        tidy_writer = TidyWriter(f)
-        ConfigParser.write(self, tidy_writer)
-        tidy_writer.close()
-        f.close()
+        if self._has_changed():
+            f = open(self.path, 'w')
+            tidy_writer = TidyWriter(f)
+            ConfigParser.write(self, tidy_writer)
+            tidy_writer.close()
+            f.close()

     def add(self, repo):
         self.add_section(repo.id)
diff --git a/subscription-manager.spec b/subscription-manager.spec
index 04a660d..cf294c7 100644
--- a/subscription-manager.spec
+++ b/subscription-manager.spec
@@ -14,7 +14,7 @@

 Name: subscription-manager
 Version: 1.10.14
-Release: 8%{?dist}
+Release: 9%{?dist}
 Summary: Tools and libraries for subscription and repository management
 Group:   System Environment/Base
 License: GPLv2
@@ -419,6 +419,9 @@ fi
 %endif

 %changelog
+* Wed Jun 04 2014 ckozak <ckozak@redhat.com> 1.10.14-9
+- 1104777: Don't rewrite redhat.repo unless it has changed (ckozak@redhat.com)
+
 * Tue May 27 2014 ckozak <ckozak@redhat.com> 1.10.14-8
 - 1098891: Update repos, persisting local settings when possible
   (ckozak@redhat.com)
diff --git a/test/test_repolib.py b/test/test_repolib.py
index 72505a3..cde217a 100644
--- a/test/test_repolib.py
+++ b/test/test_repolib.py
@@ -15,6 +15,7 @@

 import unittest

+from iniparse import RawConfigParser
 from mock import Mock, patch
 from StringIO import StringIO

@@ -23,7 +24,8 @@ from stubs import StubCertificateDirectory, StubProductCertificate, \
         StubProduct, StubEntitlementCertificate, StubContent, \
         StubProductDirectory, StubUEP, StubConsumerIdentity
 import subscription_manager.injection as inj
-from subscription_manager.repolib import Repo, UpdateAction, TidyWriter
+from subscription_manager.repolib import Repo, UpdateAction, \
+        TidyWriter, RepoFile
 from subscription_manager import repolib


@@ -478,3 +480,61 @@ class TidyWriterTests(unittest.TestCase):
         tidy_writer.close()

         self.assertEquals("test stuff\n\ntest\n", output.getvalue())
+
+
+class RepoFileTest(unittest.TestCase):
+
+    @patch("subscription_manager.repolib.RepoFile.create")
+    @patch("subscription_manager.repolib.TidyWriter")
+    def test_configparsers_equal(self, tidy_writer, stub_create):
+        rf = RepoFile()
+        other = RawConfigParser()
+        for parser in [rf, other]:
+            parser.add_section('test')
+            parser.set('test', 'key', 'val')
+        self.assertTrue(rf._configparsers_equal(other))
+
+    @patch("subscription_manager.repolib.RepoFile.create")
+    @patch("subscription_manager.repolib.TidyWriter")
+    def test_configparsers_diff_sections(self, tidy_writer, stub_create):
+        rf = RepoFile()
+        rf.add_section('new_section')
+        other = RawConfigParser()
+        for parser in [rf, other]:
+            parser.add_section('test')
+            parser.set('test', 'key', 'val')
+        self.assertFalse(rf._configparsers_equal(other))
+
+    @patch("subscription_manager.repolib.RepoFile.create")
+    @patch("subscription_manager.repolib.TidyWriter")
+    def test_configparsers_diff_item_val(self, tidy_writer, stub_create):
+        rf = RepoFile()
+        other = RawConfigParser()
+        for parser in [rf, other]:
+            parser.add_section('test')
+            parser.set('test', 'key', 'val')
+        rf.set('test', 'key', 'val2')
+        self.assertFalse(rf._configparsers_equal(other))
+
+    @patch("subscription_manager.repolib.RepoFile.create")
+    @patch("subscription_manager.repolib.TidyWriter")
+    def test_configparsers_diff_items(self, tidy_writer, stub_create):
+        rf = RepoFile()
+        other = RawConfigParser()
+        for parser in [rf, other]:
+            parser.add_section('test')
+            parser.set('test', 'key', 'val')
+        rf.set('test', 'somekey', 'val')
+        self.assertFalse(rf._configparsers_equal(other))
+
+    @patch("subscription_manager.repolib.RepoFile.create")
+    @patch("subscription_manager.repolib.TidyWriter")
+    def test_configparsers_equal_int(self, tidy_writer, stub_create):
+        rf = RepoFile()
+        other = RawConfigParser()
+        for parser in [rf, other]:
+            parser.add_section('test')
+            parser.set('test', 'key', 'val')
+        rf.set('test', 'k', 1)
+        other.set('test', 'k', '1')
+        self.assertTrue(rf._configparsers_equal(other))