diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 440110548..2e628b5b8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,7 +9,7 @@ on: pull_request: env: - latest_go: "1.18.x" + latest_go: "1.19.x" GO111MODULE: on jobs: @@ -19,24 +19,30 @@ jobs: # list of jobs to run: include: - job_name: Windows - go: 1.18.x + go: 1.19.x os: windows-latest install_verb: install - job_name: macOS - go: 1.18.x + go: 1.19.x os: macOS-latest test_fuse: false install_verb: install - job_name: Linux - go: 1.18.x + go: 1.19.x os: ubuntu-latest test_cloud_backends: true test_fuse: true check_changelog: true install_verb: install + - job_name: Linux + go: 1.18.x + os: ubuntu-latest + test_fuse: true + install_verb: install + - job_name: Linux go: 1.17.x os: ubuntu-latest @@ -260,7 +266,7 @@ jobs: uses: golangci/golangci-lint-action@v2 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. - version: v1.45 + version: v1.48 # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true args: --verbose --timeout 5m diff --git a/internal/restic/snapshot_policy.go b/internal/restic/snapshot_policy.go index 8ce6cb2e3..3271140aa 100644 --- a/internal/restic/snapshot_policy.go +++ b/internal/restic/snapshot_policy.go @@ -190,7 +190,7 @@ type KeepReason struct { // according to the policy p. list is sorted in the process. reasons contains // the reasons to keep each snapshot, it is in the same order as keep. func ApplyPolicy(list Snapshots, p ExpirePolicy) (keep, remove Snapshots, reasons []KeepReason) { - sort.Sort(list) + sort.Stable(list) if p.Empty() { for _, sn := range list { diff --git a/internal/restic/testdata/policy_keep_snapshots_0 b/internal/restic/testdata/policy_keep_snapshots_0 index 1290b88cf..11ca587c8 100644 --- a/internal/restic/testdata/policy_keep_snapshots_0 +++ b/internal/restic/testdata/policy_keep_snapshots_0 @@ -150,27 +150,6 @@ "tree": null, "paths": null }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -185,6 +164,27 @@ "bar" ] }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-20T10:20:30Z", "tree": null, @@ -911,39 +911,6 @@ ], "counters": {} }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "policy is empty" - ], - "counters": {} - }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "policy is empty" - ], - "counters": {} - }, { "snapshot": { "time": "2015-10-22T10:20:30Z", @@ -970,6 +937,39 @@ ], "counters": {} }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "policy is empty" + ], + "counters": {} + }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "policy is empty" + ], + "counters": {} + }, { "snapshot": { "time": "2015-10-20T10:20:30Z", diff --git a/internal/restic/testdata/policy_keep_snapshots_18 b/internal/restic/testdata/policy_keep_snapshots_18 index cf63c45b8..feb9ac20b 100644 --- a/internal/restic/testdata/policy_keep_snapshots_18 +++ b/internal/restic/testdata/policy_keep_snapshots_18 @@ -1,5 +1,23 @@ { "keep": [ + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -12,24 +30,6 @@ "bar" ] }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2014-11-15T10:20:30Z", "tree": null, @@ -153,6 +153,36 @@ } ], "reasons": [ + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "has tags [foo]" + ], + "counters": {} + }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "has tags [foo]" + ], + "counters": {} + }, { "snapshot": { "time": "2015-10-22T10:20:30Z", @@ -171,36 +201,6 @@ ], "counters": {} }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "has tags [foo]" - ], - "counters": {} - }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "has tags [foo]" - ], - "counters": {} - }, { "snapshot": { "time": "2014-11-15T10:20:30Z", diff --git a/internal/restic/testdata/policy_keep_snapshots_19 b/internal/restic/testdata/policy_keep_snapshots_19 index 81a438313..440315b10 100644 --- a/internal/restic/testdata/policy_keep_snapshots_19 +++ b/internal/restic/testdata/policy_keep_snapshots_19 @@ -1,5 +1,23 @@ { "keep": [ + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -12,24 +30,6 @@ "bar" ] }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2014-11-15T10:20:30Z", "tree": null, @@ -41,6 +41,36 @@ } ], "reasons": [ + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "has tags [foo, bar]" + ], + "counters": {} + }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "has tags [foo, bar]" + ], + "counters": {} + }, { "snapshot": { "time": "2015-10-22T10:20:30Z", @@ -59,36 +89,6 @@ ], "counters": {} }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "has tags [foo, bar]" - ], - "counters": {} - }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "has tags [foo, bar]" - ], - "counters": {} - }, { "snapshot": { "time": "2014-11-15T10:20:30Z", diff --git a/internal/restic/testdata/policy_keep_snapshots_20 b/internal/restic/testdata/policy_keep_snapshots_20 index a57fcf024..f4febe82c 100644 --- a/internal/restic/testdata/policy_keep_snapshots_20 +++ b/internal/restic/testdata/policy_keep_snapshots_20 @@ -1,5 +1,23 @@ { "keep": [ + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -12,24 +30,6 @@ "bar" ] }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2014-11-15T10:20:30Z", "tree": null, @@ -161,6 +161,38 @@ } ], "reasons": [ + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "has tags [foo]", + "has tags [bar]" + ], + "counters": {} + }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "has tags [foo]", + "has tags [bar]" + ], + "counters": {} + }, { "snapshot": { "time": "2015-10-22T10:20:30Z", @@ -180,38 +212,6 @@ ], "counters": {} }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "has tags [foo]", - "has tags [bar]" - ], - "counters": {} - }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "has tags [foo]", - "has tags [bar]" - ], - "counters": {} - }, { "snapshot": { "time": "2014-11-15T10:20:30Z", diff --git a/internal/restic/testdata/policy_keep_snapshots_26 b/internal/restic/testdata/policy_keep_snapshots_26 index 61703f8fe..af3bc0ced 100644 --- a/internal/restic/testdata/policy_keep_snapshots_26 +++ b/internal/restic/testdata/policy_keep_snapshots_26 @@ -150,27 +150,6 @@ "tree": null, "paths": null }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -185,6 +164,27 @@ "bar" ] }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-20T10:20:30Z", "tree": null, @@ -662,39 +662,6 @@ ], "counters": {} }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "within 1y1m1d" - ], - "counters": {} - }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "within 1y1m1d" - ], - "counters": {} - }, { "snapshot": { "time": "2015-10-22T10:20:30Z", @@ -721,6 +688,39 @@ ], "counters": {} }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "within 1y1m1d" + ], + "counters": {} + }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "within 1y1m1d" + ], + "counters": {} + }, { "snapshot": { "time": "2015-10-20T10:20:30Z", diff --git a/internal/restic/testdata/policy_keep_snapshots_29 b/internal/restic/testdata/policy_keep_snapshots_29 index 172d3000f..2a82ecabd 100644 --- a/internal/restic/testdata/policy_keep_snapshots_29 +++ b/internal/restic/testdata/policy_keep_snapshots_29 @@ -150,27 +150,6 @@ "tree": null, "paths": null }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -185,6 +164,27 @@ "bar" ] }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-20T10:20:30Z", "tree": null, @@ -691,39 +691,6 @@ ], "counters": {} }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "within 1y2m3d3h" - ], - "counters": {} - }, - { - "snapshot": { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, - "matches": [ - "within 1y2m3d3h" - ], - "counters": {} - }, { "snapshot": { "time": "2015-10-22T10:20:30Z", @@ -750,6 +717,39 @@ ], "counters": {} }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "within 1y2m3d3h" + ], + "counters": {} + }, + { + "snapshot": { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, + "matches": [ + "within 1y2m3d3h" + ], + "counters": {} + }, { "snapshot": { "time": "2015-10-20T10:20:30Z", diff --git a/internal/restic/testdata/policy_keep_snapshots_3 b/internal/restic/testdata/policy_keep_snapshots_3 index 265e52130..b497c6902 100644 --- a/internal/restic/testdata/policy_keep_snapshots_3 +++ b/internal/restic/testdata/policy_keep_snapshots_3 @@ -150,27 +150,6 @@ "tree": null, "paths": null }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -185,6 +164,27 @@ "bar" ] }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-20T10:20:30Z", "tree": null, @@ -955,14 +955,7 @@ "snapshot": { "time": "2015-10-22T10:20:30Z", "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] + "paths": null }, "matches": [ "last snapshot" @@ -992,7 +985,11 @@ "snapshot": { "time": "2015-10-22T10:20:30Z", "tree": null, - "paths": null + "paths": null, + "tags": [ + "foo", + "bar" + ] }, "matches": [ "last snapshot" @@ -1005,7 +1002,10 @@ "snapshot": { "time": "2015-10-22T10:20:30Z", "tree": null, - "paths": null, + "paths": [ + "path1", + "path2" + ], "tags": [ "foo", "bar" diff --git a/internal/restic/testdata/policy_keep_snapshots_4 b/internal/restic/testdata/policy_keep_snapshots_4 index 8657da8c8..ff572d6a0 100644 --- a/internal/restic/testdata/policy_keep_snapshots_4 +++ b/internal/restic/testdata/policy_keep_snapshots_4 @@ -150,27 +150,6 @@ "tree": null, "paths": null }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] - }, - { - "time": "2015-10-22T10:20:30Z", - "tree": null, - "paths": null, - "tags": [ - "foo", - "bar" - ] - }, { "time": "2015-10-22T10:20:30Z", "tree": null, @@ -185,6 +164,27 @@ "bar" ] }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, { "time": "2015-10-20T10:20:30Z", "tree": null, @@ -975,14 +975,7 @@ "snapshot": { "time": "2015-10-22T10:20:30Z", "tree": null, - "paths": [ - "path1", - "path2" - ], - "tags": [ - "foo", - "bar" - ] + "paths": null }, "matches": [ "last snapshot" @@ -1012,7 +1005,11 @@ "snapshot": { "time": "2015-10-22T10:20:30Z", "tree": null, - "paths": null + "paths": null, + "tags": [ + "foo", + "bar" + ] }, "matches": [ "last snapshot" @@ -1025,7 +1022,10 @@ "snapshot": { "time": "2015-10-22T10:20:30Z", "tree": null, - "paths": null, + "paths": [ + "path1", + "path2" + ], "tags": [ "foo", "bar"