4차 A-2: 내보낸 보고서에 만든 사람을 넣음

이름 판단을 MergeNote.AuthorOf 로 모아 머지 주석과 보고서가 같은 이름을 쓴다.
이름이 비면 줄 자체를 넣지 않는다. 검사 8건 추가.
This commit is contained in:
김승준 2026-09-10 20:34:28 +09:00
parent 7278829d1e
commit 0625236fc3
7 changed files with 63 additions and 11 deletions

View File

@ -127,3 +127,33 @@ doc/
| 고친 것 없이 두 번 연속 열기 | 창이 뜨지 않았다 | | 고친 것 없이 두 번 연속 열기 | 창이 뜨지 않았다 |
검사 514건 통과 · 빌드 경고 0 · 오류 0. 검사 514건 통과 · 빌드 경고 0 · 오류 0.
---
## A-2. 내보낸 보고서에 만든 사람이 없던 것 — **완료** (2026-09-10)
**왜** - `결과 내보내기` 로 뽑은 글에 `만든 때` 는 있는데 **누가 뽑았는지가 없었다.**
남에게 보내라고 만든 기능인데 작성자가 없으면 받는 쪽이 되묻게 된다.
**이름 판단을 한 함수로 모았다.** `MergeNote.AuthorOf` 를 새로 빼고 `MergeNote.Build` 도 그것을 쓴다.
설정에 적힌 이름이 없으면 윈도우 계정으로 물러선다. **같은 사람이 같은 화면에서 한 일인데
주석과 보고서에 다른 이름이 남으면 그 자체가 버그다** - 판단이 두 군데로 갈리면 언젠가 어긋난다.
**이름이 비어 있으면 줄 자체를 넣지 않는다.** `만든 사람: ` 만 덩그러니 있는 것보다 없는 편이 낫다.
파일 비교 · 폴더 비교 두 보고서에 모두 들어간다. 자리는 `만든 때` 바로 아래다.
**확인한 것**
실제로 뽑아 본 파일 머리글이다.
```
MergeHub 파일 비교 결과
만든 때: 2026-09-10 20:33:17
만든 사람: 김승준
왼쪽 : ...\left\Other.cpp
오른쪽: ...\right\Other.cpp
```
화면의 머지 주석 미리보기가 `// [김승준] 2026-09-10` 이었으니 **두 이름이 같다.**
검사 8건 추가(`ReportTest` 23 → 31). 전체 **522건 통과** · 빌드 경고 0 · 오류 0.

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 | | 날짜 | 항목 | 커밋 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 |
| 2026-09-10 | **4차 A-1** — 저장하지 않은 편집이 말없이 사라지던 길 여덟 군데를 막음. 플랫폼에 세 갈래 확인 창을 새로 넣었다 | 아래 | | 2026-09-10 | **4차 A-1** — 저장하지 않은 편집이 말없이 사라지던 길 여덟 군데를 막음. 플랫폼에 세 갈래 확인 창을 새로 넣었다 | 아래 |
| 2026-09-10 | **4차 D-2** — 항목을 끝내면 상세·상태·한 줄을 각각 어디에 적을지 공통 규칙으로 못박음 | 아래 | | 2026-09-10 | **4차 D-2** — 항목을 끝내면 상세·상태·한 줄을 각각 어디에 적을지 공통 규칙으로 못박음 | 아래 |
| 2026-09-10 | **4차 D-1** — 721줄짜리 진행상황을 `history/` 의 날짜별 파일로 나누고 지시서를 `작업지시/` 로 모음 | 아래 | | 2026-09-10 | **4차 D-1** — 721줄짜리 진행상황을 `history/` 의 날짜별 파일로 나누고 지시서를 `작업지시/` 로 모음 | 아래 |
@ -28,6 +29,7 @@
| 날짜 | 문서 | 내용 | | 날짜 | 문서 | 내용 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 |
| 2026-09-10 | **4차 A-1** — 저장하지 않은 편집이 말없이 사라지던 길 여덟 군데를 막음. 플랫폼에 세 갈래 확인 창을 새로 넣었다 | 아래 | | 2026-09-10 | **4차 A-1** — 저장하지 않은 편집이 말없이 사라지던 길 여덟 군데를 막음. 플랫폼에 세 갈래 확인 창을 새로 넣었다 | 아래 |
| 2026-09-10 | **4차 D-2** — 항목을 끝내면 상세·상태·한 줄을 각각 어디에 적을지 공통 규칙으로 못박음 | 아래 | | 2026-09-10 | **4차 D-2** — 항목을 끝내면 상세·상태·한 줄을 각각 어디에 적을지 공통 규칙으로 못박음 | 아래 |
| 2026-09-10 | **4차 D-1** — 721줄짜리 진행상황을 `history/` 의 날짜별 파일로 나누고 지시서를 `작업지시/` 로 모음 | 아래 | | 2026-09-10 | **4차 D-1** — 721줄짜리 진행상황을 `history/` 의 날짜별 파일로 나누고 지시서를 `작업지시/` 로 모음 | 아래 |

View File

@ -23,7 +23,7 @@
| 상태 | 항목 | | 상태 | 항목 |
|---|---| |---|---|
| **완료** | A-1 저장하지 않은 편집이 말없이 사라진다 | | **완료** | A-1 저장하지 않은 편집이 말없이 사라진다 |
| 대기 | A-2 내보낸 보고서에 만든 사람이 없다 | | **완료** | A-2 내보낸 보고서에 만든 사람이 없다 |
### B. 매일 쓰는 마찰 줄이기 ### B. 매일 쓰는 마찰 줄이기

View File

@ -20,11 +20,11 @@ namespace MergeHub.Services
/// <summary>파일 비교 결과.</summary> /// <summary>파일 비교 결과.</summary>
public static string ForFile(string leftLabel, string rightLabel, public static string ForFile(string leftLabel, string rightLabel,
IReadOnlyList<MergeLine> lines, DateTime when) IReadOnlyList<MergeLine> lines, DateTime when, string? author = null)
{ {
var text = new StringBuilder(); var text = new StringBuilder();
Head(text, "파일 비교 결과", leftLabel, rightLabel, when); Head(text, "파일 비교 결과", leftLabel, rightLabel, when, author);
var changed = 0; var changed = 0;
var added = 0; var added = 0;
@ -73,11 +73,11 @@ namespace MergeHub.Services
/// <summary>폴더 비교 결과.</summary> /// <summary>폴더 비교 결과.</summary>
public static string ForFolder(string leftFolder, string rightFolder, public static string ForFolder(string leftFolder, string rightFolder,
FolderCompareResult result, DateTime when) FolderCompareResult result, DateTime when, string? author = null)
{ {
var text = new StringBuilder(); var text = new StringBuilder();
Head(text, "폴더 비교 결과", leftFolder, rightFolder, when); Head(text, "폴더 비교 결과", leftFolder, rightFolder, when, author);
text.AppendLine("요약: " + result.Summary); text.AppendLine("요약: " + result.Summary);
if (result.Truncated) text.AppendLine("(항목이 너무 많아 도중에 멈춘 결과입니다)"); if (result.Truncated) text.AppendLine("(항목이 너무 많아 도중에 멈춘 결과입니다)");
text.AppendLine(); text.AppendLine();
@ -115,10 +115,16 @@ namespace MergeHub.Services
} }
} }
private static void Head(StringBuilder text, string title, string left, string right, DateTime when) /// <param name="author">
/// 뽑은 사람. 남에게 보내라고 만든 글이라 <b>누가 뽑았는지</b>가 없으면 받는 쪽이 되묻게 된다.
/// 비어 있으면 줄 자체를 넣지 않는다 - "만든 사람: " 만 덩그러니 있는 것보다 없는 편이 낫다.
/// </param>
private static void Head(StringBuilder text, string title, string left, string right, DateTime when,
string? author)
{ {
text.AppendLine($"MergeHub {title}"); text.AppendLine($"MergeHub {title}");
text.AppendLine($"만든 때: {when:yyyy-MM-dd HH:mm:ss}"); text.AppendLine($"만든 때: {when:yyyy-MM-dd HH:mm:ss}");
if (!string.IsNullOrWhiteSpace(author)) text.AppendLine($"만든 사람: {author}");
text.AppendLine($"왼쪽 : {left}"); text.AppendLine($"왼쪽 : {left}");
text.AppendLine($"오른쪽: {right}"); text.AppendLine($"오른쪽: {right}");
text.AppendLine(Rule); text.AppendLine(Rule);

View File

@ -21,9 +21,19 @@ namespace MergeHub.Services
/// 주석 한 조각을 만든다. 구성은 딱 세 가지 - [사용자] 날짜 설명. /// 주석 한 조각을 만든다. 구성은 딱 세 가지 - [사용자] 날짜 설명.
/// 설명이 비어 있어도 [사용자]와 날짜는 항상 남는다. /// 설명이 비어 있어도 [사용자]와 날짜는 항상 남는다.
/// </summary> /// </summary>
/// <summary>
/// 기록에 남길 사람 이름. 설정에 적힌 이름이 없으면 윈도우 계정으로 물러선다.
///
/// <b>따로 뺀 까닭</b> - 머지 주석과 내보낸 보고서에 <b>같은 이름</b>이 찍혀야 한다.
/// 같은 사람이 같은 화면에서 한 일인데 두 곳에 다른 이름이 남으면 그 자체가 버그다.
/// 판단이 두 군데로 갈리면 언젠가 어긋난다.
/// </summary>
public static string AuthorOf(string? author) =>
string.IsNullOrWhiteSpace(author) ? Environment.UserName : author!.Trim();
public static string Build(string? author, DateTime when, string? comment, string? path) public static string Build(string? author, DateTime when, string? comment, string? path)
{ {
var who = string.IsNullOrWhiteSpace(author) ? Environment.UserName : author!.Trim(); var who = AuthorOf(author);
var body = $"[{who}] {when:yyyy-MM-dd}"; var body = $"[{who}] {when:yyyy-MM-dd}";

View File

@ -270,7 +270,9 @@ namespace MergeHub.ViewModels
try try
{ {
var report = CompareReport.ForFolder(LeftFolder, RightFolder, result, DateTime.Now); // 파일 비교 쪽과 같은 이름이 찍혀야 한다(MergeNote.AuthorOf).
var report = CompareReport.ForFolder(LeftFolder, RightFolder, result, DateTime.Now,
MergeNote.AuthorOf(_workspace.AuthorName));
TextFile.Write(dialog.FileName, report); TextFile.Write(dialog.FileName, report);
MessageUtil.ShowSuccessToast($"저장했습니다 · {Path.GetFileName(dialog.FileName)}"); MessageUtil.ShowSuccessToast($"저장했습니다 · {Path.GetFileName(dialog.FileName)}");
} }

View File

@ -1591,9 +1591,11 @@ namespace MergeHub.ViewModels
try try
{ {
// 머지 주석과 같은 자리에서 이름을 가져온다. 두 곳에 다른 이름이 찍히면 그 자체가 버그다.
var report = CompareReport.ForFile(ReportLabel(BaseHeader, LeftFile), var report = CompareReport.ForFile(ReportLabel(BaseHeader, LeftFile),
ReportLabel(LocalHeader, RightFile), ReportLabel(LocalHeader, RightFile),
Lines, DateTime.Now); Lines, DateTime.Now,
MergeNote.AuthorOf(_workspace.AuthorName));
TextFile.Write(dialog.FileName, report); TextFile.Write(dialog.FileName, report);
MessageUtil.ShowSuccessToast($"저장했습니다 · {Path.GetFileName(dialog.FileName)}"); MessageUtil.ShowSuccessToast($"저장했습니다 · {Path.GetFileName(dialog.FileName)}");
} }