summaryrefslogtreecommitdiffstats
path: root/build/scripts
diff options
context:
space:
mode:
authordimdim11 <[email protected]>2026-05-14 20:00:45 +0300
committerdimdim11 <[email protected]>2026-05-14 20:47:32 +0300
commitf193ad3afbddfbe2e999c60431c2d42ca79d1750 (patch)
tree354662580575d16a95e7b91aee41702b1972a7b8 /build/scripts
parentac94ded76d19e7e59734ddab60a76e9167938e9b (diff)
Support any one package name for Go 1.25 coverage
Support any one package name for Go 1.25 coverage commit_hash:c2c5ba2c3b4e18dddf4518abaf6dec045ef8c3cf
Diffstat (limited to 'build/scripts')
-rw-r--r--build/scripts/go.py48
1 files changed, 32 insertions, 16 deletions
diff --git a/build/scripts/go.py b/build/scripts/go.py
index 3d66c81c252..bd30b6f3af8 100644
--- a/build/scripts/go.py
+++ b/build/scripts/go.py
@@ -143,26 +143,42 @@ class _GoToolCover(_GoTool):
def __init__(self, args):
super().__init__(args)
+ # For GO_TEST_FOR module in cover_module, else moddir is module for coverage
self.cover_module = self.args.cover_module if self.args.cover_module else self.args.moddir
self.cover_package = self.args.cover_package
def execute(self) -> int:
- # For GO_TEST_FOR module in cover_module, else moddir is module for coverage
- go_files = []
+ if not self.args.cover_srcs:
+ sys.stderr.write("Not found source files, skip covering\n")
+ return 0
+ # Extract go packages from all go files
+ go_package2files = {}
for go_file in self.args.cover_srcs:
go_package = self.go_package(self.source_root / go_file)
- if go_package == 'main':
- self._make_empty_cover_go(go_file) # {go_file}.cover.go declared as output, we must create it
- continue # can't generate coverage for package main
- if go_package != self.cover_package:
- sys.stderr.write(
- f"In file '{go_file}' package '{go_package}' != configured package '{self.cover_package}', file skipped by coverage\n"
- )
- self._make_empty_cover_go(go_file) # {go_file}.cover.go declared as output, we must create it
- continue
- go_files.append(go_file)
- if not go_files:
- raise Exception(f"Not found files for coverage with package '{self.cover_package}'")
+ if go_package not in go_package2files:
+ go_package2files[go_package] = []
+ go_package2files[go_package].append(go_file)
+ go_packages = list(go_package2files.keys())
+ if len(go_packages) > 1:
+ for go_pkg, go_pkg_files in go_package2files.items():
+ # {go_file}.cover.go declared as output, we must create empty coverage files for build
+ for go_file in go_pkg_files:
+ self._make_empty_cover_go(go_file, go_pkg)
+ message = (
+ "Few packages found in sources, can't make coverage, please, use only one pakage in all sources "
+ + f"(recommended 'package {self.cover_package}' or 'package main').\n"
+ + "Packages and files:"
+ )
+ for go_pkg, go_pkg_files in go_package2files.items():
+ if message[-1] == ')':
+ message += ','
+ message += f' {go_pkg} ({', '.join(Path(go_file).name for go_file in go_pkg_files)})'
+ message += '.'
+ raise Exception(message)
+ go_package = go_packages[0]
+ go_files = go_package2files[go_package]
+ if go_package != self.cover_package and go_package != 'main':
+ sys.stderr.write(f"Package in files '{go_package}' != configured package '{self.cover_package}'\n")
return self._do_package_coverage(
go_package,
self.args.cover_covervars,
@@ -171,9 +187,9 @@ class _GoToolCover(_GoTool):
go_files,
)
- def _make_empty_cover_go(self, go_file: str) -> None:
+ def _make_empty_cover_go(self, go_file: str, go_pkg: str) -> None:
with open(self.bindir / Path(go_file).name.replace('.go', self.args.cover_ext), 'wt', encoding="utf-8") as f:
- f.write(f'package {self.cover_package}')
+ f.write(f'package {go_pkg}')
def _do_package_coverage(
self, go_package: str, covervars_file: str, outfileslist_file: str, pkgcfg_file: str, go_files: list[str]