// Parse commits from commitish string, populating a CommitRange. If a // single commit is matched, it is paired with its first parent commit // or resolves to an error // // return result.Result<*git.Commit, error> func ResolveCommits(repo *git.Repository, commitish string) result.Result { return result.NewResult(repo.Revparse(commitish)).FlatMap(func(value interface{}) result.Result { spec := value.(*git.Revspec) return resolveCommit(repo, spec.From()).FlatMap(func(f interface{}) result.Result { fromCommit := f.(*git.Commit) return resolveCommit(repo, spec.To()).Analysis(func(t interface{}) result.Result { toCommit := t.(*git.Commit) return result.NewSuccess(&CommitRange{fromCommit, toCommit}) }, func(err error) result.Result { return resolveCommitParent(fromCommit).FlatMap(func(parent interface{}) result.Result { return result.NewSuccess(&CommitRange{parent.(*git.Commit), fromCommit}) }) }) }) }) }