Skip to content

Commit 35f0f9a

Browse files
committed
Write query patterns to stdout
Support `-` as the customary stdout file name in the `--output` flag so the CSV content can be piped into another tool without an intermediate file.
1 parent b0914f1 commit 35f0f9a

2 files changed

Lines changed: 41 additions & 3 deletions

File tree

internal/cmd/branch/query_patterns.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,18 @@ func DownloadQueryPatternsCmd(ch *cmdutil.Helper) *cobra.Command {
4949
RunE: func(cmd *cobra.Command, args []string) error {
5050
ctx := cmd.Context()
5151
database, branch := args[0], args[1]
52+
toStdout := flags.output == "-"
5253

5354
client, err := ch.Client()
5455
if err != nil {
5556
return err
5657
}
5758

58-
end := ch.Printer.PrintProgress(fmt.Sprintf("Generating query patterns report for %s in %s...",
59-
printer.BoldBlue(branch), printer.BoldBlue(database)))
59+
end := func() {}
60+
if !toStdout {
61+
end = ch.Printer.PrintProgress(fmt.Sprintf("Generating query patterns report for %s in %s...",
62+
printer.BoldBlue(branch), printer.BoldBlue(database)))
63+
}
6064
defer end()
6165

6266
report, err := client.QueryPatterns.CreateReport(ctx, &ps.CreateQueryPatternsReportRequest{
@@ -111,6 +115,13 @@ func DownloadQueryPatternsCmd(ch *cmdutil.Helper) *cobra.Command {
111115
}
112116
defer body.Close()
113117

118+
if toStdout {
119+
if _, err := io.Copy(cmd.OutOrStdout(), body); err != nil {
120+
return fmt.Errorf("writing query patterns report to stdout: %w", err)
121+
}
122+
return nil
123+
}
124+
114125
f, err := os.Create(path)
115126
if err != nil {
116127
return fmt.Errorf("creating file %s: %w", path, err)
@@ -140,7 +151,7 @@ func DownloadQueryPatternsCmd(ch *cmdutil.Helper) *cobra.Command {
140151
}
141152

142153
cmd.Flags().StringVar(&flags.output, "output", "",
143-
"Output file for the query patterns report. Defaults to the current directory as query-patterns-<organization>-<database>-<branch>-<timestamp>.csv.")
154+
"Output file name, or - to write to stdout. Defaults to query-patterns-<organization>-<database>-<branch>-<timestamp>.csv.")
144155

145156
return cmd
146157
}

internal/cmd/branch/query_patterns_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,33 @@ func TestBranch_QueryPatternsDownloadCmd(t *testing.T) {
105105
})
106106
}
107107

108+
func TestBranch_QueryPatternsDownloadCmd_Stdout(t *testing.T) {
109+
c := qt.New(t)
110+
111+
prevInterval := queryPatternsPollInterval
112+
queryPatternsPollInterval = 10 * time.Millisecond
113+
t.Cleanup(func() { queryPatternsPollInterval = prevInterval })
114+
115+
server := queryPatternsServer(t, c, []string{"pending", "completed"})
116+
117+
var buf bytes.Buffer
118+
ch := queryPatternsTestHelper("my-org", server.URL, printer.Human, &buf)
119+
120+
var humanOut bytes.Buffer
121+
ch.Printer.SetHumanOutput(&humanOut)
122+
123+
var stdout bytes.Buffer
124+
cmd := QueryPatternsCmd(ch)
125+
cmd.SetOut(&stdout)
126+
cmd.SetArgs([]string{"download", "my-db", "my-branch", "--output", "-"})
127+
err := cmd.Execute()
128+
129+
c.Assert(err, qt.IsNil)
130+
c.Assert(stdout.String(), qt.Equals, queryPatternsCSV)
131+
c.Assert(humanOut.String(), qt.Equals, "")
132+
c.Assert(buf.String(), qt.Equals, "")
133+
}
134+
108135
func TestBranch_QueryPatternsDownloadCmd_Failed(t *testing.T) {
109136
c := qt.New(t)
110137

0 commit comments

Comments
 (0)