Skip to content

Commit 3d0df55

Browse files
committed
c/snap: add --format json to snap tasks
1 parent dfa9fde commit 3d0df55

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

cmd/snap/cmd_changes.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
package main
2121

2222
import (
23+
"encoding/json"
2324
"fmt"
2425
"regexp"
2526
"sort"
2627

2728
"github.com/jessevdk/go-flags"
28-
2929
"github.com/snapcore/snapd/client"
3030
"github.com/snapcore/snapd/i18n"
3131
)
@@ -51,14 +51,17 @@ type cmdChanges struct {
5151
type cmdTasks struct {
5252
timeMixin
5353
changeIDMixin
54+
Format string `long:"format" required:"false"`
5455
}
5556

5657
func init() {
5758
addCommand("changes", shortChangesHelp, longChangesHelp,
5859
func() flags.Commander { return &cmdChanges{} }, timeDescs, nil)
5960
addCommand("tasks", shortTasksHelp, longTasksHelp,
6061
func() flags.Commander { return &cmdTasks{} },
61-
changeIDMixinOptDesc.also(timeDescs),
62+
changeIDMixinOptDesc.also(timeDescs).also(map[string]string{
63+
"format": i18n.G("Output format (json)."),
64+
}),
6265
changeIDMixinArgDesc).alias = "change"
6366
}
6467

@@ -160,6 +163,15 @@ func (c *cmdTasks) showChange(chid string) error {
160163
return err
161164
}
162165

166+
if c.Format == "json" {
167+
data, err := json.Marshal(chg)
168+
if err != nil {
169+
return err
170+
}
171+
fmt.Fprint(Stdout, string(data))
172+
return nil
173+
}
174+
163175
w := tabWriter()
164176

165177
fmt.Fprint(w, i18n.G("Status\tSpawn\tReady\tSummary\n"))

cmd/snap/cmd_changes_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
package main_test
2121

2222
import (
23+
"encoding/json"
2324
"fmt"
2425
"net/http"
2526
"strings"
2627

2728
"gopkg.in/check.v1"
2829

2930
snap "github.com/snapcore/snapd/cmd/snap"
31+
"github.com/snapcore/snapd/client"
3032
)
3133

3234
var mockChangeJSON = `{"type": "sync", "result": {
@@ -232,6 +234,30 @@ Doing +2016-04-21T01:02:03Z +2016-04-21T01:02:04Z +some summary \(50.00%\)
232234
c.Check(s.Stderr(), check.Equals, "")
233235
}
234236

237+
func (s *SnapSuite) TestTasksJSON(c *check.C) {
238+
s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
239+
c.Check(r.Method, check.Equals, "GET")
240+
c.Check(r.URL.Path, check.Equals, "/v2/changes/42")
241+
fmt.Fprintln(w, mockChangeJSON)
242+
})
243+
244+
rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"tasks", "--format=json", "42"})
245+
c.Assert(err, check.IsNil)
246+
c.Assert(rest, check.DeepEquals, []string{})
247+
248+
var chg client.Change
249+
c.Assert(json.Unmarshal([]byte(s.Stdout()), &chg), check.IsNil)
250+
c.Check(chg.ID, check.Equals, "uno")
251+
c.Check(chg.Kind, check.Equals, "foo")
252+
c.Check(chg.Summary, check.Equals, "...")
253+
c.Check(chg.Status, check.Equals, "Do")
254+
c.Check(chg.Ready, check.Equals, false)
255+
c.Assert(chg.Tasks, check.HasLen, 1)
256+
c.Check(chg.Tasks[0].Kind, check.Equals, "bar")
257+
c.Check(chg.Tasks[0].Summary, check.Equals, "some summary")
258+
c.Check(chg.Tasks[0].Status, check.Equals, "Do")
259+
}
260+
235261
func (s *SnapSuite) TestNoChanges(c *check.C) {
236262
n := 0
237263
s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {

0 commit comments

Comments
 (0)