Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions pkg/workflow/github_cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,32 +224,6 @@ func RunGHCombinedContext(ctx context.Context, spinnerMessage string, args ...st
return runGHWithSpinnerContext(ctx, spinnerMessage, true, nil, args...)
}

// RunGHWithHost executes a gh CLI command with a spinner, targeting a specific GitHub host.
// For non-github.com hosts (GHES, Proxima/data residency), the GH_HOST environment variable
// is set on the command. This is necessary because most gh subcommands (repo, pr, run, etc.)
// do not accept a --hostname flag — only `gh api` does.
//
// Deprecated: Use RunGHContextWithHost to support context cancellation and timeouts.
//
// Usage:
//
// output, err := RunGHWithHost("Fetching repo info...", "myorg.ghe.com", "repo", "view", "--json", "owner,name")
func RunGHWithHost(spinnerMessage string, host string, args ...string) ([]byte, error) {
cmd := ExecGH(args...)
SetGHHostEnv(cmd, host)

if tty.IsStderrTerminal() {
spinner := console.NewSpinner(spinnerMessage)
spinner.Start()
defer spinner.Stop()
output, err := cmd.Output()
return output, enrichGHError(err)
}

output, err := cmd.Output()
return output, enrichGHError(err)
}

// RunGHContextWithHost executes a gh CLI command with context support, a spinner,
// and an explicit GitHub host.
func RunGHContextWithHost(ctx context.Context, spinnerMessage string, host string, args ...string) ([]byte, error) {
Expand Down
27 changes: 0 additions & 27 deletions pkg/workflow/permissions_factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,6 @@ func NewPermissionsContentsReadIssuesWrite() *Permissions {
})
}

// NewPermissionsContentsReadIssuesWritePRWrite creates permissions with contents: read, issues: write, pull-requests: write
func NewPermissionsContentsReadIssuesWritePRWrite() *Permissions {
return NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
PermissionContents: PermissionRead,
PermissionIssues: PermissionWrite,
PermissionPullRequests: PermissionWrite,
})
}

// NewPermissionsActionsWrite creates permissions with actions: write
// This is required for dispatching workflows via workflow_dispatch
func NewPermissionsActionsWrite() *Permissions {
Expand Down Expand Up @@ -131,16 +122,6 @@ func NewPermissionsContentsReadDiscussionsWrite() *Permissions {
})
}

// NewPermissionsContentsReadIssuesWriteDiscussionsWrite creates permissions with contents: read, issues: write, discussions: write
// This is used for create-discussion jobs that support fallback-to-issue when discussion creation fails
func NewPermissionsContentsReadIssuesWriteDiscussionsWrite() *Permissions {
return NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
PermissionContents: PermissionRead,
PermissionIssues: PermissionWrite,
PermissionDiscussions: PermissionWrite,
})
}

// NewPermissionsContentsReadPRWrite creates permissions with contents: read and pull-requests: write
func NewPermissionsContentsReadPRWrite() *Permissions {
return NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
Expand Down Expand Up @@ -186,14 +167,6 @@ func (p *Permissions) Clone() *Permissions {
return clone
}

// Note: organization-projects is only valid for GitHub App tokens, not workflow permissions
func NewPermissionsContentsReadProjectsWrite() *Permissions {
return NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
PermissionContents: PermissionRead,
PermissionOrganizationProj: PermissionWrite,
})
}

// NewPermissionsIssuesWrite creates permissions with issues: write only.
// Used for output-only handlers (create-issue, close-issue, etc.) that call the
// issues API without accessing repository file contents.
Expand Down
36 changes: 0 additions & 36 deletions pkg/workflow/spec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,25 +60,6 @@ func TestSpec_Permissions_ContentsReadDiscussionsWrite(t *testing.T) {
assert.Equal(t, workflow.PermissionWrite, discussionsLevel, "discussions must be write")
}

// TestSpec_Permissions_ContentsReadIssuesWriteDiscussionsWrite validates the documented combination.
// Spec: "NewPermissionsContentsReadIssuesWriteDiscussionsWrite — contents:read + issues:write + discussions:write"
func TestSpec_Permissions_ContentsReadIssuesWriteDiscussionsWrite(t *testing.T) {
p := workflow.NewPermissionsContentsReadIssuesWriteDiscussionsWrite()
require.NotNil(t, p, "NewPermissionsContentsReadIssuesWriteDiscussionsWrite must return a non-nil Permissions")

contentsLevel, ok := p.Get(workflow.PermissionContents)
assert.True(t, ok, "contents scope must be present")
assert.Equal(t, workflow.PermissionRead, contentsLevel, "contents must be read")

issuesLevel, ok := p.Get(workflow.PermissionIssues)
assert.True(t, ok, "issues scope must be present")
assert.Equal(t, workflow.PermissionWrite, issuesLevel, "issues must be write")

discussionsLevel, ok := p.Get(workflow.PermissionDiscussions)
assert.True(t, ok, "discussions scope must be present")
assert.Equal(t, workflow.PermissionWrite, discussionsLevel, "discussions must be write")
}

// TestSpec_Permissions_ContentsReadPRWrite validates the documented permission combination.
// Spec: "NewPermissionsContentsReadPRWrite — contents:read + pull-requests:write"
func TestSpec_Permissions_ContentsReadPRWrite(t *testing.T) {
Expand Down Expand Up @@ -109,23 +90,6 @@ func TestSpec_Permissions_ContentsReadSecurityEventsWrite(t *testing.T) {
assert.Equal(t, workflow.PermissionWrite, secLevel, "security-events must be write")
}

// TestSpec_Permissions_ContentsReadProjectsWrite validates the documented permission combination.
// Spec: "NewPermissionsContentsReadProjectsWrite — contents:read + projects:write"
// Note: organization-projects is a GitHub App-only scope per the spec.
func TestSpec_Permissions_ContentsReadProjectsWrite(t *testing.T) {
p := workflow.NewPermissionsContentsReadProjectsWrite()
require.NotNil(t, p, "NewPermissionsContentsReadProjectsWrite must return a non-nil Permissions")

contentsLevel, ok := p.Get(workflow.PermissionContents)
assert.True(t, ok, "contents scope must be present")
assert.Equal(t, workflow.PermissionRead, contentsLevel, "contents must be read")

// Spec: the permissions factory uses "organization-projects" for GitHub App tokens
projLevel, ok := p.GetExplicit(workflow.PermissionOrganizationProj)
assert.True(t, ok, "organization-projects scope must be explicitly set")
assert.Equal(t, workflow.PermissionWrite, projLevel, "organization-projects must be write")
}

// TestSpec_SafeOutputs_SafeOutputsConfigFromKeys validates that SafeOutputsConfigFromKeys
// builds a minimal SafeOutputsConfig from a list of safe-output key names, as documented
// in the workflow package README.md.
Expand Down
Loading