pkg/providers/ghcli.go (94 lines of code) (raw):
package providers
import (
"fmt"
"strings"
log "github.com/sirupsen/logrus"
)
type SubLabel struct {
ID string `json:"id"`
Name string `json:"name"`
}
// EnsureGhCliInstalled ensures that the Github CLI is installed and the user is logged in
func (gh GhCliClient) EnsureGhCli() {
gh.EnsureGhCliInstalled()
gh.EnsureGhCliLoggedIn()
}
type GhClient interface {
EnsureGhCli()
EnsureGhCliLoggedIn()
IsLoggedInToGh() bool
LogInToGh() error
IsValidGhRepo(repo string) error
GetRepoNameWithOwner() (string, error)
}
var _ GhClient = &GhCliClient{}
type GhCliClient struct {
CommandRunner CommandRunner
}
func NewGhClient() *GhCliClient {
gh := &GhCliClient{
CommandRunner: &DefaultCommandRunner{},
}
gh.EnsureGhCli()
return gh
}
func (gh GhCliClient) exec(args ...string) (string, error) {
return gh.CommandRunner.RunCommand(args...)
}
func (gh GhCliClient) EnsureGhCliInstalled() {
log.Debug("Checking that github cli is installed...")
_, err := gh.exec("gh")
if err != nil {
log.Fatal("Error: The github cli is required to complete this process. Find installation instructions at this link: https://github.com/cli/cli#installation")
}
log.Debug("Github cli found!")
}
func (gh GhCliClient) EnsureGhCliLoggedIn() {
gh.EnsureGhCliInstalled()
if !gh.IsLoggedInToGh() {
if err := gh.LogInToGh(); err != nil {
log.Fatal("Error: unable to log in to github")
}
}
}
func (gh GhCliClient) IsLoggedInToGh() bool {
log.Debug("Checking that user is logged in to github...")
out, err := gh.exec("gh", "auth", "status")
if err != nil {
fmt.Print(string(out))
return false
}
log.Debug("User is logged in!")
return true
}
func (gh GhCliClient) LogInToGh() error {
log.Debug("Logging user in to github...")
_, err := gh.exec("gh", "auth", "login")
if err != nil {
return err
}
return nil
}
func (gh GhCliClient) IsValidGhRepo(repo string) error {
_, err := gh.exec("gh", "repo", "view", repo)
if err != nil {
log.Debug("Github repo " + repo + "not found")
return err
}
return nil
}
func (gh GhCliClient) GetRepoNameWithOwner() (string, error) {
repoNameWithOwner := ""
out, err := gh.exec("gh", "repo", "view", "--json", "nameWithOwner", "-q", ".nameWithOwner")
if err != nil {
log.Fatal("getting github repo name with owner")
return repoNameWithOwner, err
}
if out == "" {
log.Fatal("github repo name empty from gh cli")
return repoNameWithOwner, fmt.Errorf("github repo name empty from gh cli")
}
repoNameWithOwner = string(out)
repoNameWithOwner = strings.TrimSpace(repoNameWithOwner)
log.Debug("retrieved repoNameWithOwner from gh cli: ", repoNameWithOwner)
return repoNameWithOwner, nil
}