From 1a8bf358f1ea7b6903ad76da6e31f3f01be0eb04 Mon Sep 17 00:00:00 2001
From: Michael Eischer <michael.eischer@fau.de>
Date: Sat, 9 Mar 2024 18:20:52 +0100
Subject: [PATCH 1/4] 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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
C<d&NN

literal 4174
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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")

From f8852f0eb6f63d08fddbabf19609fb530c67bb5e Mon Sep 17 00:00:00 2001
From: Michael Eischer <michael.eischer@fau.de>
Date: Sat, 9 Mar 2024 18:21:22 +0100
Subject: [PATCH 2/4] repair index: fix deletion of legacy indexes

---
 internal/index/index.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/internal/index/index.go b/internal/index/index.go
index b571c55eb..1fb2c155e 100644
--- a/internal/index/index.go
+++ b/internal/index/index.go
@@ -523,6 +523,7 @@ func DecodeIndex(buf []byte, id restic.ID) (idx *Index, oldFormat bool, err erro
 
 			debug.Log("index is probably old format, trying that")
 			idx, err = decodeOldIndex(buf)
+			idx.ids = append(idx.ids, id)
 			return idx, err == nil, err
 		}
 

From 98a6817d013a96898718514132a752c95f81eebe Mon Sep 17 00:00:00 2001
From: Michael Eischer <michael.eischer@fau.de>
Date: Sat, 9 Mar 2024 18:35:00 +0100
Subject: [PATCH 3/4] add changelog for legacy index deprecation

---
 changelog/unreleased/issue-4602 | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 changelog/unreleased/issue-4602

diff --git a/changelog/unreleased/issue-4602 b/changelog/unreleased/issue-4602
new file mode 100644
index 000000000..3cba63876
--- /dev/null
+++ b/changelog/unreleased/issue-4602
@@ -0,0 +1,13 @@
+Change: Deprecate legacy index format
+
+Support for the legacy index format used by restic before version 0.2.0 has
+been depreacted and will be removed in the next minor restic version. You can
+use `restic repair index` to update the index to the current format.
+
+It is possible to temporarily reenable support for the legacy index format by
+setting the environment variable
+`RESTIC_FEATURES=deprecate-legacy-index=false`. Note that this feature flag
+will be removed in the next minor restic version.
+
+https://github.com/restic/restic/issues/4602
+https://github.com/restic/restic/pull/4724

From 69ca12d2eba28b0744e30c5a367fddb607980b23 Mon Sep 17 00:00:00 2001
From: Michael Eischer <michael.eischer@fau.de>
Date: Sat, 9 Mar 2024 18:36:33 +0100
Subject: [PATCH 4/4] check: treat legacy index format as errors

---
 cmd/restic/cmd_check.go | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/cmd/restic/cmd_check.go b/cmd/restic/cmd_check.go
index 990702b61..cbe388877 100644
--- a/cmd/restic/cmd_check.go
+++ b/cmd/restic/cmd_check.go
@@ -231,12 +231,17 @@ func runCheck(ctx context.Context, opts CheckOptions, gopts GlobalOptions, args
 
 	errorsFound := false
 	suggestIndexRebuild := false
+	suggestLegacyIndexRebuild := false
 	mixedFound := false
 	for _, hint := range hints {
 		switch hint.(type) {
-		case *checker.ErrDuplicatePacks, *checker.ErrOldIndexFormat:
+		case *checker.ErrDuplicatePacks:
 			Printf("%v\n", hint)
 			suggestIndexRebuild = true
+		case *checker.ErrOldIndexFormat:
+			Warnf("error: %v\n", hint)
+			suggestLegacyIndexRebuild = true
+			errorsFound = true
 		case *checker.ErrMixedPack:
 			Printf("%v\n", hint)
 			mixedFound = true
@@ -247,7 +252,10 @@ func runCheck(ctx context.Context, opts CheckOptions, gopts GlobalOptions, args
 	}
 
 	if suggestIndexRebuild {
-		Printf("Duplicate packs/old indexes are non-critical, you can run `restic repair index' to correct this.\n")
+		Printf("Duplicate packs are non-critical, you can run `restic repair index' to correct this.\n")
+	}
+	if suggestLegacyIndexRebuild {
+		Warnf("Found indexes using the legacy format, you must run `restic repair index' to correct this.\n")
 	}
 	if mixedFound {
 		Printf("Mixed packs with tree and data blobs are non-critical, you can run `restic prune` to correct this.\n")