diff options
| -rw-r--r-- | pym/gentoolkit/eshowkw/keywords_header.py | 78 | ||||
| -rw-r--r-- | pym/gentoolkit/profile.py | 92 | ||||
| -rw-r--r-- | pym/gentoolkit/test/test_profile.py | 49 |
3 files changed, 142 insertions, 77 deletions
diff --git a/pym/gentoolkit/eshowkw/keywords_header.py b/pym/gentoolkit/eshowkw/keywords_header.py index f98f11a..31261dc 100644 --- a/pym/gentoolkit/eshowkw/keywords_header.py +++ b/pym/gentoolkit/eshowkw/keywords_header.py @@ -6,87 +6,11 @@ from __future__ import print_function __all__ = ['keywords_header'] -import portage -import os -import sys -if sys.hexversion < 0x3000000: - from io import open -from portage import _encodings, _unicode_encode from portage import settings as ports from gentoolkit.eshowkw.display_pretty import colorize_string from gentoolkit.eshowkw.display_pretty import align_string +from gentoolkit.profile import load_profile_data -# Copied from ekeyword -def warning(msg): - """Write |msg| as a warning to stderr""" - print('warning: %s' % msg, file=sys.stderr) - - -# Copied from ekeyword, modified to support arch vs ~arch status -def load_profile_data(portdir=None, repo='gentoo'): - """Load the list of known arches from the tree - - Args: - portdir: The repository to load all data from (and ignore |repo|) - repo: Look up this repository by name to locate profile data - - Returns: - A dict mapping the keyword to its preferred state: - {'x86': ('stable', 'arch'), 'mips': ('dev', '~arch'), ...} - """ - if portdir is None: - portdir = portage.db[portage.root]['vartree'].settings.repositories[repo].location - - arch_status = {} - - try: - arch_list = os.path.join(portdir, 'profiles', 'arch.list') - with open(_unicode_encode(arch_list, encoding=_encodings['fs']), - encoding=_encodings['content']) as f: - for line in f: - line = line.split('#', 1)[0].strip() - if line: - arch_status[line] = None - except IOError: - pass - - try: - profile_status = { - 'stable': 0, - 'dev': 1, - 'exp': 2, - None: 3, - } - profiles_list = os.path.join(portdir, 'profiles', 'profiles.desc') - with open(_unicode_encode(profiles_list, encoding=_encodings['fs']), - encoding=_encodings['content']) as f: - for line in f: - line = line.split('#', 1)[0].split() - if line: - arch, _profile, status = line - arch_status.setdefault(arch, status) - curr_status = profile_status[arch_status[arch]] - new_status = profile_status[status] - if new_status < curr_status: - arch_status[arch] = status - except IOError: - pass - - if arch_status: - arch_status['all'] = None - else: - warning('could not read profile files: %s' % arch_list) - warning('will not be able to verify args are correct') - - # TODO: support arches.desc once the GLEP is finalized - # for now, we just hardcode ~mips + *-* (fbsd, prefix) - for k, v in arch_status.items(): - if k in ('alpha', 'mips', 'riscv') or '-' in k: - arch_status[k] = (v, '~arch') - else: - arch_status[k] = (v, 'arch') - - return arch_status def gen_arch_list(status): _arch_status = load_profile_data() diff --git a/pym/gentoolkit/profile.py b/pym/gentoolkit/profile.py new file mode 100644 index 0000000..945362d --- /dev/null +++ b/pym/gentoolkit/profile.py @@ -0,0 +1,92 @@ +#!/usr/bin/python +# Copyright 2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 +# +# Licensed under the GNU General Public License, v2 + +"""Routines to load profile information for ekeyword/eshowkw""" + +__all__ = ( + 'load_profile_data', +) + + +import os.path +import portage +import sys + +if sys.hexversion < 0x3000000: + from io import open + +from portage import _encodings, _unicode_encode + + +def warning(msg): + """Write |msg| as a warning to stderr""" + print('warning: %s' % msg, file=sys.stderr) + + +def load_profile_data(portdir=None, repo='gentoo'): + """Load the list of known arches from the tree + + Args: + portdir: The repository to load all data from (and ignore |repo|) + repo: Look up this repository by name to locate profile data + + Returns: + A dict mapping the keyword to its preferred state: + {'x86': ('stable', 'arch'), 'mips': ('dev', '~arch'), ...} + """ + if portdir is None: + portdir = portage.db[portage.root]['vartree'].settings.repositories[repo].location + + arch_status = {} + + try: + arch_list = os.path.join(portdir, 'profiles', 'arch.list') + with open(_unicode_encode(arch_list, encoding=_encodings['fs']), + encoding=_encodings['content']) as f: + for line in f: + line = line.split('#', 1)[0].strip() + if line: + arch_status[line] = None + except IOError: + pass + + try: + profile_status = { + 'stable': 0, + 'dev': 1, + 'exp': 2, + None: 3, + } + profiles_list = os.path.join(portdir, 'profiles', 'profiles.desc') + with open(_unicode_encode(profiles_list, encoding=_encodings['fs']), + encoding=_encodings['content']) as f: + for line in f: + line = line.split('#', 1)[0].split() + if line: + arch, _profile, status = line + arch_status.setdefault(arch, status) + curr_status = profile_status[arch_status[arch]] + new_status = profile_status[status] + if new_status < curr_status: + arch_status[arch] = status + except IOError: + pass + + if arch_status: + arch_status['all'] = None + else: + warning('could not read profile files: %s' % arch_list) + warning('will not be able to verify args are correct') + + # TODO: support arches.desc once the GLEP is finalized + # for now, we just hardcode ~mips + *-* (fbsd, prefix) + for k, v in arch_status.items(): + if k in ('alpha', 'mips', 'riscv') or '-' in k: + arch_status[k] = (v, '~arch') + else: + arch_status[k] = (v, 'arch') + + return arch_status diff --git a/pym/gentoolkit/test/test_profile.py b/pym/gentoolkit/test/test_profile.py new file mode 100644 index 0000000..038525d --- /dev/null +++ b/pym/gentoolkit/test/test_profile.py @@ -0,0 +1,49 @@ +#!/usr/bin/python +# Copyright 2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 +# +# Licensed under the GNU General Public License, v2 + +import os.path +import unittest + +from gentoolkit.profile import load_profile_data + + +TESTDIR = os.path.join(os.path.dirname(__file__), '../ekeyword/tests') + + +class TestLoadProfileData(unittest.TestCase): + """Tests for load_profile_data""" + + def _test(self, subdir): + portdir = os.path.join(TESTDIR, 'profiles', subdir) + return load_profile_data(portdir=portdir) + + def testLoadBoth(self): + """Test loading both arch.list and profiles.desc""" + ret = self._test('both') + self.assertIn('arm', ret) + self.assertEqual(ret['arm'], ('stable', 'arch')) + self.assertIn('arm64', ret) + self.assertEqual(ret['arm64'], ('exp', 'arch')) + + def testLoadArchOnly(self): + """Test loading only arch.list""" + ret = self._test('arch-only') + self.assertIn('arm', ret) + self.assertEqual(ret['arm'], (None, 'arch')) + self.assertIn('x86-solaris', ret) + + def testLoadProfilesOnly(self): + """Test loading only profiles.desc""" + ret = self._test('profiles-only') + self.assertIn('arm', ret) + self.assertEqual(ret['arm'], ('stable', 'arch')) + self.assertIn('arm64', ret) + self.assertEqual(ret['arm64'], ('exp', 'arch')) + + def testLoadNone(self): + """Test running when neither files exists""" + ret = self._test('none') + self.assertEqual(ret, {}) |
