From 849c83031df5b4fce2f5e13a25da79e9e40a1258 Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Tue, 20 Oct 2026 17:10:55 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B8=B0=EB=A1=9D=20=C2=B7=20=EB=B0=B0?= =?UTF-8?q?=EC=B9=98=20=ED=8C=8C=EC=9D=BC=20(--log-file=20=C2=B7=20--write?= =?UTF-8?q?-batch=20=C2=B7=20--read-batch=20=C2=B7=20--only-write-batch)?= =?UTF-8?q?=20=EC=9D=98=20=EC=83=81=EB=8C=80=20=EA=B2=BD=EB=A1=9C=EB=8F=84?= =?UTF-8?q?=20=EB=A7=89=EC=9D=8C=20(=EA=B2=80=ED=86=A0=20=EB=8C=80?= =?UTF-8?q?=EA=B8=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 관리자 지시 (10/20, 28 확인): 상대 경로면 응답 파일 임시 폴더에 생겼다가 함께 지워져 사용자가 기록을 찾지 못함 - "기록 · 배치 파일은 전체 경로로 적어 주세요". --backup-dir · --partial-dir · --temp-dir · --compare-dest 류는 받는 쪽 기준이라 그대로 (시험에 둠). 번역 en · ja · zh. Co-Authored-By: Claude Opus 5.5 --- assets/l10n/en.json | 1 + assets/l10n/ja.json | 1 + assets/l10n/zh-Hans.json | 1 + lib/core/sync_tools.dart | 14 ++++++++++++++ test/rsync_msys_args_test.dart | 7 +++++++ 5 files changed, 24 insertions(+) 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', () {