요구를 잘못 읽었었다. Git 저장소 이야기로 보고 .git 찾아 올라가기를 만들었는데, 실제로는 폴더 비교 탭의 폴더 고르는 창 이야기였다. 상위 폴더를 골라 놓고 하위까지 한꺼번에 비교하고 싶은데 그 상위 폴더를 고를 방법이 없었다. 원인은 폴더 고르기를 파일 열기 창으로 돌려쓰고 있던 것이다. 이 방식은 지금 서 있는 폴더를 돌려주기 때문에, 목록에 보이는 폴더를 고르려면 반드시 그 안으로 들어가야 한다. 그래서 늘 가장 깊은 폴더만 골라졌다. - 윈도우 폴더 선택 창을 셸 COM(IFileDialog + FOS_PICKFOLDERS)으로 직접 부른다. 목록에서 폴더를 한 번 눌러 고를 수 있다. COM 이 안 되면 전에 쓰던 방식으로 물러선다. - SetDefaultFolder 가 아니라 SetFolder 를 쓴다. 전자는 윈도우가 기억한 폴더를 우선해서 지금 경로 칸에 적힌 폴더에서 열리지 않는다. - D-4(비교 창 여러 개)는 사용자 판단으로 취소. 번호는 그대로 둔다. 확인: 위로 한 번 올라가 목록의 right 폴더를 한 번 눌러 골랐고 경로 칸에 그대로 들어왔다. 그 상태로 비교하니 doc / src / src·core / src·ui 트리가 나오고 src·core·weld.cs 까지 펼쳐진다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9.9 KiB
9.9 KiB
작업 지시 — MergeHub 3차 (버그 정리 + 기능 확장)
대상: D:\Sorce\MergeTool\MergeHub (플러그인) · D:\Sorce\MergeTool\UbisamPlatform (셸)
전제: 1차·2차 지시서와 진행상황.md 의 ①~⑤ 는 끝난 상태다. 아래는 실제로 써 보고 나온 문제와 다음 요구사항이다.
공통 규칙
- A → B → C → D 순서로 진행한다. A 는 프로그램이 죽거나 화면이 망가지는 문제라 제일 먼저다.
- 항목 하나를 끝낼 때마다 빌드하고 실제로 실행해 화면을 확인한 뒤 보고한다. 전부 끝내고 한 번에 보고하지 않는다.
- 항목 하나가 끝나면
doc/진행상황.md의 대기/진행/완료를 갱신하고 로컬 커밋한다. 커밋 메시지는 한국어 한 줄로 무엇을 고쳤는지 적는다. - 푸쉬하지 않는다. 원격 저장소가 생기기 전까지
.git에만 쌓아 둔다. - 기존 테스트 하네스(총 356건)는 계속 통과해야 한다. 로직을 건드리면 테스트를 먼저 늘린다.
- 빌드 경고 0 · 오류 0 을 유지한다. 앱이 실행 중이면 빌드가 파일 잠금으로 실패하므로
UbisamBase.Shell을 먼저 종료한다. - 플랫폼을 고치면 다른 소비 프로그램에 미치는 영향을 함께 적고
doc/history/changelog.md에 남긴다.
A. 먼저 고칠 것 — 죽거나 화면이 망가지는 문제
A-1. 폴더 비교 탭에서 "왼쪽 폴더..." 를 누르면 프로그램이 다운된다
- 증상: 폴더 비교 탭의 왼쪽 폴더 선택 버튼(
FolderView.xaml의PickLeftFolderCommand)을 누르면 프로그램이 그대로 죽는다. - 오른쪽 폴더도 같은 증상인지 반드시 함께 확인한다.
- 죽는 지점을 먼저 특정한다(예외 로그 · 대화상자 호출 스레드 · 셸의 잠금/오버레이와의 충돌).
- 판정 기준: 왼쪽·오른쪽 폴더를 연속으로 열 번 골라도 죽지 않는다.
A-2. "화면 이동" 을 누르면 프로그램이 종료되거나 최소화된다
- 위치:
UbisamPlatform/src/UbisamBase.Core/Shell/ShellWindow.xaml.cs의MoveToNextMonitor. - 코드 주석에 이미 "새 자리의 다른 버튼에 떨어진다" 는 언급이 있다. 창을 옮긴 뒤 마우스 아래 버튼이 눌리거나 포커스가 엉키는 것으로 보인다.
- 판정 기준: 모니터 두 대에서 화면 이동을 스무 번 연속으로 눌러도 종료·최소화가 한 번도 없다.
A-3. 파일 비교 화면에서 "화면 이동" 을 누르면 원래 모니터로 되돌아온다
- 증상: 다른 탭에서는 옮겨지는데 파일 비교 탭에서 누르면 창이 원래 모니터로 복귀한다.
- 파일 비교 화면이 자기 위치를 되돌리는 코드(창 위치 복원 · 레이아웃 재계산 · 포커스 복원)를 찾아 원인을 적고 고친다.
- 판정 기준: 파일 비교 탭에서도 다른 탭과 똑같이 다음 모니터로 옮겨지고, 그 자리에 남는다.
A-4. "화면 이동" 을 누르면 잠금 관련 팝업이 뜬다
- 증상: 화면 이동을 눌렀는데
LockConfirmDialog로 보이는 확인 창이 뜬다. 화면 이동과 화면 잠금은 별개 기능이므로 떠서는 안 된다. - A-2 와 원인이 같을 수 있다(옮긴 뒤 다른 내비 버튼이 눌림). 같은 원인이면 함께 정리하고 그렇게 보고한다.
- 판정 기준: 화면 이동으로는 어떤 팝업도 뜨지 않는다.
A-5. 폴더 고르는 창에서 상위 폴더를 고를 수 없다
- 증상: 폴더 비교 탭에서 폴더를 고르면 그 폴더 안으로 들어가야만 선택된다. 목록에 보이는 상위 폴더를 눌러서 고를 수가 없어 늘 가장 깊은 폴더만 고르게 된다. 상위 폴더를 골라 놓고 하위까지 한꺼번에 비교하는 것이 폴더 비교의 기본 사용법인데 그것이 막힌다.
- 윈도우가 원래 가지고 있는 폴더 선택 창을 쓴다. 목록에서 폴더를 한 번 눌러 고를 수 있어야 한다.
- 창은 지금 경로 칸에 적힌 폴더에서 연다. 윈도우가 기억한 "마지막으로 본 폴더"에서 열면 엉뚱한 곳에서 시작한다.
- 곁들여: Git 탭에서 하위 폴더를 골랐더라도 위로 거슬러 올라가며
.git이 있는 최상위를 찾아 연다. - 판정 기준: 목록에서 상위 폴더를 한 번 눌러 고를 수 있고, 그 폴더로 비교하면 하위 폴더까지 나온다.
B. 3-Way 화면
B-1. 3-Way 에서 가로 스크롤 막대가 보이지 않는다
- 지금은 가로 휠로만 움직인다. 막대가 없으면 긴 줄이 있다는 사실 자체를 모른다.
- 워드랩이 켜져 있을 때는 가로 스크롤이 필요 없으므로 막대도 숨긴다. 꺼져 있을 때만 보인다.
- 소스 3칸(LOCAL/BASE/REMOTE)과 MERGED 는 스크롤 그룹이 다르다. 막대도 그 구분을 따라야 한다.
- 판정 기준: 워드랩을 끄고 긴 줄이 있는 파일을 3-Way 로 열면 막대가 보이고, 막대를 끌면 해당 그룹이 함께 움직인다.
B-2. 3-Way 에서 아래로 스크롤하면 창마다 보이는 행 수가 달라진다
- 증상: 스크롤을 내릴수록 네 칸의 줄 맞춤이 어긋나 같은 줄이 나란히 보이지 않는다.
- 워드랩이 켜졌을 때와 꺼졌을 때를 모두 확인한다. 접힌 줄이 있으면 시각 줄 수가 칸마다 달라진다는 점이 원인일 가능성이 크다.
- 판정 기준: 파일 끝까지 내려도 같은 줄 번호가 네 칸에서 같은 높이에 있다.
B-3. Take Mine / Take Theirs 가 3-Way 에서 실제로 동작하는지 확인
- 2-Way 에서는 동작한다. 3-Way 에서 두 버튼과 단축키가 모두 먹는지, 충돌 줄에서 버튼이 회색으로 죽지 않는지 확인한다.
- 동작하지 않으면 고치고, 동작하면 "확인함" 으로 보고한다.
- 판정 기준: 3-Way 충돌 줄에서 두 버튼이 눌리고 MERGED 에 반영되며, 해결한 만큼 남은 충돌 수가 줄어든다.
C. 잔손질
C-1. 소스 창의 코드 위 툴팁을 없앤다
- 증상: 파일 비교 화면에서 코드 위에 마우스를 올리면 그 줄 내용이 툴팁으로 다시 뜬다. 코드가 이미 보이는데 겹쳐 가려 방해만 된다.
- 코드 본문 툴팁만 없앤다. 버튼·상태 아이콘 툴팁은 그대로 둔다.
- 판정 기준: 코드 위 어디에 올려도 툴팁이 뜨지 않는다.
C-2. Git 탭에서 버튼과 텍스트 상자가 잘린다
- 증상: 작업 취소 등 버튼 글자와 입력 상자가 잘려 보인다.
- 창을 좁혔을 때·넓혔을 때 모두 확인한다. 고정 폭 대신 내용에 맞게 늘어나도록 정리한다.
- 판정 기준: 창을 최소 크기까지 줄여도 글자가 잘리지 않는다.
C-3. 폴더 복사 확인 팝업을 플랫폼 토스트 방식으로 바꾼다
- 지금은 별도 확인 창이 뜬다. 플랫폼이 제공하는 토스트 메시지와 같은 모양으로 맞춘다.
- 되돌릴 수 없는 동작(복사·삭제)의 확인 자체를 없애지는 않는다. 확인은 남기되 생김새를 토스트와 통일한다. 완료 알림은 토스트로 띄운다.
- 판정 기준: 폴더 복사·삭제 시 확인과 완료 알림이 프로그램의 다른 알림과 같은 모양이다.
D. 기능 추가
D-1. 코드는 같고 주석만 다른 파일을 다른 색으로
- 폴더 비교 결과에서 "코드가 다름" 과 "주석만 다름" 을 구분해 다른 색으로 보여 준다.
- 판단은 언어별 주석 기호(
LanguageProfile)를 써서 주석과 공백을 뺀 뒤 비교한다. - 어느 색이 무슨 뜻인지 화면 어딘가에 알려 준다.
- 판정 기준: 주석 한 줄만 다른 파일과 코드가 다른 파일이 서로 다른 색으로 나온다.
D-2. C++ 문법 강조
- 지금 C# 은 되고 C++ 은 안 된다.
.h .hpp .c .cpp .cc .cxx .inl을 포함한다. - 키워드 · 문자열 · 주석 · 전처리기(
#include등)를 구분한다. - 판정 기준: C++ 파일을 열면 C# 과 같은 수준으로 색이 입혀진다.
D-3. 폴더 안 전체 검색
- 폴더 비교 대상 폴더 전체에서 문자열을 찾는다.
- 대소문자 구분 · 확장자 필터 정도는 있어야 한다. 결과를 누르면 그 파일이 비교 화면으로 열린다.
- 큰 폴더에서도 화면이 멈추면 안 된다. 취소할 수 있어야 한다.
- 판정 기준: 결과 목록에서 항목을 고르면 해당 파일이 열리고, 검색 중에도 창이 반응한다.
D-4. 비교 창을 여러 개 띄울 수 있게 — 취소 (2026-09-09)
사용자 판단으로 뺀다. 번호는 그대로 둔다 — 뒤 번호를 밀면 앞서 오간 이야기와 어긋난다.
D-5. 덩어리 단위 반영
- 덩어리 단위 반영은 2-Way 에 이미 들어가 있다(
de1a43c). 먼저 지금 무엇이 되고 무엇이 안 되는지 확인해 보고한 뒤 빠진 곳을 채운다. - 3-Way 화면과 단축키에서도 같은 방식으로 동작해야 한다.
- 판정 기준: 연속된 변경 줄 묶음이 한 번의 조작으로 통째로 반영된다.
D-6. 비교 결과 텍스트 내보내기
- 비교 결과를 텍스트 파일로 저장한다. 파일 비교와 폴더 비교 양쪽에서 된다.
- 내용에는 양쪽 경로 · 요약(같음/다름/한쪽만) · 다른 줄 목록이 들어간다.
- 판정 기준: 내보낸 파일을 메모장으로 열어 무엇이 어떻게 다른지 알아볼 수 있다.
D-7. 파일·폴더 드래그 앤 드롭으로 열기
- 파일 두 개를 끌어다 놓으면 파일 비교, 폴더 두 개면 폴더 비교로 연다.
- 하나만 놓으면 그 자리(왼쪽/오른쪽)에만 넣는다.
- 판정 기준: 탐색기에서 끌어다 놓는 것만으로 비교가 시작된다.
보고 형식
항목마다 이렇게 적는다.
- 무엇이 원인이었는지 한두 줄
- 어떤 파일을 어떻게 고쳤는지
- 실제로 실행해 확인한 결과
- 커밋 해시