Extract logic into helper function
This commit is contained in:
parent
a542011cdc
commit
29371e9491
2 changed files with 133 additions and 38 deletions
|
|
@ -89,16 +89,6 @@ type EditRepositoryInput struct {
|
|||
Visibility *string `json:"visibility,omitempty"`
|
||||
}
|
||||
|
||||
type SecurityAndAnalysisInput struct {
|
||||
EnableAdvancedSecurity *SecurityAndAnalysisStatus `json:"advanced_security,omitempty"`
|
||||
EnableSecretScanning *SecurityAndAnalysisStatus `json:"secret_scanning,omitempty"`
|
||||
EnableSecretScanningPushProtection *SecurityAndAnalysisStatus `json:"secret_scanning_push_protection,omitempty"`
|
||||
}
|
||||
|
||||
type SecurityAndAnalysisStatus struct {
|
||||
Status *string `json:"status,omitempty"`
|
||||
}
|
||||
|
||||
func NewCmdEdit(f *cmdutil.Factory, runF func(options *EditOptions) error) *cobra.Command {
|
||||
opts := &EditOptions{
|
||||
IO: f.IOStreams,
|
||||
|
|
@ -172,6 +162,18 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(options *EditOptions) error) *cobr
|
|||
return cmdutil.FlagErrorf("use of --visibility flag requires --accept-visibility-change-consequences flag")
|
||||
}
|
||||
|
||||
if hasSecurityEdits(opts.Edits) {
|
||||
apiClient := api.NewClientFromHTTP(opts.HTTPClient)
|
||||
repo, err := api.FetchRepository(apiClient, opts.Repository, []string{"viewerCanAdminister"})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !repo.ViewerCanAdminister {
|
||||
return fmt.Errorf("you do not have sufficient permissions to edit repository security and analysis features")
|
||||
}
|
||||
opts.Edits.SecurityAndAnalysis = transformSecurityAndAnalysisOpts(opts)
|
||||
}
|
||||
|
||||
if runF != nil {
|
||||
return runF(opts)
|
||||
}
|
||||
|
|
@ -258,34 +260,6 @@ func editRun(ctx context.Context, opts *EditOptions) error {
|
|||
}
|
||||
}
|
||||
|
||||
if hasSecurityEdits(opts.Edits) {
|
||||
apiClient := api.NewClientFromHTTP(opts.HTTPClient)
|
||||
repo, err := api.FetchRepository(apiClient, opts.Repository, []string{"viewerCanAdminister"})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !repo.ViewerCanAdminister {
|
||||
return fmt.Errorf("you do not have sufficient permissions to edit repository security and analysis features")
|
||||
}
|
||||
|
||||
opts.Edits.SecurityAndAnalysis = &SecurityAndAnalysisInput{}
|
||||
if opts.Edits.enableAdvancedSecurity != nil {
|
||||
opts.Edits.SecurityAndAnalysis.EnableAdvancedSecurity = &SecurityAndAnalysisStatus{
|
||||
Status: boolToStatus(*opts.Edits.enableAdvancedSecurity),
|
||||
}
|
||||
}
|
||||
if opts.Edits.enableSecretScanning != nil {
|
||||
opts.Edits.SecurityAndAnalysis.EnableSecretScanning = &SecurityAndAnalysisStatus{
|
||||
Status: boolToStatus(*opts.Edits.enableSecretScanning),
|
||||
}
|
||||
}
|
||||
if opts.Edits.enableSecretScanningPushProtection != nil {
|
||||
opts.Edits.SecurityAndAnalysis.EnableSecretScanningPushProtection = &SecurityAndAnalysisStatus{
|
||||
Status: boolToStatus(*opts.Edits.enableSecretScanningPushProtection),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
apiPath := fmt.Sprintf("repos/%s/%s", repo.RepoOwner(), repo.RepoName())
|
||||
|
||||
body := &bytes.Buffer{}
|
||||
|
|
@ -620,3 +594,35 @@ func boolToStatus(status bool) *string {
|
|||
func hasSecurityEdits(edits EditRepositoryInput) bool {
|
||||
return edits.enableAdvancedSecurity != nil || edits.enableSecretScanning != nil || edits.enableSecretScanningPushProtection != nil
|
||||
}
|
||||
|
||||
type SecurityAndAnalysisInput struct {
|
||||
EnableAdvancedSecurity *SecurityAndAnalysisStatus `json:"advanced_security,omitempty"`
|
||||
EnableSecretScanning *SecurityAndAnalysisStatus `json:"secret_scanning,omitempty"`
|
||||
EnableSecretScanningPushProtection *SecurityAndAnalysisStatus `json:"secret_scanning_push_protection,omitempty"`
|
||||
}
|
||||
|
||||
type SecurityAndAnalysisStatus struct {
|
||||
Status *string `json:"status,omitempty"`
|
||||
}
|
||||
|
||||
// Transform security and analysis parameters to properly serialize EditRepositoryInput
|
||||
// See API Docs: https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#update-a-repository
|
||||
func transformSecurityAndAnalysisOpts(opts *EditOptions) *SecurityAndAnalysisInput {
|
||||
securityOptions := &SecurityAndAnalysisInput{}
|
||||
if opts.Edits.enableAdvancedSecurity != nil {
|
||||
securityOptions.EnableAdvancedSecurity = &SecurityAndAnalysisStatus{
|
||||
Status: boolToStatus(*opts.Edits.enableAdvancedSecurity),
|
||||
}
|
||||
}
|
||||
if opts.Edits.enableSecretScanning != nil {
|
||||
securityOptions.EnableSecretScanning = &SecurityAndAnalysisStatus{
|
||||
Status: boolToStatus(*opts.Edits.enableSecretScanning),
|
||||
}
|
||||
}
|
||||
if opts.Edits.enableSecretScanningPushProtection != nil {
|
||||
securityOptions.EnableSecretScanningPushProtection = &SecurityAndAnalysisStatus{
|
||||
Status: boolToStatus(*opts.Edits.enableSecretScanningPushProtection),
|
||||
}
|
||||
}
|
||||
return securityOptions
|
||||
}
|
||||
|
|
|
|||
|
|
@ -700,6 +700,95 @@ func Test_editRun_interactive(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func Test_transformSecurityAndAnalysisOpts(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
opts EditOptions
|
||||
want *SecurityAndAnalysisInput
|
||||
}{
|
||||
{
|
||||
name: "Enable all security and analysis settings",
|
||||
opts: EditOptions{
|
||||
Edits: EditRepositoryInput{
|
||||
enableAdvancedSecurity: bp(true),
|
||||
enableSecretScanning: bp(true),
|
||||
enableSecretScanningPushProtection: bp(true),
|
||||
},
|
||||
},
|
||||
want: &SecurityAndAnalysisInput{
|
||||
EnableAdvancedSecurity: &SecurityAndAnalysisStatus{
|
||||
Status: sp("enabled"),
|
||||
},
|
||||
EnableSecretScanning: &SecurityAndAnalysisStatus{
|
||||
Status: sp("enabled"),
|
||||
},
|
||||
EnableSecretScanningPushProtection: &SecurityAndAnalysisStatus{
|
||||
Status: sp("enabled"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Disable all security and analysis settings",
|
||||
opts: EditOptions{
|
||||
Edits: EditRepositoryInput{
|
||||
enableAdvancedSecurity: bp(false),
|
||||
enableSecretScanning: bp(false),
|
||||
enableSecretScanningPushProtection: bp(false),
|
||||
},
|
||||
},
|
||||
want: &SecurityAndAnalysisInput{
|
||||
EnableAdvancedSecurity: &SecurityAndAnalysisStatus{
|
||||
Status: sp("disabled"),
|
||||
},
|
||||
EnableSecretScanning: &SecurityAndAnalysisStatus{
|
||||
Status: sp("disabled"),
|
||||
},
|
||||
EnableSecretScanningPushProtection: &SecurityAndAnalysisStatus{
|
||||
Status: sp("disabled"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Enable only advanced security",
|
||||
opts: EditOptions{
|
||||
Edits: EditRepositoryInput{
|
||||
enableAdvancedSecurity: bp(true),
|
||||
},
|
||||
},
|
||||
want: &SecurityAndAnalysisInput{
|
||||
EnableAdvancedSecurity: &SecurityAndAnalysisStatus{
|
||||
Status: sp("enabled"),
|
||||
},
|
||||
EnableSecretScanning: nil,
|
||||
EnableSecretScanningPushProtection: nil,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Disable only secret scanning",
|
||||
opts: EditOptions{
|
||||
Edits: EditRepositoryInput{
|
||||
enableSecretScanning: bp(false),
|
||||
},
|
||||
},
|
||||
want: &SecurityAndAnalysisInput{
|
||||
EnableAdvancedSecurity: nil,
|
||||
EnableSecretScanning: &SecurityAndAnalysisStatus{
|
||||
Status: sp("disabled"),
|
||||
},
|
||||
EnableSecretScanningPushProtection: nil,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
opts := &tt.opts
|
||||
transformed := transformSecurityAndAnalysisOpts(opts)
|
||||
assert.Equal(t, tt.want, transformed)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func sp(v string) *string {
|
||||
return &v
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue