Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Call-by-name] Migrated go lint #22017

Merged
merged 2 commits into from
Feb 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/notes/2.26.x.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ Pants has a new mechanism for `@rule` invocation in backends. In this release th
- [django](https://www.pantsbuild.org/dev/docs/using-pants/key-concepts/backends#available-experimental-backends)
- [docformatter](https://www.pantsbuild.org/stable/reference/subsystems/docformatter)
- [flake8](https://www.pantsbuild.org/stable/reference/subsystems/flake8)
- [go-vet](https://www.pantsbuild.org/stable/reference/subsystems/go-vet)
- [gofmt](https://www.pantsbuild.org/stable/reference/subsystems/gofmt)
- [golanglint_ci](https://www.pantsbuild.org/stable/reference/subsystems/golangci-lint)
- [isort](https://www.pantsbuild.org/stable/reference/subsystems/isort)
- [preamble](https://www.pantsbuild.org/stable/reference/subsystems/preamble)
- [pydocstyle](https://www.pantsbuild.org/stable/reference/subsystems/pydocstyle)
Expand Down
28 changes: 14 additions & 14 deletions src/python/pants/backend/go/lint/gofmt/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,8 @@
from pants.backend.go.util_rules.goroot import GoRoot
from pants.core.goals.fmt import FmtResult, FmtTargetsRequest
from pants.core.util_rules.partitions import PartitionerType
from pants.engine.internals.selectors import Get
from pants.engine.process import Process, ProcessResult
from pants.engine.rules import collect_rules, rule
from pants.engine.process import Process, execute_process_or_raise
from pants.engine.rules import collect_rules, implicitly, rule
from pants.engine.target import FieldSet, Target
from pants.util.logging import LogLevel
from pants.util.strutil import pluralize
Expand Down Expand Up @@ -66,22 +65,23 @@ async def gofmt_fmt(
# Filter out non-.go files, e.g. assembly sources, from the file list.
*(f for f in request.files if f.endswith(".go")),
)
result = await Get(
ProcessResult,
Process(
argv=argv,
input_digest=request.snapshot.digest,
output_files=request.files,
description=f"Run gofmt on {pluralize(len(request.files), 'file')}.",
level=LogLevel.DEBUG,
),
result = await execute_process_or_raise(
**implicitly(
Process(
argv=argv,
input_digest=request.snapshot.digest,
output_files=request.files,
description=f"Run gofmt on {pluralize(len(request.files), 'file')}.",
level=LogLevel.DEBUG,
)
)
)
return await FmtResult.create(request, result)


def rules():
return [
return (
*collect_rules(),
*goroot.rules(),
*GofmtRequest.rules(),
]
)
98 changes: 42 additions & 56 deletions src/python/pants/backend/go/lint/golangci_lint/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,32 @@
from pants.backend.go.lint.golangci_lint.subsystem import GolangciLint
from pants.backend.go.subsystems.golang import GolangSubsystem
from pants.backend.go.target_types import GoPackageSourcesField
from pants.backend.go.util_rules.build_opts import GoBuildOptions, GoBuildOptionsFromTargetRequest
from pants.backend.go.util_rules.build_opts import (
GoBuildOptionsFromTargetRequest,
go_extract_build_options_from_target,
)
from pants.backend.go.util_rules.go_mod import (
GoModInfo,
GoModInfoRequest,
OwningGoMod,
OwningGoModRequest,
determine_go_mod_info,
find_owning_go_mod,
)
from pants.backend.go.util_rules.goroot import GoRoot
from pants.core.goals.lint import LintResult, LintTargetsRequest
from pants.core.goals.resolves import ExportableTool
from pants.core.util_rules.config_files import ConfigFiles, ConfigFilesRequest
from pants.core.util_rules.external_tool import DownloadedExternalTool, ExternalToolRequest
from pants.core.util_rules.config_files import find_config_file
from pants.core.util_rules.external_tool import download_external_tool
from pants.core.util_rules.partitions import PartitionerType
from pants.core.util_rules.source_files import SourceFiles, SourceFilesRequest
from pants.core.util_rules.source_files import SourceFilesRequest, determine_source_files
from pants.core.util_rules.system_binaries import BashBinary
from pants.engine.fs import CreateDigest, Digest, FileContent, MergeDigests
from pants.engine.internals.selectors import Get, MultiGet
from pants.engine.fs import CreateDigest, FileContent, MergeDigests
from pants.engine.internals.graph import transitive_targets as transitive_targets_get
from pants.engine.internals.selectors import concurrently
from pants.engine.intrinsics import create_digest, execute_process, merge_digests
from pants.engine.platform import Platform
from pants.engine.process import FallibleProcessResult, Process
from pants.engine.rules import collect_rules, rule
from pants.engine.target import (
FieldSet,
SourcesField,
Target,
TransitiveTargets,
TransitiveTargetsRequest,
)
from pants.engine.process import Process
from pants.engine.rules import collect_rules, implicitly, rule
from pants.engine.target import FieldSet, SourcesField, Target, TransitiveTargetsRequest
from pants.engine.unions import UnionRule
from pants.util.logging import LogLevel

Expand Down Expand Up @@ -67,55 +66,45 @@ async def run_golangci_lint(
golang_subsystem: GolangSubsystem,
golang_env_aware: GolangSubsystem.EnvironmentAware,
) -> LintResult:
transitive_targets = await Get(
TransitiveTargets,
transitive_targets = await transitive_targets_get(
TransitiveTargetsRequest(field_set.address for field_set in request.elements),
**implicitly(),
)

all_source_files_request = Get(
SourceFiles,
all_source_files_request = determine_source_files(
SourceFilesRequest(
tgt[SourcesField] for tgt in transitive_targets.closure if tgt.has_field(SourcesField)
),
)
)

target_source_files_request = Get(
SourceFiles,
SourceFilesRequest(field_set.sources for field_set in request.elements),
)

downloaded_golangci_lint_request = Get(
DownloadedExternalTool,
ExternalToolRequest,
golangci_lint.get_request(platform),
target_source_files_request = determine_source_files(
SourceFilesRequest(field_set.sources for field_set in request.elements)
)

config_files_request = Get(ConfigFiles, ConfigFilesRequest, golangci_lint.config_request())
downloaded_golangci_lint_request = download_external_tool(golangci_lint.get_request(platform))
config_files_request = find_config_file(golangci_lint.config_request())

(
target_source_files,
all_source_files,
downloaded_golangci_lint,
config_files,
) = await MultiGet(
) = await concurrently(
target_source_files_request,
all_source_files_request,
downloaded_golangci_lint_request,
config_files_request,
)

owning_go_mods = await MultiGet(
Get(OwningGoMod, OwningGoModRequest(field_set.address)) for field_set in request.elements
owning_go_mods = await concurrently(
find_owning_go_mod(OwningGoModRequest(field_set.address), **implicitly())
for field_set in request.elements
)

owning_go_mod_addresses = {x.address for x in owning_go_mods}

go_mod_infos = await MultiGet(
Get(GoModInfo, GoModInfoRequest(address)) for address in owning_go_mod_addresses
go_mod_infos = await concurrently(
determine_go_mod_info(GoModInfoRequest(address)) for address in owning_go_mod_addresses
)

go_build_opts = await MultiGet(
Get(GoBuildOptions, GoBuildOptionsFromTargetRequest(address))
go_build_opts = await concurrently(
go_extract_build_options_from_target(
GoBuildOptionsFromTargetRequest(address), **implicitly()
)
for address in owning_go_mod_addresses
)

Expand Down Expand Up @@ -146,10 +135,8 @@ async def run_golangci_lint(
).encode("utf-8"),
)

golangci_lint_run_script_digest = await Get(Digest, CreateDigest([golangci_lint_run_script]))

input_digest = await Get(
Digest,
golangci_lint_run_script_digest = await create_digest(CreateDigest([golangci_lint_run_script]))
input_digest = await merge_digests(
MergeDigests(
[
golangci_lint_run_script_digest,
Expand All @@ -159,10 +146,10 @@ async def run_golangci_lint(
all_source_files.snapshot.digest,
*(info.digest for info in set(go_mod_infos)),
]
),
)
)

argv = [
argv: list[str] = [
bash.path,
golangci_lint_run_script.path,
downloaded_golangci_lint.exe,
Expand All @@ -179,22 +166,21 @@ async def run_golangci_lint(
argv.append("--no-config")
argv.extend(golangci_lint.args)

process_result = await Get(
FallibleProcessResult,
process_result = await execute_process(
Process(
argv=argv,
input_digest=input_digest,
description="Run `golangci-lint`.",
level=LogLevel.DEBUG,
),
**implicitly(),
)

return LintResult.create(request, process_result)


def rules():
return [
return (
*collect_rules(),
*GolangciLintRequest.rules(),
UnionRule(ExportableTool, GolangciLint),
]
)
57 changes: 26 additions & 31 deletions src/python/pants/backend/go/lint/vet/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@
from pants.backend.go.lint.vet.subsystem import GoVetSubsystem
from pants.backend.go.target_types import GoPackageSourcesField
from pants.backend.go.util_rules.go_mod import (
GoModInfo,
GoModInfoRequest,
OwningGoMod,
OwningGoModRequest,
determine_go_mod_info,
find_owning_go_mod,
)
from pants.backend.go.util_rules.sdk import GoSdkProcess
from pants.core.goals.lint import LintResult, LintTargetsRequest
from pants.core.util_rules.partitions import PartitionerType
from pants.core.util_rules.source_files import SourceFiles, SourceFilesRequest
from pants.engine.fs import Digest, MergeDigests
from pants.engine.internals.selectors import Get, MultiGet
from pants.engine.process import FallibleProcessResult
from pants.engine.rules import collect_rules, rule
from pants.core.util_rules.source_files import SourceFilesRequest, determine_source_files
from pants.engine.fs import MergeDigests
from pants.engine.internals.selectors import concurrently
from pants.engine.intrinsics import execute_process, merge_digests
from pants.engine.rules import collect_rules, implicitly, rule
from pants.engine.target import FieldSet, Target
from pants.util.logging import LogLevel
from pants.util.strutil import pluralize
Expand All @@ -48,42 +48,37 @@ class GoVetRequest(LintTargetsRequest):

@rule(level=LogLevel.DEBUG)
async def run_go_vet(request: GoVetRequest.Batch[GoVetFieldSet, Any]) -> LintResult:
source_files = await Get(
SourceFiles,
SourceFilesRequest(field_set.sources for field_set in request.elements),
source_files = await determine_source_files(
SourceFilesRequest(field_set.sources for field_set in request.elements)
)

owning_go_mods = await MultiGet(
Get(OwningGoMod, OwningGoModRequest(field_set.address)) for field_set in request.elements
owning_go_mods = await concurrently(
find_owning_go_mod(OwningGoModRequest(field_set.address), **implicitly())
for field_set in request.elements
)

owning_go_mod_addresses = {x.address for x in owning_go_mods}

go_mod_infos = await MultiGet(
Get(GoModInfo, GoModInfoRequest(address)) for address in owning_go_mod_addresses
go_mod_infos = await concurrently(
determine_go_mod_info(GoModInfoRequest(address)) for address in owning_go_mod_addresses
)

input_digest = await Get(
Digest,
MergeDigests([source_files.snapshot.digest, *(info.digest for info in set(go_mod_infos))]),
input_digest = await merge_digests(
MergeDigests([source_files.snapshot.digest, *(info.digest for info in set(go_mod_infos))])
)

package_dirs = sorted({os.path.dirname(f) for f in source_files.snapshot.files})

process_result = await Get(
FallibleProcessResult,
GoSdkProcess(
("vet", *(f"./{p}" for p in package_dirs)),
input_digest=input_digest,
description=f"Run `go vet` on {pluralize(len(source_files.snapshot.files), 'file')}.",
),
process_result = await execute_process(
**implicitly(
GoSdkProcess(
("vet", *(f"./{p}" for p in package_dirs)),
input_digest=input_digest,
description=f"Run `go vet` on {pluralize(len(source_files.snapshot.files), 'file')}.",
)
)
)

return LintResult.create(request, process_result)


def rules():
return [
return (
*collect_rules(),
*GoVetRequest.rules(),
]
)
Loading