diff --git a/lib/core/sync_tools.dart b/lib/core/sync_tools.dart index cbc7aa1..2e3484e 100644 --- a/lib/core/sync_tools.dart +++ b/lib/core/sync_tools.dart @@ -113,6 +113,9 @@ List> robocopyRuns({ final extra = [ if (bandwidthKBps > 0 && !opts.any((o) => o.toUpperCase().startsWith('/IPG'))) '/IPG:${robocopyIpg(bandwidthKBps)}', if (move) '/MOVE', + // 217: 대상에 같은 파일이 있으면 robocopy 는 건너뛰고 원본에 남긴다 (종료 코드 0 - "옮겼습니다" 인데 남음, Windows 에서 확인). + // 이동은 같은 파일도 포함 (/IS) 해 원본에서 지운다. 속성만 다른 것 (Tweaked) 등 그래도 남는 것은 이동 뒤 다시 세어 알린다 (216) + if (move && !opts.any((o) => o.toUpperCase() == '/IS')) '/IS', ]; final runs = >[ for (final f in folders) [f, contents ? dest : p.join(dest, p.basename(f)), ...opts, ...extra], diff --git a/test/move_settled_test.dart b/test/move_settled_test.dart index 98f5b2e..7ac91fa 100644 --- a/test/move_settled_test.dart +++ b/test/move_settled_test.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/app/transfer_job.dart'; +import 'package:jj_mkvmaker/core/sync_tools.dart' show CopyMethod; import 'package:jj_mkvmaker/core/webdav.dart'; import 'package:path/path.dart' as p; @@ -94,6 +95,20 @@ void main() { expect(rsyncFailureText(12, ['rsync error: error in rsync protocol data stream (code 12)'], const []), isNot(contains('원본 파일을 지우지'))); }); + test('217: robocopy 이동 - 대상에 같은 파일이 있어도 원본에서 지운다 (예전에는 남기고 "옮겼습니다")', () async { + if (!Platform.isWindows) return; + // robocopy 가 "같음" 으로 보는 파일 (탐색기 · Copy-Item 복사처럼 속성까지 같은 것) + final r = Process.runSync('powershell', ['-NoProfile', '-Command', "Copy-Item -LiteralPath '${p.join(src, 'a.txt')}' -Destination '${p.join(dst, 'a.txt')}'"]); + expect(r.exitCode, 0); + final job = TransferJob(sources: [src], dest: dst, move: true, contents: true, method: CopyMethod.robocopy, options: '/E'); + await job.run(); + expect(job.error, isNull); + expect(File(p.join(src, 'a.txt')).existsSync(), isFalse, reason: '같은 파일도 옮김'); + expect(File(p.join(dst, 'a.txt')).readAsStringSync(), 'a'); + expect(job.leftInSource, 0); + // (속성만 다른 "수정됨" 파일은 /IS · /IT 로도 남는다 - 그때는 216 의 "n개는 원본에 남음" 으로 알린다) + }); + group('214 b: WebDAV', () { late Directory remote; late TestDavServer server; diff --git a/test/sync_tools_test.dart b/test/sync_tools_test.dart index 29c49d2..7aa5983 100644 --- a/test/sync_tools_test.dart +++ b/test/sync_tools_test.dart @@ -61,8 +61,8 @@ void main() { bandwidthKBps: 640, move: true, ); - expect(runs[0], [r'C:\a\movies', p.join(r'E:\dst', 'movies'), '/E', '/R:2', '/IPG:100', '/MOVE']); - expect(runs[1], [r'C:\b', r'E:\dst', '1.mkv', '2.mkv', '/R:2', '/IPG:100', '/MOV']); // 파일만: /E 빼고 /MOV + expect(runs[0], [r'C:\a\movies', p.join(r'E:\dst', 'movies'), '/E', '/R:2', '/IPG:100', '/MOVE', '/IS']); + expect(runs[1], [r'C:\b', r'E:\dst', '1.mkv', '2.mkv', '/R:2', '/IPG:100', '/MOV', '/IS']); // 파일만: /E 빼고 /MOV. 217: 이동은 같은 파일도 (/IS) expect(runs[2].sublist(0, 3), [r'C:\c', r'E:\dst', '3.mkv']); expect(robocopyIpg(0), 0); });