|  | 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 | 
|  | } |