tea open: allow usage outside of git repo

when called where PWD is not a repo,
first arg will be interpreted as repository slug, or a user-scope view,
eg /issues or /pulls
This commit is contained in:
Norwin Roosen 2020-09-18 22:29:54 +02:00
parent 3461d96d08
commit ba9f927d3a
3 changed files with 91 additions and 44 deletions

View File

@ -199,6 +199,7 @@ func saveConfig(ymlPath string) error {
return ioutil.WriteFile(ymlPath, bs, 0660)
}
// extracts a matching login and repo slug for a given local path or PWD
func curGitRepoPath(path string) (*Login, string, error) {
var err error
var repo *git.TeaRepo

View File

@ -100,7 +100,7 @@ func initCommand() (*Login, string, string) {
}
if exist || len(repoValue) == 0 {
login, repoValue, err = curGitRepoPath(repoValue)
login, repoValue, err = curGitRepoPath("")
if err != nil {
log.Fatal(err.Error())
}

View File

@ -7,6 +7,7 @@ package cmd
import (
"log"
"path"
"strconv"
"strings"
local_git "code.gitea.io/tea/modules/git"
@ -22,56 +23,54 @@ var CmdOpen = cli.Command{
Description: `Open something of the repository on web browser`,
Action: runOpen,
Flags: append([]cli.Flag{}, LoginRepoFlags...),
ArgsUsage: "[<owner>/<repo>] [<issue index> | issues | pulls | releases | commits | branches | wiki | activity | settings | labels | milestones]",
}
func runOpen(ctx *cli.Context) error {
login, owner, repo := initCommand()
login := initCommandLoginOnly()
arg1 := ctx.Args().Get(0)
arg2 := ctx.Args().Get(1)
owner, repo, view, index := argsToIndexOrRepo(arg1, arg2, repoValue)
var suffix string
number := ctx.Args().Get(0)
switch {
case strings.EqualFold(number, "issues"):
suffix = "issues"
case strings.EqualFold(number, "pulls"):
suffix = "pulls"
case strings.EqualFold(number, "releases"):
suffix = "releases"
case strings.EqualFold(number, "commits"):
repo, err := local_git.RepoForWorkdir()
if err != nil {
log.Fatal(err)
// if no repo specified via args / flags, try to extract from .git in PWD
if owner == "" {
l, ownerAndRepo, err := curGitRepoPath(repoValue)
if err == nil {
owner, repo = getOwnerAndRepo(ownerAndRepo, login.User)
login = l
}
b, err := repo.Head()
if err != nil {
log.Fatal(err)
return nil
}
name := b.Name()
switch {
case name.IsBranch():
suffix = "commits/branch/" + name.Short()
case name.IsTag():
suffix = "commits/tag/" + name.Short()
}
case strings.EqualFold(number, "branches"):
suffix = "branches"
case strings.EqualFold(number, "wiki"):
suffix = "wiki"
case strings.EqualFold(number, "activity"):
suffix = "activity"
case strings.EqualFold(number, "settings"):
suffix = "settings"
case strings.EqualFold(number, "labels"):
suffix = "labels"
case strings.EqualFold(number, "milestones"):
suffix = "milestones"
case number != "":
suffix = "issues/" + number
default:
suffix = number
}
u := path.Join(login.URL, owner, repo, suffix)
if owner != "" && repo != "" {
switch {
case strings.EqualFold(arg1, "issues"):
view = "issues"
case strings.EqualFold(arg1, "pulls"):
view = "pulls"
case strings.EqualFold(arg1, "releases"):
view = "releases"
case strings.EqualFold(arg1, "commits"):
view = getCommitView()
case strings.EqualFold(arg1, "branches"):
view = "branches"
case strings.EqualFold(arg1, "wiki"):
view = "wiki"
case strings.EqualFold(arg1, "activity"):
view = "activity"
case strings.EqualFold(arg1, "settings"):
view = "settings"
case strings.EqualFold(arg1, "labels"):
view = "labels"
case strings.EqualFold(arg1, "milestones"):
view = "milestones"
case index != "":
view = "issues/" + index
}
} else if index != "" {
log.Fatal("no repository specified")
}
u := path.Join(login.URL, owner, repo, view)
err := open.Start(u)
if err != nil {
log.Fatal(err)
@ -79,3 +78,50 @@ func runOpen(ctx *cli.Context) error {
return nil
}
// parses an argument either to an issue index, or a owner/repo combination
func argsToIndexOrRepo(arg1, arg2, overrideRepoSlug string) (owner, repo, view, idx string) {
owner, repo = getOwnerAndRepo(overrideRepoSlug, "")
_, err := strconv.ParseInt(arg1, 10, 64)
arg1IsIndex := err == nil
_, err = strconv.ParseInt(arg2, 10, 64)
arg2IsIndex := err == nil
if arg1IsIndex {
idx = arg1
return
} else if repo != "" {
view = arg1 // view was already provided by overrideRepoSlug, so we use arg1 as view param
} else {
owner, repo = getOwnerAndRepo(arg1, "")
}
if arg2IsIndex {
idx = arg2
} else {
view = arg2
}
return
}
func getCommitView() string {
repo, err := local_git.RepoForWorkdir()
if err != nil {
log.Fatal(err)
}
b, err := repo.Head()
if err != nil {
log.Fatal(err)
}
name := b.Name()
switch {
case name.IsBranch():
return "commits/branch/" + name.Short()
case name.IsTag():
return "commits/tag/" + name.Short()
default:
return ""
}
}