-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathRepoInfo.cs
89 lines (82 loc) · 3.58 KB
/
RepoInfo.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using OrbitalShell.Lib;
namespace OrbitalShell.Module.PromptGitInfo
{
public class RepoInfo
{
public RepoStatus RepoStatus;
public Dictionary<char, int> X = new Dictionary<char, int>();
public Dictionary<char, int> Y = new Dictionary<char, int>();
public string ErrorMessage;
public static List<char> Names = new List<char> { 'M', 'A', 'D', 'R', 'C', 'U', ' ', '?', '!', '#' , '↑', '↓' };
public int IndexChanges, WorktreeChanges, IndexAdded, IndexDeleted, WorktreeAdded, WorktreeDeleted, Untracked, Behind, Ahead;
public bool IsModified => (IndexChanges + WorktreeChanges + IndexAdded + IndexDeleted + WorktreeAdded + WorktreeDeleted + Untracked + Behind + Ahead) > 0;
public RepoInfo()
{
foreach (var c in Names) { X.Add(c, 0); Y.Add(c, 0); }
}
public void Update()
{
IndexChanges = X.Values.Aggregate(0, (a, b) => a + b) - X['?'] - X['A'] - X['D'] - X['↑'] - X['↓'];
WorktreeChanges = Y.Values.Aggregate(0, (a, b) => a + b) - Y['?'] - Y['A'] - Y['D'];
IndexAdded = X['A'];
IndexDeleted = X['D'];
WorktreeAdded = Y['A'];
WorktreeDeleted = Y['D'];
Untracked = X['?'];
Behind = X['↑'];
Ahead = X['↓'];
RepoStatus = RepoStatus.UpToDate;
if ((IndexChanges > 0 || WorktreeChanges > 0 || WorktreeDeleted>0 || IndexDeleted>0) && Untracked==0) RepoStatus = RepoStatus.Modified;
if (Untracked>0) RepoStatus = RepoStatus.ModifiedUntracked;
if (Behind > 0) RepoStatus = RepoStatus.Behind;
if (Ahead > 0) RepoStatus = RepoStatus.Ahead;
if (Ahead > 0 && Behind > 0) RepoStatus = RepoStatus.AheadBehind;
}
public void Inc(char lName, char rName,string line)
{
if (!X.ContainsKey(lName)) X[lName] = 0;
if (!Y.ContainsKey(rName)) Y[rName] = 0;
// untracked
if (lName == '?' && rName == '?') { X[lName]++; Y[rName]++; }
// ignored
if (lName == '!' && rName == '!') { X[lName]++; Y[rName]++; }
// updated
if (lName == 'M' && rName == ' ') X[lName]++;
// added
if (lName == 'A' && rName == ' ') X[lName]++;
// deleted
if (lName == 'D' && rName == ' ') X[lName]++;
// renamed
if (lName == 'R' && rName == ' ') X[lName]++;
// copied
if (lName == 'C' && rName == ' ') X[lName]++;
// unstaged change
if (lName == ' ' && rName != ' ') Y[rName]++;
// changed both equals
if (lName == rName && lName != ' ' && lName != '?' && lName != '#' && lName != '!') X[lName]++;
// branch info: behind commites
if (lName == '#' && rName == '#')
{
// branch
Match m = null;
if ((m = line.Match(@"\[ahead (\d+)")) != null && m.Success)
X['↓'] = Convert.ToInt32(m.Groups[1].Value);
if ((m = line.Match(@"behind (\d+)\]$")) != null && m.Success)
X['↑'] = Convert.ToInt32(m.Groups[1].Value);
}
}
public override string ToString()
{
var r = "";
foreach (var kv in X)
{
r += kv.Key + "=" + kv.Value + Environment.NewLine;
}
return r;
}
}
}