in main.go [876:918]
func execRun(cmd *cobra.Command, args []string) error {
ctx, client, err := clientWithContext(cmd.Context())
if err != nil {
return misuseError(err)
}
execCmd := args[0]
execArgs := args[1:]
// Parse local env
env := os.Environ()
for i, e := range env {
p := strings.SplitN(e, "=", 2)
if len(p) < 2 {
continue
}
k, v := p[0], p[1]
if !berglas.IsReference(v) {
continue
}
s, err := client.Resolve(ctx, v)
if err != nil {
return apiError(err)
}
env[i] = fmt.Sprintf("%s=%s", k, s)
}
execCmdFull, err := exec.LookPath(execCmd)
if err != nil {
return fmt.Errorf("failed to lookup path for %q: %w", execCmd, err)
}
// Unlike os/exec, execv(3) expects the arguments to include the command.
execArgs = append([]string{execCmdFull}, execArgs...)
if err := syscall.Exec(execCmdFull, execArgs, env); err != nil {
return fmt.Errorf("failed to execute %q: %w", execCmd, err)
}
return nil
}