using System;
using System.Collections.Generic;
using System.Linq;
namespace MergeHub.Services
{
///
/// 병합 때 처음 충돌 목록을 적어 두는 .git/MERGEHUB_CONFLICTS 를 치울지 가른다(7차 B-1).
///
/// 이 파일은 "푼 것 M개 (M/전체)" 를 세려고 둔다(6차 C-1). 첫 줄이 그때의 MERGE_HEAD 라 다른 병합과 섞이지는 않지만,
/// 지우는 곳이 없어 병합 커밋 · 작업 취소 · 터미널에서 끝낸 병합 뒤에도 남의 .git 에 남았다.
/// 판단만 여기 두어 저장소 없이 검사한다. 지우는 것은 가 한다.
///
public static class MergeConflictRecord
{
///
/// 적어 둔 것이 이제 쓸모없는지. 병합 중이 아니면(MERGE_HEAD 없음) 쓸모없다.
/// 병합 중이어도 첫 줄이 지금 MERGE_HEAD 와 다르면 다른 병합의 것이라 쓸모없다.
///
/// 지금 MERGE_HEAD. 병합 중이 아니면 null.
/// 적어 둔 파일의 첫 줄. 빈 파일이면 null.
public static bool IsStale(string? mergeHeadSha, string? recordFirstLine)
{
if (string.IsNullOrWhiteSpace(mergeHeadSha)) return true;
if (string.IsNullOrWhiteSpace(recordFirstLine)) return true;
return !string.Equals(recordFirstLine!.Trim(), mergeHeadSha!.Trim(), StringComparison.OrdinalIgnoreCase);
}
///
/// [다시 충돌로] 로 되돌릴 수 있는 파일(11차 F-8) - 이번 병합에서 처음 충돌 났고(),
/// 지금은 충돌이 아니며( 에 없음), git 이 해결 전 세 벌을 기억하는(, REUC) 파일.
/// REUC 만 보면 안 된다 - libgit2 는 저절로 병합된 파일도 거기 남긴다(6차 C-1). 처음 목록 차례를 지킨다.
///
public static IReadOnlyList Resolved(IEnumerable initial, IEnumerable current, IEnumerable resolveUndo)
{
static string N(string p) => (p ?? string.Empty).Trim().Replace('\\', '/');
var now = new HashSet(current.Select(N), StringComparer.Ordinal);
var undo = new HashSet(resolveUndo.Select(N), StringComparer.Ordinal);
var seen = new HashSet(StringComparer.Ordinal);
return initial.Select(N)
.Where(p => p.Length > 0 && !now.Contains(p) && undo.Contains(p) && seen.Add(p))
.ToList();
}
}
}