| package main |
| |
| import ( |
| "fmt" |
| |
| "go.starlark.net/starlark" |
| ) |
| |
| // getBazelDNFFiles parses third_party/sandboxroot/repositories.bzl (at the given |
| // path) into a list of rpmDefs. It does so by loading the .bzl file into a |
| // minimal starlark interpreter that emulates enough of the Bazel internal API to |
| // get things going. |
| func getBazelDNFFiles(path string) ([]*rpmDef, error) { |
| var res []*rpmDef |
| |
| // rpm will be called any time the Starlark code calls rpm() from |
| // @bazeldnf//:deps.bzl. |
| rpm := func(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { |
| var name, sha256 starlark.String |
| var urls *starlark.List |
| if err := starlark.UnpackArgs("rpm", args, kwargs, "name", &name, "sha256", &sha256, "urls", &urls); err != nil { |
| return nil, err |
| } |
| it := urls.Iterate() |
| defer it.Done() |
| |
| var urlsS []string |
| var url starlark.Value |
| for it.Next(&url) { |
| if url.Type() != "string" { |
| return nil, fmt.Errorf("urls must be a list of strings") |
| } |
| urlS := url.(starlark.String) |
| urlsS = append(urlsS, urlS.GoString()) |
| } |
| |
| ext, err := newRPMDef(name.GoString(), sha256.GoString(), urlsS) |
| if err != nil { |
| return nil, fmt.Errorf("invalid rpm: %v", err) |
| } |
| res = append(res, ext) |
| return starlark.None, nil |
| } |
| |
| thread := &starlark.Thread{ |
| Name: "fakebazel", |
| Load: func(thread *starlark.Thread, module string) (starlark.StringDict, error) { |
| switch module { |
| case "@bazeldnf//:deps.bzl": |
| return map[string]starlark.Value{ |
| "rpm": starlark.NewBuiltin("rpm", rpm), |
| }, nil |
| } |
| return nil, fmt.Errorf("not implemented in fakebazel") |
| }, |
| } |
| globals, err := starlark.ExecFile(thread, path, nil, nil) |
| if err != nil { |
| return nil, fmt.Errorf("executing failed: %w", err) |
| } |
| if !globals.Has("sandbox_dependencies") { |
| return nil, fmt.Errorf("does not contain sandbox_dupendencies") |
| } |
| _, err = starlark.Call(thread, globals["sandbox_dependencies"], nil, nil) |
| if err != nil { |
| return nil, fmt.Errorf("failed to call sandbox_dependencies: %w", err) |
| } |
| return res, nil |
| } |