using System; namespace SourceGit.Models { public enum ChangeViewMode { List, Grid, Tree, } public enum ChangeState { None, Modified, TypeChanged, Added, Deleted, Renamed, Copied, Untracked, Conflicted, } public enum ConflictReason { None, BothDeleted, AddedByUs, DeletedByThem, AddedByThem, DeletedByUs, BothAdded, BothModified, } public class ChangeDataForAmend { public string FileMode { get; set; } = ""; public string ObjectHash { get; set; } = ""; public string ParentSHA { get; set; } = ""; } public class Change { public ChangeState Index { get; set; } = ChangeState.None; public ChangeState WorkTree { get; set; } = ChangeState.None; public string Path { get; set; } = ""; public string OriginalPath { get; set; } = ""; public ChangeDataForAmend DataForAmend { get; set; } = null; public ConflictReason ConflictReason { get; set; } = ConflictReason.None; public bool IsConflicted => WorkTree == ChangeState.Conflicted; public string ConflictMarker => CONFLICT_MARKERS[(int)ConflictReason]; public string ConflictDesc => CONFLICT_DESCS[(int)ConflictReason]; public string WorkTreeDesc => TYPE_DESCS[(int)WorkTree]; public string IndexDesc => TYPE_DESCS[(int)Index]; public void Set(ChangeState index, ChangeState workTree = ChangeState.None) { Index = index; WorkTree = workTree; if (index == ChangeState.Renamed || workTree == ChangeState.Renamed) { var idx = Path.IndexOf('\t', StringComparison.Ordinal); if (idx >= 0) { OriginalPath = Path.Substring(0, idx); Path = Path.Substring(idx + 1); } else { idx = Path.IndexOf(" -> ", StringComparison.Ordinal); if (idx > 0) { OriginalPath = Path.Substring(0, idx); Path = Path.Substring(idx + 4); } } } if (Path[0] == '"') Path = Path.Substring(1, Path.Length - 2); if (!string.IsNullOrEmpty(OriginalPath) && OriginalPath[0] == '"') OriginalPath = OriginalPath.Substring(1, OriginalPath.Length - 2); } private static readonly string[] TYPE_DESCS = [ "Unknown", "Modified", "Type Changed", "Added", "Deleted", "Renamed", "Copied", "Untracked", "Conflict" ]; private static readonly string[] CONFLICT_MARKERS = [ string.Empty, "DD", "AU", "UD", "UA", "DU", "AA", "UU" ]; private static readonly string[] CONFLICT_DESCS = [ string.Empty, "Both deleted", "Added by us", "Deleted by them", "Added by them", "Deleted by us", "Both added", "Both modified" ]; } }