From 04c67d700d14f9583fad475521f3e927105e06e5 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Sun, 19 Aug 2018 00:18:43 -0600 Subject: [PATCH] ls: Stream output when using --json option --- cmd/restic/cmd_ls.go | 53 ++++++++--------------------------------- cmd/restic/global.go | 4 +++- internal/restic/node.go | 2 +- 3 files changed, 14 insertions(+), 45 deletions(-) diff --git a/cmd/restic/cmd_ls.go b/cmd/restic/cmd_ls.go index d6297be04..3bfd53f9e 100644 --- a/cmd/restic/cmd_ls.go +++ b/cmd/restic/cmd_ls.go @@ -3,9 +3,7 @@ package main import ( "context" "encoding/json" - "os" "strings" - "time" "github.com/spf13/cobra" @@ -64,25 +62,14 @@ func init() { type lsSnapshot struct { *restic.Snapshot - ID *restic.ID `json:"id"` ShortID string `json:"short_id"` - Nodes []lsNode `json:"nodes"` StructType string `json:"struct_type"` // "snapshot" } type lsNode struct { - Name string `json:"name"` - Type string `json:"type"` - Path string `json:"path"` - UID uint32 `json:"uid"` - GID uint32 `json:"gid"` - Size uint64 `json:"size,omitempty"` - Mode os.FileMode `json:"mode,omitempty"` - ModTime time.Time `json:"mtime,omitempty"` - AccessTime time.Time `json:"atime,omitempty"` - ChangeTime time.Time `json:"ctime,omitempty"` - StructType string `json:"struct_type"` // "node" + *restic.Node + StructType string `json:"struct_type"` // "node" } func runLs(opts LsOptions, gopts GlobalOptions, args []string) error { @@ -150,54 +137,33 @@ func runLs(opts LsOptions, gopts GlobalOptions, args []string) error { var ( printSnapshot func(sn *restic.Snapshot) printNode func(path string, node *restic.Node) - printFinish func() error ) if gopts.JSON { - var lssnapshots []lsSnapshot + enc := json.NewEncoder(gopts.stdout) printSnapshot = func(sn *restic.Snapshot) { - lss := lsSnapshot{ + enc.Encode(lsSnapshot{ Snapshot: sn, ID: sn.ID(), ShortID: sn.ID().Str(), StructType: "snapshot", - } - lssnapshots = append(lssnapshots, lss) + }) } printNode = func(path string, node *restic.Node) { - lsn := lsNode{ - Name: node.Name, - Type: node.Type, - Path: path, - UID: node.UID, - GID: node.GID, - Size: node.Size, - Mode: node.Mode, - ModTime: node.ModTime, - AccessTime: node.AccessTime, - ChangeTime: node.ChangeTime, + enc.Encode(lsNode{ + Node: node, StructType: "node", - } - s := &lssnapshots[len(lssnapshots)-1] - s.Nodes = append(s.Nodes, lsn) - } - - printFinish = func() error { - return json.NewEncoder(gopts.stdout).Encode(lssnapshots) + }) } } else { - // default output methods printSnapshot = func(sn *restic.Snapshot) { Verbosef("snapshot %s of %v filtered by %v at %s):\n", sn.ID().Str(), sn.Paths, dirs, sn.Time) } printNode = func(path string, node *restic.Node) { Printf("%s\n", formatNode(path, node, lsOptions.ListLong)) } - printFinish = func() error { - return nil - } } for sn := range FindFilteredSnapshots(ctx, repo, opts.Host, opts.Tags, opts.Paths, args[:1]) { @@ -240,5 +206,6 @@ func runLs(opts LsOptions, gopts GlobalOptions, args []string) error { return err } } - return printFinish() + + return nil } diff --git a/cmd/restic/global.go b/cmd/restic/global.go index d35b6ba4f..902734990 100644 --- a/cmd/restic/global.go +++ b/cmd/restic/global.go @@ -360,7 +360,9 @@ func OpenRepository(opts GlobalOptions) (*repository.Repository, error) { if len(id) > 8 { id = id[:8] } - Verbosef("repository %v opened successfully, password is correct\n", id) + if !opts.JSON { + Verbosef("repository %v opened successfully, password is correct\n", id) + } } if opts.NoCache { diff --git a/internal/restic/node.go b/internal/restic/node.go index cec7938e5..24fe4598e 100644 --- a/internal/restic/node.go +++ b/internal/restic/node.go @@ -50,7 +50,7 @@ type Node struct { Error string `json:"error,omitempty"` - Path string `json:"-"` + Path string `json:"path"` } // Nodes is a slice of nodes that can be sorted.