From 5fc311374aa270c713593e4f808234d4b374a338 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 4 Oct 2024 10:08:48 -0700 Subject: [PATCH 01/25] Add handling of empty titles for Issues and PRs Currently, the prompter doesn't enforce the requirement of a title for PR and Issue creation. However, that creates the UX where a user can enter a blank title, spend time filling out a detailed body, then fail to create the issue or pr when the request is sent to the api because the title is blank. This attempts to handle that before sending a request to the api, enforcing that, when prompting, the title of an issue is not blank. --- pkg/cmd/pr/shared/survey.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/cmd/pr/shared/survey.go b/pkg/cmd/pr/shared/survey.go index 5b8bde0eb..a059b288c 100644 --- a/pkg/cmd/pr/shared/survey.go +++ b/pkg/cmd/pr/shared/survey.go @@ -111,9 +111,16 @@ func BodySurvey(p Prompt, state *IssueMetadataState, templateContent string) err } func TitleSurvey(p Prompt, state *IssueMetadataState) error { - result, err := p.Input("Title", state.Title) - if err != nil { - return err + var err error + result := "" + for result == "" { + result, err = p.Input("Title (required)", state.Title) + if err != nil { + return err + } + if result == "" { + fmt.Println("X Title cannot be blank.") + } } if result != state.Title { From be3b6cbd8dd2fd99315404b909fd958307c42c8f Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Tue, 8 Oct 2024 16:03:14 -0700 Subject: [PATCH 02/25] Make the X in the error message red and print with io writer --- pkg/cmd/issue/create/create.go | 2 +- pkg/cmd/pr/create/create.go | 2 +- pkg/cmd/pr/shared/survey.go | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/cmd/issue/create/create.go b/pkg/cmd/issue/create/create.go index 82d4ab133..f51cde4c9 100644 --- a/pkg/cmd/issue/create/create.go +++ b/pkg/cmd/issue/create/create.go @@ -222,7 +222,7 @@ func createRun(opts *CreateOptions) (err error) { defer prShared.PreserveInput(opts.IO, &tb, &err)() if opts.Title == "" { - err = prShared.TitleSurvey(opts.Prompter, &tb) + err = prShared.TitleSurvey(opts.Prompter, opts.IO, &tb) if err != nil { return } diff --git a/pkg/cmd/pr/create/create.go b/pkg/cmd/pr/create/create.go index 7e893395c..1242af2c5 100644 --- a/pkg/cmd/pr/create/create.go +++ b/pkg/cmd/pr/create/create.go @@ -379,7 +379,7 @@ func createRun(opts *CreateOptions) (err error) { } else { if !opts.TitleProvided { - err = shared.TitleSurvey(opts.Prompter, state) + err = shared.TitleSurvey(opts.Prompter, opts.IO, state) if err != nil { return } diff --git a/pkg/cmd/pr/shared/survey.go b/pkg/cmd/pr/shared/survey.go index a059b288c..2ee343bfb 100644 --- a/pkg/cmd/pr/shared/survey.go +++ b/pkg/cmd/pr/shared/survey.go @@ -110,7 +110,7 @@ func BodySurvey(p Prompt, state *IssueMetadataState, templateContent string) err return nil } -func TitleSurvey(p Prompt, state *IssueMetadataState) error { +func TitleSurvey(p Prompt, io *iostreams.IOStreams, state *IssueMetadataState) error { var err error result := "" for result == "" { @@ -119,7 +119,10 @@ func TitleSurvey(p Prompt, state *IssueMetadataState) error { return err } if result == "" { - fmt.Println("X Title cannot be blank.") + colorizeRed := io.ColorScheme().ColorFromString("red") + msg := fmt.Sprintf("%s Title cannot be blank.", colorizeRed("X")) + // For some reason, only Fprintln and Println work here. I can't use Fprintf or Printf to eliminate the line above + fmt.Fprintln(io.ErrOut, msg) } } From da945314fd3179e3eb4cfab3d1681a210969f90a Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Tue, 8 Oct 2024 16:11:05 -0700 Subject: [PATCH 03/25] Fix failing test for pr and issue create --- pkg/cmd/issue/create/create_test.go | 4 ++-- pkg/cmd/pr/create/create_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/cmd/issue/create/create_test.go b/pkg/cmd/issue/create/create_test.go index b95b5ef66..8e49700a0 100644 --- a/pkg/cmd/issue/create/create_test.go +++ b/pkg/cmd/issue/create/create_test.go @@ -611,7 +611,7 @@ func TestIssueCreate_recover(t *testing.T) { pm := &prompter.PrompterMock{} pm.InputFunc = func(p, d string) (string, error) { - if p == "Title" { + if p == "Title (required)" { return d, nil } else { return "", prompter.NoSuchPromptErr(p) @@ -736,7 +736,7 @@ func TestIssueCreate_continueInBrowser(t *testing.T) { pm := &prompter.PrompterMock{} pm.InputFunc = func(p, d string) (string, error) { - if p == "Title" { + if p == "Title (required)" { return "hello", nil } else { return "", prompter.NoSuchPromptErr(p) diff --git a/pkg/cmd/pr/create/create_test.go b/pkg/cmd/pr/create/create_test.go index cba552101..81684ff00 100644 --- a/pkg/cmd/pr/create/create_test.go +++ b/pkg/cmd/pr/create/create_test.go @@ -1210,7 +1210,7 @@ func Test_createRun(t *testing.T) { }, promptStubs: func(pm *prompter.PrompterMock) { pm.InputFunc = func(p, d string) (string, error) { - if p == "Title" { + if p == "Title (required)" { return d, nil } else { return "", prompter.NoSuchPromptErr(p) @@ -1316,7 +1316,7 @@ func Test_createRun(t *testing.T) { } pm.InputFunc = func(p, d string) (string, error) { - if p == "Title" { + if p == "Title (required)" { return d, nil } else if p == "Body" { return d, nil From dcbd1b728cd87523768807262b44f7cc94bbb582 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Tue, 8 Oct 2024 16:32:50 -0700 Subject: [PATCH 04/25] Add test coverage for TitleSurvey change --- pkg/cmd/pr/shared/survey_test.go | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/pkg/cmd/pr/shared/survey_test.go b/pkg/cmd/pr/shared/survey_test.go index 8df492785..0e62e0e5a 100644 --- a/pkg/cmd/pr/shared/survey_test.go +++ b/pkg/cmd/pr/shared/survey_test.go @@ -158,3 +158,44 @@ type testEditor struct { func (e testEditor) Edit(filename, text string) (string, error) { return e.edit(text) } + +func TestTitleSurvey(t *testing.T) { + tests := []struct { + name string + prompterMockInputs []string + expectedTitle string + expectStderr bool + }{ + { + name: "title provided", + prompterMockInputs: []string{"title"}, + expectedTitle: "title", + }, + { + name: "first input empty", + prompterMockInputs: []string{"", "title"}, + expectedTitle: "title", + expectStderr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + io, _, _, stderr := iostreams.Test() + pm := prompter.NewMockPrompter(t) + for _, input := range tt.prompterMockInputs { + pm.RegisterInput("Title (required)", func(string, string) (string, error) { + return input, nil + }) + } + + state := &IssueMetadataState{} + err := TitleSurvey(pm, io, state) + + assert.NoError(t, err) + assert.Equal(t, tt.expectedTitle, state.Title) + if tt.expectStderr { + assert.Equal(t, "X Title cannot be blank.\n", stderr.String()) + } + }) + } +} From d709dd5b597421216f7ea9bbd6906d9b6072c870 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 14:22:07 +0000 Subject: [PATCH 05/25] build(deps): bump github.com/gabriel-vasile/mimetype from 1.4.5 to 1.4.6 Bumps [github.com/gabriel-vasile/mimetype](https://github.com/gabriel-vasile/mimetype) from 1.4.5 to 1.4.6. - [Release notes](https://github.com/gabriel-vasile/mimetype/releases) - [Commits](https://github.com/gabriel-vasile/mimetype/compare/v1.4.5...v1.4.6) --- updated-dependencies: - dependency-name: github.com/gabriel-vasile/mimetype dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index e638459fa..d9675cba2 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.5 github.com/creack/pty v1.1.23 github.com/distribution/reference v0.5.0 - github.com/gabriel-vasile/mimetype v1.4.5 + github.com/gabriel-vasile/mimetype v1.4.6 github.com/gdamore/tcell/v2 v2.5.4 github.com/google/go-cmp v0.6.0 github.com/google/go-containerregistry v0.20.2 @@ -43,10 +43,10 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 github.com/zalando/go-keyring v0.2.5 - golang.org/x/crypto v0.27.0 + golang.org/x/crypto v0.28.0 golang.org/x/sync v0.8.0 - golang.org/x/term v0.24.0 - golang.org/x/text v0.18.0 + golang.org/x/term v0.25.0 + golang.org/x/text v0.19.0 google.golang.org/grpc v1.64.1 google.golang.org/protobuf v1.34.2 gopkg.in/h2non/gock.v1 v1.1.2 @@ -158,7 +158,7 @@ require ( go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect golang.org/x/mod v0.20.0 // indirect - golang.org/x/net v0.27.0 // indirect + golang.org/x/net v0.30.0 // indirect golang.org/x/sys v0.26.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect diff --git a/go.sum b/go.sum index d1a85b60e..9d0e0e264 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= -github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.5.4 h1:TGU4tSjD3sCL788vFNeJnTdzpNKIw1H5dgLnJRQVv/k= @@ -486,8 +486,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -496,8 +496,8 @@ golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -519,15 +519,15 @@ golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 4df2e7be634cf2eb7f7d63b61351d68afc1c6c07 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Tue, 15 Oct 2024 12:16:20 -0700 Subject: [PATCH 06/25] Remove comment --- pkg/cmd/pr/shared/survey.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/cmd/pr/shared/survey.go b/pkg/cmd/pr/shared/survey.go index 2ee343bfb..3d53be4c7 100644 --- a/pkg/cmd/pr/shared/survey.go +++ b/pkg/cmd/pr/shared/survey.go @@ -121,7 +121,6 @@ func TitleSurvey(p Prompt, io *iostreams.IOStreams, state *IssueMetadataState) e if result == "" { colorizeRed := io.ColorScheme().ColorFromString("red") msg := fmt.Sprintf("%s Title cannot be blank.", colorizeRed("X")) - // For some reason, only Fprintln and Println work here. I can't use Fprintf or Printf to eliminate the line above fmt.Fprintln(io.ErrOut, msg) } } From 86b4bb99561857310bf0bc3238d928a1e0af5d60 Mon Sep 17 00:00:00 2001 From: Andy Feller Date: Wed, 16 Oct 2024 19:38:10 -0400 Subject: [PATCH 07/25] Include startedAt, completedAt in run steps data This commit expands the `Step` structure used with GitHub Actions workflow runs to include fields indicating when steps start and complete. This information is already provided by the GitHub API, so this only involves expanding the structure, fields exported, and the associated tests. In the future, I could see `gh` including the duration calculation which is used when viewing workflow or workflow run. --- pkg/cmd/run/shared/shared.go | 32 ++++++++++++++++---------- pkg/cmd/run/shared/shared_test.go | 38 +++++++++++++++++++------------ 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/pkg/cmd/run/shared/shared.go b/pkg/cmd/run/shared/shared.go index e5f09dec9..90ab5a7fe 100644 --- a/pkg/cmd/run/shared/shared.go +++ b/pkg/cmd/run/shared/shared.go @@ -180,16 +180,22 @@ func (r *Run) ExportData(fields []string) map[string]interface{} { for _, j := range r.Jobs { steps := make([]interface{}, 0, len(j.Steps)) for _, s := range j.Steps { + var stepCompletedAt time.Time + if !s.CompletedAt.IsZero() { + stepCompletedAt = s.CompletedAt + } steps = append(steps, map[string]interface{}{ - "name": s.Name, - "status": s.Status, - "conclusion": s.Conclusion, - "number": s.Number, + "name": s.Name, + "status": s.Status, + "conclusion": s.Conclusion, + "number": s.Number, + "startedAt": s.StartedAt, + "completedAt": stepCompletedAt, }) } - var completedAt time.Time + var jobCompletedAt time.Time if !j.CompletedAt.IsZero() { - completedAt = j.CompletedAt + jobCompletedAt = j.CompletedAt } jobs = append(jobs, map[string]interface{}{ "databaseId": j.ID, @@ -198,7 +204,7 @@ func (r *Run) ExportData(fields []string) map[string]interface{} { "name": j.Name, "steps": steps, "startedAt": j.StartedAt, - "completedAt": completedAt, + "completedAt": jobCompletedAt, "url": j.URL, }) } @@ -225,11 +231,13 @@ type Job struct { } type Step struct { - Name string - Status Status - Conclusion Conclusion - Number int - Log *zip.File + Name string + Status Status + Conclusion Conclusion + Number int + StartedAt time.Time `json:"started_at"` + CompletedAt time.Time `json:"completed_at"` + Log *zip.File } type Steps []Step diff --git a/pkg/cmd/run/shared/shared_test.go b/pkg/cmd/run/shared/shared_test.go index 15663cd0a..752ba2fc4 100644 --- a/pkg/cmd/run/shared/shared_test.go +++ b/pkg/cmd/run/shared/shared_test.go @@ -110,8 +110,12 @@ func TestRun_Duration(t *testing.T) { func TestRunExportData(t *testing.T) { oldestStartedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:20:13Z") + oldestStepStartedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:20:15Z") + oldestStepCompletedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:21:10Z") oldestCompletedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:21:16Z") newestStartedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:20:55Z") + newestStepStartedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:21:01Z") + newestStepCompletedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:23:10Z") newestCompletedAt, _ := time.Parse(time.RFC3339, "2022-07-20T11:23:16Z") tests := []struct { @@ -132,10 +136,12 @@ func TestRunExportData(t *testing.T) { Name: "macos", Steps: []Step{ { - Name: "Checkout", - Status: "completed", - Conclusion: "success", - Number: 1, + Name: "Checkout", + Status: "completed", + Conclusion: "success", + Number: 1, + StartedAt: oldestStepStartedAt, + CompletedAt: oldestStepCompletedAt, }, }, StartedAt: oldestStartedAt, @@ -144,7 +150,7 @@ func TestRunExportData(t *testing.T) { }, }, }, - output: `{"jobs":[{"completedAt":"2022-07-20T11:21:16Z","conclusion":"success","databaseId":123456,"name":"macos","startedAt":"2022-07-20T11:20:13Z","status":"completed","steps":[{"conclusion":"success","name":"Checkout","number":1,"status":"completed"}],"url":"https://example.com/OWNER/REPO/actions/runs/123456"}]}`, + output: `{"jobs":[{"completedAt":"2022-07-20T11:21:16Z","conclusion":"success","databaseId":123456,"name":"macos","startedAt":"2022-07-20T11:20:13Z","status":"completed","steps":[{"completedAt":"2022-07-20T11:21:10Z","conclusion":"success","name":"Checkout","number":1,"startedAt":"2022-07-20T11:20:15Z","status":"completed"}],"url":"https://example.com/OWNER/REPO/actions/runs/123456"}]}`, }, { name: "exports workflow run's multiple jobs", @@ -158,10 +164,12 @@ func TestRunExportData(t *testing.T) { Name: "macos", Steps: []Step{ { - Name: "Checkout", - Status: "completed", - Conclusion: "success", - Number: 1, + Name: "Checkout", + Status: "completed", + Conclusion: "success", + Number: 1, + StartedAt: oldestStepStartedAt, + CompletedAt: oldestStepCompletedAt, }, }, StartedAt: oldestStartedAt, @@ -175,10 +183,12 @@ func TestRunExportData(t *testing.T) { Name: "windows", Steps: []Step{ { - Name: "Checkout", - Status: "completed", - Conclusion: "error", - Number: 2, + Name: "Checkout", + Status: "completed", + Conclusion: "error", + Number: 2, + StartedAt: newestStepStartedAt, + CompletedAt: newestStepCompletedAt, }, }, StartedAt: newestStartedAt, @@ -187,7 +197,7 @@ func TestRunExportData(t *testing.T) { }, }, }, - output: `{"jobs":[{"completedAt":"2022-07-20T11:21:16Z","conclusion":"success","databaseId":123456,"name":"macos","startedAt":"2022-07-20T11:20:13Z","status":"completed","steps":[{"conclusion":"success","name":"Checkout","number":1,"status":"completed"}],"url":"https://example.com/OWNER/REPO/actions/runs/123456"},{"completedAt":"2022-07-20T11:23:16Z","conclusion":"error","databaseId":234567,"name":"windows","startedAt":"2022-07-20T11:20:55Z","status":"completed","steps":[{"conclusion":"error","name":"Checkout","number":2,"status":"completed"}],"url":"https://example.com/OWNER/REPO/actions/runs/234567"}]}`, + output: `{"jobs":[{"completedAt":"2022-07-20T11:21:16Z","conclusion":"success","databaseId":123456,"name":"macos","startedAt":"2022-07-20T11:20:13Z","status":"completed","steps":[{"completedAt":"2022-07-20T11:21:10Z","conclusion":"success","name":"Checkout","number":1,"startedAt":"2022-07-20T11:20:15Z","status":"completed"}],"url":"https://example.com/OWNER/REPO/actions/runs/123456"},{"completedAt":"2022-07-20T11:23:16Z","conclusion":"error","databaseId":234567,"name":"windows","startedAt":"2022-07-20T11:20:55Z","status":"completed","steps":[{"completedAt":"2022-07-20T11:23:10Z","conclusion":"error","name":"Checkout","number":2,"startedAt":"2022-07-20T11:21:01Z","status":"completed"}],"url":"https://example.com/OWNER/REPO/actions/runs/234567"}]}`, }, { name: "exports workflow run with attempt count", From 13ab02729bd1b38c12d65199bbe57a6528bd2b99 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 14:40:17 -0700 Subject: [PATCH 08/25] Clean up Title Survey empty title message code --- pkg/cmd/pr/shared/survey.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/cmd/pr/shared/survey.go b/pkg/cmd/pr/shared/survey.go index 3d53be4c7..ce38535d9 100644 --- a/pkg/cmd/pr/shared/survey.go +++ b/pkg/cmd/pr/shared/survey.go @@ -119,9 +119,7 @@ func TitleSurvey(p Prompt, io *iostreams.IOStreams, state *IssueMetadataState) e return err } if result == "" { - colorizeRed := io.ColorScheme().ColorFromString("red") - msg := fmt.Sprintf("%s Title cannot be blank.", colorizeRed("X")) - fmt.Fprintln(io.ErrOut, msg) + fmt.Fprintf(io.ErrOut, "%s Title cannot be blank\n", io.ColorScheme().FailureIcon()) } } From 14acbe00a93106cccb70cfd3c5fb290618d21866 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 14:45:35 -0700 Subject: [PATCH 09/25] Remove . from test case for TestTitleSurvey --- pkg/cmd/pr/shared/survey_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cmd/pr/shared/survey_test.go b/pkg/cmd/pr/shared/survey_test.go index 0e62e0e5a..d74696460 100644 --- a/pkg/cmd/pr/shared/survey_test.go +++ b/pkg/cmd/pr/shared/survey_test.go @@ -194,7 +194,7 @@ func TestTitleSurvey(t *testing.T) { assert.NoError(t, err) assert.Equal(t, tt.expectedTitle, state.Title) if tt.expectStderr { - assert.Equal(t, "X Title cannot be blank.\n", stderr.String()) + assert.Equal(t, "X Title cannot be blank\n", stderr.String()) } }) } From 18428671c3795504d15d8fa01199db595c2d3c0e Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Wed, 16 Oct 2024 15:14:18 -0700 Subject: [PATCH 10/25] Added test function for repos and repo-create test --- acceptance/acceptance_test.go | 8 ++++++++ acceptance/testdata/repos/repo-create-view.txtar | 12 ++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 acceptance/testdata/repos/repo-create-view.txtar diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go index 51e96778a..366d88cf4 100644 --- a/acceptance/acceptance_test.go +++ b/acceptance/acceptance_test.go @@ -72,6 +72,14 @@ func TestReleases(t *testing.T) { testscript.Run(t, testScriptParamsFor(tsEnv, "release")) } +func TestRepos(t *testing.T) { + var tsEnv testScriptEnv + if err := tsEnv.fromEnv(); err != nil { + t.Fatal(err) + } + testscript.Run(t, testScriptParamsFor(tsEnv, "repos")) +} + func testScriptParamsFor(tsEnv testScriptEnv, command string) testscript.Params { var files []string if tsEnv.script != "" { diff --git a/acceptance/testdata/repos/repo-create-view.txtar b/acceptance/testdata/repos/repo-create-view.txtar new file mode 100644 index 000000000..b5b85f593 --- /dev/null +++ b/acceptance/testdata/repos/repo-create-view.txtar @@ -0,0 +1,12 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Check that the repo exists +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json name --jq '.name' +stdout $SCRIPT_NAME-$RANDOM_STRING \ No newline at end of file From 83cbdc4f3686cbfd1500ce71820d2e23997bcdee Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Wed, 16 Oct 2024 15:28:38 -0700 Subject: [PATCH 11/25] Added acceptance test for repo-delete --- acceptance/testdata/repos/repo-delete.txtar | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 acceptance/testdata/repos/repo-delete.txtar diff --git a/acceptance/testdata/repos/repo-delete.txtar b/acceptance/testdata/repos/repo-delete.txtar new file mode 100644 index 000000000..855473ae9 --- /dev/null +++ b/acceptance/testdata/repos/repo-delete.txtar @@ -0,0 +1,16 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# Check that the repo exists +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json name --jq '.name' +stdout $SCRIPT_NAME-$RANDOM_STRING + +# Delete the repo +exec gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Ensure that the repo was deleted +! exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json name --jq '.name' +stderr 'Could not resolve to a Repository with the name' \ No newline at end of file From 60e20ee5312b4caa9ce3e98b633bf974b949b863 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 08:51:51 -0700 Subject: [PATCH 12/25] Add acceptance test for repo-clone --- acceptance/testdata/repos/repo-clone.txtar | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 acceptance/testdata/repos/repo-clone.txtar diff --git a/acceptance/testdata/repos/repo-clone.txtar b/acceptance/testdata/repos/repo-clone.txtar new file mode 100644 index 000000000..f0bad8e01 --- /dev/null +++ b/acceptance/testdata/repos/repo-clone.txtar @@ -0,0 +1,15 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Clone the repo +exec gh repo clone $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Ensure the repo was cloned +exec ls $SCRIPT_NAME-$RANDOM_STRING +stdout README.md \ No newline at end of file From 0c632d7c4eada9577449921c87c2cb7c340b9071 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 09:43:50 -0700 Subject: [PATCH 13/25] Acceptance testing for repo-archive and repo-unarchive --- .../repos/repo-archive-unarchive.txtar | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 acceptance/testdata/repos/repo-archive-unarchive.txtar diff --git a/acceptance/testdata/repos/repo-archive-unarchive.txtar b/acceptance/testdata/repos/repo-archive-unarchive.txtar new file mode 100644 index 000000000..d72b36906 --- /dev/null +++ b/acceptance/testdata/repos/repo-archive-unarchive.txtar @@ -0,0 +1,26 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Check that the repo exists and isn't archived +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' +stdout false + +# Archive the repo +exec gh repo archive $ORG/$SCRIPT_NAME-$RANDOM_STRING --yes + +# Check that the repo is archived +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' +stdout true + +# Unarchive the repo +exec gh repo unarchive $ORG/$SCRIPT_NAME-$RANDOM_STRING --yes + +# Check that the repo is unarchived +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' +stdout false \ No newline at end of file From fb6f7733c4974524b25d6b7d66075e0d002a8a8c Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 09:58:59 -0700 Subject: [PATCH 14/25] Add acceptance tests for repo-list and repo-rename --- .../testdata/repos/repo-list-rename.txtar | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 acceptance/testdata/repos/repo-list-rename.txtar diff --git a/acceptance/testdata/repos/repo-list-rename.txtar b/acceptance/testdata/repos/repo-list-rename.txtar new file mode 100644 index 000000000..e758ac7fd --- /dev/null +++ b/acceptance/testdata/repos/repo-list-rename.txtar @@ -0,0 +1,24 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# List the repos and check for the new repo +exec gh repo list $ORG --json name --jq '.[].name' +stdout $SCRIPT_NAME-$RANDOM_STRING + +# Rename the repo +exec gh repo rename $SCRIPT_NAME-$RANDOM_STRING-renamed --repo=$ORG/$SCRIPT_NAME-$RANDOM_STRING --yes + +# List the repos and check for the renamed repo +exec gh repo list $ORG --json name --jq '.[].name' +stdout $SCRIPT_NAME-$RANDOM_STRING-renamed + +# Delete the renamed repo +exec gh repo delete $ORG/$SCRIPT_NAME-$RANDOM_STRING-renamed --yes + +# List the repos and check for the deleted repo +exec gh repo list $ORG --json name --jq '.[].name' +! stdout $SCRIPT_NAME-$RANDOM_STRING-renamed + From c572edbfd797780426def51559b3e0fece1ff59e Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 10:08:14 -0700 Subject: [PATCH 15/25] Add acceptance test for repo-edit --- acceptance/testdata/repos/repo-edit.txtar | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 acceptance/testdata/repos/repo-edit.txtar diff --git a/acceptance/testdata/repos/repo-edit.txtar b/acceptance/testdata/repos/repo-edit.txtar new file mode 100644 index 000000000..c8e293cc0 --- /dev/null +++ b/acceptance/testdata/repos/repo-edit.txtar @@ -0,0 +1,19 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Check that the repo description is empty +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json description --jq '.description' +stdout '' + +# Edit the repo description +exec gh repo edit $ORG/$SCRIPT_NAME-$RANDOM_STRING --description 'newDescription' + +# Check that the repo description is updated +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json description --jq '.description' +stdout 'newDescription' \ No newline at end of file From 750813135635b79c99ac292414e22f7d56cb7bb0 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 10:27:20 -0700 Subject: [PATCH 16/25] Add acceptance test for repo-set-default --- .../testdata/repos/repo-set-default.txtar | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 acceptance/testdata/repos/repo-set-default.txtar diff --git a/acceptance/testdata/repos/repo-set-default.txtar b/acceptance/testdata/repos/repo-set-default.txtar new file mode 100644 index 000000000..f8c0e68c5 --- /dev/null +++ b/acceptance/testdata/repos/repo-set-default.txtar @@ -0,0 +1,23 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Clone the repo +exec gh repo clone $ORG/$SCRIPT_NAME-$RANDOM_STRING +cd $SCRIPT_NAME-$RANDOM_STRING + +# Ensure that no default is set +exec gh repo set-default --view +stderr 'no default repository has been set; use `gh repo set-default` to select one' + +# Set the default +exec gh repo set-default $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Check that the default is set +exec gh repo set-default --view +stdout $ORG/$SCRIPT_NAME-$RANDOM_STRING \ No newline at end of file From 96fa8534daa9832b34fa42d432e66298e2fd62a4 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 10:55:28 -0700 Subject: [PATCH 17/25] Add acceptance tests for repo-fork and repo-sync --- .../testdata/repos/repo-fork-sync.txtar | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 acceptance/testdata/repos/repo-fork-sync.txtar diff --git a/acceptance/testdata/repos/repo-fork-sync.txtar b/acceptance/testdata/repos/repo-fork-sync.txtar new file mode 100644 index 000000000..73beb39f1 --- /dev/null +++ b/acceptance/testdata/repos/repo-fork-sync.txtar @@ -0,0 +1,44 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create and clone a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private --clone + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# Fork and clone the repo +exec gh repo fork $ORG/$SCRIPT_NAME-$RANDOM_STRING --org $ORG --fork-name $SCRIPT_NAME-$RANDOM_STRING-fork --clone + +# Defer fork cleanup +defer gh repo delete $ORG/$SCRIPT_NAME-$RANDOM_STRING-fork --yes + +# Sleep so that the BE has time to sync +sleep 5 + +# Check that the repo was forked +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING-fork --json='isFork' --jq='.isFork' +stdout true + +# Modify original repo +cd $SCRIPT_NAME-$RANDOM_STRING +mv ../asset.txt asset.txt +exec git add . +exec git commit -m 'Add asset.txt' +exec git push + +# Checkout the forked repo and ensure asset.txt is not present +cd ../$SCRIPT_NAME-$RANDOM_STRING-fork +exec git checkout main +exec ls +! stdout asset.txt + +# Sync the forked repo with the original repo +exec gh repo sync + +# Check that asset.txt now exists in the fork +exec ls +stdout asset.txt + +-- asset.txt -- +Hello, world! \ No newline at end of file From 95ed11d9babcd3dfa41d4e1d345ef343888078d7 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 11:55:32 -0700 Subject: [PATCH 18/25] Add acceptance tests for repo deploy-key add/list/delete --- .../testdata/repos/repo-deploy-key.txtar | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 acceptance/testdata/repos/repo-deploy-key.txtar diff --git a/acceptance/testdata/repos/repo-deploy-key.txtar b/acceptance/testdata/repos/repo-deploy-key.txtar new file mode 100644 index 000000000..69c2efef8 --- /dev/null +++ b/acceptance/testdata/repos/repo-deploy-key.txtar @@ -0,0 +1,35 @@ +# Use gh as a credential helper +exec gh auth setup-git + +# Create and clone a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private --clone + +# Defer repo cleanup +defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING + +# cd to the repo and list the deploy keys. There should be no keys +cd $SCRIPT_NAME-$RANDOM_STRING +exec gh repo deploy-key list --json=title +! stdout title + +# Add a deploy key +exec gh repo deploy-key add ../deployKey.pub + +# Ensure the deploy key was added +exec gh repo deploy-key list --json=title --jq='.[].title' +stdout myTitle + +# Get the deploy key id +exec gh repo deploy-key list --json=title,id --jq='.[].title="myTitle" | .[].id' +stdout2env DEPLOY_KEY_ID + +# Delete the deploy key +exec gh repo deploy-key delete $DEPLOY_KEY_ID + +# Ensure the deploy key was deleted +exec gh repo deploy-key list --json=id --jq='.[].id' +! stdout $DEPLOY_KEY_ID + +-- deployKey.pub -- +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAZmdeRNskfpvYL5YHB/YJaW8hTEXpnvPMkx5Ri+YwUr myTitle + From e7549c93f9c4069b30173320b007ca330ee9161d Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Thu, 17 Oct 2024 13:36:19 -0700 Subject: [PATCH 19/25] Cleanup some inconsistencies and improve collapse some functionality --- .../testdata/repos/repo-archive-unarchive.txtar | 2 +- acceptance/testdata/repos/repo-clone.txtar | 2 +- acceptance/testdata/repos/repo-create-view.txtar | 4 ++-- acceptance/testdata/repos/repo-delete.txtar | 2 +- acceptance/testdata/repos/repo-deploy-key.txtar | 1 - acceptance/testdata/repos/repo-edit.txtar | 4 ++-- acceptance/testdata/repos/repo-fork-sync.txtar | 2 +- acceptance/testdata/repos/repo-list-rename.txtar | 15 +++++---------- acceptance/testdata/repos/repo-set-default.txtar | 11 ++++------- 9 files changed, 17 insertions(+), 26 deletions(-) diff --git a/acceptance/testdata/repos/repo-archive-unarchive.txtar b/acceptance/testdata/repos/repo-archive-unarchive.txtar index d72b36906..de1f7df9f 100644 --- a/acceptance/testdata/repos/repo-archive-unarchive.txtar +++ b/acceptance/testdata/repos/repo-archive-unarchive.txtar @@ -23,4 +23,4 @@ exec gh repo unarchive $ORG/$SCRIPT_NAME-$RANDOM_STRING --yes # Check that the repo is unarchived exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' -stdout false \ No newline at end of file +stdout false diff --git a/acceptance/testdata/repos/repo-clone.txtar b/acceptance/testdata/repos/repo-clone.txtar index f0bad8e01..5afc3ab0e 100644 --- a/acceptance/testdata/repos/repo-clone.txtar +++ b/acceptance/testdata/repos/repo-clone.txtar @@ -12,4 +12,4 @@ exec gh repo clone $ORG/$SCRIPT_NAME-$RANDOM_STRING # Ensure the repo was cloned exec ls $SCRIPT_NAME-$RANDOM_STRING -stdout README.md \ No newline at end of file +stdout README.md diff --git a/acceptance/testdata/repos/repo-create-view.txtar b/acceptance/testdata/repos/repo-create-view.txtar index b5b85f593..f1a67ac73 100644 --- a/acceptance/testdata/repos/repo-create-view.txtar +++ b/acceptance/testdata/repos/repo-create-view.txtar @@ -8,5 +8,5 @@ exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING # Check that the repo exists -exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json name --jq '.name' -stdout $SCRIPT_NAME-$RANDOM_STRING \ No newline at end of file +exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=name --jq='.name' +stdout $SCRIPT_NAME-$RANDOM_STRING diff --git a/acceptance/testdata/repos/repo-delete.txtar b/acceptance/testdata/repos/repo-delete.txtar index 855473ae9..c9fd2c058 100644 --- a/acceptance/testdata/repos/repo-delete.txtar +++ b/acceptance/testdata/repos/repo-delete.txtar @@ -13,4 +13,4 @@ exec gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING # Ensure that the repo was deleted ! exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json name --jq '.name' -stderr 'Could not resolve to a Repository with the name' \ No newline at end of file +stderr 'Could not resolve to a Repository with the name' diff --git a/acceptance/testdata/repos/repo-deploy-key.txtar b/acceptance/testdata/repos/repo-deploy-key.txtar index 69c2efef8..42c5b1746 100644 --- a/acceptance/testdata/repos/repo-deploy-key.txtar +++ b/acceptance/testdata/repos/repo-deploy-key.txtar @@ -32,4 +32,3 @@ exec gh repo deploy-key list --json=id --jq='.[].id' -- deployKey.pub -- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAZmdeRNskfpvYL5YHB/YJaW8hTEXpnvPMkx5Ri+YwUr myTitle - diff --git a/acceptance/testdata/repos/repo-edit.txtar b/acceptance/testdata/repos/repo-edit.txtar index c8e293cc0..3fd5a48f6 100644 --- a/acceptance/testdata/repos/repo-edit.txtar +++ b/acceptance/testdata/repos/repo-edit.txtar @@ -9,11 +9,11 @@ defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING # Check that the repo description is empty exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json description --jq '.description' -stdout '' +! stdout '.' # Edit the repo description exec gh repo edit $ORG/$SCRIPT_NAME-$RANDOM_STRING --description 'newDescription' # Check that the repo description is updated exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json description --jq '.description' -stdout 'newDescription' \ No newline at end of file +stdout 'newDescription' diff --git a/acceptance/testdata/repos/repo-fork-sync.txtar b/acceptance/testdata/repos/repo-fork-sync.txtar index 73beb39f1..8bc437567 100644 --- a/acceptance/testdata/repos/repo-fork-sync.txtar +++ b/acceptance/testdata/repos/repo-fork-sync.txtar @@ -41,4 +41,4 @@ exec ls stdout asset.txt -- asset.txt -- -Hello, world! \ No newline at end of file +Hello, world! diff --git a/acceptance/testdata/repos/repo-list-rename.txtar b/acceptance/testdata/repos/repo-list-rename.txtar index e758ac7fd..972e5a74a 100644 --- a/acceptance/testdata/repos/repo-list-rename.txtar +++ b/acceptance/testdata/repos/repo-list-rename.txtar @@ -5,20 +5,15 @@ exec gh auth setup-git exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private # List the repos and check for the new repo -exec gh repo list $ORG --json name --jq '.[].name' +exec gh repo list $ORG --json=name --jq='.[].name' stdout $SCRIPT_NAME-$RANDOM_STRING # Rename the repo exec gh repo rename $SCRIPT_NAME-$RANDOM_STRING-renamed --repo=$ORG/$SCRIPT_NAME-$RANDOM_STRING --yes +# Defer repo deletion +defer gh repo delete $ORG/$SCRIPT_NAME-$RANDOM_STRING-renamed --yes + # List the repos and check for the renamed repo -exec gh repo list $ORG --json name --jq '.[].name' +exec gh repo list $ORG --json=name --jq='.[].name' stdout $SCRIPT_NAME-$RANDOM_STRING-renamed - -# Delete the renamed repo -exec gh repo delete $ORG/$SCRIPT_NAME-$RANDOM_STRING-renamed --yes - -# List the repos and check for the deleted repo -exec gh repo list $ORG --json name --jq '.[].name' -! stdout $SCRIPT_NAME-$RANDOM_STRING-renamed - diff --git a/acceptance/testdata/repos/repo-set-default.txtar b/acceptance/testdata/repos/repo-set-default.txtar index f8c0e68c5..c5b16b9ac 100644 --- a/acceptance/testdata/repos/repo-set-default.txtar +++ b/acceptance/testdata/repos/repo-set-default.txtar @@ -1,17 +1,14 @@ # Use gh as a credential helper exec gh auth setup-git -# Create a repository with a file so it has a default branch -exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private +# Create and clone a repository with a file so it has a default branch +exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private --clone # Defer repo cleanup defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING -# Clone the repo -exec gh repo clone $ORG/$SCRIPT_NAME-$RANDOM_STRING -cd $SCRIPT_NAME-$RANDOM_STRING - # Ensure that no default is set +cd $SCRIPT_NAME-$RANDOM_STRING exec gh repo set-default --view stderr 'no default repository has been set; use `gh repo set-default` to select one' @@ -20,4 +17,4 @@ exec gh repo set-default $ORG/$SCRIPT_NAME-$RANDOM_STRING # Check that the default is set exec gh repo set-default --view -stdout $ORG/$SCRIPT_NAME-$RANDOM_STRING \ No newline at end of file +stdout $ORG/$SCRIPT_NAME-$RANDOM_STRING From a5a77532dfd13162c89cad201eba92e0329df82e Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 18 Oct 2024 08:40:33 -0700 Subject: [PATCH 20/25] Remove unnecessary gh auth setup-git steps --- acceptance/testdata/repos/repo-archive-unarchive.txtar | 3 --- acceptance/testdata/repos/repo-clone.txtar | 3 --- acceptance/testdata/repos/repo-create-view.txtar | 3 --- acceptance/testdata/repos/repo-delete.txtar | 3 --- acceptance/testdata/repos/repo-deploy-key.txtar | 3 --- acceptance/testdata/repos/repo-edit.txtar | 3 --- acceptance/testdata/repos/repo-list-rename.txtar | 3 --- acceptance/testdata/repos/repo-set-default.txtar | 3 --- 8 files changed, 24 deletions(-) diff --git a/acceptance/testdata/repos/repo-archive-unarchive.txtar b/acceptance/testdata/repos/repo-archive-unarchive.txtar index de1f7df9f..79122a80c 100644 --- a/acceptance/testdata/repos/repo-archive-unarchive.txtar +++ b/acceptance/testdata/repos/repo-archive-unarchive.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private diff --git a/acceptance/testdata/repos/repo-clone.txtar b/acceptance/testdata/repos/repo-clone.txtar index 5afc3ab0e..f08953be1 100644 --- a/acceptance/testdata/repos/repo-clone.txtar +++ b/acceptance/testdata/repos/repo-clone.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private diff --git a/acceptance/testdata/repos/repo-create-view.txtar b/acceptance/testdata/repos/repo-create-view.txtar index f1a67ac73..9774def35 100644 --- a/acceptance/testdata/repos/repo-create-view.txtar +++ b/acceptance/testdata/repos/repo-create-view.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private diff --git a/acceptance/testdata/repos/repo-delete.txtar b/acceptance/testdata/repos/repo-delete.txtar index c9fd2c058..2e0bbc62a 100644 --- a/acceptance/testdata/repos/repo-delete.txtar +++ b/acceptance/testdata/repos/repo-delete.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private diff --git a/acceptance/testdata/repos/repo-deploy-key.txtar b/acceptance/testdata/repos/repo-deploy-key.txtar index 42c5b1746..d93d07ee5 100644 --- a/acceptance/testdata/repos/repo-deploy-key.txtar +++ b/acceptance/testdata/repos/repo-deploy-key.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create and clone a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private --clone diff --git a/acceptance/testdata/repos/repo-edit.txtar b/acceptance/testdata/repos/repo-edit.txtar index 3fd5a48f6..00d3cdd2c 100644 --- a/acceptance/testdata/repos/repo-edit.txtar +++ b/acceptance/testdata/repos/repo-edit.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private diff --git a/acceptance/testdata/repos/repo-list-rename.txtar b/acceptance/testdata/repos/repo-list-rename.txtar index 972e5a74a..7f3ff1281 100644 --- a/acceptance/testdata/repos/repo-list-rename.txtar +++ b/acceptance/testdata/repos/repo-list-rename.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private diff --git a/acceptance/testdata/repos/repo-set-default.txtar b/acceptance/testdata/repos/repo-set-default.txtar index c5b16b9ac..4f7fa3273 100644 --- a/acceptance/testdata/repos/repo-set-default.txtar +++ b/acceptance/testdata/repos/repo-set-default.txtar @@ -1,6 +1,3 @@ -# Use gh as a credential helper -exec gh auth setup-git - # Create and clone a repository with a file so it has a default branch exec gh repo create $ORG/$SCRIPT_NAME-$RANDOM_STRING --add-readme --private --clone From ee0d9ab901843a9bd106395928a627b77af63731 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 18 Oct 2024 08:44:36 -0700 Subject: [PATCH 21/25] Wrap boolean strings in '' so it is clear they are strings --- acceptance/testdata/repos/repo-archive-unarchive.txtar | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/acceptance/testdata/repos/repo-archive-unarchive.txtar b/acceptance/testdata/repos/repo-archive-unarchive.txtar index 79122a80c..33ff519f3 100644 --- a/acceptance/testdata/repos/repo-archive-unarchive.txtar +++ b/acceptance/testdata/repos/repo-archive-unarchive.txtar @@ -6,18 +6,18 @@ defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING # Check that the repo exists and isn't archived exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' -stdout false +stdout 'false' # Archive the repo exec gh repo archive $ORG/$SCRIPT_NAME-$RANDOM_STRING --yes # Check that the repo is archived exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' -stdout true +stdout 'true' # Unarchive the repo exec gh repo unarchive $ORG/$SCRIPT_NAME-$RANDOM_STRING --yes # Check that the repo is unarchived exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json=isArchived --jq='.isArchived' -stdout false +stdout 'false' From 25f2956e671721a153ded1822f2e11be0644b4e3 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 18 Oct 2024 08:45:02 -0700 Subject: [PATCH 22/25] Replace LICENSE Makefile README.md acceptance api bin build cmd context docs git go.mod go.sum internal pkg script share test utils commands with --- acceptance/testdata/repos/repo-clone.txtar | 3 +-- acceptance/testdata/repos/repo-fork-sync.txtar | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/acceptance/testdata/repos/repo-clone.txtar b/acceptance/testdata/repos/repo-clone.txtar index f08953be1..b90a0894b 100644 --- a/acceptance/testdata/repos/repo-clone.txtar +++ b/acceptance/testdata/repos/repo-clone.txtar @@ -8,5 +8,4 @@ defer gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING exec gh repo clone $ORG/$SCRIPT_NAME-$RANDOM_STRING # Ensure the repo was cloned -exec ls $SCRIPT_NAME-$RANDOM_STRING -stdout README.md +exists $SCRIPT_NAME-$RANDOM_STRING/README.md diff --git a/acceptance/testdata/repos/repo-fork-sync.txtar b/acceptance/testdata/repos/repo-fork-sync.txtar index 8bc437567..5b2362ffe 100644 --- a/acceptance/testdata/repos/repo-fork-sync.txtar +++ b/acceptance/testdata/repos/repo-fork-sync.txtar @@ -30,15 +30,13 @@ exec git push # Checkout the forked repo and ensure asset.txt is not present cd ../$SCRIPT_NAME-$RANDOM_STRING-fork exec git checkout main -exec ls -! stdout asset.txt +! exists asset.txt # Sync the forked repo with the original repo exec gh repo sync # Check that asset.txt now exists in the fork -exec ls -stdout asset.txt +exists asset.txt -- asset.txt -- Hello, world! From 6c3ad5011b7acb076a039582d52eb6f4f72b16fb Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 18 Oct 2024 08:47:15 -0700 Subject: [PATCH 23/25] Remove unnecessary flags from repo-delete testscript --- acceptance/testdata/repos/repo-delete.txtar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/acceptance/testdata/repos/repo-delete.txtar b/acceptance/testdata/repos/repo-delete.txtar index 2e0bbc62a..b82388068 100644 --- a/acceptance/testdata/repos/repo-delete.txtar +++ b/acceptance/testdata/repos/repo-delete.txtar @@ -9,5 +9,5 @@ stdout $SCRIPT_NAME-$RANDOM_STRING exec gh repo delete --yes $ORG/$SCRIPT_NAME-$RANDOM_STRING # Ensure that the repo was deleted -! exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING --json name --jq '.name' +! exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING stderr 'Could not resolve to a Repository with the name' From 3f4a2aea2f95d41b633ade524dc800424a884228 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 18 Oct 2024 09:22:58 -0700 Subject: [PATCH 24/25] Rename acceptance test directory from repos to repo --- acceptance/acceptance_test.go | 4 ++-- .../testdata/{repos => repo}/repo-archive-unarchive.txtar | 0 acceptance/testdata/{repos => repo}/repo-clone.txtar | 0 acceptance/testdata/{repos => repo}/repo-create-view.txtar | 0 acceptance/testdata/{repos => repo}/repo-delete.txtar | 0 acceptance/testdata/{repos => repo}/repo-deploy-key.txtar | 0 acceptance/testdata/{repos => repo}/repo-edit.txtar | 0 acceptance/testdata/{repos => repo}/repo-fork-sync.txtar | 0 acceptance/testdata/{repos => repo}/repo-list-rename.txtar | 0 acceptance/testdata/{repos => repo}/repo-set-default.txtar | 0 10 files changed, 2 insertions(+), 2 deletions(-) rename acceptance/testdata/{repos => repo}/repo-archive-unarchive.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-clone.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-create-view.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-delete.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-deploy-key.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-edit.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-fork-sync.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-list-rename.txtar (100%) rename acceptance/testdata/{repos => repo}/repo-set-default.txtar (100%) diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go index 366d88cf4..18757cda7 100644 --- a/acceptance/acceptance_test.go +++ b/acceptance/acceptance_test.go @@ -72,12 +72,12 @@ func TestReleases(t *testing.T) { testscript.Run(t, testScriptParamsFor(tsEnv, "release")) } -func TestRepos(t *testing.T) { +func TestRepo(t *testing.T) { var tsEnv testScriptEnv if err := tsEnv.fromEnv(); err != nil { t.Fatal(err) } - testscript.Run(t, testScriptParamsFor(tsEnv, "repos")) + testscript.Run(t, testScriptParamsFor(tsEnv, "repo")) } func testScriptParamsFor(tsEnv testScriptEnv, command string) testscript.Params { diff --git a/acceptance/testdata/repos/repo-archive-unarchive.txtar b/acceptance/testdata/repo/repo-archive-unarchive.txtar similarity index 100% rename from acceptance/testdata/repos/repo-archive-unarchive.txtar rename to acceptance/testdata/repo/repo-archive-unarchive.txtar diff --git a/acceptance/testdata/repos/repo-clone.txtar b/acceptance/testdata/repo/repo-clone.txtar similarity index 100% rename from acceptance/testdata/repos/repo-clone.txtar rename to acceptance/testdata/repo/repo-clone.txtar diff --git a/acceptance/testdata/repos/repo-create-view.txtar b/acceptance/testdata/repo/repo-create-view.txtar similarity index 100% rename from acceptance/testdata/repos/repo-create-view.txtar rename to acceptance/testdata/repo/repo-create-view.txtar diff --git a/acceptance/testdata/repos/repo-delete.txtar b/acceptance/testdata/repo/repo-delete.txtar similarity index 100% rename from acceptance/testdata/repos/repo-delete.txtar rename to acceptance/testdata/repo/repo-delete.txtar diff --git a/acceptance/testdata/repos/repo-deploy-key.txtar b/acceptance/testdata/repo/repo-deploy-key.txtar similarity index 100% rename from acceptance/testdata/repos/repo-deploy-key.txtar rename to acceptance/testdata/repo/repo-deploy-key.txtar diff --git a/acceptance/testdata/repos/repo-edit.txtar b/acceptance/testdata/repo/repo-edit.txtar similarity index 100% rename from acceptance/testdata/repos/repo-edit.txtar rename to acceptance/testdata/repo/repo-edit.txtar diff --git a/acceptance/testdata/repos/repo-fork-sync.txtar b/acceptance/testdata/repo/repo-fork-sync.txtar similarity index 100% rename from acceptance/testdata/repos/repo-fork-sync.txtar rename to acceptance/testdata/repo/repo-fork-sync.txtar diff --git a/acceptance/testdata/repos/repo-list-rename.txtar b/acceptance/testdata/repo/repo-list-rename.txtar similarity index 100% rename from acceptance/testdata/repos/repo-list-rename.txtar rename to acceptance/testdata/repo/repo-list-rename.txtar diff --git a/acceptance/testdata/repos/repo-set-default.txtar b/acceptance/testdata/repo/repo-set-default.txtar similarity index 100% rename from acceptance/testdata/repos/repo-set-default.txtar rename to acceptance/testdata/repo/repo-set-default.txtar From ba324d85ebc3c210c445b93c86daa72f1ee57191 Mon Sep 17 00:00:00 2001 From: Tyler McGoffin Date: Fri, 18 Oct 2024 09:34:13 -0700 Subject: [PATCH 25/25] Wrap true in '' in repo-fork-sync --- acceptance/testdata/repo/repo-fork-sync.txtar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/acceptance/testdata/repo/repo-fork-sync.txtar b/acceptance/testdata/repo/repo-fork-sync.txtar index 5b2362ffe..6ed7b94e1 100644 --- a/acceptance/testdata/repo/repo-fork-sync.txtar +++ b/acceptance/testdata/repo/repo-fork-sync.txtar @@ -18,7 +18,7 @@ sleep 5 # Check that the repo was forked exec gh repo view $ORG/$SCRIPT_NAME-$RANDOM_STRING-fork --json='isFork' --jq='.isFork' -stdout true +stdout 'true' # Modify original repo cd $SCRIPT_NAME-$RANDOM_STRING