func runProjectShellPrompt(jirix *jiri.X, args []string) error { states, err := project.GetProjectStates(jirix, checkDirtyFlag) if err != nil { return err } var keys project.ProjectKeys for key := range states { keys = append(keys, key) } sort.Sort(keys) // Get the key of the current project. currentProjectKey, err := project.CurrentProjectKey(jirix) if err != nil { return err } var statuses []string for _, key := range keys { state := states[key] status := "" if checkDirtyFlag { if state.HasUncommitted { status += "*" } if state.HasUntracked { status += "%" } } short := state.CurrentBranch + status long := filepath.Base(states[key].Project.Name) + ":" + short if key == currentProjectKey { if showNameFlag { statuses = append([]string{long}, statuses...) } else { statuses = append([]string{short}, statuses...) } } else { pristine := state.CurrentBranch == "master" if checkDirtyFlag { pristine = pristine && !state.HasUncommitted && !state.HasUntracked } if !pristine { statuses = append(statuses, long) } } } fmt.Println(strings.Join(statuses, ",")) return nil }
// runProjectInfo provides structured info on local projects. func runProjectInfo(jirix *jiri.X, args []string) error { tmpl, err := template.New("info").Parse(formatFlag) if err != nil { return fmt.Errorf("failed to parse template %q: %v", formatFlag, err) } regexps := []*regexp.Regexp{} if len(args) > 0 { regexps = make([]*regexp.Regexp, len(args), len(args)) for i, a := range args { re, err := regexp.Compile(a) if err != nil { return fmt.Errorf("failed to compile regexp %v: %v", a, err) } regexps[i] = re } } dirty := false for _, slow := range []string{"HasUncommitted", "HasUntracked"} { if strings.Contains(formatFlag, slow) { dirty = true break } } var states map[project.ProjectKey]*project.ProjectState var keys project.ProjectKeys if len(args) == 0 { currentProjectKey, err := project.CurrentProjectKey(jirix) if err != nil { return err } state, err := project.GetProjectState(jirix, currentProjectKey, true) if err != nil { // jiri was run from outside of a project so let's // use all available projects. states, err = project.GetProjectStates(jirix, dirty) if err != nil { return err } for key := range states { keys = append(keys, key) } } else { states = map[project.ProjectKey]*project.ProjectState{ currentProjectKey: state, } keys = append(keys, currentProjectKey) } } else { var err error states, err = project.GetProjectStates(jirix, dirty) if err != nil { return err } for key := range states { for _, re := range regexps { if re.MatchString(string(key)) { keys = append(keys, key) break } } } } sort.Sort(keys) for _, key := range keys { state := states[key] out := &bytes.Buffer{} if err = tmpl.Execute(out, state); err != nil { return jirix.UsageErrorf("invalid format") } fmt.Fprintln(jirix.Stdout(), out.String()) } return nil }