70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package cmdutil
|
|
|
|
import (
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/cli/cli/v2/internal/ghrepo"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func executeParentHooks(cmd *cobra.Command, args []string) error {
|
|
for cmd.HasParent() {
|
|
cmd = cmd.Parent()
|
|
if cmd.PersistentPreRunE != nil {
|
|
return cmd.PersistentPreRunE(cmd, args)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func EnableRepoOverride(cmd *cobra.Command, f *Factory) {
|
|
cmd.PersistentFlags().StringP("repo", "R", "", "Select another repository using the `[HOST/]OWNER/REPO` format")
|
|
_ = cmd.RegisterFlagCompletionFunc("repo", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
|
remotes, err := f.Remotes()
|
|
if err != nil {
|
|
return nil, cobra.ShellCompDirectiveError
|
|
}
|
|
|
|
config, err := f.Config()
|
|
if err != nil {
|
|
return nil, cobra.ShellCompDirectiveError
|
|
}
|
|
defaultHost, _ := config.Authentication().DefaultHost()
|
|
|
|
var results []string
|
|
for _, remote := range remotes {
|
|
repo := remote.RepoOwner() + "/" + remote.RepoName()
|
|
if !strings.EqualFold(remote.RepoHost(), defaultHost) {
|
|
repo = remote.RepoHost() + "/" + repo
|
|
}
|
|
if strings.HasPrefix(repo, toComplete) {
|
|
results = append(results, repo)
|
|
}
|
|
}
|
|
sort.Strings(results)
|
|
return results, cobra.ShellCompDirectiveNoFileComp
|
|
})
|
|
|
|
cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {
|
|
if err := executeParentHooks(cmd, args); err != nil {
|
|
return err
|
|
}
|
|
repoOverride, _ := cmd.Flags().GetString("repo")
|
|
f.BaseRepo = OverrideBaseRepoFunc(f.BaseRepo, repoOverride)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func OverrideBaseRepoFunc(baseRepoFunc func() (ghrepo.Interface, error), override string) func() (ghrepo.Interface, error) {
|
|
if override == "" {
|
|
override = os.Getenv("GH_REPO")
|
|
}
|
|
if override != "" {
|
|
return func() (ghrepo.Interface, error) {
|
|
return ghrepo.FromFullName(override)
|
|
}
|
|
}
|
|
return baseRepoFunc
|
|
}
|