func runUpdate(jirix *jiri.X, _ []string) error { seq := jirix.NewSeq() // Create the $JIRI_ROOT/.jiri_root directory if it doesn't already exist. // // TODO(toddw): Remove this logic after the transition to .jiri_root is done. // The bootstrapping logic should create this directory, and jiri should fail // if the directory doesn't exist. if err := seq.MkdirAll(jirix.RootMetaDir(), 0755).Done(); err != nil { return err } // Update all projects to their latest version. // Attempt <attemptsFlag> times before failing. updateFn := func() error { return project.UpdateUniverse(jirix, gcFlag) } if err := retry.Function(jirix.Context, updateFn, retry.AttemptsOpt(attemptsFlag)); err != nil { return err } if err := project.WriteUpdateHistorySnapshot(jirix, ""); err != nil { return err } // Only attempt the bin dir transition after the update has succeeded, to // avoid messy partial states. return project.TransitionBinDir(jirix) }
func testTransitionBinDir(jirix *jiri.X, test binDirTest) (e error) { oldDir, newDir := filepath.Join(jirix.Root, "devtools", "bin"), jirix.BinDir() // The new bin dir always exists. if err := os.MkdirAll(newDir, 0777); err != nil { return fmt.Errorf("make new dir failed: %v", err) } if err := test.Setup(oldDir, newDir); err != nil { return fmt.Errorf("setup failed: %v", err) } if test.Teardown != nil { defer func() { if err := test.Teardown(oldDir, newDir); err != nil && e == nil { e = fmt.Errorf("teardown failed: %v", err) } }() } oldInfo, _ := os.Stat(oldDir) switch err := project.TransitionBinDir(jirix); { case err != nil && test.Error == "": return fmt.Errorf("got error %q, want success", err) case err != nil && !strings.Contains(fmt.Sprint(err), test.Error): return fmt.Errorf("got error %q, want prefix %q", err, test.Error) case err == nil && test.Error != "": return fmt.Errorf("got no error, want %q", test.Error) case err == nil && test.Error == "": // Make sure the symlink exists and is correctly linked. link, err := os.Readlink(oldDir) if err != nil { return fmt.Errorf("old dir isn't a symlink: %v", err) } if got, want := link, newDir; got != want { return fmt.Errorf("old dir symlink got %v, want %v", got, want) } if test.CheckBackup { // Make sure the oldDir was backed up correctly. backupDir := filepath.Join(jirix.RootMetaDir(), "bin.BACKUP") backupInfo, err := os.Stat(backupDir) if err != nil { return fmt.Errorf("stat backup dir failed: %v", err) } if !os.SameFile(oldInfo, backupInfo) { return fmt.Errorf("old dir wasn't backed up correctly") } } } return nil }