2
2
mirror of https://github.com/octoleo/restic.git synced 2024-12-22 19:08:55 +00:00

new sub-option for backup: time

New option to specify the timestamp for a backup
This commit is contained in:
Tobias Klein 2017-08-29 18:29:46 +02:00
parent 5c75a98053
commit 43ff971dfd
6 changed files with 19 additions and 8 deletions

View File

@ -66,6 +66,7 @@ type BackupOptions struct {
Tags []string Tags []string
Hostname string Hostname string
FilesFrom string FilesFrom string
TimeStamp string
} }
var backupOptions BackupOptions var backupOptions BackupOptions
@ -86,6 +87,7 @@ func init() {
f.StringArrayVar(&backupOptions.Tags, "tag", nil, "add a `tag` for the new snapshot (can be specified multiple times)") f.StringArrayVar(&backupOptions.Tags, "tag", nil, "add a `tag` for the new snapshot (can be specified multiple times)")
f.StringVar(&backupOptions.Hostname, "hostname", "", "set the `hostname` for the snapshot manually") f.StringVar(&backupOptions.Hostname, "hostname", "", "set the `hostname` for the snapshot manually")
f.StringVar(&backupOptions.FilesFrom, "files-from", "", "read the files to backup from file (can be combined with file args)") f.StringVar(&backupOptions.FilesFrom, "files-from", "", "read the files to backup from file (can be combined with file args)")
f.StringVar(&backupOptions.TimeStamp, "time", "", "time of the backup (ex. '2012-11-01 22:08:41') (default: now)")
} }
func newScanProgress(gopts GlobalOptions) *restic.Progress { func newScanProgress(gopts GlobalOptions) *restic.Progress {
@ -493,7 +495,15 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, args []string) error {
Warnf("%s\rwarning for %s: %v\n", ClearLine(), dir, err) Warnf("%s\rwarning for %s: %v\n", ClearLine(), dir, err)
} }
_, id, err := arch.Snapshot(context.TODO(), newArchiveProgress(gopts, stat), target, opts.Tags, opts.Hostname, parentSnapshotID) timeStamp := time.Now()
if opts.TimeStamp != "" {
timeStamp, err = time.Parse(TimeFormat, opts.TimeStamp)
if err != nil {
return errors.Fatalf("error in time option: %v\n", err)
}
}
_, id, err := arch.Snapshot(context.TODO(), newArchiveProgress(gopts, stat), target, opts.Tags, opts.Hostname, parentSnapshotID, timeStamp)
if err != nil { if err != nil {
return err return err
} }

View File

@ -28,7 +28,7 @@ func (r *Reader) Archive(ctx context.Context, name string, rd io.Reader, p *rest
} }
debug.Log("start archiving %s", name) debug.Log("start archiving %s", name)
sn, err := restic.NewSnapshot([]string{name}, r.Tags, r.Hostname) sn, err := restic.NewSnapshot([]string{name}, r.Tags, r.Hostname, time.Now())
if err != nil { if err != nil {
return nil, restic.ID{}, err return nil, restic.ID{}, err
} }

View File

@ -651,7 +651,7 @@ func (p baseNameSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// Snapshot creates a snapshot of the given paths. If parentrestic.ID is set, this is // Snapshot creates a snapshot of the given paths. If parentrestic.ID is set, this is
// used to compare the files to the ones archived at the time this snapshot was // used to compare the files to the ones archived at the time this snapshot was
// taken. // taken.
func (arch *Archiver) Snapshot(ctx context.Context, p *restic.Progress, paths, tags []string, hostname string, parentID *restic.ID) (*restic.Snapshot, restic.ID, error) { func (arch *Archiver) Snapshot(ctx context.Context, p *restic.Progress, paths, tags []string, hostname string, parentID *restic.ID, time time.Time) (*restic.Snapshot, restic.ID, error) {
paths = unique(paths) paths = unique(paths)
sort.Sort(baseNameSlice(paths)) sort.Sort(baseNameSlice(paths))
@ -666,7 +666,7 @@ func (arch *Archiver) Snapshot(ctx context.Context, p *restic.Progress, paths, t
defer p.Done() defer p.Done()
// create new snapshot // create new snapshot
sn, err := restic.NewSnapshot(paths, tags, hostname) sn, err := restic.NewSnapshot(paths, tags, hostname, time)
if err != nil { if err != nil {
return nil, restic.ID{}, err return nil, restic.ID{}, err
} }

View File

@ -3,6 +3,7 @@ package archiver
import ( import (
"context" "context"
"testing" "testing"
"time"
"github.com/restic/restic/internal/restic" "github.com/restic/restic/internal/restic"
) )
@ -10,7 +11,7 @@ import (
// TestSnapshot creates a new snapshot of path. // TestSnapshot creates a new snapshot of path.
func TestSnapshot(t testing.TB, repo restic.Repository, path string, parent *restic.ID) *restic.Snapshot { func TestSnapshot(t testing.TB, repo restic.Repository, path string, parent *restic.ID) *restic.Snapshot {
arch := New(repo) arch := New(repo)
sn, _, err := arch.Snapshot(context.TODO(), nil, []string{path}, []string{"test"}, "localhost", parent) sn, _, err := arch.Snapshot(context.TODO(), nil, []string{path}, []string{"test"}, "localhost", parent, time.Now())
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -29,7 +29,7 @@ type Snapshot struct {
// NewSnapshot returns an initialized snapshot struct for the current user and // NewSnapshot returns an initialized snapshot struct for the current user and
// time. // time.
func NewSnapshot(paths []string, tags []string, hostname string) (*Snapshot, error) { func NewSnapshot(paths []string, tags []string, hostname string, time time.Time) (*Snapshot, error) {
for i, path := range paths { for i, path := range paths {
if p, err := filepath.Abs(path); err != nil { if p, err := filepath.Abs(path); err != nil {
paths[i] = p paths[i] = p
@ -38,7 +38,7 @@ func NewSnapshot(paths []string, tags []string, hostname string) (*Snapshot, err
sn := &Snapshot{ sn := &Snapshot{
Paths: paths, Paths: paths,
Time: time.Now(), Time: time,
Tags: tags, Tags: tags,
Hostname: hostname, Hostname: hostname,
} }

View File

@ -164,7 +164,7 @@ func TestCreateSnapshot(t testing.TB, repo Repository, at time.Time, depth int,
t.Logf("create fake snapshot at %s with seed %d", at, seed) t.Logf("create fake snapshot at %s with seed %d", at, seed)
fakedir := fmt.Sprintf("fakedir-at-%v", at.Format("2006-01-02 15:04:05")) fakedir := fmt.Sprintf("fakedir-at-%v", at.Format("2006-01-02 15:04:05"))
snapshot, err := NewSnapshot([]string{fakedir}, []string{"test"}, "foo") snapshot, err := NewSnapshot([]string{fakedir}, []string{"test"}, "foo", time.Now())
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }