[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/
commit: d37395418f44d5716a24d9cc84f8bf2d8bc084bb Author: Arthur Zamarin gentoo org> AuthorDate: Sun Jun 2 19:18:05 2024 + Commit: Arthur Zamarin gentoo org> CommitDate: Sun Jun 2 19:18:05 2024 + URL: https://gitweb.gentoo.org/proj/pkgcore/pkgdev.git/commit/?id=d3739541 mask: fix test & improve error messages Resolves: https://github.com/pkgcore/pkgdev/issues/188 Signed-off-by: Arthur Zamarin gentoo.org> src/pkgdev/scripts/pkgdev_mask.py | 7 ++- tests/scripts/test_pkgdev_mask.py | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pkgdev/scripts/pkgdev_mask.py b/src/pkgdev/scripts/pkgdev_mask.py index 1d614a0..450c52c 100644 --- a/src/pkgdev/scripts/pkgdev_mask.py +++ b/src/pkgdev/scripts/pkgdev_mask.py @@ -101,7 +101,12 @@ def _mask_validate(parser, namespace): atoms = set() maintainers = set() -namespace.bugs = list(map(int, dict.fromkeys(namespace.bugs))) +try: +namespace.bugs = list(map(int, dict.fromkeys(namespace.bugs))) +except ValueError: +parser.error("argument -b/--bug: invalid integer value") +if min(namespace.bugs, default=1) < 1: +parser.error("argument -b/--bug: must be >= 1") if not namespace.rites and namespace.file_bug: mask.error("bug filing requires last rites") diff --git a/tests/scripts/test_pkgdev_mask.py b/tests/scripts/test_pkgdev_mask.py index 8366ced..63d1e53 100644 --- a/tests/scripts/test_pkgdev_mask.py +++ b/tests/scripts/test_pkgdev_mask.py @@ -337,6 +337,7 @@ class TestPkgdevMask: for bug_nums, expected in [ (["42"], "Bug #42."), (["42", "43"], "Bugs #42, #43."), +(["42,43", "43"], "Bugs #42, #43."), ]: args = [] for bug_num in bug_nums: @@ -361,7 +362,7 @@ class TestPkgdevMask: def test_mask_bug_bad(self, capsys, tool): for arg, expected in [("-1", "must be >= 1"), ("foo", "invalid integer value")]: -with pytest.raises(SystemExit): +with pytest.raises(SystemExit), chdir(pjoin(self.repo.path)): tool.parse_args(["mask", "--bug", arg]) out, err = capsys.readouterr() assert err.strip() == f"pkgdev mask: error: argument -b/--bug: {expected}"
[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/
commit: ecbda90d2d0dba4d65dd2f95e347cbc4152107e2 Author: Arthur Zamarin gentoo org> AuthorDate: Fri May 17 10:21:37 2024 + Commit: Arthur Zamarin gentoo org> CommitDate: Fri May 17 10:21:37 2024 + URL: https://gitweb.gentoo.org/proj/pkgcore/pkgdev.git/commit/?id=ecbda90d mask: update removal line to match GLEP-84 Signed-off-by: Arthur Zamarin gentoo.org> src/pkgdev/scripts/pkgdev_mask.py | 2 +- tests/scripts/test_pkgdev_mask.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pkgdev/scripts/pkgdev_mask.py b/src/pkgdev/scripts/pkgdev_mask.py index 858c590..4ce2984 100644 --- a/src/pkgdev/scripts/pkgdev_mask.py +++ b/src/pkgdev/scripts/pkgdev_mask.py @@ -213,7 +213,7 @@ def get_comment(bugs, rites: int): tmp = tempfile.NamedTemporaryFile(mode="w") summary = [] if rites: -summary.append(f"Removal: {datetime.now(timezone.utc) + timedelta(days=rites):%Y-%m-%d}.") +summary.append(f"Removal on {datetime.now(timezone.utc) + timedelta(days=rites):%Y-%m-%d}.") if bugs: # Bug(s) #A, #B, #C bug_list = ", ".join(f"#{b}" for b in bugs) diff --git a/tests/scripts/test_pkgdev_mask.py b/tests/scripts/test_pkgdev_mask.py index d723535..8366ced 100644 --- a/tests/scripts/test_pkgdev_mask.py +++ b/tests/scripts/test_pkgdev_mask.py @@ -294,7 +294,7 @@ class TestPkgdevMask: f"""\ # First Last ({today}) # mask comment -# Removal: {removal}. +# Removal on {removal}. cat/pkg """ )
[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/
commit: 290143b24bab7ccc2f083395e13bd188132b54be Author: Arthur Zamarin gentoo org> AuthorDate: Fri Dec 15 11:20:49 2023 + Commit: Arthur Zamarin gentoo org> CommitDate: Fri Dec 15 11:20:49 2023 + URL: https://gitweb.gentoo.org/proj/pkgcore/pkgdev.git/commit/?id=290143b2 bugs: mention age of packages in the bug description Resolves: https://github.com/pkgcore/pkgdev/issues/140 Signed-off-by: Arthur Zamarin gentoo.org> src/pkgdev/scripts/pkgdev_bugs.py | 28 tests/scripts/test_pkgdev_bugs.py | 6 +++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/pkgdev/scripts/pkgdev_bugs.py b/src/pkgdev/scripts/pkgdev_bugs.py index e6cac18..924e9e4 100644 --- a/src/pkgdev/scripts/pkgdev_bugs.py +++ b/src/pkgdev/scripts/pkgdev_bugs.py @@ -5,6 +5,7 @@ import json import sys import urllib.request as urllib from collections import defaultdict +from datetime import datetime from functools import partial from itertools import chain from pathlib import Path @@ -13,6 +14,7 @@ from urllib.parse import urlencode from pkgcheck import const as pkgcheck_const from pkgcheck.addons import ArchesAddon, init_addon from pkgcheck.addons.profiles import ProfileAddon +from pkgcheck.addons.git import GitAddon, GitModifiedRepo from pkgcheck.checks import visibility from pkgcheck.scripts import argparse_actions from pkgcore.ebuild.atom import atom @@ -113,6 +115,7 @@ bugs_state.add_argument( ) ArchesAddon.mangle_argparser(bugs) +GitAddon.mangle_argparser(bugs) ProfileAddon.mangle_argparser(bugs) @@ -199,13 +202,18 @@ class GraphNode: keywords.add("*") def file_bug( -self, api_key: str, auto_cc_arches: frozenset[str], block_bugs: list[int], observer=None +self, +api_key: str, +auto_cc_arches: frozenset[str], +block_bugs: list[int], +modified_repo: multiplex.tree, +observer=None, ) -> int: if self.bugno is not None: return self.bugno for dep in self.edges: if dep.bugno is None: -dep.file_bug(api_key, auto_cc_arches, (), observer) +dep.file_bug(api_key, auto_cc_arches, (), modified_repo, observer) maintainers = dict.fromkeys( maintainer.email for pkg, _ in self.pkgs for maintainer in pkg.maintainers ) @@ -219,6 +227,17 @@ class GraphNode: if len(summary) > 90 and len(self.pkgs) > 1: summary = f"{self.pkgs[0][0].versioned_atom.cpvstr} and friends: stablereq" +description = ["Please stabilize", ""] +if modified_repo is not None: +for pkg, _ in self.pkgs: +with contextlib.suppress(StopIteration): +match = next(modified_repo.itermatch(pkg.versioned_atom)) +added = datetime.fromtimestamp(match.time) +days_old = (datetime.today() - added).days +description.append( +f" {pkg.versioned_atom.cpvstr}: no change for {days_old} days, since {added:%Y-%m-%d}" +) + request_data = dict( Bugzilla_api_key=api_key, product="Gentoo Linux", @@ -226,7 +245,7 @@ class GraphNode: severity="enhancement", version="unspecified", summary=summary, -description="Please stabilize", +description="\n".join(description).strip(), keywords=keywords, cf_stabilisation_atoms="\n".join(self.lines()), assigned_to=maintainers[0], @@ -505,8 +524,9 @@ class DependencyGraph: ) self.out.flush() +modified_repo = init_addon(GitAddon, self.options).cached_repo(GitModifiedRepo) for node in self.starting_nodes: -node.file_bug(api_key, auto_cc_arches, block_bugs, observe) +node.file_bug(api_key, auto_cc_arches, block_bugs, modified_repo, observe) def _load_from_stdin(out: Formatter, err: Formatter): diff --git a/tests/scripts/test_pkgdev_bugs.py b/tests/scripts/test_pkgdev_bugs.py index e020ffd..641e5f0 100644 --- a/tests/scripts/test_pkgdev_bugs.py +++ b/tests/scripts/test_pkgdev_bugs.py @@ -68,7 +68,7 @@ class TestBugFiling: session = BugsSession() pkg = max(repo.itermatch(atom("=cat/u-0"))) with patch("pkgdev.scripts.pkgdev_bugs.urllib.urlopen", session): -bugs.GraphNode(((pkg, {"*"}),)).file_bug("API", frozenset(), ()) +bugs.GraphNode(((pkg, {"*"}),)).file_bug("API", frozenset(), (), None) assert len(session.calls) == 1 call = session.calls[0] assert call["Bugzilla_api_key"] == "API" @@ -83,7 +83,7 @@ class TestBugFiling: session = BugsSession() pkg = max(repo.itermatch(atom("=cat/z-0"))) with patch("pkgdev.scripts.pkgdev_bugs.urllib.urlopen", session): -bugs.GraphNode(((pkg,
[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/
commit: 047ac2bdcfe019107b13646825818a0bc5339b9d Author: Arthur Zamarin gentoo org> AuthorDate: Thu Aug 24 17:25:48 2023 + Commit: Arthur Zamarin gentoo org> CommitDate: Thu Aug 24 17:48:51 2023 + URL: https://gitweb.gentoo.org/proj/pkgcore/pkgdev.git/commit/?id=047ac2bd push: `--ask` stops for confirmation on warnings Resolves: https://github.com/pkgcore/pkgdev/issues/150 Signed-off-by: Arthur Zamarin gentoo.org> src/pkgdev/scripts/pkgdev_push.py | 9 - tests/scripts/test_pkgdev_push.py | 23 +++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/pkgdev/scripts/pkgdev_push.py b/src/pkgdev/scripts/pkgdev_push.py index 7948336..cf510ab 100644 --- a/src/pkgdev/scripts/pkgdev_push.py +++ b/src/pkgdev/scripts/pkgdev_push.py @@ -2,6 +2,7 @@ import argparse import shlex from pkgcheck import reporters, scan +from pkgcheck.results import Warning as PkgcheckWarning from snakeoil.cli import arghparse from snakeoil.cli.input import userquery @@ -58,9 +59,12 @@ def _push(options, out, err): # scan commits for QA issues pipe = scan(options.scan_args) +has_warnings = False with reporters.FancyReporter(out) as reporter: for result in pipe: reporter.report(result) +if result.level == PkgcheckWarning.level: +has_warnings = True # fail on errors unless they're ignored if pipe.errors: @@ -68,7 +72,10 @@ def _push(options, out, err): out.write(out.bold, out.fg("red"), "\nFAILURES", out.reset) for result in sorted(pipe.errors): reporter.report(result) -if not (options.ask and userquery("Push commits anyway?", out, err)): +if not (options.ask and userquery("Push commits anyway?", out, err, default_answer=False)): +return 1 +elif has_warnings and options.ask: +if not userquery("warnings detected, push commits anyway?", out, err, default_answer=False): return 1 # push commits upstream diff --git a/tests/scripts/test_pkgdev_push.py b/tests/scripts/test_pkgdev_push.py index f1f0a0b..fb4faa3 100644 --- a/tests/scripts/test_pkgdev_push.py +++ b/tests/scripts/test_pkgdev_push.py @@ -124,3 +124,26 @@ class TestPkgdevPush: ), pytest.raises(SystemExit) as excinfo, chdir(self.child_git_repo.path): self.script() assert excinfo.value.code == 0 + +def test_warnings(self, capsys): +pkgdir = os.path.dirname(self.child_repo.create_ebuild("cat/pkg-1")) +os.makedirs((filesdir := pjoin(pkgdir, "files")), exist_ok=True) +with open(pjoin(filesdir, "foo"), "w") as f: +f.write("") +self.child_git_repo.add_all("cat/pkg-1") + +# scans with warnings ask for confirmation before pushing with "--ask" +with patch("sys.argv", self.args + ["--ask"]), patch( +"sys.stdin", StringIO("n\n") +), pytest.raises(SystemExit) as excinfo, chdir(self.child_git_repo.path): +self.script() +assert excinfo.value.code == 1 +out, err = capsys.readouterr() +assert "EmptyFile" in out + +# but without "--ask" it still pushes +with patch("sys.argv", self.args), pytest.raises(SystemExit) as excinfo, chdir( +self.child_git_repo.path +): +self.script() +assert excinfo.value.code == 0
[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/
commit: 729947acaa9bb071936c4d68fa1dfe86628f2d26 Author: Arthur Zamarin gentoo org> AuthorDate: Sun Oct 16 17:27:36 2022 + Commit: Arthur Zamarin gentoo org> CommitDate: Sun Oct 16 17:27:36 2022 + URL: https://gitweb.gentoo.org/proj/pkgcore/pkgdev.git/commit/?id=729947ac commit: don't show disable for targets that are no-op For PYTHON_COMPAT, LUA_COMPAT and USE_RUBY, show the "disable" target after "enable" only if this target exists. For example, if I enable py3.11 and disable py3.7 (which is no-op), it will show only "enable py3.11". If there is no "enable", it will still show "disable py3.7". Signed-off-by: Arthur Zamarin gentoo.org> src/pkgdev/scripts/pkgdev_commit.py | 10 +++--- tests/scripts/test_pkgdev_commit.py | 23 +++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/pkgdev/scripts/pkgdev_commit.py b/src/pkgdev/scripts/pkgdev_commit.py index 20fd471..0cdf232 100644 --- a/src/pkgdev/scripts/pkgdev_commit.py +++ b/src/pkgdev/scripts/pkgdev_commit.py @@ -443,6 +443,7 @@ class PkgSummary(ChangeSummary): watch_vars = {'HOMEPAGE', 'DESCRIPTION', 'LICENSE', 'SRC_URI'} array_targets = {'PYTHON_COMPAT', 'LUA_COMPAT'} string_targets = {'USE_RUBY'} +use_expand_mapping = {'PYTHON_COMPAT': 'python_targets', 'LUA_COMPAT': 'lua_targets', 'USE_RUBY': 'ruby_targets'} targets = array_targets | string_targets updated_vars = drop.keys() & add.keys() @@ -450,9 +451,11 @@ class PkgSummary(ChangeSummary): return f"update {', '.join(updated)}" elif (target := targets & updated_vars) and len(target) == 1: target = next(iter(target)) +py_re = lambda x: re.sub(r'^python(\d+)_(\d+)$', r'py\1.\2', x) +use_expand = {py_re(use[len(target)+2:]) +for use, _ in self.repo.use_expand_desc[use_expand_mapping[target]]} if target in array_targets: array_re = re.compile(r'\[\d+\]="(?P.+?)"') -py_re = lambda x: re.sub(r'^python(\d+)_(\d+)$', r'py\1.\2', x) old = {py_re(m.group('val')) for m in re.finditer(array_re, drop[target])} new = {py_re(m.group('val')) for m in re.finditer(array_re, add[target])} else: @@ -462,8 +465,9 @@ class PkgSummary(ChangeSummary): msg = [] if added := sorted(new - old): msg.append(f"enable {', '.join(added)}") -if dropped := sorted(old - new): -msg.append(f"disable {', '.join(dropped)}") +if dropped := old - new: +if not msg or (dropped := dropped.intersection(use_expand)): +msg.append(f"disable {', '.join(sorted(dropped))}") msg = ' and '.join(msg) if len(msg) <= 50: return msg diff --git a/tests/scripts/test_pkgdev_commit.py b/tests/scripts/test_pkgdev_commit.py index f920054..efc9491 100644 --- a/tests/scripts/test_pkgdev_commit.py +++ b/tests/scripts/test_pkgdev_commit.py @@ -479,6 +479,9 @@ class TestPkgdevCommit: assert commit() == 'cat/pkg: update DESCRIPTION, HOMEPAGE' # update string_targets (USE_RUBY) +os.mkdir(pjoin(repo.location, 'profiles', 'desc')) +with open(pjoin(repo.path, 'profiles', 'desc', 'ruby_targets.desc'), 'w') as file: +file.write('\n'.join(f'ruby{ver} - stub' for ver in range(27, 40))) repo.create_ebuild('cat/pkg-8', use_ruby='ruby27') git_repo.add_all('cat/pkg-8') repo.create_ebuild('cat/pkg-8', use_ruby='ruby27 ruby30') @@ -489,12 +492,16 @@ class TestPkgdevCommit: assert commit() == 'cat/pkg: update USE_RUBY support' # update array_targets (PYTHON_COMPAT) -repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_9 )') +with open(pjoin(repo.path, 'profiles', 'desc', 'python_targets.desc'), 'w') as file: +file.write('\n'.join(f'python3_{ver} - stub' for ver in (10, 11))) +repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_8 python3_9 )') git_repo.add_all('cat/pkg-9') -repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_{9..10} )') +repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_{8..10} )') assert commit() == 'cat/pkg: enable py3.10' -repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_10 )') -assert commit() == 'cat/pkg: disable py3.9' +repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_{9..10} )') +assert commit() == 'cat/pkg: disable py3.8' +repo.create_ebuild('cat/pkg-9', data='PYTHON_COMPAT=( python3_{10..11}
[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/
commit: 6cf5a11fc6ff12af7c62e13329694f3c22a5e32d Author: Arthur Zamarin gentoo org> AuthorDate: Fri Oct 14 19:21:07 2022 + Commit: Arthur Zamarin gentoo org> CommitDate: Fri Oct 14 19:34:13 2022 + URL: https://gitweb.gentoo.org/proj/pkgcore/pkgdev.git/commit/?id=6cf5a11f manifest: better handling of path target When passing a `.` path while inside a package directory, it passed to path restrict generator as a simple path, which resulted in broken restrict which collected all ebuilds in the repository. By using `os.path.relpath` to base of repository, we make sure the correct path is passed and the correct restricts are generated. Fixes: https://github.com/pkgcore/pkgdev/issues/85 Signed-off-by: Arthur Zamarin gentoo.org> src/pkgdev/scripts/pkgdev_manifest.py | 2 ++ tests/scripts/test_pkgdev_manifest.py | 32 2 files changed, 34 insertions(+) diff --git a/src/pkgdev/scripts/pkgdev_manifest.py b/src/pkgdev/scripts/pkgdev_manifest.py index de36fcc..229238c 100644 --- a/src/pkgdev/scripts/pkgdev_manifest.py +++ b/src/pkgdev/scripts/pkgdev_manifest.py @@ -66,6 +66,8 @@ def _restrict_targets(repo, targets): for target in targets: if os.path.exists(target): try: +if target in repo: +target = os.path.relpath(target, repo.location) restrictions.append(repo.path_restrict(target)) except ValueError as exc: manifest.error(exc) diff --git a/tests/scripts/test_pkgdev_manifest.py b/tests/scripts/test_pkgdev_manifest.py index 0c1c8c8..2800236 100644 --- a/tests/scripts/test_pkgdev_manifest.py +++ b/tests/scripts/test_pkgdev_manifest.py @@ -24,6 +24,38 @@ class TestPkgdevManifestParseArgs: matches = [x.cpvstr for x in repo.itermatch(options.restriction)] assert matches == ['cat/pkg-0'] +def test_repo_relative_pkg(self, repo, capsys, tool): +repo.create_ebuild('cat/pkg-0') +repo.create_ebuild('cat/newpkg-0') +with chdir(pjoin(repo.location, 'cat/pkg')): +options, _ = tool.parse_args(['manifest', '.']) +matches = [x.cpvstr for x in repo.itermatch(options.restriction)] +assert matches == ['cat/pkg-0'] + +def test_repo_relative_category(self, repo, capsys, tool): +repo.create_ebuild('cat/pkg-0') +repo.create_ebuild('cat/newpkg-0') + +with chdir(pjoin(repo.location, 'cat')): +options, _ = tool.parse_args(['manifest', 'pkg']) +matches = [x.cpvstr for x in repo.itermatch(options.restriction)] +assert matches == ['cat/pkg-0'] + +with chdir(pjoin(repo.location, 'cat')): +options, _ = tool.parse_args(['manifest', '.']) +matches = [x.cpvstr for x in repo.itermatch(options.restriction)] +assert set(matches) == {'cat/pkg-0', 'cat/newpkg-0'} + +def test_repo_relative_outside(self, tmp_path, repo, capsys, tool): +repo.create_ebuild('cat/pkg-0') +(ebuild := tmp_path / 'pkg.ebuild').touch() +with pytest.raises(SystemExit) as excinfo: +with chdir(repo.location): +tool.parse_args(['manifest', str(ebuild)]) +assert excinfo.value.code == 2 +out, err = capsys.readouterr() +assert err.strip() == f"pkgdev manifest: error: {repo.repo_id!r} repo doesn't contain: {str(ebuild)!r}" + def test_dir_target(self, repo, capsys, tool): repo.create_ebuild('cat/pkg-0') with chdir(repo.location):