128 lines
3 KiB
Go
128 lines
3 KiB
Go
package shared
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/cli/cli/v2/internal/ghrepo"
|
|
"github.com/cli/cli/v2/pkg/cmdutil"
|
|
)
|
|
|
|
type RulesetGraphQL struct {
|
|
DatabaseId int
|
|
Name string
|
|
Target string
|
|
Enforcement string
|
|
Source struct {
|
|
TypeName string `json:"__typename"`
|
|
Owner string
|
|
}
|
|
Rules struct {
|
|
TotalCount int
|
|
}
|
|
}
|
|
|
|
type RulesetREST struct {
|
|
Id int
|
|
Name string
|
|
Target string
|
|
Enforcement string
|
|
CurrentUserCanBypass string `json:"current_user_can_bypass"`
|
|
BypassActors []struct {
|
|
ActorId int `json:"actor_id"`
|
|
ActorType string `json:"actor_type"`
|
|
BypassMode string `json:"bypass_mode"`
|
|
} `json:"bypass_actors"`
|
|
Conditions map[string]map[string]interface{}
|
|
SourceType string `json:"source_type"`
|
|
Source string
|
|
Rules []RulesetRule
|
|
Links struct {
|
|
Html struct {
|
|
Href string
|
|
}
|
|
} `json:"_links"`
|
|
}
|
|
|
|
type RulesetRule struct {
|
|
Type string
|
|
Parameters map[string]interface{}
|
|
RulesetSourceType string `json:"ruleset_source_type"`
|
|
RulesetSource string `json:"ruleset_source"`
|
|
RulesetId int `json:"ruleset_id"`
|
|
}
|
|
|
|
// Returns the source of the ruleset in the format "owner/name (repo)" or "owner (org)"
|
|
func RulesetSource(rs RulesetGraphQL) string {
|
|
var level string
|
|
if rs.Source.TypeName == "Repository" {
|
|
level = "repo"
|
|
} else if rs.Source.TypeName == "Organization" {
|
|
level = "org"
|
|
} else {
|
|
level = "unknown"
|
|
}
|
|
|
|
return fmt.Sprintf("%s (%s)", rs.Source.Owner, level)
|
|
}
|
|
|
|
func ParseRulesForDisplay(rules []RulesetRule) string {
|
|
var display strings.Builder
|
|
|
|
// sort keys for consistent responses
|
|
sort.SliceStable(rules, func(i, j int) bool {
|
|
return rules[i].Type < rules[j].Type
|
|
})
|
|
|
|
for _, rule := range rules {
|
|
display.WriteString(fmt.Sprintf("- %s", rule.Type))
|
|
|
|
if len(rule.Parameters) > 0 {
|
|
display.WriteString(": ")
|
|
|
|
// sort these keys too for consistency
|
|
params := make([]string, 0, len(rule.Parameters))
|
|
for p := range rule.Parameters {
|
|
params = append(params, p)
|
|
}
|
|
sort.Strings(params)
|
|
|
|
for _, n := range params {
|
|
display.WriteString(fmt.Sprintf("[%s: %v] ", n, rule.Parameters[n]))
|
|
}
|
|
}
|
|
|
|
// ruleset source info is only returned from the "get rules for a branch" endpoint
|
|
if rule.RulesetSource != "" {
|
|
display.WriteString(
|
|
fmt.Sprintf(
|
|
"\n (configured in ruleset %d from %s %s)\n",
|
|
rule.RulesetId,
|
|
strings.ToLower(rule.RulesetSourceType),
|
|
rule.RulesetSource,
|
|
),
|
|
)
|
|
}
|
|
|
|
display.WriteString("\n")
|
|
}
|
|
|
|
return display.String()
|
|
}
|
|
|
|
func NoRulesetsFoundError(orgOption string, repoI ghrepo.Interface, includeParents bool) error {
|
|
entityName := EntityName(orgOption, repoI)
|
|
parentsMsg := ""
|
|
if includeParents {
|
|
parentsMsg = " or its parents"
|
|
}
|
|
return cmdutil.NewNoResultsError(fmt.Sprintf("no rulesets found in %s%s", entityName, parentsMsg))
|
|
}
|
|
|
|
func EntityName(orgOption string, repoI ghrepo.Interface) string {
|
|
if orgOption != "" {
|
|
return orgOption
|
|
}
|
|
return ghrepo.FullName(repoI)
|
|
}
|