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

pantsbuild / pants / 19015773527

02 Nov 2025 05:33PM UTC coverage: 17.872% (-62.4%) from 80.3%
19015773527

Pull #22816

github

web-flow
Merge a12d75757 into 6c024e162
Pull Request #22816: Update Pants internal Python to 3.14

4 of 5 new or added lines in 3 files covered. (80.0%)

28452 existing lines in 683 files now uncovered.

9831 of 55007 relevant lines covered (17.87%)

0.18 hits per line

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

0.0
/src/python/pants/backend/makeself/goals/package.py
1
# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

UNCOV
4
from __future__ import annotations
×
5

UNCOV
6
import dataclasses
×
UNCOV
7
import logging
×
UNCOV
8
import os
×
UNCOV
9
from collections.abc import Iterable
×
UNCOV
10
from dataclasses import dataclass
×
UNCOV
11
from pathlib import PurePath
×
12

UNCOV
13
from pants.backend.makeself.subsystem import MakeselfTool
×
UNCOV
14
from pants.backend.makeself.system_binaries import MakeselfBinaryShimsRequest
×
UNCOV
15
from pants.backend.makeself.target_types import (
×
16
    MakeselfArchiveArgsField,
17
    MakeselfArchiveFilesField,
18
    MakeselfArchiveOutputPathField,
19
    MakeselfArchivePackagesField,
20
    MakeselfArchiveStartupScriptField,
21
    MakeselfArchiveToolsField,
22
    MakeselfArthiveLabelField,
23
)
UNCOV
24
from pants.backend.shell.target_types import ShellSourceField
×
UNCOV
25
from pants.core.goals import package
×
UNCOV
26
from pants.core.goals.package import (
×
27
    BuiltPackage,
28
    BuiltPackageArtifact,
29
    EnvironmentAwarePackageRequest,
30
    PackageFieldSet,
31
    environment_aware_package,
32
)
UNCOV
33
from pants.core.goals.run import RunFieldSet, RunInSandboxBehavior
×
UNCOV
34
from pants.core.target_types import FileSourceField
×
UNCOV
35
from pants.core.util_rules import source_files
×
UNCOV
36
from pants.core.util_rules.system_binaries import create_binary_shims
×
UNCOV
37
from pants.engine.addresses import UnparsedAddressInputs
×
UNCOV
38
from pants.engine.fs import Digest, MergeDigests
×
UNCOV
39
from pants.engine.internals.graph import find_valid_field_sets, hydrate_sources, resolve_targets
×
UNCOV
40
from pants.engine.internals.native_engine import AddPrefix
×
UNCOV
41
from pants.engine.intrinsics import add_prefix, digest_to_snapshot, merge_digests
×
UNCOV
42
from pants.engine.process import Process, ProcessCacheScope, execute_process_or_raise
×
UNCOV
43
from pants.engine.rules import Rule, collect_rules, concurrently, implicitly, rule
×
UNCOV
44
from pants.engine.target import FieldSetsPerTargetRequest, HydrateSourcesRequest, SourcesField
×
UNCOV
45
from pants.engine.unions import UnionRule
×
UNCOV
46
from pants.util.logging import LogLevel
×
47

UNCOV
48
logger = logging.getLogger(__name__)
×
49

50

UNCOV
51
@dataclass(frozen=True)
×
UNCOV
52
class MakeselfArchiveFieldSet(PackageFieldSet, RunFieldSet):
×
UNCOV
53
    required_fields = (MakeselfArchiveStartupScriptField,)
×
UNCOV
54
    run_in_sandbox_behavior = RunInSandboxBehavior.RUN_REQUEST_HERMETIC
×
55

UNCOV
56
    startup_script: MakeselfArchiveStartupScriptField
×
UNCOV
57
    label: MakeselfArthiveLabelField
×
UNCOV
58
    files: MakeselfArchiveFilesField
×
UNCOV
59
    packages: MakeselfArchivePackagesField
×
UNCOV
60
    output_path: MakeselfArchiveOutputPathField
×
UNCOV
61
    args: MakeselfArchiveArgsField
×
UNCOV
62
    tools: MakeselfArchiveToolsField
×
63

64

UNCOV
65
@dataclass(frozen=True)
×
UNCOV
66
class CreateMakeselfArchive:
×
67
    """Await create_makeself_archive() to get a Process to invoke.
68

69
    See docs for the options [here](https://github.com/megastep/makeself/tree/release-2.5.0#usage).
70
    """
71

UNCOV
72
    args: tuple[str, ...]
×
UNCOV
73
    archive_dir: str
×
UNCOV
74
    file_name: str
×
UNCOV
75
    label: str
×
UNCOV
76
    startup_script: tuple[str, ...]
×
UNCOV
77
    input_digest: Digest
×
UNCOV
78
    description: str = dataclasses.field(compare=False)
×
UNCOV
79
    output_filename: str
×
UNCOV
80
    extra_tools: tuple[str, ...] | None = None
×
UNCOV
81
    level: LogLevel = LogLevel.INFO
×
UNCOV
82
    cache_scope: ProcessCacheScope | None = None
×
UNCOV
83
    timeout_seconds: int | None = None
×
84

85

UNCOV
86
@rule
×
UNCOV
87
async def create_makeself_archive(
×
88
    request: CreateMakeselfArchive,
89
    makeself: MakeselfTool,
90
) -> Process:
91
    shims = await create_binary_shims(
×
92
        **implicitly(
93
            MakeselfBinaryShimsRequest(
94
                extra_tools=request.extra_tools or (),
95
                rationale="create makeself archive",
96
            )
97
        )
98
    )
99

100
    tooldir = "__makeself"
×
101
    argv = (
×
102
        os.path.join(tooldir, makeself.exe),
103
        *request.args,
104
        request.archive_dir,
105
        request.file_name,
106
        request.label,
107
        *request.startup_script,
108
    )
109

110
    process = Process(
×
111
        argv,
112
        input_digest=request.input_digest,
113
        immutable_input_digests={
114
            tooldir: makeself.digest,
115
            **shims.immutable_input_digests,
116
        },
117
        env={"PATH": shims.path_component},
118
        description=request.description,
119
        level=request.level,
120
        append_only_caches={},
121
        output_files=(request.output_filename,),
122
        cache_scope=request.cache_scope or ProcessCacheScope.SUCCESSFUL,
123
        timeout_seconds=request.timeout_seconds,
124
    )
125
    return process
×
126

127

UNCOV
128
@dataclass(frozen=True)
×
UNCOV
129
class BuiltMakeselfArchiveArtifact(BuiltPackageArtifact):
×
UNCOV
130
    @classmethod
×
UNCOV
131
    def create(cls, relpath: str) -> BuiltMakeselfArchiveArtifact:
×
132
        return cls(
×
133
            relpath=relpath,
134
            extra_log_lines=(f"Built Makeself binary: {relpath}",),
135
        )
136

137

UNCOV
138
@rule
×
UNCOV
139
async def package_makeself_binary(field_set: MakeselfArchiveFieldSet) -> BuiltPackage:
×
140
    archive_dir = "__archive"
×
141

142
    package_targets, file_targets = await concurrently(
×
143
        resolve_targets(
144
            **implicitly({field_set.packages.to_unparsed_address_inputs(): UnparsedAddressInputs})
145
        ),
146
        resolve_targets(
147
            **implicitly({field_set.files.to_unparsed_address_inputs(): UnparsedAddressInputs})
148
        ),
149
    )
150

151
    package_field_sets_per_target = await find_valid_field_sets(
×
152
        FieldSetsPerTargetRequest(PackageFieldSet, package_targets), **implicitly()
153
    )
154
    packages = await concurrently(
×
155
        environment_aware_package(EnvironmentAwarePackageRequest(field_set))
156
        for field_set in package_field_sets_per_target.field_sets
157
    )
158

159
    file_sources = await concurrently(
×
160
        hydrate_sources(
161
            HydrateSourcesRequest(
162
                tgt.get(SourcesField),
163
                for_sources_types=(FileSourceField, ShellSourceField),
164
                enable_codegen=True,
165
            ),
166
            **implicitly(),
167
        )
168
        for tgt in file_targets
169
    )
170

171
    input_digest = await merge_digests(
×
172
        MergeDigests(
173
            (
174
                *(package.digest for package in packages),
175
                *(sources.snapshot.digest for sources in file_sources),
176
            )
177
        )
178
    )
179
    input_digest = await add_prefix(AddPrefix(input_digest, archive_dir))
×
180

181
    output_path = PurePath(field_set.output_path.value_or_default(file_ending="run"))
×
182
    output_filename = output_path.name
×
183
    result = await execute_process_or_raise(
×
184
        **implicitly(
185
            CreateMakeselfArchive(
186
                archive_dir=archive_dir,
187
                file_name=output_filename,
188
                label=field_set.label.value or output_filename,
189
                startup_script=field_set.startup_script.value or (),
190
                args=field_set.args.value or (),
191
                input_digest=input_digest,
192
                output_filename=output_filename,
193
                extra_tools=field_set.tools.value or (),
194
                description=f"Packaging makeself archive: {field_set.address}",
195
                level=LogLevel.DEBUG,
196
            )
197
        )
198
    )
199
    digest = await add_prefix(AddPrefix(result.output_digest, str(output_path.parent)))
×
200
    snapshot = await digest_to_snapshot(digest)
×
201
    assert len(snapshot.files) == 1, snapshot
×
202

203
    return BuiltPackage(
×
204
        snapshot.digest,
205
        artifacts=tuple(BuiltMakeselfArchiveArtifact.create(file) for file in snapshot.files),
206
    )
207

208

UNCOV
209
def rules() -> Iterable[Rule | UnionRule]:
×
UNCOV
210
    return (
×
211
        *collect_rules(),
212
        *package.rules(),
213
        *source_files.rules(),
214
        *MakeselfArchiveFieldSet.rules(),
215
        UnionRule(PackageFieldSet, MakeselfArchiveFieldSet),
216
    )
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