WIP 177 보충 4 (28 확인): 붙여 쓴 -f"+ *.txt" 도 규칙으로 읽음 (예전에는 말없이 버려 지울 목록이 적게 보였다) · --files-from 은 "미리 볼 수 없음" (검토 대기)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
next3
RyuJongJin 2026-10-19 22:34:20 +09:00
parent 63ef362f6d
commit 6d40eaf174
2 changed files with 15 additions and 0 deletions

View File

@ -95,6 +95,13 @@ class RsyncFilter {
filterRule(v!); filterRule(v!);
} else if (o == '-f' && i + 1 < t.length) { } else if (o == '-f' && i + 1 < t.length) {
filterRule(t[++i]); filterRule(t[++i]);
} else if (o.startsWith('-f') && !o.startsWith('--')) {
// 28 확인: -f"+ *.txt" 처럼 붙여 쓴 것 (따옴표가 벗겨져 "-f+ *.txt" 한 낱말) - 예전에는 말없이 버렸다
filterRule(o.substring(2));
} else if (o == '--files-from' || o.startsWith('--files-from=')) {
// 28 확인: 고른 파일만 보내므로 미리 보기와 다르다 (미리 보기는 더 많이 보임) - 알린다
if (o == '--files-from' && i + 1 < t.length) i++;
unsupported.add(o);
} else if (o == '--delete-excluded') { } else if (o == '--delete-excluded') {
deleteExcluded = true; deleteExcluded = true;
} else if (o == '--cvs-exclude' || o == '-F' || (o.startsWith('-') && !o.startsWith('--') && (o.contains('C') || o.contains('F')))) { } else if (o == '--cvs-exclude' || o == '-F' || (o.startsWith('-') && !o.startsWith('--') && (o.contains('C') || o.contains('F')))) {

View File

@ -53,6 +53,11 @@ void main() {
expect(ex('--exclude="My Folder/"', 'My Folder', dir: true), isTrue); expect(ex('--exclude="My Folder/"', 'My Folder', dir: true), isTrue);
expect(ex('--filter="- *.bak"', 'x.bak'), isTrue); expect(ex('--filter="- *.bak"', 'x.bak'), isTrue);
expect(ex('-f "+ keep.bak" -f "- *.bak"', 'keep.bak'), isFalse); expect(ex('-f "+ keep.bak" -f "- *.bak"', 'keep.bak'), isFalse);
// 28 확인: 붙여 쓴 -f"…" 도 읽는다 · --files-from 은 미리 볼 수 없음
expect(ex('-f"+ *.txt" --exclude=*', 'gone.txt'), isFalse);
expect(ex('-f"+ *.txt" --exclude=*', 'old.log'), isTrue);
expect(ex('-f"- *.log"', 'c.log'), isTrue);
expect(RsyncFilter.parse('--files-from=list.txt').unsupported, ['--files-from=list.txt']);
}); });
test('--exclude-from 파일 (빈 줄 · # · + / - 머리) · 못 읽으면 알림 목록', () { test('--exclude-from 파일 (빈 줄 · # · + / - 머리) · 못 읽으면 알림 목록', () {
final f = RsyncFilter.parse('--exclude-from=list.txt', final f = RsyncFilter.parse('--exclude-from=list.txt',
@ -272,6 +277,9 @@ void main() {
'-a --delete-after --exclude=*.log', '-a --delete-after --exclude=*.log',
'-a --delete --exclude=**/x/', '-a --delete --exclude=**/x/',
'-a --delete --include=*.txt --exclude=*.log --exclude=*/', '-a --delete --include=*.txt --exclude=*.log --exclude=*/',
// 28 확인 (63ef362): 붙여 쓴 -f
'-a --delete -f"+ *.txt" --exclude=*',
'-a --delete -f"- *.log"',
].indexed) { ].indexed) {
test('${i + 1}: $opts', () async { test('${i + 1}: $opts', () async {
if (!Platform.isWindows || !File(rsync).existsSync()) return markTestSkipped('앱에 든 rsync 가 없음'); if (!Platform.isWindows || !File(rsync).existsSync()) return markTestSkipped('앱에 든 rsync 가 없음');