v0.10.0: ports and adapters refactor
pipeline / test (push) Has been cancelled
pipeline / build (push) Has been cancelled

- Extract shared manifest types into internal/manifest/types leaf package.
- Extract SQLite adapter into internal/manifest/sqlite.
- Extract JSONL adapter into internal/manifest/jsonl.
- Isolate modernc.org/sqlite import to sqlite/adapter.go.
- Add adapter-backed registry with manifest.Default.
- Adapter-agnostic ConvertManifest in types/.
- MemoryAdapter for in-memory manifest testing.
- CLI uses manifest.Default registry directly.
- SQLite LogWriter type assertion moved into SQLiteAdapter.
- Manifest interface includes Entries(); EntryReader removed.
- No behavior changes. 100% coverage across all 6 packages.
This commit is contained in:
Ein Anderssono
2026-06-15 08:27:38 +02:00
parent 9cd048d9f3
commit c9ac014473
28 changed files with 2061 additions and 927 deletions
+17 -19
View File
@@ -34,6 +34,7 @@ var (
renameFunc = os.Rename
openFileFunc = os.OpenFile
removeFunc = os.Remove
reg = manifest.Default
)
type exportOptions struct {
@@ -500,7 +501,7 @@ func cmdExport(args []string, stdout, stderr io.Writer, bridge photos.Bridge) in
return exitErr
}
mf, mfErr := manifest.ParseFormat(manifestFmt)
mf, mfErr := reg.ParseFormat(manifestFmt)
if mfErr != nil {
fmt.Fprintf(stderr, "error: %v\n", mfErr)
return exitErr
@@ -603,7 +604,7 @@ func cmdExport(args []string, stdout, stderr io.Writer, bridge photos.Bridge) in
}
var exported, failed int
if opts.metadataOnly {
m, _ := manifest.Open(outDir, mf)
m, _ := reg.Open(outDir, mf)
defer m.Close()
entries := manifestEntries(m)
fmt.Fprintf(stderr, "writing metadata for %d assets to %s...\n", total, outDir)
@@ -673,7 +674,7 @@ func cmdBackupAll(args []string, stdout, stderr io.Writer, bridge photos.Bridge)
return exitErr
}
mf, mfErr := manifest.ParseFormat(manifestFmt)
mf, mfErr := reg.ParseFormat(manifestFmt)
if mfErr != nil {
fmt.Fprintf(stderr, "error: %v\n", mfErr)
return exitErr
@@ -747,7 +748,7 @@ func cmdBackupAll(args []string, stdout, stderr io.Writer, bridge photos.Bridge)
}
var totalAssets, failed int
if opts.metadataOnly {
m, _ := manifest.Open(outDir, mf)
m, _ := reg.Open(outDir, mf)
entries := manifestEntries(m)
m.Close()
pending, skipped := collectPendingAssets(nodes, outDir, bridge, skipVideos, originals, nil, nil, sortNewest, excludeAlbums, sinceTime, opts)
@@ -1299,10 +1300,7 @@ func writeMetadataOnlySidecar(pa pendingAsset, entry manifest.Entry, originals b
}
func manifestEntries(m manifest.Manifest) map[string]manifest.Entry {
if r, ok := m.(manifest.EntryReader); ok {
return r.Entries()
}
return nil
return m.Entries()
}
func metadataOnlyAssets(assets []photos.Asset, outDir string, originals bool, dirPrefix string, entries map[string]manifest.Entry, opts exportOptions, bridge photos.Bridge) (int, int) {
@@ -1428,7 +1426,7 @@ func backupTree(nodes []photos.CollectionNode, outDir string, targetSize, qualit
var m manifest.Manifest
if !noManifest {
var err error
m, err = manifest.Open(outDir, mf)
m, err = reg.Open(outDir, mf)
if err != nil {
fmt.Fprintf(stderr, " warning: could not open manifest: %v\n", err)
} else {
@@ -1441,7 +1439,7 @@ func backupTree(nodes []photos.CollectionNode, outDir string, targetSize, qualit
var lw manifest.LogWriter = manifest.NoopLogWriter
if enableLog {
var err error
lw, err = manifest.OpenLogWriter(m, outDir)
lw, err = reg.OpenLogWriter(m, outDir, mf)
if err != nil {
fmt.Fprintf(stderr, " warning: could not open log writer: %v\n", err)
lw = manifest.NoopLogWriter
@@ -1717,7 +1715,7 @@ func exportAssets(assets []photos.Asset, outDir string, targetSize, quality, con
var m manifest.Manifest
if !noManifest {
var err error
m, err = manifest.Open(outDir, mf)
m, err = reg.Open(outDir, mf)
if err != nil {
fmt.Fprintf(stderr, "warning: could not open manifest: %v\n", err)
} else {
@@ -1730,7 +1728,7 @@ func exportAssets(assets []photos.Asset, outDir string, targetSize, quality, con
var lw manifest.LogWriter = manifest.NoopLogWriter
if enableLog {
var err error
lw, err = manifest.OpenLogWriter(m, outDir)
lw, err = reg.OpenLogWriter(m, outDir, mf)
if err != nil {
fmt.Fprintf(stderr, "warning: could not open log writer: %v\n", err)
lw = manifest.NoopLogWriter
@@ -2230,7 +2228,7 @@ func cmdReport(args []string, stdout, stderr io.Writer) int {
fmt.Fprintln(stderr, "error: --out is required")
return exitErr
}
mf, err := manifest.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
mf, err := reg.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr
@@ -2259,7 +2257,7 @@ func cmdDiff(args []string, stdout, stderr io.Writer, bridge photos.Bridge) int
fmt.Fprintln(stderr, "error: --album-id and --out are required")
return exitErr
}
mf, err := manifest.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
mf, err := reg.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr
@@ -2304,7 +2302,7 @@ func cmdVerify(args []string, stdout, stderr io.Writer) int {
fmt.Fprintln(stderr, "error: --out is required")
return exitErr
}
mf, err := manifest.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
mf, err := reg.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr
@@ -2417,7 +2415,7 @@ func cmdDoctor(args []string, stdout, stderr io.Writer, bridge photos.Bridge) in
problems++
} else {
result["backup_dir"] = "ok"
mf, err := manifest.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
mf, err := reg.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr
@@ -2466,7 +2464,7 @@ func cmdCleanup(args []string, stdout, stderr io.Writer) int {
fmt.Fprintln(stderr, "error: --out is required")
return exitErr
}
mf, err := manifest.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
mf, err := reg.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr
@@ -2544,7 +2542,7 @@ func cmdManifest(args []string, stdout, stderr io.Writer) int {
fmt.Fprintf(stderr, "error: --checksum must be none or sha256, got %q\n", checksumMode)
return exitErr
}
mf, err := manifest.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
mf, err := reg.ParseFormat(flagValWithDefault(args, "--manifest", "jsonl"))
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr
@@ -2755,7 +2753,7 @@ func cmdStatus(args []string, stdout, stderr io.Writer) int {
return exitErr
}
manifestFmt := flagValWithDefault(args, "--manifest", "jsonl")
mf, err := manifest.ParseFormat(manifestFmt)
mf, err := reg.ParseFormat(manifestFmt)
if err != nil {
fmt.Fprintf(stderr, "error: %v\n", err)
return exitErr