diff --git a/adapters/googlePhotos/googlephotos.go b/adapters/googlePhotos/googlephotos.go index 9dc54a049..151dc0a7e 100644 --- a/adapters/googlePhotos/googlephotos.go +++ b/adapters/googlePhotos/googlephotos.go @@ -3,6 +3,7 @@ package gp import ( "bytes" "context" + "errors" "io/fs" "log/slog" "path" @@ -95,6 +96,11 @@ func (toc *TakeoutCmd) Browse(ctx context.Context) chan *assets.Group { func (toc *TakeoutCmd) passOneFsWalk(ctx context.Context, w fs.FS) error { err := fs.WalkDir(w, ".", func(name string, d fs.DirEntry, err error) error { if err != nil { + if errors.Is(err, fs.ErrNotExist) { + // This branch can happen when you have symbolic links. + return nil + } + return err } diff --git a/adapters/googlePhotos/googlephotos_test.go b/adapters/googlePhotos/googlephotos_test.go new file mode 100644 index 000000000..0a6284d0f --- /dev/null +++ b/adapters/googlePhotos/googlephotos_test.go @@ -0,0 +1,32 @@ +package gp + +import ( + "io/fs" + "testing" +) + +// mockFS implements a simple fs.FS for testing +type mockFS struct{} + +func (m mockFS) Open(name string) (fs.File, error) { + return nil, fs.ErrNotExist +} + +func (m mockFS) Name() string { + return "test.zip" +} + +func Test_TakeoutCmd_passOneFsWalk(t *testing.T) { + t.Parallel() + + t.Run("pass: fs.ErrNotExist should not error", func(t *testing.T) { + t.Parallel() + + toc := &TakeoutCmd{} + + err := toc.passOneFsWalk(t.Context(), mockFS{}) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + }) +}