v0.10.0: ports and adapters refactor
- 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:
+17
-19
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user