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鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use the "package_name" variable to fix an UnboundLocalError. (Cherry-pick of #19433) #19452

Merged
merged 1 commit into from Jul 17, 2023

Conversation

WorkerPants
Copy link
Member

Issue

In a case where a go project is probably misconfigured, the pants run command may raise an UnboundLocalError exception, obscuring the actual reason why the run command failed.

Steps to Reproduce

For a project layout:

foo/
  src/
    go/
      foo/
        BUILD
        foo.go
  pants
  pants.toml

pants.toml:

[GLOBAL]
pants_version = "2.16.0"

backend_packages = [
  "pants.backend.experimental.go",
]

foo.go:

package foo

func main() {
	println("foo")
}

BUILD (how the file got like this is irrelevant 馃槣)

go_mod(name="foo0")
go_binary(name="foo1")
go_package(name="foo2")
$ ./pants run src/go/foo:
12:45:44.09 [INFO] Initialization options changed: reinitializing scheduler...
12:45:45.07 [INFO] Scheduler initialized.
12:45:49.78 [ERROR] 1 Exception encountered:

Engine traceback:
  in `run` goal

UnboundLocalError: local variable 'analysis' referenced before assignment

With the --print-stacktrace option:

$ ./pants --print-stacktrace run src/go/foo:foo
10:55:55.85 [INFO] waiting for pantsd to start...
10:56:00.84 [INFO] waiting for pantsd to start...
10:56:05.76 [INFO] waiting for pantsd to start...
10:56:10.76 [INFO] waiting for pantsd to start...
10:56:11.88 [INFO] pantsd started
10:56:13.10 [INFO] Initializing scheduler...
10:56:14.26 [INFO] Scheduler initialized.
10:56:15.76 [ERROR] 1 Exception encountered:

Engine traceback:
  in select
    ..
  in pants.core.goals.run.run
    `run` goal

Traceback (most recent call last):
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 623, in native_engine_generator_send
    res = rule.send(arg) if err is None else rule.throw(throw or err)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/core/goals/run.py", line 292, in run
    request = await (
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 118, in __await__
    result = yield self
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 623, in native_engine_generator_send
    res = rule.send(arg) if err is None else rule.throw(throw or err)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/backend/go/goals/run_binary.py", line 15, in create_go_binary_run_request
    binary = await Get(BuiltPackage, PackageFieldSet, field_set)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 118, in __await__
    result = yield self
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 623, in native_engine_generator_send
    res = rule.send(arg) if err is None else rule.throw(throw or err)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/backend/go/goals/package_binary.py", line 96, in package_go_binary
    f"`{field_set.address}` but uses package name `{analysis.name}` instead of `main`. Go "
UnboundLocalError: local variable 'analysis' referenced before assignment

Validation

After creating the pants_from_source script, I reran the run command with the change in this PR:

$  ./pants_from_source run src/go/foo:foo
...
11:02:56.74 [ERROR] 1 Exception encountered:

Engine traceback:
  in `run` goal

ValueError: go_package target `src/go/foo:foo2` is used as the main package for go_binary target `src/go/foo:foo` but uses package name `foo` instead of `main`. Go requires that main packages actually use `main` as the package name.

### Issue
In a case where a go project is probably misconfigured, the `pants run`
command may raise an `UnboundLocalError` exception, obscuring the actual
reason why the run command failed.

#### Steps to Reproduce
For a project layout:
```
foo/
  src/
    go/
      foo/
        BUILD
        foo.go
  pants
  pants.toml
```
pants.toml:
```toml
[GLOBAL]
pants_version = "2.16.0"

backend_packages = [
  "pants.backend.experimental.go",
]
```

foo.go:
```go
package foo

func main() {
	println("foo")
}
```

BUILD (how the file got like this is irrelevant 馃槣)
```
go_mod(name="foo0")
go_binary(name="foo1")
go_package(name="foo2")
```

```bash
$ ./pants run src/go/foo:
12:45:44.09 [INFO] Initialization options changed: reinitializing scheduler...
12:45:45.07 [INFO] Scheduler initialized.
12:45:49.78 [ERROR] 1 Exception encountered:

Engine traceback:
  in `run` goal

UnboundLocalError: local variable 'analysis' referenced before assignment
```

With the `--print-stacktrace` option:
```
$ ./pants --print-stacktrace run src/go/foo:foo
10:55:55.85 [INFO] waiting for pantsd to start...
10:56:00.84 [INFO] waiting for pantsd to start...
10:56:05.76 [INFO] waiting for pantsd to start...
10:56:10.76 [INFO] waiting for pantsd to start...
10:56:11.88 [INFO] pantsd started
10:56:13.10 [INFO] Initializing scheduler...
10:56:14.26 [INFO] Scheduler initialized.
10:56:15.76 [ERROR] 1 Exception encountered:

Engine traceback:
  in select
    ..
  in pants.core.goals.run.run
    `run` goal

Traceback (most recent call last):
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 623, in native_engine_generator_send
    res = rule.send(arg) if err is None else rule.throw(throw or err)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/core/goals/run.py", line 292, in run
    request = await (
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 118, in __await__
    result = yield self
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 623, in native_engine_generator_send
    res = rule.send(arg) if err is None else rule.throw(throw or err)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/backend/go/goals/run_binary.py", line 15, in create_go_binary_run_request
    binary = await Get(BuiltPackage, PackageFieldSet, field_set)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 118, in __await__
    result = yield self
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/engine/internals/selectors.py", line 623, in native_engine_generator_send
    res = rule.send(arg) if err is None else rule.throw(throw or err)
  File "/Users/sww/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.lrySlP/install/lib/python3.9/site-packages/pants/backend/go/goals/package_binary.py", line 96, in package_go_binary
    f"`{field_set.address}` but uses package name `{analysis.name}` instead of `main`. Go "
UnboundLocalError: local variable 'analysis' referenced before assignment
```

### Validation
After creating the `pants_from_source`
[script](https://www.pantsbuild.org/docs/running-pants-from-sources), I
reran the run command with the change in this PR:
```
$  ./pants_from_source run src/go/foo:foo
...
11:02:56.74 [ERROR] 1 Exception encountered:

Engine traceback:
  in `run` goal

ValueError: go_package target `src/go/foo:foo2` is used as the main package for go_binary target `src/go/foo:foo` but uses package name `foo` instead of `main`. Go requires that main packages actually use `main` as the package name.
@WorkerPants WorkerPants added this to the 2.16.x milestone Jul 12, 2023
@WorkerPants WorkerPants added the category:bugfix Bug fixes for released features label Jul 12, 2023
@WorkerPants WorkerPants requested a review from kaos July 12, 2023 18:14
@kaos kaos merged commit 30743c1 into 2.16.x Jul 17, 2023
25 checks passed
@kaos kaos deleted the cherry-pick-19433-to-2.16.x branch July 17, 2023 15:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
category:bugfix Bug fixes for released features
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants