forked from TrueCloudLab/restic
Remove old text table implementation
This commit is contained in:
parent
9aa36a37c7
commit
76387b6cd0
4 changed files with 45 additions and 116 deletions
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/restic/restic/internal/cache"
|
"github.com/restic/restic/internal/cache"
|
||||||
"github.com/restic/restic/internal/errors"
|
"github.com/restic/restic/internal/errors"
|
||||||
"github.com/restic/restic/internal/fs"
|
"github.com/restic/restic/internal/fs"
|
||||||
|
"github.com/restic/restic/internal/ui/table"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -85,9 +86,17 @@ func runCache(opts CacheOptions, gopts GlobalOptions, args []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
tab := NewTable()
|
tab := table.New()
|
||||||
tab.Header = fmt.Sprintf("%-14s %-16s %s", "Repository ID", "Last Used", "Old")
|
|
||||||
tab.RowFormat = "%-14s %-16s %s"
|
type data struct {
|
||||||
|
ID string
|
||||||
|
Last string
|
||||||
|
Old string
|
||||||
|
}
|
||||||
|
|
||||||
|
tab.AddColumn("Repo ID", "{{ .ID }}")
|
||||||
|
tab.AddColumn("Last Used", "{{ .Last }}")
|
||||||
|
tab.AddColumn("Old", "{{ .Old }}")
|
||||||
|
|
||||||
dirs, err := cache.All(cachedir)
|
dirs, err := cache.All(cachedir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -109,7 +118,7 @@ func runCache(opts CacheOptions, gopts GlobalOptions, args []string) error {
|
||||||
old = "yes"
|
old = "yes"
|
||||||
}
|
}
|
||||||
|
|
||||||
tab.Rows = append(tab.Rows, []interface{}{
|
tab.AddRow(data{
|
||||||
entry.Name()[:10],
|
entry.Name()[:10],
|
||||||
fmt.Sprintf("%d days ago", uint(time.Since(entry.ModTime()).Hours()/24)),
|
fmt.Sprintf("%d days ago", uint(time.Since(entry.ModTime()).Hours()/24)),
|
||||||
old,
|
old,
|
||||||
|
|
|
@ -3,7 +3,6 @@ package main
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"github.com/restic/restic/internal/errors"
|
"github.com/restic/restic/internal/errors"
|
||||||
"github.com/restic/restic/internal/repository"
|
"github.com/restic/restic/internal/repository"
|
||||||
"github.com/restic/restic/internal/restic"
|
"github.com/restic/restic/internal/restic"
|
||||||
|
"github.com/restic/restic/internal/ui/table"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
@ -36,53 +36,18 @@ func init() {
|
||||||
flags.StringVarP(&newPasswordFile, "new-password-file", "", "", "the file from which to load a new password")
|
flags.StringVarP(&newPasswordFile, "new-password-file", "", "", "the file from which to load a new password")
|
||||||
}
|
}
|
||||||
|
|
||||||
type keyInfo struct {
|
|
||||||
Current bool `json:"current"`
|
|
||||||
ID string `json:"id"`
|
|
||||||
UserName string `json:"userName"`
|
|
||||||
HostName string `json:"hostName"`
|
|
||||||
Created string `json:"created"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ki keyInfo) CurrentStr() string {
|
|
||||||
if ki.Current {
|
|
||||||
return "*"
|
|
||||||
}
|
|
||||||
return " "
|
|
||||||
}
|
|
||||||
|
|
||||||
func listKeys(ctx context.Context, s *repository.Repository, gopts GlobalOptions) error {
|
func listKeys(ctx context.Context, s *repository.Repository, gopts GlobalOptions) error {
|
||||||
var (
|
type keyInfo struct {
|
||||||
appendKey func(keyInfo)
|
Current bool `json:"current"`
|
||||||
printKeys func() error
|
ID string `json:"id"`
|
||||||
)
|
UserName string `json:"userName"`
|
||||||
|
HostName string `json:"hostName"`
|
||||||
switch gopts.JSON {
|
Created string `json:"created"`
|
||||||
case true:
|
|
||||||
var keys []keyInfo
|
|
||||||
|
|
||||||
appendKey = func(key keyInfo) {
|
|
||||||
keys = append(keys, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
printKeys = func() error {
|
|
||||||
return json.NewEncoder(gopts.stdout).Encode(keys)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
tab := NewTable()
|
|
||||||
tab.Header = fmt.Sprintf(" %-10s %-10s %-10s %s", "ID", "User", "Host", "Created")
|
|
||||||
tab.RowFormat = "%s%-10s %-10s %-10s %s"
|
|
||||||
|
|
||||||
appendKey = func(key keyInfo) {
|
|
||||||
tab.Rows = append(tab.Rows, []interface{}{key.CurrentStr(), key.ID, key.UserName, key.HostName, key.Created})
|
|
||||||
}
|
|
||||||
|
|
||||||
printKeys = func() error {
|
|
||||||
return tab.Write(globalOptions.stdout)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.List(ctx, restic.KeyFile, func(id restic.ID, size int64) error {
|
var keys []keyInfo
|
||||||
|
|
||||||
|
err := s.List(ctx, restic.KeyFile, func(id restic.ID, size int64) error {
|
||||||
k, err := repository.LoadKey(ctx, s, id.String())
|
k, err := repository.LoadKey(ctx, s, id.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Warnf("LoadKey() failed: %v\n", err)
|
Warnf("LoadKey() failed: %v\n", err)
|
||||||
|
@ -97,14 +62,29 @@ func listKeys(ctx context.Context, s *repository.Repository, gopts GlobalOptions
|
||||||
Created: k.Created.Format(TimeFormat),
|
Created: k.Created.Format(TimeFormat),
|
||||||
}
|
}
|
||||||
|
|
||||||
appendKey(key)
|
keys = append(keys, key)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}); err != nil {
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return printKeys()
|
if gopts.JSON {
|
||||||
|
return json.NewEncoder(globalOptions.stdout).Encode(keys)
|
||||||
|
}
|
||||||
|
|
||||||
|
tab := table.New()
|
||||||
|
tab.AddColumn(" ID", "{{if .Current}}*{{else}} {{end}}{{ .ID }}")
|
||||||
|
tab.AddColumn("User", "{{ .UserName }}")
|
||||||
|
tab.AddColumn("Host", "{{ .HostName }}")
|
||||||
|
tab.AddColumn("Created", "{{ .Created }}")
|
||||||
|
|
||||||
|
for _, key := range keys {
|
||||||
|
tab.AddRow(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
return tab.Write(globalOptions.stdout)
|
||||||
}
|
}
|
||||||
|
|
||||||
// testKeyNewPassword is used to set a new password during integration testing.
|
// testKeyNewPassword is used to set a new password during integration testing.
|
||||||
|
|
|
@ -38,6 +38,9 @@ import (
|
||||||
|
|
||||||
var version = "0.9.2-dev (compiled manually)"
|
var version = "0.9.2-dev (compiled manually)"
|
||||||
|
|
||||||
|
// TimeFormat is the format used for all timestamps printed by restic.
|
||||||
|
const TimeFormat = "2006-01-02 15:04:05"
|
||||||
|
|
||||||
// GlobalOptions hold all global options for restic.
|
// GlobalOptions hold all global options for restic.
|
||||||
type GlobalOptions struct {
|
type GlobalOptions struct {
|
||||||
Repo string
|
Repo string
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Table contains data for a table to be printed.
|
|
||||||
type Table struct {
|
|
||||||
Header string
|
|
||||||
Rows [][]interface{}
|
|
||||||
Footer string
|
|
||||||
|
|
||||||
RowFormat string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTable initializes a new Table.
|
|
||||||
func NewTable() Table {
|
|
||||||
return Table{
|
|
||||||
Rows: [][]interface{}{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t Table) printSeparationLine(w io.Writer) error {
|
|
||||||
_, err := fmt.Fprintln(w, strings.Repeat("-", 70))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write prints the table to w.
|
|
||||||
func (t Table) Write(w io.Writer) error {
|
|
||||||
_, err := fmt.Fprintln(w, t.Header)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = t.printSeparationLine(w)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, row := range t.Rows {
|
|
||||||
_, err = fmt.Fprintf(w, t.RowFormat+"\n", row...)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = t.printSeparationLine(w)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = fmt.Fprintln(w, t.Footer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TimeFormat is the format used for all timestamps printed by restic.
|
|
||||||
const TimeFormat = "2006-01-02 15:04:05"
|
|
Loading…
Reference in a new issue