todo-app/lib/sync/backlog_export_io.dart
Krzysztof kuhy Rudnicki 3fd326516b
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
file-length / file length <= 250 lines (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
release-apk / release (APK) (push) Waiting to run
Export the backlog to ~/src/todo, not ~/todo
Both desktop writers build the directory by string interpolation
(`Directory('$home/todo')`), which the ~ reorganisation's reference
rewriter cannot see. The first export after the move recreated a stray
~/todo and tripped the home-tidy root allowlist.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AwtowrowDXx6ccmWVPkCaF
2026-09-11 20:33:07 +02:00

48 lines
2.0 KiB
Dart

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';
/// Resolves the home directory the desktop export writes under.
///
/// Overridable **so the test suite never writes to the real `~/src/todo`**. This is
/// not hypothetical: before this seam existed, running `flutter test` exported
/// a fake note over the user's canonical `~/src/todo/BACKLOG.md` every time.
String Function() resolveExportHome = () =>
Platform.environment['HOME'] ?? Directory.current.path;
/// Writes the Markdown export somewhere the user can get at it, and returns a
/// human-readable description of where it went.
///
/// On mobile this opens the system share sheet; on a `dart:io` desktop host it
/// writes the canonical `~/src/todo/BACKLOG.md`.
Future<String> exportBacklog(String markdown, int noteCount) async {
// coverage:ignore-start
// Mobile-only share path: Platform.isAndroid/isIOS are always false on the
// Linux test host, so these lines are structurally unreachable in CI and
// excluded from the coverage denominator. Verified on-device.
if (Platform.isAndroid || Platform.isIOS) {
final dir = await getTemporaryDirectory();
final file = File('${dir.path}/todo-backlog.md');
await file.writeAsString(markdown);
await SharePlus.instance.share(
ShareParams(
files: [XFile(file.path, mimeType: 'text/markdown')],
subject: 'todo backlog ($noteCount notes)',
),
);
return 'Shared $noteCount notes';
}
// coverage:ignore-end
final home = resolveExportHome();
// `src/` since the 2026-09-11 ~ reorganisation: every repo lives under
// ~/src, and the path is built by interpolation, so the migration's
// reference rewriter could not see it — the app quietly recreated
// ~/todo on the next export.
final dir = Directory('$home/src/todo');
if (!dir.existsSync()) dir.createSync(recursive: true);
final file = File('${dir.path}/BACKLOG.md');
await file.writeAsString(markdown);
return 'Exported $noteCount notes to ${file.path}';
}