check / check (push) Failing after 4m42s
A backup of a directory that holds the local index stored a torn copy of it, its -wal and -shm side files and vaultik.pid, all being written while they were read. The scan now treats these files as excluded, whatever the config says. Their paths come from index_path and the lock directory, with symlinks in their directories resolved the way source paths are. If index_path is itself a symlink, SQLite writes the file it points to, so that file and its side files are skipped too. pidlock now owns the lock directory and the PID file name, so the CLI and the scanner use the same path. Model: opus-5-5
69 lines
2.1 KiB
Go
69 lines
2.1 KiB
Go
package cli //nolint:testpackage // shares runEntry and the hermetic config helpers
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/adrg/xdg"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestEntrySnapshotCreateSkipsOwnFiles backs up a directory that holds
|
|
// vaultik's index and PID file beside one other file, with no exclude
|
|
// pattern set. The summary counts only the other file. See
|
|
// https://git.eeqj.de/sneak/vaultik/issues/421.
|
|
//
|
|
//nolint:paralleltest // replaces os.Args, os.Stdout, os.Stderr and the xdg globals
|
|
func TestEntrySnapshotCreateSkipsOwnFiles(t *testing.T) {
|
|
for _, testCase := range []struct {
|
|
name string
|
|
// linked sets index_path to a symlink outside the backed-up
|
|
// directory that points to the index inside it.
|
|
linked bool
|
|
}{
|
|
{name: "index in the backed-up directory"},
|
|
{name: "index_path links into the backed-up directory", linked: true},
|
|
} {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
configPath := filepath.Join(dir, "config.yml")
|
|
sourceDir := filepath.Join(dir, "source")
|
|
storeDir := filepath.Join(dir, "store")
|
|
|
|
indexPath := filepath.Join(sourceDir, "index.sqlite")
|
|
|
|
if testCase.linked {
|
|
link := filepath.Join(dir, "index.sqlite")
|
|
require.NoError(t, os.Symlink(indexPath, link))
|
|
|
|
indexPath = link
|
|
}
|
|
|
|
contents := fmt.Sprintf(hermeticConfig,
|
|
sourceDir, storeDir, indexPath)
|
|
require.NoError(t,
|
|
os.WriteFile(configPath, []byte(contents), configFileMode))
|
|
require.NoError(t, os.Mkdir(storeDir, 0o750))
|
|
require.NoError(t, os.Mkdir(sourceDir, 0o750))
|
|
require.NoError(t, os.WriteFile(
|
|
filepath.Join(sourceDir, "file.txt"), []byte("hello"), 0o600))
|
|
|
|
// The PID file goes in a directory under XDG_DATA_HOME, which
|
|
// xdg reads at package init.
|
|
t.Setenv("XDG_DATA_HOME", filepath.Join(sourceDir, "data"))
|
|
xdg.Reload()
|
|
t.Cleanup(xdg.Reload)
|
|
|
|
code, stdout, _ := runEntry(t,
|
|
flagConfig, configPath, cmdSnapshot, cmdCreate)
|
|
|
|
require.Equal(t, 0, code)
|
|
assert.Contains(t, stdout,
|
|
"Files: 1 examined, 1 backed up, 0 unchanged.")
|
|
})
|
|
}
|
|
}
|