ksj09406 b82e40a17c 4차 D-1: 변경 이력을 doc/history/ 로 나눔
721줄짜리 진행상황.md 를 날짜별 파일과 changelog 로 나누고 73줄로 줄였다.
지시서 네 개는 git mv 로 doc/작업지시/ 에 모았다. 링크 15개 전부 살아 있다.
옮기기만 하고 내용은 고치지 않았다.
2026-09-10 20:15:57 +09:00

11 KiB

작업 지시 — MergeHub 3차 (버그 정리 + 기능 확장)

대상: D:\Sorce\MergeTool\MergeHub (플러그인) · D:\Sorce\MergeTool\UbisamPlatform (셸) 전제: 1차·2차 지시서와 ../진행상황.md 의 ①~⑤ 는 끝난 상태다. 아래는 실제로 써 보고 나온 문제와 다음 요구사항이다.


공통 규칙

  • A → B → C → D 순서로 진행한다. A 는 프로그램이 죽거나 화면이 망가지는 문제라 제일 먼저다.
  • 항목 하나를 끝낼 때마다 빌드하고 실제로 실행해 화면을 확인한 뒤 보고한다. 전부 끝내고 한 번에 보고하지 않는다.
  • 항목 하나가 끝나면 ../진행상황.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. 파일·폴더 드래그 앤 드롭으로 열기

  • 파일 두 개를 끌어다 놓으면 파일 비교, 폴더 두 개면 폴더 비교로 연다.
  • 하나만 놓으면 그 자리(왼쪽/오른쪽)에만 넣는다.
  • 판정 기준: 탐색기에서 끌어다 놓는 것만으로 비교가 시작된다.

보고 형식

항목마다 이렇게 적는다.

  • 무엇이 원인이었는지 한두 줄
  • 어떤 파일을 어떻게 고쳤는지
  • 실제로 실행해 확인한 결과
  • 커밋 해시

E. 추가 요청 (2026-09-09 오후)

E-1. 원본 세 칸에 세로 스크롤 막대가 없다

  • B-1 에서 가로 막대를 붙였는데 세로가 빠져 있었다.
  • 판정 기준: 세 칸 오른쪽에 막대가 보이고, 하나를 끌면 셋이 함께 움직인다.

E-2. 칸 폭을 줄였다 늘리면 행 높이가 돌아오지 않는다

  • 증상: 화면을 좁혔다가 다시 넓히면 접혔던 행이 넓은 자리를 그대로 차지한 채 남는다.
  • 창을 옮겨 크기가 바뀌는 경우와 가운데 구분선을 끄는 경우 둘 다 확인한다.
  • 판정 기준: 좁혔다 되돌리면 처음과 똑같은 화면이 된다.

E-3. 경로 줄과 코드 사이의 빈 공간을 없앤다

  • 증상: 패널 머리(제목·경로) 아래에 쓰이지 않는 빈 자리가 넓게 남아 코드가 그만큼 덜 보인다.
  • 나란히 놓인 칸끼리는 머리 높이가 같아야 첫 줄이 같은 눈높이에 온다. 그 조건은 지킨다.
  • 판정 기준: 경로 줄 바로 아래에서 코드가 시작하고, 두(세) 칸의 01행이 같은 높이에 있다.