From 9c1b7568336c13177ab479e8d684df4ffac335a1 Mon Sep 17 00:00:00 2001 From: Ondrej Nosek Date: Aug 23 2020 22:01:18 +0000 Subject: New layout for retired packages Fixes fail during execution operation over the already retired package or module. Test `is_retired` is run in the beginning, but the method was not reachable when the package was already retired - no layout was selected in this case and it left `self.layout` unset. A new layout was created. Also modifies related tests. When a package is retired, a directory contains only a marker and other tracked files are removed from git. There should not be any difference between retired DistGit or SRPM layouts. JIRA: RHELCMP-1967 Resolves: rhbz#1867822 Signed-off-by: Ondrej Nosek --- diff --git a/pyrpkg/layout/__init__.py b/pyrpkg/layout/__init__.py index bdb2a79..7a3370a 100644 --- a/pyrpkg/layout/__init__.py +++ b/pyrpkg/layout/__init__.py @@ -11,7 +11,7 @@ from pyrpkg.errors import LayoutError from .base import MetaLayout -from .layouts import DistGitLayout, SRPMLayout # noqa +from .layouts import DistGitLayout, RetiredLayout, SRPMLayout # noqa def build(path): diff --git a/pyrpkg/layout/base.py b/pyrpkg/layout/base.py index db30540..cc0cd33 100644 --- a/pyrpkg/layout/base.py +++ b/pyrpkg/layout/base.py @@ -75,7 +75,7 @@ class BaseLayout(ABC): This method's implementation is madatory and should return an instance of the object class. - It should return None if it can't read the path + It should raise an exception if it can't read the path or if the dir path contains an invalid layout. """ if not os.path.exists(path): diff --git a/pyrpkg/layout/layouts.py b/pyrpkg/layout/layouts.py index 96143b9..7324708 100644 --- a/pyrpkg/layout/layouts.py +++ b/pyrpkg/layout/layouts.py @@ -36,7 +36,7 @@ class DistGitLayout(BaseLayout): """ Creates a new object instance from a valid path in the file system. - Returns none if path or package structure is invalid. + Raises exception if path or package structure is invalid. """ super(DistGitLayout, cls).from_path(path) @@ -67,7 +67,7 @@ class SRPMLayout(BaseLayout): """ Creates a new object instance from a valid path in the file system. - Returns none if path or package structure is invalid. + Raises exception if path or package structure is invalid. """ super(SRPMLayout, cls).from_path(path) @@ -78,3 +78,28 @@ class SRPMLayout(BaseLayout): if len([f for f in os.listdir(path) if f.endswith('.metadata')]) == 0: raise LayoutError('metadata file not found.') return cls(root_dir=path) + + +class RetiredLayout(BaseLayout): + """ + This class represents situation that package or module is retired. + Directory contains just a marker. + """ + def __init__(self, root_dir=None): + """ + Default class constructor to create a new object instance. + """ + self.root_dir = root_dir + + @classmethod + def from_path(cls, path): + """ + Creates a new object instance from a valid path in the file system. + + Raises exception if no marker is found. + """ + super(RetiredLayout, cls).from_path(path) + + if not cls(root_dir=path).is_retired(): + raise LayoutError('Retired marker not found.') + return cls(root_dir=path) diff --git a/tests/fixtures/layouts/dead-module/foobar.spec b/tests/fixtures/layouts/dead-module/foobar.spec deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/dead-module/foobar.spec +++ /dev/null diff --git a/tests/fixtures/layouts/dead-package/foobar.spec b/tests/fixtures/layouts/dead-package/foobar.spec deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/dead-package/foobar.spec +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-module/.foobar.metadata b/tests/fixtures/layouts/srpm-dead-module/.foobar.metadata deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-module/.foobar.metadata +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-module/SOURCES/foobar-firstcommit.patch b/tests/fixtures/layouts/srpm-dead-module/SOURCES/foobar-firstcommit.patch deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-module/SOURCES/foobar-firstcommit.patch +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-module/SPECS/foobar.spec b/tests/fixtures/layouts/srpm-dead-module/SPECS/foobar.spec deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-module/SPECS/foobar.spec +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-module/dead.module b/tests/fixtures/layouts/srpm-dead-module/dead.module deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-module/dead.module +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/.foobar.metadata b/tests/fixtures/layouts/srpm-dead-package/.foobar.metadata deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/.foobar.metadata +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/SOURCES/foobar-firstcommit.patch b/tests/fixtures/layouts/srpm-dead-package/SOURCES/foobar-firstcommit.patch deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/SOURCES/foobar-firstcommit.patch +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/SPECS/foobar.spec b/tests/fixtures/layouts/srpm-dead-package/SPECS/foobar.spec deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/SPECS/foobar.spec +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/dead.package b/tests/fixtures/layouts/srpm-dead-package/dead.package deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/dead.package +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/srpm/.foobar.metadata b/tests/fixtures/layouts/srpm-dead-package/srpm/.foobar.metadata deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/srpm/.foobar.metadata +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/srpm/SOURCES/foobar-firstcommit.patch b/tests/fixtures/layouts/srpm-dead-package/srpm/SOURCES/foobar-firstcommit.patch deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/srpm/SOURCES/foobar-firstcommit.patch +++ /dev/null diff --git a/tests/fixtures/layouts/srpm-dead-package/srpm/SPECS/foobar.spec b/tests/fixtures/layouts/srpm-dead-package/srpm/SPECS/foobar.spec deleted file mode 100644 index e69de29..0000000 --- a/tests/fixtures/layouts/srpm-dead-package/srpm/SPECS/foobar.spec +++ /dev/null diff --git a/tests/test_layout_distgit.py b/tests/test_layout_distgit.py index a4c4944..32c8480 100644 --- a/tests/test_layout_distgit.py +++ b/tests/test_layout_distgit.py @@ -40,11 +40,3 @@ class DistGitLayoutErrorsTestCase(unittest.TestCase): with self.assertRaises(errors.LayoutError) as e: layouts.DistGitLayout.from_path(os.path.join(self.workdir, 'specless')) self.assertEqual('spec file not found.', e.exception.args[0]) - - def test_dead_module_error(self): - layout = layouts.DistGitLayout.from_path(os.path.join(self.workdir, 'dead-module')) - self.assertEqual('dead.module', layout.is_retired()) - - def test_dead_package_error(self): - layout = layouts.DistGitLayout.from_path(os.path.join(self.workdir, 'dead-package')) - self.assertEqual('dead.package', layout.is_retired()) diff --git a/tests/test_layout_retired.py b/tests/test_layout_retired.py new file mode 100644 index 0000000..a046769 --- /dev/null +++ b/tests/test_layout_retired.py @@ -0,0 +1,45 @@ +import os +import unittest + +from pyrpkg.layout import layouts +from pyrpkg import errors + + +fixtures_dir = os.path.join(os.path.dirname(__file__), 'fixtures') + + +class RetiredLayoutTestCase(unittest.TestCase): + def setUp(self): + self.workdir = os.path.join(fixtures_dir, 'layouts/dead-package') + self.layout = layouts.RetiredLayout.from_path(self.workdir) + + def test_layout_data(self): + self.assertEqual(self.layout.sourcedir, None) + self.assertEqual(self.layout.specdir, None) + self.assertEqual(self.layout.specdir, None) + self.assertEqual(self.layout.root_dir, self.workdir) + self.assertEqual(self.layout.builddir, None) + self.assertEqual(self.layout.rpmdir, None) + self.assertEqual(self.layout.srcrpmdir, None) + self.assertEqual(self.layout.sources_file_template, None) + + def test_layout_retired(self): + self.assertEqual('dead.package', self.layout.is_retired()) + + +class RetiredLayoutErrorsTestCase(unittest.TestCase): + def setUp(self): + self.workdir = os.path.join(fixtures_dir, 'layouts') + + def test_path_error(self): + with self.assertRaises(errors.LayoutError) as e: + layouts.RetiredLayout.from_path(os.path.join(self.workdir, 'notfound')) + self.assertEqual('package path does not exist', e.exception.args[0]) + + def test_dead_module_error(self): + layout = layouts.RetiredLayout.from_path(os.path.join(self.workdir, 'dead-module')) + self.assertEqual('dead.module', layout.is_retired()) + + def test_dead_package_error(self): + layout = layouts.RetiredLayout.from_path(os.path.join(self.workdir, 'dead-package')) + self.assertEqual('dead.package', layout.is_retired()) diff --git a/tests/test_layout_srpm.py b/tests/test_layout_srpm.py index 562406f..2311dd3 100644 --- a/tests/test_layout_srpm.py +++ b/tests/test_layout_srpm.py @@ -39,11 +39,3 @@ class SRPMLayoutErrorsTestCase(unittest.TestCase): with self.assertRaises(errors.LayoutError) as e: layouts.SRPMLayout.from_path(os.path.join(self.workdir, 'srpm-specless')) self.assertEqual('spec file not found.', e.exception.args[0]) - - def test_dead_module_error(self): - layout = layouts.SRPMLayout.from_path(os.path.join(self.workdir, 'srpm-dead-module')) - self.assertEqual('dead.module', layout.is_retired()) - - def test_dead_package_error(self): - layout = layouts.SRPMLayout.from_path(os.path.join(self.workdir, 'srpm-dead-package')) - self.assertEqual('dead.package', layout.is_retired())