Files
kopia/cli/command_object_show.go
2017-09-15 18:35:27 -07:00

88 lines
1.6 KiB
Go

package cli
import (
"bytes"
"compress/gzip"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"github.com/kopia/kopia/snapshot"
"github.com/kopia/kopia/repo"
kingpin "gopkg.in/alecthomas/kingpin.v2"
)
var (
showCommand = objectCommands.Command("show", "Show contents of a repository object.")
showObjectIDs = showCommand.Arg("id", "IDs of objects to show").Required().Strings()
showJSON = showCommand.Flag("json", "Pretty-print JSON content").Short('j').Bool()
showUnzip = showCommand.Flag("unzip", "Transparently unzip the content").Short('z').Bool()
)
func runShowCommand(context *kingpin.ParseContext) error {
rep := mustOpenRepository(nil)
defer rep.Close()
mgr := snapshot.NewManager(rep)
for _, oidString := range *showObjectIDs {
oid, err := parseObjectID(mgr, oidString)
if err != nil {
return err
}
if err := showObject(rep, oid); err != nil {
return err
}
}
return nil
}
func showObject(r *repo.Repository, oid repo.ObjectID) error {
var rd io.ReadCloser
rd, err := r.Objects.Open(oid)
if err != nil {
return err
}
defer rd.Close()
if *showUnzip {
gz, err := gzip.NewReader(rd)
if err != nil {
return fmt.Errorf("unable to open gzip stream: %v", err)
}
rd = gz
}
var buf1, buf2 bytes.Buffer
if *showJSON {
if _, err := io.Copy(&buf1, rd); err != nil {
return err
}
if err := json.Indent(&buf2, buf1.Bytes(), "", " "); err != nil {
return err
}
rd = ioutil.NopCloser(&buf2)
}
if _, err := io.Copy(os.Stdout, rd); err != nil {
return err
}
return nil
}
func init() {
showCommand.Action(runShowCommand)
}