Merge pull request #6051 from cli/api-headers-pager

Fix writing `gh api -i` response headers to terminal pager
This commit is contained in:
Mislav Marohnić 2022-08-10 17:54:06 +02:00 committed by GitHub
commit 95dcd4a6e0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 18 deletions

View file

@ -272,10 +272,7 @@ func apiRun(opts *ApiOptions) error {
httpClient = api.NewCachedHTTPClient(httpClient, opts.CacheTTL)
}
headersOutputStream := opts.IO.Out
if opts.Silent {
opts.IO.Out = io.Discard
} else {
if !opts.Silent {
if err := opts.IO.StartPager(); err == nil {
defer opts.IO.StopPager()
} else {
@ -283,6 +280,12 @@ func apiRun(opts *ApiOptions) error {
}
}
bodyWriter := opts.IO.Out
headersWriter := opts.IO.Out
if opts.Silent {
bodyWriter = io.Discard
}
cfg, err := opts.Config()
if err != nil {
return err
@ -303,7 +306,7 @@ func apiRun(opts *ApiOptions) error {
return err
}
endCursor, err := processResponse(resp, opts, headersOutputStream, &template)
endCursor, err := processResponse(resp, opts, bodyWriter, headersWriter, &template)
if err != nil {
return err
}
@ -330,11 +333,11 @@ func apiRun(opts *ApiOptions) error {
return template.End()
}
func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream io.Writer, template *export.Template) (endCursor string, err error) {
func processResponse(resp *http.Response, opts *ApiOptions, bodyWriter, headersWriter io.Writer, template *export.Template) (endCursor string, err error) {
if opts.ShowResponseHeaders {
fmt.Fprintln(headersOutputStream, resp.Proto, resp.Status)
printHeaders(headersOutputStream, resp.Header, opts.IO.ColorEnabled())
fmt.Fprint(headersOutputStream, "\r\n")
fmt.Fprintln(headersWriter, resp.Proto, resp.Status)
printHeaders(headersWriter, resp.Header, opts.IO.ColorEnabled())
fmt.Fprint(headersWriter, "\r\n")
}
if resp.StatusCode == 204 {
@ -362,20 +365,20 @@ func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream
if opts.FilterOutput != "" && serverError == "" {
// TODO: reuse parsed query across pagination invocations
err = export.FilterJSON(opts.IO.Out, responseBody, opts.FilterOutput)
err = export.FilterJSON(bodyWriter, responseBody, opts.FilterOutput)
if err != nil {
return
}
} else if opts.Template != "" && serverError == "" {
// TODO: reuse parsed template across pagination invocations
err = template.Execute(responseBody)
err = template.Execute(bodyWriter, responseBody)
if err != nil {
return
}
} else if isJSON && opts.IO.ColorEnabled() {
err = jsoncolor.Write(opts.IO.Out, responseBody, " ")
err = jsoncolor.Write(bodyWriter, responseBody, " ")
} else {
_, err = io.Copy(opts.IO.Out, responseBody)
_, err = io.Copy(bodyWriter, responseBody)
}
if err != nil {
return

View file

@ -1299,7 +1299,7 @@ func Test_processResponse_template(t *testing.T) {
Template: `{{range .}}{{.title}} ({{.labels | pluck "name" | join ", " }}){{"\n"}}{{end}}`,
}
template := export.NewTemplate(ios, opts.Template)
_, err := processResponse(&resp, &opts, io.Discard, &template)
_, err := processResponse(&resp, &opts, ios.Out, io.Discard, &template)
require.NoError(t, err)
err = template.End()

View file

@ -76,9 +76,7 @@ func (t *Template) parseTemplate(tpl string) (*template.Template, error) {
return template.New("").Funcs(templateFuncs).Parse(tpl)
}
func (t *Template) Execute(input io.Reader) error {
w := t.io.Out
func (t *Template) Execute(w io.Writer, input io.Reader) error {
if t.template == nil {
template, err := t.parseTemplate(t.templateStr)
if err != nil {
@ -103,7 +101,7 @@ func (t *Template) Execute(input io.Reader) error {
func ExecuteTemplate(io *iostreams.IOStreams, input io.Reader, template string) error {
t := NewTemplate(io, template)
if err := t.Execute(input); err != nil {
if err := t.Execute(io.Out, input); err != nil {
return err
}
return t.End()