// ListTags returns the list of all release tags, sorted by the versions they represent. func ListTags() (tags []string, err error) { var task = "Get release tags" // Get all release tags. stdout, err := git.RunCommand("tag", "--list", "v*.*.*") if err != nil { return nil, errs.NewError(task, err) } // Parse the output to get sortable versions. var vers []*version.Version scanner := bufio.NewScanner(stdout) for scanner.Scan() { line := scanner.Text() if line == "" { continue } line = line[1:] // strip "v" ver, _ := version.Parse(line) vers = append(vers, ver) } if err := scanner.Err(); err != nil { return nil, errs.NewError(task, err) } // Sort the versions. sort.Sort(version.Versions(vers)) // Convert versions back to tag names and return. tgs := make([]string, 0, len(vers)) for _, ver := range vers { tgs = append(tgs, "v"+ver.String()) } return tgs, nil }
func SetForBranch(ver *Version, branch string) (act action.Action, err error) { var mainTask = fmt.Sprintf("Bump version to %v for branch '%v'", ver, branch) // Make sure the repository is clean (don't check untracked files). task := "Make sure the repository is clean" if err := git.EnsureCleanWorkingTree(false); err != nil { return nil, errs.NewError(task, err) } // Remember the current branch. currentBranch, err := git.CurrentBranch() if err != nil { return nil, err } // Remember the current position of the target branch. task = fmt.Sprintf("Remember the position of branch '%v'", branch) originalPosition, err := git.Hexsha("refs/heads/" + branch) if err != nil { return nil, errs.NewError(task, err) } // Checkout the target branch. task = fmt.Sprintf("Checkout branch '%v'", branch) if err := git.Checkout(branch); err != nil { return nil, errs.NewError(task, err) } defer func() { // Checkout the original branch on return. task := fmt.Sprintf("Checkout branch '%v'", currentBranch) if ex := git.Checkout(currentBranch); ex != nil { if err == nil { err = ex } else { errs.LogError(task, ex) } } }() // Set the project version to the desired value. if err := Set(ver); err != nil { if ex, ok := err.(*scripts.ErrNotFound); ok { return nil, fmt.Errorf( "custom SalsaFlow script '%v' not found on branch '%v'", ex.ScriptName(), branch) } return nil, err } // Commit changes. _, err = git.RunCommand("commit", "-a", "-m", fmt.Sprintf("Bump version to %v", ver), "-m", fmt.Sprintf("Story-Id: %v", git.StoryIdUnassignedTagValue)) if err != nil { task := "Reset the working tree to the original state" if err := git.Reset("--keep"); err != nil { errs.LogError(task, err) } return nil, err } return action.ActionFunc(func() (err error) { // On rollback, reset the target branch to the original position. log.Rollback(mainTask) return git.ResetKeep(branch, originalPosition) }), nil }