108 lines
2.4 KiB
Go
108 lines
2.4 KiB
Go
package featuredetection
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/cli/cli/v2/api"
|
|
"github.com/cli/cli/v2/internal/ghinstance"
|
|
graphql "github.com/cli/shurcooL-graphql"
|
|
)
|
|
|
|
type Detector interface {
|
|
IssueFeatures() (IssueFeatures, error)
|
|
PullRequestFeatures() (PullRequestFeatures, error)
|
|
RepositoryFeatures() (RepositoryFeatures, error)
|
|
}
|
|
|
|
type IssueFeatures struct{}
|
|
|
|
var allIssueFeatures = IssueFeatures{}
|
|
|
|
type PullRequestFeatures struct {
|
|
ReviewDecision bool
|
|
StatusCheckRollup bool
|
|
BranchProtectionRule bool
|
|
}
|
|
|
|
var allPullRequestFeatures = PullRequestFeatures{
|
|
ReviewDecision: true,
|
|
StatusCheckRollup: true,
|
|
BranchProtectionRule: true,
|
|
}
|
|
|
|
type RepositoryFeatures struct {
|
|
IssueTemplateMutation bool
|
|
IssueTemplateQuery bool
|
|
PullRequestTemplateQuery bool
|
|
}
|
|
|
|
var allRepositoryFeatures = RepositoryFeatures{
|
|
IssueTemplateMutation: true,
|
|
IssueTemplateQuery: true,
|
|
PullRequestTemplateQuery: true,
|
|
}
|
|
|
|
type detector struct {
|
|
host string
|
|
httpClient *http.Client
|
|
}
|
|
|
|
func NewDetector(httpClient *http.Client, host string) Detector {
|
|
cachedClient := api.NewCachedClient(httpClient, time.Hour*48)
|
|
return &detector{
|
|
httpClient: cachedClient,
|
|
host: host,
|
|
}
|
|
}
|
|
|
|
func (d *detector) IssueFeatures() (IssueFeatures, error) {
|
|
if !ghinstance.IsEnterprise(d.host) {
|
|
return allIssueFeatures, nil
|
|
}
|
|
|
|
return allIssueFeatures, nil
|
|
}
|
|
|
|
func (d *detector) PullRequestFeatures() (PullRequestFeatures, error) {
|
|
if !ghinstance.IsEnterprise(d.host) {
|
|
return allPullRequestFeatures, nil
|
|
}
|
|
|
|
return allPullRequestFeatures, nil
|
|
}
|
|
|
|
func (d *detector) RepositoryFeatures() (RepositoryFeatures, error) {
|
|
if !ghinstance.IsEnterprise(d.host) {
|
|
return allRepositoryFeatures, nil
|
|
}
|
|
|
|
features := RepositoryFeatures{
|
|
IssueTemplateQuery: true,
|
|
IssueTemplateMutation: true,
|
|
}
|
|
|
|
var featureDetection struct {
|
|
Repository struct {
|
|
Fields []struct {
|
|
Name string
|
|
} `graphql:"fields(includeDeprecated: true)"`
|
|
} `graphql:"Repository: __type(name: \"Repository\")"`
|
|
}
|
|
|
|
gql := graphql.NewClient(ghinstance.GraphQLEndpoint(d.host), d.httpClient)
|
|
|
|
err := gql.QueryNamed(context.Background(), "Repository_fields", &featureDetection, nil)
|
|
if err != nil {
|
|
return features, err
|
|
}
|
|
|
|
for _, field := range featureDetection.Repository.Fields {
|
|
if field.Name == "pullRequestTemplates" {
|
|
features.PullRequestTemplateQuery = true
|
|
}
|
|
}
|
|
|
|
return features, nil
|
|
}
|