Fill obsrepomaps when reading repos.yaml
authorEd Bartosh <eduard.bartosh@intel.com>
Fri, 28 Jun 2013 12:17:25 +0000 (15:17 +0300)
committerGerrit Code Review <gerrit2@otctools.jf.intel.com>
Mon, 1 Jul 2013 02:29:54 +0000 (19:29 -0700)
obsrepomaps is a mapping between OBS project name and repo name from
repos.yaml. This change implements filling mappings while parsing
repo.yaml in BackendDb::read_repos()

Fixes: #1031

Change-Id: I01efb4b1717e5971a83a1984dc2e3245244977d5
Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
common/backenddb.py
tests/test_backenddb.py

index 090e6d0..3c7c4af 100644 (file)
@@ -150,17 +150,30 @@ class BackendDB():
             raise BackendDBError("Error loading yaml: %s" % err)
 
         db_repos = self.get_repos()
-        db_list = db_repos.keys() # save set of repos before loading new repos
-        names = set([])
+        db_obsrepomap = self.get_obs_repo_map()
+
+        # save set of repos and mappings before loading new repos
+        db_list = db_repos.keys()
+        db_map_list = db_obsrepomap.keys()
+
+        names = set()
+        mapkeys = set()
         for repo in repos:
             name = repo.pop('Name')
             names.add(name)
             db_repos[name] = repo
 
-        # Cleanup entries, which are present in db_list,
-        # but don't present in names
+            mapkey = repo['Project']
+            mapkeys.add(mapkey)
+            db_obsrepomap[mapkey] = name
+
+        # Cleanup old entries from repos
         for name in db_list.difference(names):
             db_repos.delete(name)
+        # and from obsrepomaps
+        for mapping in db_map_list.difference(mapkeys):
+            db_obsrepomap.delete(mapping)
+
 
     def get_release_ids(self):
         """Return release id entity object."""
index 4e02f82..a7e77e4 100644 (file)
@@ -155,7 +155,35 @@ class BackendDBTest(unittest.TestCase):
         bdb = BackendDB()
         bdb.read_repos(REPOS)
         repos = bdb.get_repos()
+        maps = bdb.get_obs_repo_map()
         self.assertEqual(repos.keys(), set(['Repo1', 'Repo2', 'Repo3']))
+        self.assertEqual(maps.keys(), set(['Project:Repo1', 'Project:Repo2',
+                                           'Tizen:non-oss']))
+        self.assertEqual(maps['Project:Repo1'], 'Repo1')
+        self.assertEqual(maps['Project:Repo2'], 'Repo2')
+        self.assertEqual(maps['Tizen:non-oss'], 'Repo3')
+
+    def test_repos_cleanup(self):
+        """Set some repos and see if they'll be cleaned up by read_repos."""
+        bdb = BackendDB()
+        # Clean all repos and maps
+        repos = bdb.get_repos()
+        for repo in repos:
+            repos.delete(repo)
+        maps = bdb.get_obs_repo_map()
+        for mapping in maps:
+            maps.delete(mapping)
+        # check if they're cleaned
+        self.assertEqual(repos.keys(), set([]))
+        self.assertEqual(maps.keys(), set([]))
+        # set some junk repos and maps
+        repos['tobedeletedrepo'] = {'Architectures': []}
+        maps['tobedeletedobs'] =  'tobedeleletdrepo'
+        # read repos
+        bdb.read_repos(REPOS)
+        # check if junk repos and maps have been cleaned up
+        self.assertFalse('tobedeletedrepo' in repos)
+        self.assertFalse('tobedeletedobs' in maps)
 
     def test_reading_repos_from_fileobj(self):
         """Read repos from file object."""