From c94c01482fb6cdbe017d33ed0668bcb80ba06017 Mon Sep 17 00:00:00 2001 From: Mykyta Holubakha Date: Fri, 30 Jun 2017 04:49:25 +0300 Subject: Multiple changes and fixes for installation make package backend optional fix merge destination makedir properly add files to git index compare package slot with default the right way multiple fixes in writing metadata changed tests to reflect current code and pass --- pomu/cli.py | 5 +++-- pomu/package.py | 6 +++--- pomu/repo/repo.py | 35 +++++++++++++++++++---------------- pomu/source/file.py | 2 +- pomu/source/portage.py | 2 +- tests/test_dispatch.py | 47 +++++++++++++++++++++++++---------------------- tests/test_init.py | 6 +++++- 7 files changed, 57 insertions(+), 46 deletions(-) diff --git a/pomu/cli.py b/pomu/cli.py index 9a0b9bf..72cec9b 100644 --- a/pomu/cli.py +++ b/pomu/cli.py @@ -120,8 +120,9 @@ def show(package): print('Merged into repository', repo.name, 'at', repo.root) for f in pkg.files: print(' ', path.join(*f)) - print('Backend:', pkg.backend.__name__) - print('Backend detailes:', pkg.backend) + if pkg.backend: + print('Backend:', pkg.backend.__name__) + print('Backend detailes:', pkg.backend) def main_(): try: diff --git a/pomu/package.py b/pomu/package.py index 55ec994..7c9321e 100644 --- a/pomu/package.py +++ b/pomu/package.py @@ -14,7 +14,7 @@ from pomu.util.fs import strip_prefix from pomu.util.result import Result class Package(): - def __init__(self, backend, name, root, category=None, version=None, slot='0', d_path=None, files=None, filemap=None): + def __init__(self, name, root, backend=None, category=None, version=None, slot='0', d_path=None, files=None, filemap=None): """ Parameters: backend - specific source module object/class @@ -76,7 +76,7 @@ class Package(): wd, _ = path.split(trg) dest = path.join(dst, wd) try: - makedirs(wd, exists_ok=True) + makedirs(dest, exist_ok=True) copy2(src, dest) except PermissionError: return Result.Err('You do not have enough permissions') @@ -96,7 +96,7 @@ class Package(): stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=d) if ret.returncode != 0: - return Result.Err('Failed to generate manifest at', d) + return Result.Err('Failed to generate manifest at ' + d) if path.exists(path.join(d, 'Manifest')): res.append(path.join(d, 'Manifest')) return Result.Ok(res) diff --git a/pomu/repo/repo.py b/pomu/repo/repo.py index 11a5c2c..f41e0e4 100644 --- a/pomu/repo/repo.py +++ b/pomu/repo/repo.py @@ -1,5 +1,5 @@ """Subroutines with repositories""" -from os import path, rmdir +from os import path, rmdir, makedirs from git import Repo import portage @@ -33,20 +33,20 @@ class Repository(): """Merge a package (a pomu.package.Package package) into the repository""" r = self.repo pkgdir = path.join(self.pomu_dir, package.category, package.name) - if package.slot != 0: + if package.slot != '0': pkgdir = path.join(pkgdir, package.slot) package.merge_into(self.root).expect('Failed to merge package') for wd, f in package.files: - r.index.add(path.join(self.root, wd, f)) + r.index.add([path.join(wd, f)]) manifests = package.gen_manifests(self.root).expect() for m in manifests: - r.index.add(m) + r.index.add([m]) self.write_meta(pkgdir, package, manifests) with open(path.join(self.pomu_dir, 'world'), 'a+') as f: - f.write(package.category, '/', package.name) + f.write('{}/{}'.format(package.category, package.name)) f.write('\n' if package.slot == '0' else ':{}\n'.format(package.slot)) - r.index.add(path.join(self.pomu_dir, package.name)) - r.index.add(self.pomu_dir) + r.index.add([path.join(self.pomu_dir, package.category, package.name)]) + r.index.add([path.join(self.pomu_dir, 'world')]) r.index.commit('Merged package ' + package.name) return Result.Ok('Merged package ' + package.name + ' successfully') @@ -58,16 +58,17 @@ class Repository(): package - the package object manifests - list of generated manifest files """ - with open(path.join(pkgdir, 'FILES'), 'w') as f: - for w, f in package.files: - f.write('{}/{}\n'.format(w, f)) + makedirs(pkgdir, exist_ok=True) + with open(path.join(pkgdir, 'FILES'), 'w+') as f: + for wd, fil in package.files: + f.write('{}/{}\n'.format(wd, fil)) for m in manifests: f.write('{}\n'.format(strip_prefix(m, self.root))) if package.backend: - with open(path.join(pkgdir, 'BACKEND'), 'w') as f: + with open(path.join(pkgdir, 'BACKEND'), 'w+') as f: f.write('{}\n'.format(package.backend.__name__)) package.backend.write_meta(pkgdir) - with open(path.join(pkgdir, 'VERSION')) as f: + with open(path.join(pkgdir, 'VERSION'), 'w+') as f: f.write(package.version) def unmerge(self, package): @@ -97,14 +98,16 @@ class Repository(): pkgdir = path.join(self.pomu_dir, category, name) else: pkgdir = path.join(self.pomu_dir, category, name, slot) - with open(path.join(pkgdir, 'BACKEND'), 'r') as f: - bname = f.readline().strip() - backend = dispatcher.backends[bname].from_meta_dir(pkgdir) + backend = None + if path.exists(path.join(pkgdir, 'BACKEND')): + with open(path.join(pkgdir, 'BACKEND'), 'r') as f: + bname = f.readline().strip() + backend = dispatcher.backends[bname].from_meta_dir(pkgdir) with open(path.join(pkgdir, 'VERSION'), 'r') as f: version = f.readline().strip() with open(path.join(pkgdir, 'FILES'), 'r') as f: files = [x.strip() for x in f] - return Package(backend, name, self.root, category=category, version=version, slot=slot, files=files) + return Package(name, self.root, backend, category=category, version=version, slot=slot, files=files) def get_package(self, name, category=None, slot=None): """Get a package by name, category and slot""" diff --git a/pomu/source/file.py b/pomu/source/file.py index d3fc7ed..ffd7c07 100644 --- a/pomu/source/file.py +++ b/pomu/source/file.py @@ -22,7 +22,7 @@ class LocalEbuild(): self.path = path def fetch(self): - return Package(self, self.name, '/', self.category, self.version, + return Package(self.name, '/', self, self.category, self.version, filemap = { path.join( self.category, diff --git a/pomu/source/portage.py b/pomu/source/portage.py index e71f539..1dc740b 100644 --- a/pomu/source/portage.py +++ b/pomu/source/portage.py @@ -25,7 +25,7 @@ class PortagePackage(): self.slot = slot def fetch(self): - return Package(self, self.name, portage_repo_path(self.repo), + return Package(self.name, portage_repo_path(self.repo), self, category=self.category, version=self.version, slot=self.slot, files=[path.join(self.category, self.name, 'metadata.xml'), path.join(self.category, self.name, self.name + '-' + self.version + '.ebuild')]) diff --git a/tests/test_dispatch.py b/tests/test_dispatch.py index ebb450f..58d08fb 100644 --- a/tests/test_dispatch.py +++ b/tests/test_dispatch.py @@ -1,7 +1,7 @@ import shutil import unittest -from os import path +from os import path, makedirs from tempfile import mkdtemp from pomu.package import Package @@ -20,13 +20,15 @@ class DummySource(): @classmethod def fetch_package(cls, uri): - return Package(cls, 'test', cls.path) + return Package('test', cls.path, backend=cls, category='test') + class DispatcherTests(unittest.TestCase): def setUp(self): pomu_active_repo._drop() self.source_path = mkdtemp() - with open(path.join(self.source_path, 'test.ebuild'), 'w+') as f: + makedirs(path.join(self.source_path, 'test')) + with open(path.join(self.source_path, 'test', 'test.ebuild'), 'w+') as f: f.write('# Copytight 1999-2017\nAll Rights Reserved\nEAPI="0"\n') DummySource.path = self.source_path @@ -37,17 +39,18 @@ class DispatcherTests(unittest.TestCase): def testFetch(self): pkg = dispatcher.get_package('/test').unwrap() - self.assertEqual(pkg.files, [('', 'test.ebuild')]) + self.assertEqual(pkg.files, [('test', 'test.ebuild')]) def tearDown(self): shutil.rmtree(self.source_path) -""" + class InstallTests(unittest.TestCase): def setUp(self): pomu_active_repo._drop() self.source_path = mkdtemp() - with open(path.join(self.source_path, 'test.ebuild'), 'w+') as f: + makedirs(path.join(self.source_path, 'test')) + with open(path.join(self.source_path, 'test', 'test.ebuild'), 'w+') as f: f.write('# Copytight 1999-2017\nAll Rights Reserved\nEAPI="0"\n') DummySource.path = self.source_path @@ -60,24 +63,24 @@ class InstallTests(unittest.TestCase): shutil.rmtree(self.repo_dir) def testPkgCreate(self): - pkg = Package('test', self.source_path, files=['test.ebuild']) - self.assertEqual(pkg.files, [('', 'test.ebuild')]) - - def testPkgMerge(self): - pkg = Package('test', self.source_path) - self.repo.merge(pkg).expect() + pkg = Package('test', self.source_path, category='test', files=['test/test.ebuild']) + self.assertEqual(pkg.files, [('test', 'test.ebuild')]) def testPortagePkg(self): pkg = dispatcher.get_package('sys-apps/portage').expect() self.repo.merge(pkg).expect() - def testPkgUnmerge(self): - pkg = Package('test', self.source_path) - self.repo.merge(pkg).expect() - with self.subTest(i=0): - self.repo.unmerge(pkg).expect() - with self.subTest(i=1): - self.repo.remove_package('test').expect() - with self.subTest(i=2): - self.repo.remove_package('tset').expect_err() -""" +# TODO: convert to LocalEbuildFile backend +# def testPkgMerge(self): +# pkg = Package('test', self.source_path, category='test') +# self.repo.merge(pkg).expect() +# +# def testPkgUnmerge(self): +# pkg = Package('test', self.source_path, category='test') +# self.repo.merge(pkg).expect() +# with self.subTest(i=0): +# self.repo.unmerge(pkg).expect() +# with self.subTest(i=1): +# self.repo.remove_package('test').expect() +# with self.subTest(i=2): +# self.repo.remove_package('tset').expect_err() diff --git a/tests/test_init.py b/tests/test_init.py index 0c68324..bece6f9 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -30,7 +30,6 @@ class PlainRepoInitialization(unittest.TestCase): class PortageRepoInitialization(unittest.TestCase): def setUp(self): - pomu_active_repo._drop() os.environ['EROOT'] = REPO_PATH os.environ['ROOT'] = REPO_PATH os.environ['PORTAGE_CONFIGROOT'] = REPO_PATH @@ -42,6 +41,11 @@ class PortageRepoInitialization(unittest.TestCase): self.REPO_DIR = REPO_DIR def tearDown(self): + pomu_active_repo._drop() + del os.environ['EROOT'] + del os.environ['ROOT'] + del os.environ['PORTAGE_CONFIGROOT'] + importlib.reload(portage) rmtree(REPO_PATH) def testRepoList(self): -- cgit v1.2.3-65-gdbad