From 9f514a32d68791bea66e6bfdc3f58f06b95d9db0 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Sun, 8 Feb 2026 05:08:33 -0500 Subject: [PATCH 01/17] [portage] Start of stubs --- stubs/portage/@tests/stubtest_allowlist.txt | 19 +++++++ stubs/portage/METADATA.toml | 5 ++ stubs/portage/portage/__init__.pyi | 17 ++++++ stubs/portage/portage/dbapi/__init__.pyi | 49 +++++++++++++++++ stubs/portage/portage/dbapi/porttree.pyi | 11 ++++ stubs/portage/portage/package/__init__.pyi | 0 .../portage/package/ebuild/__init__.pyi | 0 .../portage/portage/package/ebuild/config.pyi | 24 +++++++++ .../portage/package/ebuild/doebuild.pyi | 53 +++++++++++++++++++ stubs/portage/portage/versions.pyi | 44 +++++++++++++++ 10 files changed, 222 insertions(+) create mode 100644 stubs/portage/@tests/stubtest_allowlist.txt create mode 100644 stubs/portage/METADATA.toml create mode 100644 stubs/portage/portage/__init__.pyi create mode 100644 stubs/portage/portage/dbapi/__init__.pyi create mode 100644 stubs/portage/portage/dbapi/porttree.pyi create mode 100644 stubs/portage/portage/package/__init__.pyi create mode 100644 stubs/portage/portage/package/ebuild/__init__.pyi create mode 100644 stubs/portage/portage/package/ebuild/config.pyi create mode 100644 stubs/portage/portage/package/ebuild/doebuild.pyi create mode 100644 stubs/portage/portage/versions.pyi diff --git a/stubs/portage/@tests/stubtest_allowlist.txt b/stubs/portage/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..7b6030f2e00f --- /dev/null +++ b/stubs/portage/@tests/stubtest_allowlist.txt @@ -0,0 +1,19 @@ +portage.tests.* +portage.(VERSION|abssymlink|archlist|auxdbkeys|bsd_chflags|create_trees|eapi_is_supported|endversion|endversion_keys|getcwd|getpid|groups|lchown|load_mod|mtimedbfile|ostype|pickle_write|pkglines|portage_gid|portage_uid|portageexit|prelink_capable|profiledir|secpass|selinux|selinux_enabled|thirdpartymirrors|uid|userland|userpriv_groups|utf8_mode|wheelgid) +portage.(binpkg|checksum|const|cvstree|data|debug|dispatch_conf|eapi|eclass_cache|exception|getbinpkg|glsa|gpg|gpkg|installation|localization|locks|mail|manifest|metadata|module|news|output|process|progress|update|xpak) +portage.(binrepo|cache|dep|elog|emaint|env|proxy|repository|sync|util|xml)(..*)? +portage._compat_upgrade..* +portage._emirrordist..* +portage._sets..* +portage.dbapi.(DummyTree|IndexedPortdb|IndexedVardb|bintree|cpv_expand|dep_expand|vartree|virtual) +portage.dbapi.__all__ +portage.dbapi.dbapi..* +portage.dbapi.porttree..* +portage.package.ebuild.(deprecated_profile_check|digestcheck|digestgen|fetch|getmaskingreason|getmaskingstatus|prepare_build_dirs|profile_iuse) +portage.package.ebuild._config..* +portage.package.ebuild._ipc..* +portage.package.ebuild._parallel_manifest..* +portage.package.ebuild.config..* +portage.package.ebuild.doebuild..* +portage.versions.(best|catsplit|cpv_getkey|cpv_getversion|cpv_sort_key|pkgcmp|pkgsplit|ververify) +portage.versions.__all__ diff --git a/stubs/portage/METADATA.toml b/stubs/portage/METADATA.toml new file mode 100644 index 000000000000..42899c7e5c08 --- /dev/null +++ b/stubs/portage/METADATA.toml @@ -0,0 +1,5 @@ +version = "3.0.*" +upstream_repository = "https://gitweb.gentoo.org/proj/portage.git" + +[tool.stubtest] +ci_platforms = ["linux"] diff --git a/stubs/portage/portage/__init__.pyi b/stubs/portage/portage/__init__.pyi new file mode 100644 index 000000000000..79111e0f69c5 --- /dev/null +++ b/stubs/portage/portage/__init__.pyi @@ -0,0 +1,17 @@ +from collections.abc import Mapping +from typing import Any, TypedDict, type_check_only + +from .dbapi import dbapi +from .dbapi.porttree import portagetree +from .package.ebuild.config import config +from .package.ebuild.doebuild import doebuild + +@type_check_only +class DBRootDict(TypedDict): + bintree: Any + porttree: portagetree + virtuals: Any + +db: Mapping[str, DBRootDict] +root: str +settings: config diff --git a/stubs/portage/portage/dbapi/__init__.pyi b/stubs/portage/portage/dbapi/__init__.pyi new file mode 100644 index 000000000000..5be1f8c5d70c --- /dev/null +++ b/stubs/portage/portage/dbapi/__init__.pyi @@ -0,0 +1,49 @@ +from typing import Literal + +class dbapi: + def aux_get( + self, + mycpv: str, + mylist: list[ + Literal[ + "DEFINED_PHASES", + "DEPEND", + "EAPI", + "HDEPEND", + "HOMEPAGE", + "INHERITED", + "IUSE", + "KEYWORDS", + "LICENSE", + "PDEPEND", + "PROPERTIES", + "PROVIDE", + "RDEPEND", + "REQUIRED_USE", + "repository", + "RESTRICT", + "SRC_URI", + "SLOT", + ] + ], + mytree: str | None = ..., + myrepo: str | None = ..., + ) -> list[str]: ... + def xmatch( + self, + level: Literal[ + "bestmatch-visible", + "match-all-cpv-only", + "match-all", + "match-visible", + "minimum-all", + "minimum-visible", + "minimum-all-ignore-profile", + ], + origdep: str, + ) -> list[str] | str: ... + def findname(self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ...) -> str: ... + def findname2( + self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ... + ) -> tuple[None, Literal[0]] | tuple[str, str] | tuple[str, None]: ... + def match(self, mydep: str, use_cache: Literal[0, 1] = ...) -> list[str] | str: ... diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi new file mode 100644 index 000000000000..7fb352d06e4f --- /dev/null +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -0,0 +1,11 @@ +from collections.abc import Sequence + +from portage.dbapi import dbapi + +class portdbapi(dbapi): + def getFetchMap( + self, mypkg: str, useflags: Sequence[str] | None = ..., mytree: str | None = ... + ) -> dict[str, tuple[str, ...]]: ... + +class portagetree: + dbapi: portdbapi diff --git a/stubs/portage/portage/package/__init__.pyi b/stubs/portage/portage/package/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/portage/portage/package/ebuild/__init__.pyi b/stubs/portage/portage/package/ebuild/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/portage/portage/package/ebuild/config.pyi b/stubs/portage/portage/package/ebuild/config.pyi new file mode 100644 index 000000000000..d7acba7b1230 --- /dev/null +++ b/stubs/portage/portage/package/ebuild/config.pyi @@ -0,0 +1,24 @@ +from typing import Any + +class config: + def __init__( + self, + clone: config | None = ..., + mycpv: str | None = ..., + config_profile_path: str | None = ..., + config_incrementals: dict[str, str] | None = ..., + config_root: str | None = ..., + target_root: str | None = ..., + sysroot: str | None = ..., + eprefix: str | None = ..., + local_config: bool = True, + env: dict[str, str] | None = ..., + _unmatched_removal: bool = ..., + repositories: list[str] | None = ..., + ) -> None: ... + def __getitem__(self, key: str) -> str: ... + def __setitem__(self, key: str, value: str) -> None: ... + def __delitem__(self, key: str) -> None: ... + def __iter__(self) -> str: ... + def get(self, k: str, x: Any = ...) -> Any: ... + def __len__(self) -> int: ... diff --git a/stubs/portage/portage/package/ebuild/doebuild.pyi b/stubs/portage/portage/package/ebuild/doebuild.pyi new file mode 100644 index 000000000000..5c6f37f32727 --- /dev/null +++ b/stubs/portage/portage/package/ebuild/doebuild.pyi @@ -0,0 +1,53 @@ +from typing import Any, Literal + +from portage.dbapi.porttree import portdbapi +from .config import config + +def doebuild( + myebuild: str, + mydo: Literal[ + "clean", + "cleanrm", + "compile", + "config", + "configure", + "depend", + "digest", + "fetch", + "fetchall", + "help", + "info", + "install", + "instprep", + "manifest", + "merge", + "nofetch", + "package", + "postinst", + "postrm", + "preinst", + "prepare", + "prerm", + "pretend", + "qmerge", + "rpm", + "setup", + "test", + "unmerge", + "unpack", + ], + settings: config | None = ..., + debug: Literal[0, 1] = ..., + listonly: Literal[0, 1] = ..., + fetchonly: Literal[0, 1] = ..., + cleanup: Literal[0, 1] = ..., + use_cache: Literal[0, 1] = ..., + fetchall: Literal[0, 1] = ..., + tree: Literal["vartree", "porttree", "bintree"] = ..., + mydbapi: portdbapi | None = ..., + vartree: Any = ..., + prev_mtimes: dict[str, Any] | None = ..., + fd_pipes: dict[str, str] | None = ..., + returnproc: int | bool = ..., +) -> Literal[0, 1] | bool | list[int]: # Missing portage.process.MultiprocessingProcess + ... diff --git a/stubs/portage/portage/versions.pyi b/stubs/portage/portage/versions.pyi new file mode 100644 index 000000000000..caeec5507f2b --- /dev/null +++ b/stubs/portage/portage/versions.pyi @@ -0,0 +1,44 @@ +from typing import Any, Literal +from typing_extensions import Self + +def vercmp(ver1: str, ver2: str, silent: Literal[0, 1] = ...) -> int | None: ... + +class _pkg_str(str): + @property + def stable(self) -> bool: ... + def __new__( + cls, + cpv: str, + metadata: dict[str, Any] | None = ..., + settings: Any = ..., + eapi: Any = ..., + repo: str | None = ..., + slot: str | None = ..., + build_time: int | None = ..., + build_id: str | None = ..., + file_size: int | None = ..., + mtime: int | None = ..., + db: Any = ..., + repoconfig: Any = ..., + ) -> Self: ... + def __init__( + self, + cpv: str, + metadata: dict[str, Any] | None = ..., + settings: Any = ..., + eapi: Any = ..., + repo: str | None = ..., + slot: str | None = ..., + build_time: int | None = ..., + build_id: str | None = ..., + file_size: int | None = ..., + mtime: int | None = ..., + db: Any = ..., + repoconfig: Any = ..., + ) -> None: ... + @staticmethod + def _long(var: Any, default: int) -> int: ... + +def catpkgsplit( + mydata: str | _pkg_str, silent: Literal[0, 1] = ..., eapi: str | None = ... +) -> tuple[str | None, str, str, str] | None: ... From 1982232fd11cd07922f93bc73a017a2abb47b839 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Feb 2026 10:17:35 +0000 Subject: [PATCH 02/17] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/portage/portage/__init__.pyi | 2 -- stubs/portage/portage/package/ebuild/doebuild.pyi | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/stubs/portage/portage/__init__.pyi b/stubs/portage/portage/__init__.pyi index 79111e0f69c5..1f34f5f1ad57 100644 --- a/stubs/portage/portage/__init__.pyi +++ b/stubs/portage/portage/__init__.pyi @@ -1,10 +1,8 @@ from collections.abc import Mapping from typing import Any, TypedDict, type_check_only -from .dbapi import dbapi from .dbapi.porttree import portagetree from .package.ebuild.config import config -from .package.ebuild.doebuild import doebuild @type_check_only class DBRootDict(TypedDict): diff --git a/stubs/portage/portage/package/ebuild/doebuild.pyi b/stubs/portage/portage/package/ebuild/doebuild.pyi index 5c6f37f32727..3c62b90371b6 100644 --- a/stubs/portage/portage/package/ebuild/doebuild.pyi +++ b/stubs/portage/portage/package/ebuild/doebuild.pyi @@ -1,6 +1,7 @@ from typing import Any, Literal from portage.dbapi.porttree import portdbapi + from .config import config def doebuild( From d5c1f029dc8414c7602d2548908d2e1bf2401e8d Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:00:54 -0400 Subject: [PATCH 03/17] [portage] mark as partial, make stub-only type private --- stubs/portage/@tests/stubtest_allowlist.txt | 19 ------------------- stubs/portage/METADATA.toml | 3 ++- stubs/portage/portage/__init__.pyi | 4 ++-- 3 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 stubs/portage/@tests/stubtest_allowlist.txt diff --git a/stubs/portage/@tests/stubtest_allowlist.txt b/stubs/portage/@tests/stubtest_allowlist.txt deleted file mode 100644 index 7b6030f2e00f..000000000000 --- a/stubs/portage/@tests/stubtest_allowlist.txt +++ /dev/null @@ -1,19 +0,0 @@ -portage.tests.* -portage.(VERSION|abssymlink|archlist|auxdbkeys|bsd_chflags|create_trees|eapi_is_supported|endversion|endversion_keys|getcwd|getpid|groups|lchown|load_mod|mtimedbfile|ostype|pickle_write|pkglines|portage_gid|portage_uid|portageexit|prelink_capable|profiledir|secpass|selinux|selinux_enabled|thirdpartymirrors|uid|userland|userpriv_groups|utf8_mode|wheelgid) -portage.(binpkg|checksum|const|cvstree|data|debug|dispatch_conf|eapi|eclass_cache|exception|getbinpkg|glsa|gpg|gpkg|installation|localization|locks|mail|manifest|metadata|module|news|output|process|progress|update|xpak) -portage.(binrepo|cache|dep|elog|emaint|env|proxy|repository|sync|util|xml)(..*)? -portage._compat_upgrade..* -portage._emirrordist..* -portage._sets..* -portage.dbapi.(DummyTree|IndexedPortdb|IndexedVardb|bintree|cpv_expand|dep_expand|vartree|virtual) -portage.dbapi.__all__ -portage.dbapi.dbapi..* -portage.dbapi.porttree..* -portage.package.ebuild.(deprecated_profile_check|digestcheck|digestgen|fetch|getmaskingreason|getmaskingstatus|prepare_build_dirs|profile_iuse) -portage.package.ebuild._config..* -portage.package.ebuild._ipc..* -portage.package.ebuild._parallel_manifest..* -portage.package.ebuild.config..* -portage.package.ebuild.doebuild..* -portage.versions.(best|catsplit|cpv_getkey|cpv_getversion|cpv_sort_key|pkgcmp|pkgsplit|ververify) -portage.versions.__all__ diff --git a/stubs/portage/METADATA.toml b/stubs/portage/METADATA.toml index 42899c7e5c08..edd71bda5ed6 100644 --- a/stubs/portage/METADATA.toml +++ b/stubs/portage/METADATA.toml @@ -1,5 +1,6 @@ version = "3.0.*" upstream_repository = "https://gitweb.gentoo.org/proj/portage.git" +partial_stub = true [tool.stubtest] -ci_platforms = ["linux"] +ignore_missing_stub = true diff --git a/stubs/portage/portage/__init__.pyi b/stubs/portage/portage/__init__.pyi index 1f34f5f1ad57..3c316af6e30d 100644 --- a/stubs/portage/portage/__init__.pyi +++ b/stubs/portage/portage/__init__.pyi @@ -5,11 +5,11 @@ from .dbapi.porttree import portagetree from .package.ebuild.config import config @type_check_only -class DBRootDict(TypedDict): +class _DBRootDict(TypedDict): bintree: Any porttree: portagetree virtuals: Any -db: Mapping[str, DBRootDict] +db: Mapping[str, _DBRootDict] root: str settings: config From b9a07aecbba5fad8c24e08b2cdb085e2ba281de5 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:10:39 -0400 Subject: [PATCH 04/17] [portage] fix stubtest_allowlist --- stubs/portage/@tests/stubtest_allowlist.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 stubs/portage/@tests/stubtest_allowlist.txt diff --git a/stubs/portage/@tests/stubtest_allowlist.txt b/stubs/portage/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..23db6e10471a --- /dev/null +++ b/stubs/portage/@tests/stubtest_allowlist.txt @@ -0,0 +1,6 @@ +portage.dbapi.dbapi.aux_get +portage.dbapi.dbapi.match +portage.dbapi.porttree.portagetree.__init__ +portage.dbapi.porttree.portdbapi.__init__ +portage.dbapi.porttree.portdbapi.xmatch +portage.package.ebuild.doebuild.doebuild From 5f37280460cc7478aa1686a6e4f2d59e00617854 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:20:53 -0400 Subject: [PATCH 05/17] [portage] fix method locations --- stubs/portage/portage/dbapi/__init__.pyi | 17 ----------------- stubs/portage/portage/dbapi/porttree.pyi | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/stubs/portage/portage/dbapi/__init__.pyi b/stubs/portage/portage/dbapi/__init__.pyi index 5be1f8c5d70c..16077026e510 100644 --- a/stubs/portage/portage/dbapi/__init__.pyi +++ b/stubs/portage/portage/dbapi/__init__.pyi @@ -29,21 +29,4 @@ class dbapi: mytree: str | None = ..., myrepo: str | None = ..., ) -> list[str]: ... - def xmatch( - self, - level: Literal[ - "bestmatch-visible", - "match-all-cpv-only", - "match-all", - "match-visible", - "minimum-all", - "minimum-visible", - "minimum-all-ignore-profile", - ], - origdep: str, - ) -> list[str] | str: ... - def findname(self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ...) -> str: ... - def findname2( - self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ... - ) -> tuple[None, Literal[0]] | tuple[str, str] | tuple[str, None]: ... def match(self, mydep: str, use_cache: Literal[0, 1] = ...) -> list[str] | str: ... diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi index 7fb352d06e4f..e1646a07bbc3 100644 --- a/stubs/portage/portage/dbapi/porttree.pyi +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -6,6 +6,23 @@ class portdbapi(dbapi): def getFetchMap( self, mypkg: str, useflags: Sequence[str] | None = ..., mytree: str | None = ... ) -> dict[str, tuple[str, ...]]: ... + def xmatch( + self, + level: Literal[ + "bestmatch-visible", + "match-all-cpv-only", + "match-all", + "match-visible", + "minimum-all", + "minimum-visible", + "minimum-all-ignore-profile", + ], + origdep: str, + ) -> list[str] | str: ... + def findname(self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ...) -> str: ... + def findname2( + self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ... + ) -> tuple[None, Literal[0]] | tuple[str, str] | tuple[str, None]: ... class portagetree: dbapi: portdbapi From f9ea290a0bb85e298877136bdfa2844d3048c86d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:21:59 +0000 Subject: [PATCH 06/17] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/portage/portage/dbapi/porttree.pyi | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi index e1646a07bbc3..275c976f9b7c 100644 --- a/stubs/portage/portage/dbapi/porttree.pyi +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -9,13 +9,13 @@ class portdbapi(dbapi): def xmatch( self, level: Literal[ - "bestmatch-visible", - "match-all-cpv-only", - "match-all", - "match-visible", - "minimum-all", - "minimum-visible", - "minimum-all-ignore-profile", + bestmatch - visible, + match - all - cpv - only, + match - all, + match - visible, + minimum - all, + minimum - visible, + minimum - all - ignore - profile, ], origdep: str, ) -> list[str] | str: ... From 7f5f27e3b76639dbf06c5d2e8db56183d781d535 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:22:37 -0400 Subject: [PATCH 07/17] [portage] config: remove non-existent method --- stubs/portage/portage/package/ebuild/config.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stubs/portage/portage/package/ebuild/config.pyi b/stubs/portage/portage/package/ebuild/config.pyi index d7acba7b1230..405158019154 100644 --- a/stubs/portage/portage/package/ebuild/config.pyi +++ b/stubs/portage/portage/package/ebuild/config.pyi @@ -21,4 +21,3 @@ class config: def __delitem__(self, key: str) -> None: ... def __iter__(self) -> str: ... def get(self, k: str, x: Any = ...) -> Any: ... - def __len__(self) -> int: ... From 598e45253bbaa40ac60b9bad474ee94824c66792 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:23:46 -0400 Subject: [PATCH 08/17] [portage] add missing import --- stubs/portage/portage/dbapi/porttree.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi index 275c976f9b7c..0888f16fd04a 100644 --- a/stubs/portage/portage/dbapi/porttree.pyi +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -1,4 +1,5 @@ from collections.abc import Sequence +from typing import Literal from portage.dbapi import dbapi From b40d18b778267392dfa3a75e3de31b4bc29bf8c5 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:26:37 -0400 Subject: [PATCH 09/17] [portage] fix copied literal content --- stubs/portage/portage/dbapi/porttree.pyi | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi index 0888f16fd04a..152ec1079fe4 100644 --- a/stubs/portage/portage/dbapi/porttree.pyi +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -10,13 +10,13 @@ class portdbapi(dbapi): def xmatch( self, level: Literal[ - bestmatch - visible, - match - all - cpv - only, - match - all, - match - visible, - minimum - all, - minimum - visible, - minimum - all - ignore - profile, + "bestmatch-visible", + "match-all-cpv-only", + "match-all", + "match-visible", + "minimum-all", + "minimum-visible", + "minimum-all-ignore-profile", ], origdep: str, ) -> list[str] | str: ... From 38dd002eb1c66c576776be108c9a9b488e79d4ab Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 08:34:30 -0400 Subject: [PATCH 10/17] [portage] add __getaddr__ to root to mark incomplete --- stubs/portage/portage/__init__.pyi | 2 ++ stubs/portage/portage/dbapi/__init__.pyi | 2 ++ 2 files changed, 4 insertions(+) diff --git a/stubs/portage/portage/__init__.pyi b/stubs/portage/portage/__init__.pyi index 3c316af6e30d..5243415955e5 100644 --- a/stubs/portage/portage/__init__.pyi +++ b/stubs/portage/portage/__init__.pyi @@ -13,3 +13,5 @@ class _DBRootDict(TypedDict): db: Mapping[str, _DBRootDict] root: str settings: config + +def __getattr__(name: str): ... # incomplete module diff --git a/stubs/portage/portage/dbapi/__init__.pyi b/stubs/portage/portage/dbapi/__init__.pyi index 16077026e510..f4d06bfacd65 100644 --- a/stubs/portage/portage/dbapi/__init__.pyi +++ b/stubs/portage/portage/dbapi/__init__.pyi @@ -30,3 +30,5 @@ class dbapi: myrepo: str | None = ..., ) -> list[str]: ... def match(self, mydep: str, use_cache: Literal[0, 1] = ...) -> list[str] | str: ... + +def __getattr__(name: str): ... # incomplete module From 7b67e8fac445cdea53c5e25168f29473dfb82410 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 09:16:48 -0400 Subject: [PATCH 11/17] [portage] QA fixes --- stubs/portage/METADATA.toml | 2 +- stubs/portage/portage/__init__.pyi | 10 ++++--- stubs/portage/portage/dbapi/__init__.pyi | 5 ++-- .../portage/portage/package/ebuild/config.pyi | 18 ++++++++++-- .../portage/package/ebuild/doebuild.pyi | 21 ++++++++------ stubs/portage/portage/versions.pyi | 28 +++++++++++-------- 6 files changed, 54 insertions(+), 30 deletions(-) diff --git a/stubs/portage/METADATA.toml b/stubs/portage/METADATA.toml index edd71bda5ed6..b1b1a39d58d8 100644 --- a/stubs/portage/METADATA.toml +++ b/stubs/portage/METADATA.toml @@ -1,5 +1,5 @@ version = "3.0.*" -upstream_repository = "https://gitweb.gentoo.org/proj/portage.git" +upstream_repository = "https://github.com/gentoo/portage" partial_stub = true [tool.stubtest] diff --git a/stubs/portage/portage/__init__.pyi b/stubs/portage/portage/__init__.pyi index 5243415955e5..1cc7e00fc12f 100644 --- a/stubs/portage/portage/__init__.pyi +++ b/stubs/portage/portage/__init__.pyi @@ -1,17 +1,19 @@ +from _typeshed import Incomplete from collections.abc import Mapping -from typing import Any, TypedDict, type_check_only +from typing import TypedDict, type_check_only from .dbapi.porttree import portagetree from .package.ebuild.config import config @type_check_only class _DBRootDict(TypedDict): - bintree: Any + bintree: Incomplete porttree: portagetree - virtuals: Any + vartree: Incomplete + virtuals: dict[str, Incomplete] db: Mapping[str, _DBRootDict] root: str settings: config -def __getattr__(name: str): ... # incomplete module +def __getattr__(name: str) -> Incomplete: ... # incomplete module diff --git a/stubs/portage/portage/dbapi/__init__.pyi b/stubs/portage/portage/dbapi/__init__.pyi index f4d06bfacd65..fa06ce0472fd 100644 --- a/stubs/portage/portage/dbapi/__init__.pyi +++ b/stubs/portage/portage/dbapi/__init__.pyi @@ -1,3 +1,4 @@ +from _typeshed import Incomplete from typing import Literal class dbapi: @@ -29,6 +30,6 @@ class dbapi: mytree: str | None = ..., myrepo: str | None = ..., ) -> list[str]: ... - def match(self, mydep: str, use_cache: Literal[0, 1] = ...) -> list[str] | str: ... + def match(self, mydep: str, use_cache: Literal[0, 1] = 1) -> list[str] | str: ... -def __getattr__(name: str): ... # incomplete module +def __getattr__(name: str) -> Incomplete: ... # incomplete module diff --git a/stubs/portage/portage/package/ebuild/config.pyi b/stubs/portage/portage/package/ebuild/config.pyi index 405158019154..66985b1a8838 100644 --- a/stubs/portage/portage/package/ebuild/config.pyi +++ b/stubs/portage/portage/package/ebuild/config.pyi @@ -1,4 +1,5 @@ -from typing import Any +from collections.abc import Hashable, Mapping +from typing import Literal, TypeVar class config: def __init__( @@ -20,4 +21,17 @@ class config: def __setitem__(self, key: str, value: str) -> None: ... def __delitem__(self, key: str) -> None: ... def __iter__(self) -> str: ... - def get(self, k: str, x: Any = ...) -> Any: ... + def get(self, k: str, x=...): ... + +_K = TypeVar("_K") +_V = TypeVar("_V") + +def best_from_dict( + key: Hashable, + top_dict: Mapping[_K, _V], + key_order, + EmptyOnError: Literal[0, 1] = 1, + FullCopy: Literal[0, 1] = 1, + AllowEmpty: Literal[0, 1] = 1, +) -> Literal[""] | dict[_K, _V]: ... +def autouse(myvartree, use_cache: Literal[0, 1] = 1, mysettings: config | None = None) -> Literal[""]: ... diff --git a/stubs/portage/portage/package/ebuild/doebuild.pyi b/stubs/portage/portage/package/ebuild/doebuild.pyi index 3c62b90371b6..ed1821fd0b61 100644 --- a/stubs/portage/portage/package/ebuild/doebuild.pyi +++ b/stubs/portage/portage/package/ebuild/doebuild.pyi @@ -1,4 +1,5 @@ -from typing import Any, Literal +from _typeshed import Incomplete +from typing import Literal from portage.dbapi.porttree import portdbapi @@ -38,17 +39,19 @@ def doebuild( "unpack", ], settings: config | None = ..., - debug: Literal[0, 1] = ..., - listonly: Literal[0, 1] = ..., - fetchonly: Literal[0, 1] = ..., - cleanup: Literal[0, 1] = ..., - use_cache: Literal[0, 1] = ..., - fetchall: Literal[0, 1] = ..., + debug: Literal[0, 1] = 0, + listonly: Literal[0, 1] = 0, + fetchonly: Literal[0, 1] = 0, + cleanup: Literal[0, 1] = 0, + use_cache: Literal[0, 1] = 1, + fetchall: Literal[0, 1] = 0, tree: Literal["vartree", "porttree", "bintree"] = ..., mydbapi: portdbapi | None = ..., - vartree: Any = ..., - prev_mtimes: dict[str, Any] | None = ..., + vartree=..., + prev_mtimes: dict[str, Incomplete] | None = ..., fd_pipes: dict[str, str] | None = ..., returnproc: int | bool = ..., ) -> Literal[0, 1] | bool | list[int]: # Missing portage.process.MultiprocessingProcess ... + +def __getattr__(name: str) -> Incomplete: ... # incomplete module diff --git a/stubs/portage/portage/versions.pyi b/stubs/portage/portage/versions.pyi index caeec5507f2b..457f982576ef 100644 --- a/stubs/portage/portage/versions.pyi +++ b/stubs/portage/portage/versions.pyi @@ -1,6 +1,9 @@ -from typing import Any, Literal +from _typeshed import Incomplete +from typing import Literal from typing_extensions import Self +from .package.ebuild.config import config + def vercmp(ver1: str, ver2: str, silent: Literal[0, 1] = ...) -> int | None: ... class _pkg_str(str): @@ -9,36 +12,37 @@ class _pkg_str(str): def __new__( cls, cpv: str, - metadata: dict[str, Any] | None = ..., - settings: Any = ..., - eapi: Any = ..., + metadata: dict[str, Incomplete] | None = ..., + settings: config = ..., + eapi=..., repo: str | None = ..., slot: str | None = ..., build_time: int | None = ..., build_id: str | None = ..., file_size: int | None = ..., mtime: int | None = ..., - db: Any = ..., - repoconfig: Any = ..., + db=..., + repoconfig=..., ) -> Self: ... def __init__( self, cpv: str, - metadata: dict[str, Any] | None = ..., - settings: Any = ..., - eapi: Any = ..., + metadata: dict[str, Incomplete] | None = ..., + settings: config = ..., + eapi=..., repo: str | None = ..., slot: str | None = ..., build_time: int | None = ..., build_id: str | None = ..., file_size: int | None = ..., mtime: int | None = ..., - db: Any = ..., - repoconfig: Any = ..., + db=..., + repoconfig=..., ) -> None: ... @staticmethod - def _long(var: Any, default: int) -> int: ... + def _long(var, default: int) -> int: ... def catpkgsplit( mydata: str | _pkg_str, silent: Literal[0, 1] = ..., eapi: str | None = ... ) -> tuple[str | None, str, str, str] | None: ... +def __getattr__(name: str) -> Incomplete: ... # incomplete module From 53070df1ff1c46e7f9f9483c54144e9625798e90 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 09:19:01 -0400 Subject: [PATCH 12/17] [portage] Add defaults to doebuild() --- stubs/portage/portage/package/ebuild/doebuild.pyi | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/stubs/portage/portage/package/ebuild/doebuild.pyi b/stubs/portage/portage/package/ebuild/doebuild.pyi index ed1821fd0b61..8c075faf035d 100644 --- a/stubs/portage/portage/package/ebuild/doebuild.pyi +++ b/stubs/portage/portage/package/ebuild/doebuild.pyi @@ -38,19 +38,19 @@ def doebuild( "unmerge", "unpack", ], - settings: config | None = ..., + settings: config | None = None, debug: Literal[0, 1] = 0, listonly: Literal[0, 1] = 0, fetchonly: Literal[0, 1] = 0, cleanup: Literal[0, 1] = 0, use_cache: Literal[0, 1] = 1, fetchall: Literal[0, 1] = 0, - tree: Literal["vartree", "porttree", "bintree"] = ..., - mydbapi: portdbapi | None = ..., - vartree=..., - prev_mtimes: dict[str, Incomplete] | None = ..., - fd_pipes: dict[str, str] | None = ..., - returnproc: int | bool = ..., + tree: Literal["vartree", "porttree", "bintree"] | None = None, + mydbapi: portdbapi | None = None, + vartree=None, + prev_mtimes: dict[str, Incomplete] | None = None, + fd_pipes: dict[str, str] | None = None, + returnproc: int | bool = False, ) -> Literal[0, 1] | bool | list[int]: # Missing portage.process.MultiprocessingProcess ... From 98f9c49c8a1fd6f35bc14b9f5a3be1c39269b268 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 09:25:24 -0400 Subject: [PATCH 13/17] [portage] fixes in versions module --- stubs/portage/portage/versions.pyi | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/stubs/portage/portage/versions.pyi b/stubs/portage/portage/versions.pyi index 457f982576ef..6ff36dbd39d0 100644 --- a/stubs/portage/portage/versions.pyi +++ b/stubs/portage/portage/versions.pyi @@ -13,14 +13,14 @@ class _pkg_str(str): cls, cpv: str, metadata: dict[str, Incomplete] | None = ..., - settings: config = ..., - eapi=..., - repo: str | None = ..., - slot: str | None = ..., - build_time: int | None = ..., - build_id: str | None = ..., - file_size: int | None = ..., - mtime: int | None = ..., + settings: config | None = None, + eapi: str | None = None, + repo: str | None = None, + slot: str | None = None, + build_time: int | None = None, + build_id: str | None = None, + file_size: int | None = None, + mtime: int | None = None, db=..., repoconfig=..., ) -> Self: ... @@ -28,14 +28,14 @@ class _pkg_str(str): self, cpv: str, metadata: dict[str, Incomplete] | None = ..., - settings: config = ..., - eapi=..., - repo: str | None = ..., - slot: str | None = ..., - build_time: int | None = ..., - build_id: str | None = ..., - file_size: int | None = ..., - mtime: int | None = ..., + settings: config | None = None, + eapi: str | None = None, + repo: str | None = None, + slot: str | None = None, + build_time: int | None = None, + build_id: str | None = None, + file_size: int | None = None, + mtime: int | None = None, db=..., repoconfig=..., ) -> None: ... @@ -43,6 +43,6 @@ class _pkg_str(str): def _long(var, default: int) -> int: ... def catpkgsplit( - mydata: str | _pkg_str, silent: Literal[0, 1] = ..., eapi: str | None = ... + mydata: str | _pkg_str, silent: Literal[0, 1] = 1, eapi: str | None = None ) -> tuple[str | None, str, str, str] | None: ... def __getattr__(name: str) -> Incomplete: ... # incomplete module From 24a1c7e95af6634ea3bc8c1d15ec76396ba2ea4a Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 09:26:26 -0400 Subject: [PATCH 14/17] [portage] fixes in versions module --- stubs/portage/portage/versions.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/portage/portage/versions.pyi b/stubs/portage/portage/versions.pyi index 6ff36dbd39d0..833f883d7596 100644 --- a/stubs/portage/portage/versions.pyi +++ b/stubs/portage/portage/versions.pyi @@ -12,7 +12,7 @@ class _pkg_str(str): def __new__( cls, cpv: str, - metadata: dict[str, Incomplete] | None = ..., + metadata: dict[str, Incomplete] | None = None, settings: config | None = None, eapi: str | None = None, repo: str | None = None, @@ -27,7 +27,7 @@ class _pkg_str(str): def __init__( self, cpv: str, - metadata: dict[str, Incomplete] | None = ..., + metadata: dict[str, Incomplete] | None = None, settings: config | None = None, eapi: str | None = None, repo: str | None = None, From 938cce8a234c23b642fc16734eb25e6966b775dc Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 09:33:29 -0400 Subject: [PATCH 15/17] [portage] more defaults --- stubs/portage/portage/dbapi/__init__.pyi | 4 +-- stubs/portage/portage/dbapi/porttree.pyi | 9 ++++--- .../portage/portage/package/ebuild/config.pyi | 26 +++++++++---------- stubs/portage/portage/versions.pyi | 2 +- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/stubs/portage/portage/dbapi/__init__.pyi b/stubs/portage/portage/dbapi/__init__.pyi index fa06ce0472fd..72923af21793 100644 --- a/stubs/portage/portage/dbapi/__init__.pyi +++ b/stubs/portage/portage/dbapi/__init__.pyi @@ -27,8 +27,8 @@ class dbapi: "SLOT", ] ], - mytree: str | None = ..., - myrepo: str | None = ..., + mytree: str | None = None, + myrepo: str | None = None, ) -> list[str]: ... def match(self, mydep: str, use_cache: Literal[0, 1] = 1) -> list[str] | str: ... diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi index 152ec1079fe4..0daa99cc1e87 100644 --- a/stubs/portage/portage/dbapi/porttree.pyi +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -1,3 +1,4 @@ +from _typeshed import Incomplete from collections.abc import Sequence from typing import Literal @@ -5,7 +6,7 @@ from portage.dbapi import dbapi class portdbapi(dbapi): def getFetchMap( - self, mypkg: str, useflags: Sequence[str] | None = ..., mytree: str | None = ... + self, mypkg: str, useflags: Sequence[str] | None = None, mytree: str | None = None ) -> dict[str, tuple[str, ...]]: ... def xmatch( self, @@ -20,10 +21,12 @@ class portdbapi(dbapi): ], origdep: str, ) -> list[str] | str: ... - def findname(self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ...) -> str: ... + def findname(self, mycpv: str, mytree: str | None = None, myrepo: str | None = None) -> str: ... def findname2( - self, mycpv: str, mytree: str | None = ..., myrepo: str | None = ... + self, mycpv: str, mytree: str | None = None, myrepo: str | None = None ) -> tuple[None, Literal[0]] | tuple[str, str] | tuple[str, None]: ... class portagetree: dbapi: portdbapi + +def __getattr__(name: str) -> Incomplete: ... # incomplete module diff --git a/stubs/portage/portage/package/ebuild/config.pyi b/stubs/portage/portage/package/ebuild/config.pyi index 66985b1a8838..5247581cfa13 100644 --- a/stubs/portage/portage/package/ebuild/config.pyi +++ b/stubs/portage/portage/package/ebuild/config.pyi @@ -1,21 +1,21 @@ -from collections.abc import Hashable, Mapping +from collections.abc import Mapping from typing import Literal, TypeVar class config: def __init__( self, - clone: config | None = ..., - mycpv: str | None = ..., - config_profile_path: str | None = ..., - config_incrementals: dict[str, str] | None = ..., - config_root: str | None = ..., - target_root: str | None = ..., - sysroot: str | None = ..., - eprefix: str | None = ..., + clone: config | None = None, + mycpv: str | None = None, + config_profile_path: str | None = None, + config_incrementals: dict[str, str] | None = None, + config_root: str | None = None, + target_root: str | None = None, + sysroot: str | None = None, + eprefix: str | None = None, local_config: bool = True, - env: dict[str, str] | None = ..., - _unmatched_removal: bool = ..., - repositories: list[str] | None = ..., + env: dict[str, str] | None = None, + _unmatched_removal: bool = False, + repositories: list[str] | None = None, ) -> None: ... def __getitem__(self, key: str) -> str: ... def __setitem__(self, key: str, value: str) -> None: ... @@ -27,7 +27,7 @@ _K = TypeVar("_K") _V = TypeVar("_V") def best_from_dict( - key: Hashable, + key: _K, top_dict: Mapping[_K, _V], key_order, EmptyOnError: Literal[0, 1] = 1, diff --git a/stubs/portage/portage/versions.pyi b/stubs/portage/portage/versions.pyi index 833f883d7596..1265ccfbdf6e 100644 --- a/stubs/portage/portage/versions.pyi +++ b/stubs/portage/portage/versions.pyi @@ -4,7 +4,7 @@ from typing_extensions import Self from .package.ebuild.config import config -def vercmp(ver1: str, ver2: str, silent: Literal[0, 1] = ...) -> int | None: ... +def vercmp(ver1: str, ver2: str, silent: Literal[0, 1] = 1) -> int | None: ... class _pkg_str(str): @property From 1cbb95df3deb3136408149191fde68a61447b171 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Wed, 18 Mar 2026 15:01:43 -0400 Subject: [PATCH 16/17] [portage] add exceptions to stricter pyrightconfig --- pyrightconfig.stricter.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index c8ade412980c..e6e87cbc6668 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -72,6 +72,9 @@ "stubs/pexpect", "stubs/pika", "stubs/pony", + "stubs/portage/portage/package/ebuild/config.pyi", + "stubs/portage/portage/package/ebuild/doebuild.pyi", + "stubs/portage/portage/versions.pyi", "stubs/protobuf", "stubs/psutil/psutil/__init__.pyi", "stubs/psycopg2", From 05e717afe1b5c5fab089e3d778707e370ada276e Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Sat, 21 Mar 2026 23:14:56 -0400 Subject: [PATCH 17/17] [portage] fix methods in dbapi.porttree and add comments about allowlist entries --- stubs/portage/@tests/stubtest_allowlist.txt | 3 +- stubs/portage/portage/dbapi/__init__.pyi | 55 ++++++++++----------- stubs/portage/portage/dbapi/porttree.pyi | 7 ++- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/stubs/portage/@tests/stubtest_allowlist.txt b/stubs/portage/@tests/stubtest_allowlist.txt index 23db6e10471a..895f254fb0cf 100644 --- a/stubs/portage/@tests/stubtest_allowlist.txt +++ b/stubs/portage/@tests/stubtest_allowlist.txt @@ -1,5 +1,4 @@ -portage.dbapi.dbapi.aux_get -portage.dbapi.dbapi.match +# Don't stub the deprecated params (root, virtual; _unused_param; mydep; _unused) portage.dbapi.porttree.portagetree.__init__ portage.dbapi.porttree.portdbapi.__init__ portage.dbapi.porttree.portdbapi.xmatch diff --git a/stubs/portage/portage/dbapi/__init__.pyi b/stubs/portage/portage/dbapi/__init__.pyi index 72923af21793..5ea5050d6383 100644 --- a/stubs/portage/portage/dbapi/__init__.pyi +++ b/stubs/portage/portage/dbapi/__init__.pyi @@ -1,35 +1,30 @@ from _typeshed import Incomplete -from typing import Literal +from collections.abc import Sequence +from typing import Literal, TypeAlias + +_MyListString: TypeAlias = Literal[ + "DEFINED_PHASES", + "DEPEND", + "EAPI", + "HDEPEND", + "HOMEPAGE", + "INHERITED", + "IUSE", + "KEYWORDS", + "LICENSE", + "PDEPEND", + "PROPERTIES", + "PROVIDE", + "RDEPEND", + "REQUIRED_USE", + "repository", + "RESTRICT", + "SRC_URI", + "SLOT", +] class dbapi: - def aux_get( - self, - mycpv: str, - mylist: list[ - Literal[ - "DEFINED_PHASES", - "DEPEND", - "EAPI", - "HDEPEND", - "HOMEPAGE", - "INHERITED", - "IUSE", - "KEYWORDS", - "LICENSE", - "PDEPEND", - "PROPERTIES", - "PROVIDE", - "RDEPEND", - "REQUIRED_USE", - "repository", - "RESTRICT", - "SRC_URI", - "SLOT", - ] - ], - mytree: str | None = None, - myrepo: str | None = None, - ) -> list[str]: ... - def match(self, mydep: str, use_cache: Literal[0, 1] = 1) -> list[str] | str: ... + def aux_get(self, mycpv: str, mylist: Sequence[_MyListString], myrepo: str | None = None) -> list[str]: ... + def match(self, origdep: str, use_cache: Literal[0, 1] = 1) -> list[str] | str: ... def __getattr__(name: str) -> Incomplete: ... # incomplete module diff --git a/stubs/portage/portage/dbapi/porttree.pyi b/stubs/portage/portage/dbapi/porttree.pyi index 0daa99cc1e87..d3772b523e05 100644 --- a/stubs/portage/portage/dbapi/porttree.pyi +++ b/stubs/portage/portage/dbapi/porttree.pyi @@ -2,7 +2,7 @@ from _typeshed import Incomplete from collections.abc import Sequence from typing import Literal -from portage.dbapi import dbapi +from portage.dbapi import _MyListString, dbapi class portdbapi(dbapi): def getFetchMap( @@ -25,6 +25,11 @@ class portdbapi(dbapi): def findname2( self, mycpv: str, mytree: str | None = None, myrepo: str | None = None ) -> tuple[None, Literal[0]] | tuple[str, str] | tuple[str, None]: ... + # This method overrides in an incompatible way + def aux_get( # type: ignore[override] + self, mycpv: str, mylist: Sequence[_MyListString], mytree: str | None = None, myrepo: str | None = None + ) -> list[str]: ... + def match(self, mydep: str, use_cache: Literal[0, 1] = 1) -> list[str] | str: ... class portagetree: dbapi: portdbapi