Name the database each command uses on stderr (closes #111)
check / check (push) Canceled after 0s

scan, report and trees now print one line on stderr before anything
else, naming the database as an absolute path and saying whether the
path is the default or comes from SFDUPES_DATABASE; scan also says when
no database file exists yet. report and trees print it before opening
the database, so a missing-database error follows it. databasePath in
db.go now returns the absolute path and its source, and every command
uses that absolute path throughout, so errors and the lock file name it
too. README "Database" lists when scan writes each file, from the lock
file to the -wal and -shm files going away.

Unverified: the line on a terminal has no test of its own; it is
printed before any progress display, the same way in both cases.

Model: opus-5-5
This commit is contained in:
2026-10-16 12:02:46 +00:00
parent 198cefa152
commit ff14c28ee7
9 changed files with 226 additions and 35 deletions
+19 -6
View File
@@ -42,17 +42,30 @@ func openTestDB(t *testing.T) *sql.DB {
return db
}
//nolint:paralleltest // changes the process-wide working directory
func TestDatabasePath(t *testing.T) {
t.Setenv(databaseEnv, "")
// README §Database: SFDUPES_DATABASE when set and non-empty, the
// default otherwise, made absolute against the working directory.
dir := t.TempDir()
t.Chdir(dir)
if got := databasePath(); got != defaultDatabasePath {
t.Errorf("databasePath() = %q, want %q", got, defaultDatabasePath)
fromEnv := "from " + databaseEnv
cases := []struct {
env, path, source string
}{
{"", defaultDatabasePath, "default"},
{"/custom/place.sqlite", "/custom/place.sqlite", fromEnv},
{"sub/place.sqlite", filepath.Join(dir, "sub/place.sqlite"), fromEnv},
}
t.Setenv(databaseEnv, "/custom/place.sqlite")
for _, tc := range cases {
t.Setenv(databaseEnv, tc.env)
if got := databasePath(); got != "/custom/place.sqlite" {
t.Errorf("databasePath() = %q, want the env override", got)
path, source, err := databasePath()
if err != nil || path != tc.path || source != tc.source {
t.Errorf("databasePath() with %s=%q = %q, %q, %v; want %q, %q",
databaseEnv, tc.env, path, source, err, tc.path, tc.source)
}
}
}