• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 22285099215

22 Feb 2026 08:52PM UTC coverage: 75.854% (-17.1%) from 92.936%
22285099215

Pull #23121

github

web-flow
Merge c7299df9c into ba8359840
Pull Request #23121: fix issue with optional fields in dependency validator

28 of 29 new or added lines in 2 files covered. (96.55%)

11174 existing lines in 400 files now uncovered.

53694 of 70786 relevant lines covered (75.85%)

1.88 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.18
/src/python/pants/backend/go/util_rules/go_bootstrap.py
1
# Copyright 2022 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3
from __future__ import annotations
4✔
4

5
import logging
4✔
6
from collections.abc import Collection
4✔
7
from dataclasses import dataclass
4✔
8

9
from pants.backend.go.subsystems.golang import GolangSubsystem
4✔
10
from pants.core.environments.target_types import EnvironmentTarget
4✔
11
from pants.core.util_rules import asdf, search_paths
4✔
12
from pants.core.util_rules.asdf import AsdfPathString, AsdfToolPathsResult
4✔
13
from pants.core.util_rules.search_paths import ValidateSearchPathsRequest, validate_search_paths
4✔
14
from pants.engine.internals.platform_rules import environment_path_variable
4✔
15
from pants.engine.rules import collect_rules, rule
4✔
16
from pants.util.ordered_set import FrozenOrderedSet
4✔
17

18
logger = logging.getLogger(__name__)
4✔
19

20

21
@dataclass(frozen=True)
4✔
22
class GoBootstrap:
4✔
23
    go_search_paths: tuple[str, ...]
4✔
24

25

26
async def _go_search_paths(
4✔
27
    env_tgt: EnvironmentTarget, golang_subsystem: GolangSubsystem, paths: Collection[str]
28
) -> tuple[str, ...]:
29
    asdf_result = await AsdfToolPathsResult.get_un_cachable_search_paths(
4✔
30
        paths,
31
        env_tgt=env_tgt,
32
        tool_name=golang_subsystem.asdf_tool_name,
33
        tool_description="Go distribution",
34
        paths_option_name="[golang].go_search_paths",
35
        bin_relpath=golang_subsystem.asdf_bin_relpath,
36
    )
37
    special_strings = {
4✔
38
        AsdfPathString.STANDARD.value: asdf_result.standard_tool_paths,
39
        AsdfPathString.LOCAL.value: asdf_result.local_tool_paths,
40
    }
41

42
    path_variables = await environment_path_variable()
4✔
43
    expanded: list[str] = []
4✔
44
    for s in paths:
4✔
45
        if s == "<PATH>":
4✔
46
            expanded.extend(path_variables)
4✔
47
        elif s in special_strings:
1✔
UNCOV
48
            special_paths = special_strings[s]
×
UNCOV
49
            expanded.extend(special_paths)
×
50
        else:
51
            expanded.append(s)
1✔
52
    return tuple(expanded)
4✔
53

54

55
@rule
4✔
56
async def resolve_go_bootstrap(
4✔
57
    golang_subsystem: GolangSubsystem, golang_env_aware: GolangSubsystem.EnvironmentAware
58
) -> GoBootstrap:
59
    search_paths = await validate_search_paths(
4✔
60
        ValidateSearchPathsRequest(
61
            env_tgt=golang_env_aware.env_tgt,
62
            search_paths=tuple(golang_env_aware.raw_go_search_paths),
63
            option_origin=f"[{GolangSubsystem.options_scope}].go_search_paths",
64
            environment_key="golang_go_search_paths",
65
            is_default=golang_env_aware._is_default("_go_search_paths"),
66
            local_only=FrozenOrderedSet((AsdfPathString.STANDARD, AsdfPathString.LOCAL)),
67
        )
68
    )
69
    paths = await _go_search_paths(golang_env_aware.env_tgt, golang_subsystem, search_paths)
4✔
70

71
    return GoBootstrap(go_search_paths=paths)
4✔
72

73

74
def compatible_go_version(*, compiler_version: str, target_version: str) -> bool:
4✔
75
    """Can the Go compiler handle the target version?
76

77
    Inspired by
78
    https://github.com/golang/go/blob/30501bbef9fcfc9d53e611aaec4d20bb3cdb8ada/src/cmd/go/internal/work/exec.go#L429-L445.
79

80
    Input expected in the form `1.17`.
81
    """
82
    if target_version == "1.0":
4✔
UNCOV
83
        return True
×
84

85
    def parse(v: str) -> tuple[int, int]:
4✔
86
        parts = v.split(".", maxsplit=2)
4✔
87
        major, minor = parts[0], parts[1]
4✔
88
        return int(major), int(minor)
4✔
89

90
    return parse(target_version) <= parse(compiler_version)
4✔
91

92

93
def rules():
4✔
94
    return (
4✔
95
        *collect_rules(),
96
        *asdf.rules(),
97
        *search_paths.rules(),
98
    )
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc