From 1a8bf358f1ea7b6903ad76da6e31f3f01be0eb04 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 9 Mar 2024 18:20:52 +0100 Subject: [PATCH] index: deprecate legacy index format --- .../repo-restore-permissions-test.tar.gz | Bin 4174 -> 4256 bytes internal/feature/registry.go | 6 ++++-- internal/index/index.go | 6 ++++++ internal/index/index_test.go | 3 +++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cmd/restic/testdata/repo-restore-permissions-test.tar.gz b/cmd/restic/testdata/repo-restore-permissions-test.tar.gz index 36aa62dbfb0ad52d5c0cafab528cfee393d388a2..dc8e9bc80e992fca9a59632cbb89344dcd870869 100644 GIT binary patch literal 4256 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 Yc<|uCg9i^DJpPaKUr7c%#{f_O02$#w+W-In diff --git a/internal/feature/registry.go b/internal/feature/registry.go index 7a9cbf560..620c9ec35 100644 --- a/internal/feature/registry.go +++ b/internal/feature/registry.go @@ -5,11 +5,13 @@ var Flag = New() // flag names are written in kebab-case const ( - ExampleFeature FlagName = "example-feature" + ExampleFeature FlagName = "example-feature" + DeprecateLegacyIndex FlagName = "deprecate-legacy-index" ) func init() { Flag.SetFlags(map[FlagName]FlagDesc{ - ExampleFeature: {Type: Alpha, Description: "just for testing"}, + ExampleFeature: {Type: Alpha, Description: "just for testing"}, + DeprecateLegacyIndex: {Type: Beta, Description: "disable support for index format used by restic 0.1.0. Use `restic repair index` to update the index if necessary."}, }) } diff --git a/internal/index/index.go b/internal/index/index.go index ecd481594..b571c55eb 100644 --- a/internal/index/index.go +++ b/internal/index/index.go @@ -3,12 +3,14 @@ package index import ( "context" "encoding/json" + "fmt" "io" "sync" "time" "github.com/restic/restic/internal/crypto" "github.com/restic/restic/internal/errors" + "github.com/restic/restic/internal/feature" "github.com/restic/restic/internal/restic" "github.com/restic/restic/internal/debug" @@ -515,6 +517,10 @@ func DecodeIndex(buf []byte, id restic.ID) (idx *Index, oldFormat bool, err erro debug.Log("Error %v", err) if isErrOldIndex(err) { + if feature.Flag.Enabled(feature.DeprecateLegacyIndex) { + return nil, false, fmt.Errorf("index seems to use the legacy format. update it using `restic repair index`") + } + debug.Log("index is probably old format, trying that") idx, err = decodeOldIndex(buf) return idx, err == nil, err diff --git a/internal/index/index_test.go b/internal/index/index_test.go index 4f0dbd2a0..78e4800ca 100644 --- a/internal/index/index_test.go +++ b/internal/index/index_test.go @@ -8,6 +8,7 @@ import ( "sync" "testing" + "github.com/restic/restic/internal/feature" "github.com/restic/restic/internal/index" "github.com/restic/restic/internal/restic" rtest "github.com/restic/restic/internal/test" @@ -427,6 +428,8 @@ func BenchmarkEncodeIndex(b *testing.B) { } func TestIndexUnserializeOld(t *testing.T) { + defer feature.TestSetFlag(t, feature.Flag, feature.DeprecateLegacyIndex, false)() + idx, oldFormat, err := index.DecodeIndex(docOldExample, restic.NewRandomID()) rtest.OK(t, err) rtest.Assert(t, oldFormat, "old index format recognized as new format")