[gentoo-commits] proj/pkgcore/pkgdev:main commit in: tests/scripts/, src/pkgdev/scripts/

2024-06-02 Thread Arthur Zamarin
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/

2024-05-17 Thread Arthur Zamarin
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/

2023-12-15 Thread Arthur Zamarin
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/

2023-08-24 Thread Arthur Zamarin
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/

2022-10-16 Thread Arthur Zamarin
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/

2022-10-14 Thread Arthur Zamarin
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):