v0.2.4: stop export loop on Ctrl+C instead of flooding failures

- Add IsCancelled() to Bridge interface
- Check bridge.IsCancelled() before each export in serial/parallel/backupTree
- Parallel workers mark remaining slots as 'cancelled' instead of exporting
- Add photos_request_is_cancelled to ObjC and C stub
This commit is contained in:
Ein Anderssono
2026-06-11 21:44:55 +02:00
parent 009c71e6bb
commit 479c284dfc
9 changed files with 32 additions and 1 deletions
+11
View File
@@ -263,6 +263,9 @@ func backupTree(nodes []photos.CollectionNode, outDir string, targetSize int, or
total := 0
failed := 0
for _, node := range nodes {
if bridge.IsCancelled() {
break
}
path := outDir + "/" + sanitizePathComponent(node.Name)
if node.Kind == "folder" {
n, t, f, err := backupTree(node.Children, path, targetSize, originals, stderr, bridge)
@@ -306,6 +309,9 @@ func exportAssetsSerial(assets []photos.Asset, outDir string, targetSize int, or
exported := 0
failed := 0
for i, a := range assets {
if bridge.IsCancelled() {
break
}
result, exportErr := exportOne(bridge, a, outDir, targetSize, originals, i)
progressBar(stderr, exported+failed+1, total, dirPrefix+result.Filename, result.Size, result.Cloud)
if exportErr != nil {
@@ -337,6 +343,11 @@ func exportAssetsParallel(assets []photos.Asset, outDir string, targetSize int,
go func() {
defer wg.Done()
for i := range jobs {
if bridge.IsCancelled() {
slots[i].err = fmt.Errorf("cancelled")
close(slots[i].done)
continue
}
result, exportErr := exportOne(bridge, assets[i], outDir, targetSize, originals, i)
slots[i].result = result
slots[i].err = exportErr
+1
View File
@@ -50,6 +50,7 @@ func (m *mockBridge) ExportOriginal(assetID, out string, index int) (photos.Expo
return photos.ExportResult{Filename: "test.jpg", Size: 2048, Cloud: "cloud"}, nil
}
func (m *mockBridge) Cancel() { m.cancelled = true }
func (m *mockBridge) IsCancelled() bool { return m.cancelled }
func runWith(args []string, b photos.Bridge) (string, string, int) {
var out, err bytes.Buffer