// setPathHelper is a utility function for setting path environment // variables for different types of workspaces. func setPathHelper(ctx *tool.Context, env *envvar.Vars, name, root string, workspaces []string, suffix string) error { path := env.GetTokens(name, ":") projects, _, err := project.ReadManifest(ctx) if err != nil { return err } for _, workspace := range workspaces { absWorkspace := filepath.Join(root, workspace, suffix) // Only append an entry to the path if the workspace is rooted // under a jiri project that exists locally or vice versa. for _, project := range projects { // We check if <project.Path> is a prefix of <absWorkspace> to // account for Go workspaces nested under a single jiri project, // such as: $JIRI_ROOT/release/projects/chat/go. // // We check if <absWorkspace> is a prefix of <project.Path> to // account for Go workspaces that span multiple jiri projects, // such as: $JIRI_ROOT/release/go. if strings.HasPrefix(absWorkspace, project.Path) || strings.HasPrefix(project.Path, absWorkspace) { if _, err := ctx.Run().Stat(filepath.Join(absWorkspace)); err == nil { path = append(path, absWorkspace) break } } } } env.SetTokens(name, path, ":") return nil }
func runRebuild(env *cmdline.Env, args []string) (e error) { ctx := tool.NewContextFromEnv(env) _, tools, err := project.ReadManifest(ctx) if err != nil { return err } // Create a temporary directory in which tools will be built. tmpDir, err := ctx.Run().TempDir("", "tmp-jiri-rebuild") if err != nil { return fmt.Errorf("TempDir() failed: %v", err) } // Make sure we cleanup the temp directory. defer collect.Error(func() error { return ctx.Run().RemoveAll(tmpDir) }, &e) // Paranoid sanity checking. if _, ok := tools[project.JiriName]; !ok { return fmt.Errorf("tool %q not found", project.JiriName) } // Build and install tools. if err := project.BuildTools(ctx, tools, tmpDir); err != nil { return err } return project.InstallTools(ctx, tmpDir) }
// NewConfigHelper creates a new config helper. If filename is of non-zero // length then that file will be read as a profiles manifest file, if not, the // existing, if any, in-memory profiles information will be used. If SkipProfiles // is specified for profilesMode, then no profiles are used. func NewConfigHelper(ctx *tool.Context, profilesMode ProfilesMode, filename string) (*ConfigHelper, error) { root, err := project.JiriRoot() if err != nil { return nil, err } config, err := util.LoadConfig(ctx) if err != nil { return nil, err } projects, tools, err := project.ReadManifest(ctx) if err != nil { return nil, err } if profilesMode == UseProfiles && len(filename) > 0 { if err := Read(ctx, filepath.Join(root, filename)); err != nil { return nil, err } } ch := &ConfigHelper{ ctx: ctx, root: root, config: config, projects: projects, tools: tools, profilesMode: bool(profilesMode), } ch.Vars = envvar.VarsFromOS() if profilesMode == SkipProfiles { return ch, nil } ch.legacyMode = (SchemaVersion() == Original) || (len(os.Getenv("JIRI_PROFILE")) > 0) if ch.legacyMode { vars, err := util.JiriLegacyEnvironment(ch.ctx) if err != nil { return nil, err } ch.Vars = vars } return ch, nil }