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

pantsbuild / pants / 18517631058

15 Oct 2025 04:18AM UTC coverage: 69.207% (-11.1%) from 80.267%
18517631058

Pull #22745

github

web-flow
Merge 642a76ca1 into 99919310e
Pull Request #22745: [windows] Add windows support in the stdio crate.

53815 of 77759 relevant lines covered (69.21%)

2.42 hits per line

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

50.0
/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
7✔
4

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

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

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

20

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

25

26
async def _go_search_paths(
7✔
27
    env_tgt: EnvironmentTarget, golang_subsystem: GolangSubsystem, paths: Collection[str]
28
) -> tuple[str, ...]:
29
    asdf_result = await AsdfToolPathsResult.get_un_cachable_search_paths(
×
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 = {
×
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()
×
43
    expanded: list[str] = []
×
44
    for s in paths:
×
45
        if s == "<PATH>":
×
46
            expanded.extend(path_variables)
×
47
        elif s in special_strings:
×
48
            special_paths = special_strings[s]
×
49
            expanded.extend(special_paths)
×
50
        else:
51
            expanded.append(s)
×
52
    return tuple(expanded)
×
53

54

55
@rule
7✔
56
async def resolve_go_bootstrap(
7✔
57
    golang_subsystem: GolangSubsystem, golang_env_aware: GolangSubsystem.EnvironmentAware
58
) -> GoBootstrap:
59
    search_paths = await validate_search_paths(
×
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)
×
70

71
    return GoBootstrap(go_search_paths=paths)
×
72

73

74
def compatible_go_version(*, compiler_version: str, target_version: str) -> bool:
7✔
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":
×
83
        return True
×
84

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

90
    return parse(target_version) <= parse(compiler_version)
×
91

92

93
def rules():
7✔
94
    return (
7✔
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

© 2025 Coveralls, Inc