check / check (push) Successful in 10m54s
The default config backs up the home directory, which holds vaultik's local index and PID file, so a backup stored a torn copy of the index it was writing. The scan now skips the index, its SQLite side files and the PID file whatever the config says, including when index_path or its directory is a symlink. database purge removes the same list of index files. Model: opus-5-5
66 regels
1.8 KiB
Go
66 regels
1.8 KiB
Go
package snapshot_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/spf13/afero"
|
|
"github.com/stretchr/testify/require"
|
|
"sneak.berlin/go/vaultik/internal/database"
|
|
"sneak.berlin/go/vaultik/internal/snapshot"
|
|
)
|
|
|
|
// A backup of the directory that holds vaultik's index and PID file
|
|
// stores neither, with no exclude pattern set, and still stores the
|
|
// files beside them. See https://git.eeqj.de/sneak/vaultik/issues/421.
|
|
func TestScanSkipsIndexAndLockFiles(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
const dataDir = "/home/user/.local/share/vaultik"
|
|
|
|
indexAndLockFiles := append(database.IndexFiles(dataDir+"/index.sqlite"),
|
|
dataDir+"/vaultik.pid")
|
|
|
|
fs := afero.NewMemMapFs()
|
|
for _, p := range append(indexAndLockFiles, dataDir+"/notes.txt") {
|
|
require.NoError(t, afero.WriteFile(fs, p, []byte("data"), 0o600))
|
|
}
|
|
|
|
db, err := database.NewTestDB()
|
|
require.NoError(t, err)
|
|
|
|
defer func() { _ = db.Close() }()
|
|
|
|
repos := database.NewRepositories(db)
|
|
|
|
scanner := snapshot.NewScanner(snapshot.ScannerConfig{
|
|
FS: fs,
|
|
ChunkSize: 64 * 1024,
|
|
Repositories: repos,
|
|
MaxBlobSize: 1024 * 1024,
|
|
CompressionLevel: 3,
|
|
AgeRecipients: []string{
|
|
"age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p"},
|
|
IndexAndLockFiles: indexAndLockFiles,
|
|
})
|
|
require.NotNil(t, scanner)
|
|
|
|
ctx := context.Background()
|
|
createSnapshotRecord(ctx, t, repos, "test-snapshot")
|
|
|
|
result, err := scanner.Scan(ctx, "/home/user", "test-snapshot")
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 1, result.FilesScanned)
|
|
|
|
stored, err := repos.Files.GetByPath(ctx, dataDir+"/notes.txt")
|
|
require.NoError(t, err)
|
|
require.NotNil(t, stored, "a file beside the index is stored")
|
|
|
|
for _, p := range indexAndLockFiles {
|
|
f, err := repos.Files.GetByPath(ctx, p)
|
|
require.NoError(t, err)
|
|
require.Nil(t, f, "%s is not stored", p)
|
|
}
|
|
}
|