X Tutup
Skip to content

Commit a47ee66

Browse files
committed
Pr edit command
1 parent 4109af9 commit a47ee66

File tree

7 files changed

+953
-144
lines changed

7 files changed

+953
-144
lines changed

api/queries_pr.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,34 @@ func CreatePullRequest(client *Client, repo *Repository, params map[string]inter
835835
return pr, nil
836836
}
837837

838+
func UpdatePullRequest(client *Client, repo ghrepo.Interface, params githubv4.UpdatePullRequestInput) error {
839+
var mutation struct {
840+
UpdatePullRequest struct {
841+
PullRequest struct {
842+
ID string
843+
}
844+
} `graphql:"updatePullRequest(input: $input)"`
845+
}
846+
variables := map[string]interface{}{"input": params}
847+
gql := graphQLClient(client.http, repo.RepoHost())
848+
err := gql.MutateNamed(context.Background(), "PullRequestUpdate", &mutation, variables)
849+
return err
850+
}
851+
852+
func UpdatePullRequestReviews(client *Client, repo ghrepo.Interface, params githubv4.RequestReviewsInput) error {
853+
var mutation struct {
854+
RequestReviews struct {
855+
PullRequest struct {
856+
ID string
857+
}
858+
} `graphql:"requestReviews(input: $input)"`
859+
}
860+
variables := map[string]interface{}{"input": params}
861+
gql := graphQLClient(client.http, repo.RepoHost())
862+
err := gql.MutateNamed(context.Background(), "PullRequestUpdateRequestReviews", &mutation, variables)
863+
return err
864+
}
865+
838866
func isBlank(v interface{}) bool {
839867
switch vv := v.(type) {
840868
case string:

pkg/cmd/issue/edit/edit.go

Lines changed: 47 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ type EditOptions struct {
2222
BaseRepo func() (ghrepo.Interface, error)
2323

2424
DetermineEditor func() (string, error)
25-
FieldsToEditSurvey func(*prShared.EditableOptions) error
26-
EditableSurvey func(string, *prShared.EditableOptions) error
27-
FetchOptions func(*api.Client, ghrepo.Interface, *prShared.EditableOptions) error
25+
FieldsToEditSurvey func(*prShared.Editable) error
26+
EditFieldsSurvey func(*prShared.Editable, string) error
27+
FetchOptions func(*api.Client, ghrepo.Interface, *prShared.Editable) error
2828

2929
SelectorArg string
3030
Interactive bool
3131

32-
prShared.EditableOptions
32+
prShared.Editable
3333
}
3434

3535
func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Command {
@@ -38,7 +38,7 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman
3838
HttpClient: f.HttpClient,
3939
DetermineEditor: func() (string, error) { return cmdutil.DetermineEditor(f.Config) },
4040
FieldsToEditSurvey: prShared.FieldsToEditSurvey,
41-
EditableSurvey: prShared.EditableSurvey,
41+
EditFieldsSurvey: prShared.EditFieldsSurvey,
4242
FetchOptions: prShared.FetchOptions,
4343
}
4444

@@ -62,25 +62,25 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman
6262

6363
flags := cmd.Flags()
6464
if flags.Changed("title") {
65-
opts.EditableOptions.TitleEdited = true
65+
opts.Editable.TitleEdited = true
6666
}
6767
if flags.Changed("body") {
68-
opts.EditableOptions.BodyEdited = true
68+
opts.Editable.BodyEdited = true
6969
}
7070
if flags.Changed("assignee") {
71-
opts.EditableOptions.AssigneesEdited = true
71+
opts.Editable.AssigneesEdited = true
7272
}
7373
if flags.Changed("label") {
74-
opts.EditableOptions.LabelsEdited = true
74+
opts.Editable.LabelsEdited = true
7575
}
7676
if flags.Changed("project") {
77-
opts.EditableOptions.ProjectsEdited = true
77+
opts.Editable.ProjectsEdited = true
7878
}
7979
if flags.Changed("milestone") {
80-
opts.EditableOptions.MilestoneEdited = true
80+
opts.Editable.MilestoneEdited = true
8181
}
8282

83-
if !opts.EditableOptions.Dirty() {
83+
if !opts.Editable.Dirty() {
8484
opts.Interactive = true
8585
}
8686

@@ -96,12 +96,12 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman
9696
},
9797
}
9898

99-
cmd.Flags().StringVarP(&opts.EditableOptions.Title, "title", "t", "", "Revise the issue title.")
100-
cmd.Flags().StringVarP(&opts.EditableOptions.Body, "body", "b", "", "Revise the issue body.")
101-
cmd.Flags().StringSliceVarP(&opts.EditableOptions.Assignees, "assignee", "a", nil, "Set assigned people by their `login`. Use \"@me\" to self-assign.")
102-
cmd.Flags().StringSliceVarP(&opts.EditableOptions.Labels, "label", "l", nil, "Set the issue labels by `name`")
103-
cmd.Flags().StringSliceVarP(&opts.EditableOptions.Projects, "project", "p", nil, "Set the projects the issue belongs to by `name`")
104-
cmd.Flags().StringVarP(&opts.EditableOptions.Milestone, "milestone", "m", "", "Set the milestone the issue belongs to by `name`")
99+
cmd.Flags().StringVarP(&opts.Editable.Title, "title", "t", "", "Revise the issue title.")
100+
cmd.Flags().StringVarP(&opts.Editable.Body, "body", "b", "", "Revise the issue body.")
101+
cmd.Flags().StringSliceVarP(&opts.Editable.Assignees, "assignee", "a", nil, "Set assigned people by their `login`. Use \"@me\" to self-assign.")
102+
cmd.Flags().StringSliceVarP(&opts.Editable.Labels, "label", "l", nil, "Set the issue labels by `name`")
103+
cmd.Flags().StringSliceVarP(&opts.Editable.Projects, "project", "p", nil, "Set the projects the issue belongs to by `name`")
104+
cmd.Flags().StringVarP(&opts.Editable.Milestone, "milestone", "m", "", "Set the milestone the issue belongs to by `name`")
105105

106106
return cmd
107107
}
@@ -118,23 +118,23 @@ func editRun(opts *EditOptions) error {
118118
return err
119119
}
120120

121-
editOptions := opts.EditableOptions
122-
editOptions.TitleDefault = issue.Title
123-
editOptions.BodyDefault = issue.Body
124-
editOptions.AssigneesDefault = issue.Assignees
125-
editOptions.LabelsDefault = issue.Labels
126-
editOptions.ProjectsDefault = issue.ProjectCards
127-
editOptions.MilestoneDefault = issue.Milestone
121+
editable := opts.Editable
122+
editable.TitleDefault = issue.Title
123+
editable.BodyDefault = issue.Body
124+
editable.AssigneesDefault = issue.Assignees
125+
editable.LabelsDefault = issue.Labels
126+
editable.ProjectsDefault = issue.ProjectCards
127+
editable.MilestoneDefault = issue.Milestone
128128

129129
if opts.Interactive {
130-
err = opts.FieldsToEditSurvey(&editOptions)
130+
err = opts.FieldsToEditSurvey(&editable)
131131
if err != nil {
132132
return err
133133
}
134134
}
135135

136136
opts.IO.StartProgressIndicator()
137-
err = opts.FetchOptions(apiClient, repo, &editOptions)
137+
err = opts.FetchOptions(apiClient, repo, &editable)
138138
opts.IO.StopProgressIndicator()
139139
if err != nil {
140140
return err
@@ -145,14 +145,14 @@ func editRun(opts *EditOptions) error {
145145
if err != nil {
146146
return err
147147
}
148-
err = opts.EditableSurvey(editorCommand, &editOptions)
148+
err = opts.EditFieldsSurvey(&editable, editorCommand)
149149
if err != nil {
150150
return err
151151
}
152152
}
153153

154154
opts.IO.StartProgressIndicator()
155-
err = updateIssue(apiClient, repo, issue.ID, editOptions)
155+
err = updateIssue(apiClient, repo, issue.ID, editable)
156156
opts.IO.StopProgressIndicator()
157157
if err != nil {
158158
return err
@@ -163,61 +163,28 @@ func editRun(opts *EditOptions) error {
163163
return nil
164164
}
165165

166-
func updateIssue(client *api.Client, repo ghrepo.Interface, id string, options prShared.EditableOptions) error {
167-
params := githubv4.UpdateIssueInput{ID: id}
168-
if options.TitleEdited {
169-
title := githubv4.String(options.Title)
170-
params.Title = &title
166+
func updateIssue(client *api.Client, repo ghrepo.Interface, id string, options prShared.Editable) error {
167+
var err error
168+
params := githubv4.UpdateIssueInput{
169+
ID: id,
170+
Title: options.TitleParam(),
171+
Body: options.BodyParam(),
171172
}
172-
if options.BodyEdited {
173-
body := githubv4.String(options.Body)
174-
params.Body = &body
175-
}
176-
if options.AssigneesEdited {
177-
meReplacer := prShared.NewMeReplacer(client, repo.RepoHost())
178-
assignees, err := meReplacer.ReplaceSlice(options.Assignees)
179-
if err != nil {
180-
return err
181-
}
182-
ids, err := options.Metadata.MembersToIDs(assignees)
183-
if err != nil {
184-
return err
185-
}
186-
assigneeIDs := make([]githubv4.ID, len(ids))
187-
for i, v := range ids {
188-
assigneeIDs[i] = v
189-
}
190-
params.AssigneeIDs = &assigneeIDs
173+
params.AssigneeIDs, err = options.AssigneesParam(client, repo)
174+
if err != nil {
175+
return err
191176
}
192-
if options.LabelsEdited {
193-
ids, err := options.Metadata.LabelsToIDs(options.Labels)
194-
if err != nil {
195-
return err
196-
}
197-
labelIDs := make([]githubv4.ID, len(ids))
198-
for i, v := range ids {
199-
labelIDs[i] = v
200-
}
201-
params.LabelIDs = &labelIDs
177+
params.LabelIDs, err = options.LabelsParam()
178+
if err != nil {
179+
return err
202180
}
203-
if options.ProjectsEdited {
204-
ids, err := options.Metadata.ProjectsToIDs(options.Projects)
205-
if err != nil {
206-
return err
207-
}
208-
projectIDs := make([]githubv4.ID, len(ids))
209-
for i, v := range ids {
210-
projectIDs[i] = v
211-
}
212-
params.ProjectIDs = &projectIDs
181+
params.ProjectIDs, err = options.ProjectsParam()
182+
if err != nil {
183+
return err
213184
}
214-
if options.MilestoneEdited {
215-
id, err := options.Metadata.MilestoneToID(options.Milestone)
216-
if err != nil {
217-
return err
218-
}
219-
milestoneID := githubv4.ID(id)
220-
params.MilestoneID = &milestoneID
185+
params.MilestoneID, err = options.MilestoneParam()
186+
if err != nil {
187+
return err
221188
}
222189
return api.IssueUpdate(client, repo, params)
223190
}

pkg/cmd/issue/edit/edit_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func TestNewCmdEdit(t *testing.T) {
4141
input: "23 --title test",
4242
output: EditOptions{
4343
SelectorArg: "23",
44-
EditableOptions: prShared.EditableOptions{
44+
Editable: prShared.Editable{
4545
Title: "test",
4646
TitleEdited: true,
4747
},
@@ -53,7 +53,7 @@ func TestNewCmdEdit(t *testing.T) {
5353
input: "23 --body test",
5454
output: EditOptions{
5555
SelectorArg: "23",
56-
EditableOptions: prShared.EditableOptions{
56+
Editable: prShared.Editable{
5757
Body: "test",
5858
BodyEdited: true,
5959
},
@@ -65,7 +65,7 @@ func TestNewCmdEdit(t *testing.T) {
6565
input: "23 --assignee monalisa,hubot",
6666
output: EditOptions{
6767
SelectorArg: "23",
68-
EditableOptions: prShared.EditableOptions{
68+
Editable: prShared.Editable{
6969
Assignees: []string{"monalisa", "hubot"},
7070
AssigneesEdited: true,
7171
},
@@ -77,7 +77,7 @@ func TestNewCmdEdit(t *testing.T) {
7777
input: "23 --label feature,TODO,bug",
7878
output: EditOptions{
7979
SelectorArg: "23",
80-
EditableOptions: prShared.EditableOptions{
80+
Editable: prShared.Editable{
8181
Labels: []string{"feature", "TODO", "bug"},
8282
LabelsEdited: true,
8383
},
@@ -89,7 +89,7 @@ func TestNewCmdEdit(t *testing.T) {
8989
input: "23 --project Cleanup,Roadmap",
9090
output: EditOptions{
9191
SelectorArg: "23",
92-
EditableOptions: prShared.EditableOptions{
92+
Editable: prShared.Editable{
9393
Projects: []string{"Cleanup", "Roadmap"},
9494
ProjectsEdited: true,
9595
},
@@ -101,7 +101,7 @@ func TestNewCmdEdit(t *testing.T) {
101101
input: "23 --milestone GA",
102102
output: EditOptions{
103103
SelectorArg: "23",
104-
EditableOptions: prShared.EditableOptions{
104+
Editable: prShared.Editable{
105105
Milestone: "GA",
106106
MilestoneEdited: true,
107107
},
@@ -144,7 +144,7 @@ func TestNewCmdEdit(t *testing.T) {
144144
assert.NoError(t, err)
145145
assert.Equal(t, tt.output.SelectorArg, gotOpts.SelectorArg)
146146
assert.Equal(t, tt.output.Interactive, gotOpts.Interactive)
147-
assert.Equal(t, tt.output.EditableOptions, gotOpts.EditableOptions)
147+
assert.Equal(t, tt.output.Editable, gotOpts.Editable)
148148
})
149149
}
150150
}
@@ -162,7 +162,7 @@ func Test_editRun(t *testing.T) {
162162
input: &EditOptions{
163163
SelectorArg: "123",
164164
Interactive: false,
165-
EditableOptions: prShared.EditableOptions{
165+
Editable: prShared.Editable{
166166
Title: "new title",
167167
TitleEdited: true,
168168
Body: "new body",
@@ -190,7 +190,7 @@ func Test_editRun(t *testing.T) {
190190
input: &EditOptions{
191191
SelectorArg: "123",
192192
Interactive: true,
193-
FieldsToEditSurvey: func(eo *prShared.EditableOptions) error {
193+
FieldsToEditSurvey: func(eo *prShared.Editable) error {
194194
eo.TitleEdited = true
195195
eo.BodyEdited = true
196196
eo.AssigneesEdited = true
@@ -199,7 +199,7 @@ func Test_editRun(t *testing.T) {
199199
eo.MilestoneEdited = true
200200
return nil
201201
},
202-
EditableSurvey: func(_ string, eo *prShared.EditableOptions) error {
202+
EditFieldsSurvey: func(eo *prShared.Editable, _ string) error {
203203
eo.Title = "new title"
204204
eo.Body = "new body"
205205
eo.Assignees = []string{"monalisa", "hubot"}

0 commit comments

Comments
 (0)
X Tutup