diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 7dcce7c..d727cd0 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -5,6 +5,11 @@ Release Notes ============= +0.6.0 +----- + +* **New:** Filter ``pkgcheck`` results by keyword or message. + 0.5.0 ----- diff --git a/find_work/__main__.py b/find_work/__main__.py index d2f488b..84d4795 100644 --- a/find_work/__main__.py +++ b/find_work/__main__.py @@ -84,15 +84,22 @@ def pgo(options: Options) -> None: @cli.group(aliases=["chk", "c"], cls=ClickAliasedGroup) +@click.option("-M", "--message", metavar="LIST", + help="Warning message to search for.") +@click.option("-k", "--keywords", metavar="LIST", + help="Keywords to scan for.") @click.option("-r", "--repo", metavar="REPO", required=True, help="Repository name or absolute path.") @click.pass_obj -def pkgcheck(options: Options, repo: str) -> None: +def pkgcheck(options: Options, message: str | None, keywords: str | None, + repo: str) -> None: """ Use pkgcheck to find work. """ options.cache_key.feed("pkgcheck") options.pkgcheck.repo = repo + options.pkgcheck.keywords = (keywords or "").split(",") + options.pkgcheck.message = message or "" for key in options.pkgcheck.cache_order: options.cache_key.feed_option(key, options.pkgcheck[key]) diff --git a/find_work/cache.py b/find_work/cache.py index 5149741..d556af0 100644 --- a/find_work/cache.py +++ b/find_work/cache.py @@ -31,12 +31,14 @@ class CacheKey: True >>> key.feed_option("flag", True) True + >>> key.feed_option("keywords", ["wow", "amazing"]) + True >>> bytes(key) - b'bytes\\x00string\\x00count:42\\x00flag:1\\x00' - >>> key.feed([1, 2, 3]) + b'bytes\\x00string\\x00count:42\\x00flag:1\\x00keywords:amazing\\x19wow\\x00' + >>> key.feed({1, 2, 3}) Traceback (most recent call last): ... - TypeError: Unsupported type: list + TypeError: Unsupported type: set """ data: bytes = b"" @@ -52,6 +54,8 @@ class CacheKey: return value case str(): return value.encode() + case list(): + return b"\31".join(map(cls._encode, sorted(value))) case bool(): return b"1" if value else b"0" case int(): @@ -62,7 +66,7 @@ class CacheKey: @classmethod def _feedable(cls, value: Any) -> bool: match value: - case bytes() | str(): + case bytes() | str() | list(): return bool(value) case bool() | int(): return True diff --git a/find_work/cli/__init__.py b/find_work/cli/__init__.py index e204737..d10cc21 100644 --- a/find_work/cli/__init__.py +++ b/find_work/cli/__init__.py @@ -101,9 +101,15 @@ class PkgcheckOptions(ModuleOptionsBase): # Repository name or absolute path. repo: str = "" + # Class of the pkgcheck warning, e.g. DeprecatedEapi + keywords: list[str] = field(default_factory=list) + + # Message of the pkgcheck warning, e.g. 'uses deprecated EAPI 5' + message: str = "" + @cached_property def cache_order(self) -> list[str]: - return ["repo"] + return ["repo", "keywords", "message"] @dataclass diff --git a/find_work/cli/pkgcheck.py b/find_work/cli/pkgcheck.py index 8f6e45f..4733c6c 100644 --- a/find_work/cli/pkgcheck.py +++ b/find_work/cli/pkgcheck.py @@ -10,7 +10,6 @@ import pkgcheck from sortedcontainers import SortedDict, SortedSet from find_work.cli import Message, Options, ProgressDots -from find_work.constants import PKGCHECK_MIN_PACKAGE_SCOPE def _do_scan(options: Options) -> SortedDict[str, SortedSet]: @@ -20,12 +19,16 @@ def _do_scan(options: Options) -> SortedDict[str, SortedSet]: repo_obj = pm.repositories[options.pkgcheck.repo] cli_opts = [ - "-r", options.pkgcheck.repo, - "-f", "latest", # TODO: become version-aware + "--repo", options.pkgcheck.repo, + "--scope", "pkg,ver", + "--filter", "latest", # TODO: become version-aware ] + if options.pkgcheck.keywords: + cli_opts += ["--keywords", ",".join(options.pkgcheck.keywords)] + data: SortedDict[str, SortedSet] = SortedDict() for result in pkgcheck.scan(cli_opts): - if result.scope.level < PKGCHECK_MIN_PACKAGE_SCOPE: + if options.pkgcheck.message not in result.desc: continue package = "/".join([result.category, result.package]) diff --git a/find_work/constants.py b/find_work/constants.py index 5c83db2..d322bb6 100644 --- a/find_work/constants.py +++ b/find_work/constants.py @@ -30,6 +30,3 @@ PGO_BASE_URL = "https://packages.gentoo.org" # Gentoo Packages API location. PGO_API_URL = f"{PGO_BASE_URL}/api/graphql/" - -# Scope level for `pkgcheck.base.package_scope`. -PKGCHECK_MIN_PACKAGE_SCOPE = 3 diff --git a/man/find-work.1 b/man/find-work.1 index c171160..e3f5fef 100644 --- a/man/find-work.1 +++ b/man/find-work.1 @@ -93,6 +93,8 @@ Find stabilization candidates. .It Xo .Cm pkgcheck .Fl r Ar repo +.Op Fl M Ar text +.Op Fl k Ar keyword .Ar command .Xc .Dl Pq alias: Cm chk , Cm c @@ -109,8 +111,14 @@ The options for .Cm find-work pkgcheck are as follows: .Bl -tag -width Ds +.It Fl M Ar text , Fl -message Ar text +Message of the pkgcheck warning, e.g. +.Qq uses deprecated EAPI 5 . +.It Fl k Ar keyword , Fl -keywords Ar keyword +Comma-separated list of pkgcheck keywords, e.g. DeprecatedEapi. .It Fl r Ar repo , Fl -repo Ar repo Repository name or absolute path. +This option is required. .El . .It Xo @@ -139,13 +147,13 @@ This option is required. Some examples for Gentoo include: .Bl -bullet -compact -width 1n .It -.Ql gentoo +.Qq gentoo .It -.Ql gentoo_ovl_guru +.Qq gentoo_ovl_guru .It -.Ql gentoo_ovl_pentoo +.Qq gentoo_ovl_pentoo .It -.Ql gentoo_ovl_science +.Qq gentoo_ovl_science .El .El .El