Files
kopia/cli/show_utils.go
Jarek Kowalski ad4b222939 cli: added support for copying (or moving) snapshot history (#703)
Both source and destination can be specified using user@host,
@host or user@host:/path where destination values override the
corresponding parts of the source, so both targeted
and mass copying is supported.

Supported combinations are:

Source:             Destination         Behavior
---------------------------------------------------
@host1              @host2              copy snapshots from all users of host1
user1@host1         @host2              copy all snapshots to user1@host2
user1@host1         user2@host2         copy all snapshots to user2@host2
user1@host1:/path1  @host2              copy to user1@host2:/path1
user1@host1:/path1  user2@host2         copy to user2@host2:/path1
user1@host1:/path1  user2@host2:/path2  copy snapshots from single path

When --move is specified, the matching source snapshots are also deleted.

* cli: upgraded kingpin to latest version (not tagged)

This allows using `EnableFileExpansion` to disable treating
arguments prefixed with "@" as file includes.
2020-12-04 16:34:55 -08:00

108 lines
2.1 KiB
Go

package cli
import (
"bytes"
"compress/gzip"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"time"
"github.com/alecthomas/kingpin"
"github.com/pkg/errors"
"github.com/kopia/kopia/internal/iocopy"
"github.com/kopia/kopia/internal/units"
)
var (
commonIndentJSON bool
commonUnzip bool
timeZone = app.Flag("timezone", "Format time according to specified time zone (local, utc, original or time zone name)").Default("local").Hidden().String()
)
func setupShowCommand(cmd *kingpin.CmdClause) {
cmd.Flag("json", "Pretty-print JSON content").Short('j').BoolVar(&commonIndentJSON)
cmd.Flag("unzip", "Transparently unzip the content").Short('z').BoolVar(&commonUnzip)
}
func showContent(rd io.Reader) error {
return showContentWithFlags(rd, commonUnzip, commonIndentJSON)
}
func showContentWithFlags(rd io.Reader, unzip, indentJSON bool) error {
if unzip {
gz, err := gzip.NewReader(rd)
if err != nil {
return errors.Wrap(err, "unable to open gzip stream")
}
rd = gz
}
var buf1, buf2 bytes.Buffer
if indentJSON {
if _, err := iocopy.Copy(&buf1, rd); err != nil {
return err
}
if err := json.Indent(&buf2, buf1.Bytes(), "", " "); err != nil {
return err
}
rd = ioutil.NopCloser(&buf2)
}
if _, err := iocopy.Copy(os.Stdout, rd); err != nil {
return err
}
return nil
}
func maybeHumanReadableBytes(enable bool, value int64) string {
if enable {
return units.BytesStringBase10(value)
}
return fmt.Sprintf("%v", value)
}
func maybeHumanReadableCount(enable bool, value int64) string {
if enable {
return units.Count(value)
}
return fmt.Sprintf("%v", value)
}
func formatTimestamp(ts time.Time) string {
return convertTimezone(ts).Format("2006-01-02 15:04:05 MST")
}
func formatTimestampPrecise(ts time.Time) string {
return convertTimezone(ts).Format("2006-01-02 15:04:05.000 MST")
}
func convertTimezone(ts time.Time) time.Time {
switch *timeZone {
case "local":
return ts.Local()
case "utc":
return ts.UTC()
case "original":
return ts
default:
loc, err := time.LoadLocation(*timeZone)
if err == nil {
return ts.In(loc)
}
return ts
}
}