Add functions to filter snapshots

This commit is contained in:
Alexander Neumann 2016-08-19 20:50:52 +02:00
parent bb84d351f1
commit 6cf4b81558
26 changed files with 3080 additions and 1 deletions

View File

@ -83,7 +83,8 @@ func LoadAllSnapshots(repo *repository.Repository) (snapshots []*Snapshot, err e
}
func (sn Snapshot) String() string {
return fmt.Sprintf("<Snapshot %s of %v at %s>", sn.id.Str(), sn.Paths, sn.Time)
return fmt.Sprintf("<Snapshot %s of %v at %s by %s@%s>",
sn.id.Str(), sn.Paths, sn.Time, sn.Username, sn.Hostname)
}
// ID retuns the snapshot's ID.

View File

@ -0,0 +1,195 @@
package restic
import (
"fmt"
"reflect"
"sort"
"time"
)
// Snapshots is a list of snapshots.
type Snapshots []*Snapshot
// Len returns the number of snapshots in sn.
func (sn Snapshots) Len() int {
return len(sn)
}
// Less returns true iff the ith snapshot has been made after the jth.
func (sn Snapshots) Less(i, j int) bool {
return sn[i].Time.After(sn[j].Time)
}
// Swap exchanges the two snapshots.
func (sn Snapshots) Swap(i, j int) {
sn[i], sn[j] = sn[j], sn[i]
}
// SnapshotFilter configures criteria for filtering snapshots before an
// ExpirePolicy can be applied.
type SnapshotFilter struct {
Hostname string
Username string
Paths []string
}
// FilterSnapshots returns the snapshots from s which match the filter f.
func FilterSnapshots(s Snapshots, f SnapshotFilter) (result Snapshots) {
for _, snap := range s {
if f.Hostname != "" && f.Hostname != snap.Hostname {
continue
}
if f.Username != "" && f.Username != snap.Username {
continue
}
if f.Paths != nil && !reflect.DeepEqual(f.Paths, snap.Paths) {
continue
}
result = append(result, snap)
}
return result
}
// ExpirePolicy configures which snapshots should be automatically removed.
type ExpirePolicy struct {
Last int // keep the last n snapshots
Daily int // keep the last n daily snapshots
Weekly int // keep the last n weekly snapshots
Monthly int // keep the last n monthly snapshots
Yearly int // keep the last n yearly snapshots
}
// Sum returns the maximum number of snapshots to be kept according to this
// policy.
func (e ExpirePolicy) Sum() int {
return e.Last + e.Daily + e.Weekly + e.Monthly + e.Yearly
}
// filter is used to split a list of snapshots into those to keep and those to
// remove according to a policy.
type filter struct {
Unprocessed Snapshots
Remove Snapshots
Keep Snapshots
}
func (f filter) String() string {
return fmt.Sprintf("<filter %d todo, %d keep, %d remove>", len(f.Unprocessed), len(f.Keep), len(f.Remove))
}
// ymd returns an integer in the form YYYYMMDD.
func ymd(d time.Time) int {
return d.Year()*10000 + int(d.Month())*100 + d.Day()
}
// yw returns an integer in the form YYYYWW, where WW is the week number.
func yw(d time.Time) int {
year, week := d.ISOWeek()
return year*100 + week
}
// ym returns an integer in the form YYYYMM.
func ym(d time.Time) int {
return d.Year()*100 + int(d.Month())
}
// y returns the year of d.
func y(d time.Time) int {
return d.Year()
}
// apply moves snapshots from Unprocess to either Keep or Remove. It sorts the
// snapshots into buckets according to the return of fn, and then moves the
// newest snapshot in each bucket to Keep and all others to Remove. When max
// snapshots were found, processing stops.
func (f *filter) apply(fn func(time.Time) int, max int) {
if max == 0 || len(f.Unprocessed) == 0 {
return
}
sameDay := Snapshots{}
lastDay := fn(f.Unprocessed[0].Time)
for len(f.Unprocessed) > 0 {
cur := f.Unprocessed[0]
day := fn(cur.Time)
// if the snapshots are from a new day, forget all but the first (=last
// in time) snapshot from the previous day.
if day != lastDay {
f.Keep = append(f.Keep, sameDay[0])
for _, snapshot := range sameDay[1:] {
f.Remove = append(f.Remove, snapshot)
}
sameDay = Snapshots{}
lastDay = day
max--
if max == 0 {
break
}
}
// collect all snapshots for the current day
sameDay = append(sameDay, cur)
f.Unprocessed = f.Unprocessed[1:]
}
if len(sameDay) > 0 {
f.Keep = append(f.Keep, sameDay[0])
for _, snapshot := range sameDay[1:] {
f.Remove = append(f.Remove, snapshot)
}
}
}
// keepLast marks the last n snapshots as to be kept.
func (f *filter) keepLast(n int) {
if n > len(f.Unprocessed) {
n = len(f.Unprocessed)
}
f.Keep = append(f.Keep, f.Unprocessed[:n]...)
f.Unprocessed = f.Unprocessed[n:]
}
// finish moves all remaining snapshots to remove.
func (f *filter) finish() {
f.Remove = append(f.Remove, f.Unprocessed...)
}
// ApplyPolicy runs returns the snapshots from s that are to be deleted according
// to the policy p. s is sorted in the process.
func ApplyPolicy(list Snapshots, p ExpirePolicy) (keep, remove Snapshots) {
sort.Sort(list)
empty := ExpirePolicy{}
if p == empty {
return list, remove
}
if len(list) == 0 {
return list, remove
}
f := filter{
Unprocessed: list,
Remove: Snapshots{},
Keep: Snapshots{},
}
f.keepLast(p.Last)
f.apply(ymd, p.Daily)
f.apply(yw, p.Weekly)
f.apply(ym, p.Monthly)
f.apply(y, p.Yearly)
f.finish()
return f.Keep, f.Remove
}

View File

@ -0,0 +1,262 @@
package restic
import (
"encoding/json"
"fmt"
"io/ioutil"
"path/filepath"
"reflect"
"sort"
"testing"
"time"
)
func parseTime(s string) time.Time {
t, err := time.Parse("2006-01-02 15:04:05 -0700", s)
if err != nil {
panic(err)
}
return t.Local()
}
var testFilterSnapshots = Snapshots{
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-01 01:02:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "bar", Username: "testuser", Time: parseTime("2016-01-01 01:03:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-03 07:02:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "bar", Username: "testuser", Time: parseTime("2016-01-01 07:08:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 10:23:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 11:23:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 12:23:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 12:24:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 12:28:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 12:30:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-04 16:23:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-05 09:02:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-06 08:02:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-07 10:02:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "root", Time: parseTime("2016-01-08 20:02:03 +0100"), Paths: []string{"/usr", "/sbin"}},
{Hostname: "foo", Username: "root", Time: parseTime("2016-01-09 21:02:03 +0100"), Paths: []string{"/usr", "/sbin"}},
{Hostname: "bar", Username: "root", Time: parseTime("2016-01-12 21:02:03 +0100"), Paths: []string{"/usr", "/sbin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-12 21:08:03 +0100"), Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "testuser", Time: parseTime("2016-01-18 12:02:03 +0100"), Paths: []string{"/usr", "/bin"}},
}
var filterTests = []SnapshotFilter{
{Hostname: "foo"},
{Username: "root"},
{Hostname: "foo", Username: "root"},
{Paths: []string{"/usr", "/bin"}},
{Hostname: "bar", Paths: []string{"/usr", "/bin"}},
{Hostname: "foo", Username: "root", Paths: []string{"/usr", "/sbin"}},
}
func TestFilterSnapshots(t *testing.T) {
sort.Sort(testFilterSnapshots)
for i, f := range filterTests {
res := FilterSnapshots(testFilterSnapshots, f)
goldenFilename := filepath.Join("testdata", fmt.Sprintf("filter_snapshots_%d", i))
if *updateGoldenFiles {
buf, err := json.MarshalIndent(res, "", " ")
if err != nil {
t.Fatalf("error marshaling result: %v", err)
}
if err = ioutil.WriteFile(goldenFilename, buf, 0644); err != nil {
t.Fatalf("unable to update golden file: %v", err)
}
}
buf, err := ioutil.ReadFile(goldenFilename)
if err != nil {
t.Errorf("error loading golden file %v: %v", goldenFilename, err)
continue
}
var want Snapshots
err = json.Unmarshal(buf, &want)
if !reflect.DeepEqual(res, want) {
t.Errorf("test %v: wrong result, want:\n %#v\ngot:\n %#v", i, want, res)
continue
}
}
}
var testExpireSnapshots = Snapshots{
{Time: parseTime("2014-09-01 10:20:30 +0100")},
{Time: parseTime("2014-09-02 10:20:30 +0100")},
{Time: parseTime("2014-09-05 10:20:30 +0100")},
{Time: parseTime("2014-09-06 10:20:30 +0100")},
{Time: parseTime("2014-09-08 10:20:30 +0100")},
{Time: parseTime("2014-09-09 10:20:30 +0100")},
{Time: parseTime("2014-09-10 10:20:30 +0100")},
{Time: parseTime("2014-09-11 10:20:30 +0100")},
{Time: parseTime("2014-09-20 10:20:30 +0100")},
{Time: parseTime("2014-09-22 10:20:30 +0100")},
{Time: parseTime("2014-08-08 10:20:30 +0100")},
{Time: parseTime("2014-08-10 10:20:30 +0100")},
{Time: parseTime("2014-08-12 10:20:30 +0100")},
{Time: parseTime("2014-08-13 10:20:30 +0100")},
{Time: parseTime("2014-08-13 10:20:30 +0100")},
{Time: parseTime("2014-08-15 10:20:30 +0100")},
{Time: parseTime("2014-08-18 10:20:30 +0100")},
{Time: parseTime("2014-08-20 10:20:30 +0100")},
{Time: parseTime("2014-08-21 10:20:30 +0100")},
{Time: parseTime("2014-08-22 10:20:30 +0100")},
{Time: parseTime("2014-10-01 10:20:30 +0100")},
{Time: parseTime("2014-10-02 10:20:30 +0100")},
{Time: parseTime("2014-10-05 10:20:30 +0100")},
{Time: parseTime("2014-10-06 10:20:30 +0100")},
{Time: parseTime("2014-10-08 10:20:30 +0100")},
{Time: parseTime("2014-10-09 10:20:30 +0100")},
{Time: parseTime("2014-10-10 10:20:30 +0100")},
{Time: parseTime("2014-10-11 10:20:30 +0100")},
{Time: parseTime("2014-10-20 10:20:30 +0100")},
{Time: parseTime("2014-10-22 10:20:30 +0100")},
{Time: parseTime("2014-11-08 10:20:30 +0100")},
{Time: parseTime("2014-11-10 10:20:30 +0100")},
{Time: parseTime("2014-11-12 10:20:30 +0100")},
{Time: parseTime("2014-11-13 10:20:30 +0100")},
{Time: parseTime("2014-11-13 10:20:30 +0100")},
{Time: parseTime("2014-11-15 10:20:30 +0100")},
{Time: parseTime("2014-11-18 10:20:30 +0100")},
{Time: parseTime("2014-11-20 10:20:30 +0100")},
{Time: parseTime("2014-11-21 10:20:30 +0100")},
{Time: parseTime("2014-11-22 10:20:30 +0100")},
{Time: parseTime("2015-09-01 10:20:30 +0100")},
{Time: parseTime("2015-09-02 10:20:30 +0100")},
{Time: parseTime("2015-09-05 10:20:30 +0100")},
{Time: parseTime("2015-09-06 10:20:30 +0100")},
{Time: parseTime("2015-09-08 10:20:30 +0100")},
{Time: parseTime("2015-09-09 10:20:30 +0100")},
{Time: parseTime("2015-09-10 10:20:30 +0100")},
{Time: parseTime("2015-09-11 10:20:30 +0100")},
{Time: parseTime("2015-09-20 10:20:30 +0100")},
{Time: parseTime("2015-09-22 10:20:30 +0100")},
{Time: parseTime("2015-08-08 10:20:30 +0100")},
{Time: parseTime("2015-08-10 10:20:30 +0100")},
{Time: parseTime("2015-08-12 10:20:30 +0100")},
{Time: parseTime("2015-08-13 10:20:30 +0100")},
{Time: parseTime("2015-08-13 10:20:30 +0100")},
{Time: parseTime("2015-08-15 10:20:30 +0100")},
{Time: parseTime("2015-08-18 10:20:30 +0100")},
{Time: parseTime("2015-08-20 10:20:30 +0100")},
{Time: parseTime("2015-08-21 10:20:30 +0100")},
{Time: parseTime("2015-08-22 10:20:30 +0100")},
{Time: parseTime("2015-10-01 10:20:30 +0100")},
{Time: parseTime("2015-10-02 10:20:30 +0100")},
{Time: parseTime("2015-10-05 10:20:30 +0100")},
{Time: parseTime("2015-10-06 10:20:30 +0100")},
{Time: parseTime("2015-10-08 10:20:30 +0100")},
{Time: parseTime("2015-10-09 10:20:30 +0100")},
{Time: parseTime("2015-10-10 10:20:30 +0100")},
{Time: parseTime("2015-10-11 10:20:30 +0100")},
{Time: parseTime("2015-10-20 10:20:30 +0100")},
{Time: parseTime("2015-10-22 10:20:30 +0100")},
{Time: parseTime("2015-11-08 10:20:30 +0100")},
{Time: parseTime("2015-11-10 10:20:30 +0100")},
{Time: parseTime("2015-11-12 10:20:30 +0100")},
{Time: parseTime("2015-11-13 10:20:30 +0100")},
{Time: parseTime("2015-11-13 10:20:30 +0100")},
{Time: parseTime("2015-11-15 10:20:30 +0100")},
{Time: parseTime("2015-11-18 10:20:30 +0100")},
{Time: parseTime("2015-11-20 10:20:30 +0100")},
{Time: parseTime("2015-11-21 10:20:30 +0100")},
{Time: parseTime("2015-11-22 10:20:30 +0100")},
{Time: parseTime("2016-01-01 01:02:03 +0100")},
{Time: parseTime("2016-01-01 01:03:03 +0100")},
{Time: parseTime("2016-01-01 07:08:03 +0100")},
{Time: parseTime("2016-01-03 07:02:03 +0100")},
{Time: parseTime("2016-01-04 10:23:03 +0100")},
{Time: parseTime("2016-01-04 11:23:03 +0100")},
{Time: parseTime("2016-01-04 12:23:03 +0100")},
{Time: parseTime("2016-01-04 12:24:03 +0100")},
{Time: parseTime("2016-01-04 12:28:03 +0100")},
{Time: parseTime("2016-01-04 12:30:03 +0100")},
{Time: parseTime("2016-01-04 16:23:03 +0100")},
{Time: parseTime("2016-01-05 09:02:03 +0100")},
{Time: parseTime("2016-01-06 08:02:03 +0100")},
{Time: parseTime("2016-01-07 10:02:03 +0100")},
{Time: parseTime("2016-01-08 20:02:03 +0100")},
{Time: parseTime("2016-01-09 21:02:03 +0100")},
{Time: parseTime("2016-01-12 21:02:03 +0100")},
{Time: parseTime("2016-01-12 21:08:03 +0100")},
{Time: parseTime("2016-01-18 12:02:03 +0100")},
}
var expireTests = []ExpirePolicy{
{},
{Last: 10},
{Last: 15},
{Last: 99},
{Last: 200},
{Daily: 3},
{Daily: 10},
{Daily: 30},
{Last: 5, Daily: 5},
{Last: 2, Daily: 10},
{Weekly: 2},
{Weekly: 4},
{Daily: 3, Weekly: 4},
{Monthly: 6},
{Daily: 2, Weekly: 2, Monthly: 6},
{Yearly: 10},
{Daily: 7, Weekly: 2, Monthly: 3, Yearly: 10},
}
func TestApplyPolicy(t *testing.T) {
for i, p := range expireTests {
keep, remove := ApplyPolicy(testExpireSnapshots, p)
t.Logf("test %d: returned keep %v, remove %v (of %v) expired snapshots for policy %v",
i, len(keep), len(remove), len(testExpireSnapshots), p)
if len(keep)+len(remove) != len(testExpireSnapshots) {
t.Errorf("test %d: len(keep)+len(remove) = %d != len(testExpireSnapshots) = %d",
i, len(keep)+len(remove), len(testExpireSnapshots))
}
if p.Sum() > 0 && len(keep) > p.Sum() {
t.Errorf("not enough snapshots removed: policy allows %v snapshots to remain, but ended up with %v",
p.Sum(), len(keep))
}
for _, sn := range keep {
t.Logf("test %d: keep snapshot at %v\n", i, sn.Time)
}
for _, sn := range remove {
t.Logf("test %d: forget snapshot at %v\n", i, sn.Time)
}
goldenFilename := filepath.Join("testdata", fmt.Sprintf("expired_snapshots_%d", i))
if *updateGoldenFiles {
buf, err := json.MarshalIndent(keep, "", " ")
if err != nil {
t.Fatalf("error marshaling result: %v", err)
}
if err = ioutil.WriteFile(goldenFilename, buf, 0644); err != nil {
t.Fatalf("unable to update golden file: %v", err)
}
}
buf, err := ioutil.ReadFile(goldenFilename)
if err != nil {
t.Errorf("error loading golden file %v: %v", goldenFilename, err)
continue
}
var want Snapshots
err = json.Unmarshal(buf, &want)
if !reflect.DeepEqual(keep, want) {
t.Errorf("test %v: wrong result, want:\n %v\ngot:\n %v", i, want, keep)
continue
}
}
}

497
src/restic/testdata/expired_snapshots_0 vendored Normal file
View File

@ -0,0 +1,497 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:28:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:24:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T11:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T10:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T01:03:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T01:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-21T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-18T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-15T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-12T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-21T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-18T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-15T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-12T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-08T11:20:30+02:00",
"tree": null,
"paths": null
}
]

52
src/restic/testdata/expired_snapshots_1 vendored Normal file
View File

@ -0,0 +1,52 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,12 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,22 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,37 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-15T10:20:30+01:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,32 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,52 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-22T11:20:30+02:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,17 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
}
]

View File

@ -0,0 +1,72 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
}
]

77
src/restic/testdata/expired_snapshots_2 vendored Normal file
View File

@ -0,0 +1,77 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:28:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:24:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T11:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T10:23:03+01:00",
"tree": null,
"paths": null
}
]

497
src/restic/testdata/expired_snapshots_3 vendored Normal file
View File

@ -0,0 +1,497 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:28:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:24:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T11:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T10:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T01:03:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T01:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-21T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-18T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-15T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-12T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-21T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-18T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-15T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-12T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-08T11:20:30+02:00",
"tree": null,
"paths": null
}
]

497
src/restic/testdata/expired_snapshots_4 vendored Normal file
View File

@ -0,0 +1,497 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:28:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:24:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T12:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T11:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T10:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T01:03:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T01:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-21T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-18T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-15T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-12T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-08-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-09-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-21T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-18T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-15T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-13T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-12T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2014-08-08T11:20:30+02:00",
"tree": null,
"paths": null
}
]

17
src/restic/testdata/expired_snapshots_5 vendored Normal file
View File

@ -0,0 +1,17 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
}
]

52
src/restic/testdata/expired_snapshots_6 vendored Normal file
View File

@ -0,0 +1,52 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": null
}
]

152
src/restic/testdata/expired_snapshots_7 vendored Normal file
View File

@ -0,0 +1,152 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-21T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-20T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-18T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-15T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-13T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-12T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-10T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-08T10:20:30+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-22T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-20T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-11T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-10T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-09T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-08T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-06T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-05T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-02T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-10-01T11:20:30+02:00",
"tree": null,
"paths": null
},
{
"time": "2015-09-22T11:20:30+02:00",
"tree": null,
"paths": null
}
]

52
src/restic/testdata/expired_snapshots_8 vendored Normal file
View File

@ -0,0 +1,52 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
}
]

62
src/restic/testdata/expired_snapshots_9 vendored Normal file
View File

@ -0,0 +1,62 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": null
},
{
"time": "2015-11-22T10:20:30+01:00",
"tree": null,
"paths": null
}
]

162
src/restic/testdata/filter_snapshots_0 vendored Normal file
View File

@ -0,0 +1,162 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:28:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:24:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T11:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T10:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-01T01:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
}
]

32
src/restic/testdata/filter_snapshots_1 vendored Normal file
View File

@ -0,0 +1,32 @@
[
{
"time": "2016-01-12T21:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "bar",
"username": "root"
},
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
}
]

22
src/restic/testdata/filter_snapshots_2 vendored Normal file
View File

@ -0,0 +1,22 @@
[
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
}
]

162
src/restic/testdata/filter_snapshots_3 vendored Normal file
View File

@ -0,0 +1,162 @@
[
{
"time": "2016-01-18T12:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-12T21:08:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-07T10:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-06T08:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-05T09:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T16:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:30:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:28:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:24:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T12:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T11:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-04T10:23:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-03T07:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
},
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "bar",
"username": "testuser"
},
{
"time": "2016-01-01T01:03:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "bar",
"username": "testuser"
},
{
"time": "2016-01-01T01:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "foo",
"username": "testuser"
}
]

22
src/restic/testdata/filter_snapshots_4 vendored Normal file
View File

@ -0,0 +1,22 @@
[
{
"time": "2016-01-01T07:08:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "bar",
"username": "testuser"
},
{
"time": "2016-01-01T01:03:03+01:00",
"tree": null,
"paths": [
"/usr",
"/bin"
],
"hostname": "bar",
"username": "testuser"
}
]

22
src/restic/testdata/filter_snapshots_5 vendored Normal file
View File

@ -0,0 +1,22 @@
[
{
"time": "2016-01-09T21:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
},
{
"time": "2016-01-08T20:02:03+01:00",
"tree": null,
"paths": [
"/usr",
"/sbin"
],
"hostname": "foo",
"username": "root"
}
]