74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package factory
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/cli/cli/git"
|
|
"github.com/cli/cli/internal/config"
|
|
"github.com/cli/cli/internal/ghrepo"
|
|
"github.com/cli/cli/pkg/cmdutil"
|
|
"github.com/cli/cli/pkg/iostreams"
|
|
)
|
|
|
|
func New(appVersion string) *cmdutil.Factory {
|
|
io := iostreams.System()
|
|
|
|
var cachedConfig config.Config
|
|
var configError error
|
|
configFunc := func() (config.Config, error) {
|
|
if cachedConfig != nil || configError != nil {
|
|
return cachedConfig, configError
|
|
}
|
|
cachedConfig, configError = config.ParseDefaultConfig()
|
|
if errors.Is(configError, os.ErrNotExist) {
|
|
cachedConfig = config.NewBlankConfig()
|
|
configError = nil
|
|
}
|
|
cachedConfig = config.InheritEnv(cachedConfig)
|
|
return cachedConfig, configError
|
|
}
|
|
|
|
rr := &remoteResolver{
|
|
readRemotes: git.Remotes,
|
|
getConfig: configFunc,
|
|
}
|
|
remotesFunc := rr.Resolver()
|
|
|
|
ghExecutable := "gh"
|
|
if exe, err := os.Executable(); err == nil {
|
|
ghExecutable = exe
|
|
}
|
|
|
|
return &cmdutil.Factory{
|
|
IOStreams: io,
|
|
Config: configFunc,
|
|
Remotes: remotesFunc,
|
|
HttpClient: func() (*http.Client, error) {
|
|
cfg, err := configFunc()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return NewHTTPClient(io, cfg, appVersion, true), nil
|
|
},
|
|
BaseRepo: func() (ghrepo.Interface, error) {
|
|
remotes, err := remotesFunc()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return remotes[0], nil
|
|
},
|
|
Branch: func() (string, error) {
|
|
currentBranch, err := git.CurrentBranch()
|
|
if err != nil {
|
|
return "", fmt.Errorf("could not determine current branch: %w", err)
|
|
}
|
|
return currentBranch, nil
|
|
},
|
|
Executable: ghExecutable,
|
|
Browser: cmdutil.NewBrowser(os.Getenv("BROWSER"), io.Out, io.ErrOut),
|
|
}
|
|
}
|