diff --git a/assets/l10n/en.json b/assets/l10n/en.json index d54fe9a..e0de90a 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -820,6 +820,7 @@ "기기 안에서 그리려면 모델을 받아야 합니다 ({0})": "To draw on this device, download the model first ({0})", "기기에 따라 앱 목록이 열리면, 목록에서 JJ_MKVMaker 를 찾아 켜세요.": "On some devices a list of apps opens instead - find JJ_MKVMaker in the list and turn it on.", "기능 버튼 줄": "Button bar", + "기록 · 배치 파일은 전체 경로로 적어 주세요: {0}": "Please write the full path of the log or batch file: {0}", "기본": "Default", "기본 DNS": "Primary DNS", "기본 앱으로 열기": "Open with default app", diff --git a/assets/l10n/ja.json b/assets/l10n/ja.json index da1155d..f32c23e 100644 --- a/assets/l10n/ja.json +++ b/assets/l10n/ja.json @@ -820,6 +820,7 @@ "기기 안에서 그리려면 모델을 받아야 합니다 ({0})": "この端末で描くにはモデルのダウンロードが必要です ({0})", "기기에 따라 앱 목록이 열리면, 목록에서 JJ_MKVMaker 를 찾아 켜세요.": "機器によってはアプリ一覧が開きます。その場合は一覧から JJ_MKVMaker を探してオンにしてください。", "기능 버튼 줄": "機能ボタンの列", + "기록 · 배치 파일은 전체 경로로 적어 주세요: {0}": "ログ・バッチファイルはフルパスで書いてください: {0}", "기본": "既定", "기본 DNS": "優先 DNS", "기본 앱으로 열기": "既定のアプリで開く", diff --git a/assets/l10n/zh-Hans.json b/assets/l10n/zh-Hans.json index a42f8f3..ae45aac 100644 --- a/assets/l10n/zh-Hans.json +++ b/assets/l10n/zh-Hans.json @@ -820,6 +820,7 @@ "기기 안에서 그리려면 모델을 받아야 합니다 ({0})": "要在本设备上绘制,需要先下载模型 ({0})", "기기에 따라 앱 목록이 열리면, 목록에서 JJ_MKVMaker 를 찾아 켜세요.": "在某些设备上会打开应用列表,请在列表中找到 JJ_MKVMaker 并开启。", "기능 버튼 줄": "功能按钮栏", + "기록 · 배치 파일은 전체 경로로 적어 주세요: {0}": "请填写日志或批处理文件的完整路径: {0}", "기본": "默认", "기본 DNS": "首选 DNS", "기본 앱으로 열기": "用默认应用打开", diff --git a/lib/core/sync_tools.dart b/lib/core/sync_tools.dart index 22ef2dc..41cdee5 100644 --- a/lib/core/sync_tools.dart +++ b/lib/core/sync_tools.dart @@ -240,9 +240,23 @@ List unreadableOptions(String options, {bool? windows}) { for (final f in listFileValues(parsed.words)) { if (!_absolutePath(f)) bad.add(trf('목록 파일은 전체 경로로 적어 주세요: {0}', [f])); } + // 관리자 지시 (10/20, 28 확인): 기록 · 배치 파일도 - 상대 경로면 응답 파일 임시 폴더에 생겼다가 함께 지워져 찾을 수 없다. + // --backup-dir · --partial-dir · --temp-dir · --compare-dest 류는 받는 쪽 기준이라 그대로 + for (final f in _optionValues(parsed.words, const {'--log-file', '--write-batch', '--read-batch', '--only-write-batch'})) { + if (!_absolutePath(f)) bad.add(trf('기록 · 배치 파일은 전체 경로로 적어 주세요: {0}', [f])); + } return bad; } +/// 긴 옵션 [names] 의 값 (--이름=값 · --이름 값) +List _optionValues(List words, Set names) => [ + for (var i = 0; i < words.length; i++) + if (words[i].contains('=') && names.contains(words[i].substring(0, words[i].indexOf('=')))) + words[i].substring(words[i].indexOf('=') + 1) + else if (names.contains(words[i]) && i + 1 < words.length) + words[i + 1], + ]; + /// 파일을 받는 옵션의 값 (--exclude-from · --include-from · --files-from · --filter / -f 의 ". 파일" · "merge 파일"). /// ": 이름" · dir-merge 는 폴더마다 읽는 파일 이름이라 (원래 상대) 빼고 List listFileValues(List words) { diff --git a/test/rsync_msys_args_test.dart b/test/rsync_msys_args_test.dart index fcc6299..45a42a2 100644 --- a/test/rsync_msys_args_test.dart +++ b/test/rsync_msys_args_test.dart @@ -63,9 +63,16 @@ void main() { '-a --filter="dir-merge .x"', '-a -F', '-a --exclude=list.txt', + // 받는 쪽 기준이라 그대로 (28 확인) + '-a --backup-dir=old --partial-dir=.part --temp-dir=tmp --compare-dest=../base', + r'-a --log-file=C:\logs\r.log --write-batch=/cygdrive/c/b/batch', ]) { expect(unreadableOptions(o, windows: true), isEmpty, reason: o); } + // 관리자 지시 (10/20, 28 확인): 기록 · 배치 파일도 전체 경로만 (상대면 응답 파일 임시 폴더에 생겼다가 함께 지워짐) + for (final o in ['-a --log-file=r.log', '-a --log-file r.log', '-a --write-batch=b', '-a --only-write-batch b', '-a --read-batch=./b']) { + expect(unreadableOptions(o, windows: true), [contains('기록 · 배치 파일은 전체 경로로 적어 주세요')], reason: o); + } }); group('실제 rsync', () {