提交 fd411335 编写于 作者: J Jingwen Owen Ou

Implement checkout

上级 3ee7aeec
package commands
import (
"fmt"
"github.com/jingweno/gh/git"
"github.com/jingweno/gh/github"
"github.com/jingweno/gh/utils"
"regexp"
)
var cmdCheckout = &Command{
......@@ -20,14 +23,54 @@ var cmdCheckout = &Command{
$ gh checkout https://github.com/jingweno/gh/pull/73 custom-branch-name
**/
func checkout(command *Command, args []string) {
var err error
if len(args) > 0 {
args = transformCheckoutArgs(args)
args, err = transformCheckoutArgs(args)
utils.Check(err)
}
err := git.ExecCheckout(args)
err = git.ExecCheckout(args)
utils.Check(err)
}
func transformCheckoutArgs(args []string) []string {
return nil
func transformCheckoutArgs(args []string) ([]string, error) {
id := parsePullRequestId(args[0])
if id != "" {
newArgs, url := removeItem(args, 0)
gh := github.New()
pullRequest, err := gh.PullRequest(id)
if err != nil {
return nil, err
}
user := pullRequest.User.Login
branch := pullRequest.Head.Ref
if pullRequest.Head.Repo.ID == 0 {
return nil, fmt.Errorf("%s's fork is not available anymore", user)
}
git.AddRemoteWithTrack(branch, user, url)
trackedBranch := fmt.Sprintf("%s/%s", user, branch)
var newBranchName string
if len(newArgs) > 0 {
newArgs, newBranchName = removeItem(newArgs, 0)
} else {
newBranchName = fmt.Sprintf("%s-%s", user, branch)
}
newArgs = append(newArgs, "--track", "-B", newBranchName, trackedBranch)
return newArgs, nil
}
return args, nil
}
func parsePullRequestId(url string) string {
pullURLRegex := regexp.MustCompile("https://github\\.com/.+/.+/pull/(\\d+)")
if pullURLRegex.MatchString(url) {
return pullURLRegex.FindStringSubmatch(url)[1]
}
return ""
}
package commands
import (
"github.com/bmizerany/assert"
"testing"
)
func TestParsePullRequestId(t *testing.T) {
url := "https://github.com/jingweno/gh/pull/73"
assert.Equal(t, "73", parsePullRequestId(url))
url = "https://github.com/jingweno/gh/pull/"
assert.Equal(t, "", parsePullRequestId(url))
}
......@@ -123,6 +123,12 @@ func AddRemote(name, url string) error {
return err
}
func AddRemoteWithTrack(trackedBranch, name, url string) error {
_, err := execGitCmd([]string{"remote", "add", "-f", "-t", trackedBranch, name, url})
return err
}
func ExecCheckout(args []string) error {
cmdArgs := make([]string, 0)
cmdArgs = append(cmdArgs, "checkout")
......
......@@ -18,6 +18,12 @@ type GitHub struct {
config *Config
}
func (gh *GitHub) PullRequest(id string) (*octokat.PullRequest, error) {
client := gh.client()
return client.PullRequest(gh.repo(), id)
}
func (gh *GitHub) CreatePullRequest(base, head, title, body string) (string, error) {
client := gh.client()
params := octokat.PullRequestParams{base, head, title, body}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册