// InstallTools installs the tools from the given directory into // $JIRI_ROOT/devtools/bin. func InstallTools(ctx *tool.Context, dir string) error { ctx.TimerPush("install tools") defer ctx.TimerPop() if ctx.DryRun() { // In "dry run" mode, no binaries are built. return nil } binDir, err := ToAbs(devtoolsBinDir) if err != nil { return err } fis, err := ioutil.ReadDir(dir) if err != nil { return fmt.Errorf("ReadDir(%v) failed: %v", dir, err) } failed := false for _, fi := range fis { installFn := func() error { src := filepath.Join(dir, fi.Name()) dst := filepath.Join(binDir, fi.Name()) if err := ctx.Run().Rename(src, dst); err != nil { return err } return nil } opts := runutil.Opts{Verbose: true} if err := ctx.Run().FunctionWithOpts(opts, installFn, "install tool %q", fi.Name()); err != nil { fmt.Fprintf(ctx.Stderr(), "%v\n", err) failed = true } } if failed { return cmdline.ErrExitCode(2) } // Delete old "v23" tool, and the old jiri-xprofile command. // TODO(nlacasse): Once everybody has had a chance to update, remove this // code. v23SubCmds := []string{ "jiri-xprofile", "v23", } for _, subCmd := range v23SubCmds { subCmdPath := filepath.Join(binDir, subCmd) if err := ctx.Run().RemoveAll(subCmdPath); err != nil { return err } } return nil }