func transformRemoteArgs(args *Args) { ownerWithName := args.LastParam() owner, name, match := parseRepoNameOwner(ownerWithName) if !match { return } var err error if name == "" { name, err = utils.DirName() utils.Check(err) } isPriavte := parseRemotePrivateFlag(args) if owner == "origin" { owner = github.CurrentConfig().FetchUser() } else if args.ParamsSize() > 2 { // `git remote add jingweno foo/bar` args.RemoveParam(args.ParamsSize() - 1) } project := github.Project{Owner: owner, Name: name} url := project.GitURL(name, owner, isPriavte) args.AppendParams(url) }
func transformCloneArgs(args *Args) { isSSH := parseClonePrivateFlag(args) hasValueRegxp := regexp.MustCompile("^(--(upload-pack|template|depth|origin|branch|reference|name)|-[ubo])$") nameWithOwnerRegexp := regexp.MustCompile(NameWithOwnerRe) for i, a := range args.Params { if hasValueRegxp.MatchString(a) { continue } if nameWithOwnerRegexp.MatchString(a) && !isDir(a) { name, owner := parseCloneNameAndOwner(a) config := github.CurrentConfig() isSSH = isSSH || owner == config.User if owner == "" { owner = config.User } project := github.Project{Name: name, Owner: owner} url := project.GitURL(name, owner, isSSH) args.ReplaceParam(i, url) break } } }
/* $ gh browse > open https://github.com/YOUR_USER/CURRENT_REPO $ gh browse commit/SHA > open https://github.com/YOUR_USER/CURRENT_REPO/commit/SHA $ gh browse issues > open https://github.com/YOUR_USER/CURRENT_REPO/issues $ gh browse -p jingweno/gh > open https://github.com/jingweno/gh $ gh browse -p jingweno/gh commit/SHA > open https://github.com/jingweno/gh/commit/SHA $ gh browse -p resque > open https://github.com/YOUR_USER/resque $ gh browse -p resque network > open https://github.com/YOUR_USER/resque/network */ func browse(command *Command, args *Args) { var ( project *github.Project branch *github.Branch err error ) localRepo := github.LocalRepo() if flagBrowseProject != "" { // gh browse -p jingweno/gh // gh browse -p gh project = github.NewProject("", flagBrowseProject, "") } else { // gh browse branch, project, err = localRepo.RemoteBranchAndProject("") utils.Check(err) } if project == nil { err := fmt.Errorf(command.FormattedUsage()) utils.Check(err) } master := localRepo.MasterBranch() if branch == nil { branch = master } var subpage string if !args.IsParamsEmpty() { subpage = args.RemoveParam(0) } if subpage == "commits" { subpage = fmt.Sprintf("commits/%s", branchInURL(branch)) } else if subpage == "tree" || subpage == "" { if !reflect.DeepEqual(branch, master) && branch.IsRemote() { subpage = fmt.Sprintf("tree/%s", branchInURL(branch)) } } pageUrl := project.WebURL("", "", subpage) launcher, err := utils.BrowserLauncher() utils.Check(err) if flagBrowseURLOnly { args.Replace("echo", pageUrl) } else { args.Replace(launcher[0], "", launcher[1:]...) args.AppendParams(pageUrl) } }
func transformInitArgs(args *Args) error { if !parseInitFlag(args) { return nil } name, err := utils.DirName() if err != nil { return err } owner := github.CurrentConfig().FetchUser() project := github.Project{Owner: owner, Name: name} url := project.GitURL(name, owner, true) args.After("git", "remote", "add", "origin", url) return nil }
/* $ gh compare refactor > open https://github.com/CURRENT_REPO/compare/refactor $ gh compare 1.0..1.1 > open https://github.com/CURRENT_REPO/compare/1.0...1.1 $ gh compare -u other-user patch > open https://github.com/other-user/REPO/compare/patch */ func compare(command *Command, args *Args) { localRepo := github.LocalRepo() var ( branch *github.Branch project *github.Project r string err error ) branch, project, err = localRepo.RemoteBranchAndProject("") utils.Check(err) if args.IsParamsEmpty() { master := localRepo.MasterBranch() if master.ShortName() == branch.ShortName() { err = fmt.Errorf(command.FormattedUsage()) utils.Check(err) } else { r = branch.ShortName() } } else { r = parseCompareRange(args.RemoveParam(args.ParamsSize() - 1)) if args.IsParamsEmpty() { project, err = localRepo.CurrentProject() utils.Check(err) } else { project = github.NewProject(args.RemoveParam(args.ParamsSize()-1), "", "") } } r = strings.Replace(r, "/", ";", -1) subpage := utils.ConcatPaths("compare", r) url := project.WebURL("", "", subpage) launcher, err := utils.BrowserLauncher() utils.Check(err) if flagCompareURLOnly { args.Replace("echo", url) } else { args.Replace(launcher[0], "", launcher[1:]...) args.AppendParams(url) } }
func transformCloneArgs(args *Args) { isSSH := parseClonePrivateFlag(args) hasValueRegxp := regexp.MustCompile("^(--(upload-pack|template|depth|origin|branch|reference|name)|-[ubo])$") nameWithOwnerRegexp := regexp.MustCompile(NameWithOwnerRe) var skipNext bool for i, a := range args.Params { if skipNext { skipNext = false continue } if strings.HasPrefix(a, "-") { if hasValueRegxp.MatchString(a) { skipNext = true } continue } if github.MatchURL(a) != nil { break } if nameWithOwnerRegexp.MatchString(a) && !isDir(a) { name, owner := parseCloneNameAndOwner(a) config := github.CurrentConfig() isSSH = isSSH || args.Command != "submodule" && owner == config.User if owner == "" { owner = config.User isSSH = true } project := github.Project{Name: name, Owner: owner} url := project.GitURL(name, owner, isSSH) args.ReplaceParam(i, url) break } } }