From f0955fa931ee6239773a9b2037e4dc4d9c912bd8 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 28 Sep 2025 14:52:41 +0200 Subject: [PATCH] repository: add Checker() method to repository to replace unchecked cast --- internal/archiver/archiver_test.go | 2 +- internal/checker/checker.go | 9 +++++++-- internal/checker/checker_test.go | 4 ++-- internal/checker/testing.go | 4 +--- internal/repository/checker.go | 6 +++--- internal/repository/index/master_index_test.go | 2 +- internal/repository/repository.go | 4 ++++ internal/repository/testing.go | 2 +- 8 files changed, 20 insertions(+), 13 deletions(-) diff --git a/internal/archiver/archiver_test.go b/internal/archiver/archiver_test.go index 848822e29..061306879 100644 --- a/internal/archiver/archiver_test.go +++ b/internal/archiver/archiver_test.go @@ -29,7 +29,7 @@ import ( "golang.org/x/sync/errgroup" ) -func prepareTempdirRepoSrc(t testing.TB, src TestDir) (string, restic.Repository) { +func prepareTempdirRepoSrc(t testing.TB, src TestDir) (string, *repository.Repository) { tempdir := rtest.TempDir(t) repo := repository.TestRepository(t) diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 79dbba76a..28c0f6fa5 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -33,10 +33,15 @@ type Checker struct { repo restic.Repository } +type checkerRepository interface { + restic.Repository + Checker() *repository.Checker +} + // New returns a new checker which runs on repo. -func New(repo restic.Repository, trackUnused bool) *Checker { +func New(repo checkerRepository, trackUnused bool) *Checker { c := &Checker{ - Checker: repository.NewChecker(repo), + Checker: repo.Checker(), repo: repo, trackUnused: trackUnused, } diff --git a/internal/checker/checker_test.go b/internal/checker/checker_test.go index 7008ba0f0..f8eddb5da 100644 --- a/internal/checker/checker_test.go +++ b/internal/checker/checker_test.go @@ -435,7 +435,7 @@ func TestCheckerModifiedData(t *testing.T) { // loadTreesOnceRepository allows each tree to be loaded only once type loadTreesOnceRepository struct { - restic.Repository + *repository.Repository loadedTrees restic.IDSet mutex sync.Mutex DuplicateTree bool @@ -476,7 +476,7 @@ func TestCheckerNoDuplicateTreeDecodes(t *testing.T) { // delayRepository delays read of a specific handle. type delayRepository struct { - restic.Repository + *repository.Repository DelayTree restic.ID UnblockChannel chan struct{} Unblocker sync.Once diff --git a/internal/checker/testing.go b/internal/checker/testing.go index 89c307362..b4209958b 100644 --- a/internal/checker/testing.go +++ b/internal/checker/testing.go @@ -3,12 +3,10 @@ package checker import ( "context" "testing" - - "github.com/restic/restic/internal/restic" ) // TestCheckRepo runs the checker on repo. -func TestCheckRepo(t testing.TB, repo restic.Repository) { +func TestCheckRepo(t testing.TB, repo checkerRepository) { chkr := New(repo, true) hints, errs := chkr.LoadIndex(context.TODO(), nil) diff --git a/internal/repository/checker.go b/internal/repository/checker.go index 25ef91134..efe295b7c 100644 --- a/internal/repository/checker.go +++ b/internal/repository/checker.go @@ -51,11 +51,11 @@ func (e *PackError) Error() string { // Checker handles index-related operations for repository checking. type Checker struct { packs map[restic.ID]int64 - repo restic.Repository + repo *Repository } // NewChecker creates a new Checker. -func NewChecker(repo restic.Repository) *Checker { +func NewChecker(repo *Repository) *Checker { return &Checker{ packs: make(map[restic.ID]int64), repo: repo, @@ -256,7 +256,7 @@ func (c *Checker) ReadPacks(ctx context.Context, packs map[restic.ID]int64, p *p } } - err := CheckPack(ctx, c.repo.(*Repository), ps.id, ps.blobs, ps.size, bufRd, dec) + err := CheckPack(ctx, c.repo, ps.id, ps.blobs, ps.size, bufRd, dec) p.Add(1) if err == nil { continue diff --git a/internal/repository/index/master_index_test.go b/internal/repository/index/master_index_test.go index 3e2c08cfe..cbd09c28d 100644 --- a/internal/repository/index/master_index_test.go +++ b/internal/repository/index/master_index_test.go @@ -347,7 +347,7 @@ var ( depth = 3 ) -func createFilledRepo(t testing.TB, snapshots int, version uint) (restic.Repository, restic.Unpacked[restic.FileType]) { +func createFilledRepo(t testing.TB, snapshots int, version uint) (*repository.Repository, restic.Unpacked[restic.FileType]) { repo, unpacked, _ := repository.TestRepositoryWithVersion(t, version) for i := 0; i < snapshots; i++ { diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 8d1b35d91..413538c11 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -178,6 +178,10 @@ func (r *Repository) SetDryRun() { r.be = dryrun.New(r.be) } +func (r *Repository) Checker() *Checker { + return NewChecker(r) +} + // LoadUnpacked loads and decrypts the file with the given type and ID. func (r *Repository) LoadUnpacked(ctx context.Context, t restic.FileType, id restic.ID) ([]byte, error) { debug.Log("load %v with id %v", t, id) diff --git a/internal/repository/testing.go b/internal/repository/testing.go index 0661e93ea..c8248c556 100644 --- a/internal/repository/testing.go +++ b/internal/repository/testing.go @@ -164,7 +164,7 @@ func TestNewLock(_ *testing.T, repo *Repository, exclusive bool) (*restic.Lock, } // TestCheckRepo runs the checker on repo. -func TestCheckRepo(t testing.TB, repo restic.Repository) { +func TestCheckRepo(t testing.TB, repo *Repository) { chkr := NewChecker(repo) hints, errs := chkr.LoadIndex(context.TODO(), nil)