-
Notifications
You must be signed in to change notification settings - Fork 107
/
GitTreeObject.cs
132 lines (114 loc) · 4.12 KB
/
GitTreeObject.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.IO;
namespace GitScc.DataServices
{
public class GitTreeObject : INotifyPropertyChanged
{
public string Id { get; internal set; }
public string Name { get; internal set; }
public string FullName { get; internal set; }
public string Type { get; set; }
public string Mode { get; set; }
public string Repository { get; internal set; }
public bool IsBlob
{
get { return Type == "blob"; }
}
public bool IsCommit
{
get { return Type == "commit"; }
}
public bool IsTree
{
get { return Type == "tree"; }
}
private bool isExpanded;
private IEnumerable<GitTreeObject> children;
private byte[] content;
public IEnumerable<GitTreeObject> Children
{
get
{
if (children == null)
{
if (!IsTree) return null;
if (!IsExpanded) return new List<GitTreeObject> { new GitTreeObject() }; // a place holder
try
{
var result = GitBash.Run("ls-tree -z \"" + Id + "\"", this.Repository);
if (!result.HasError)
children = result.Output.Split(new char[] { '\0', '\n' })
.Select(t => ParseString(t))
.OfType<GitTreeObject>();
}
catch (Exception ex)
{
Log.WriteLine("GitTreeObject.Children: {0} - {1}\r\n{2}", Id, this.Repository, ex.ToString());
}
}
return children;
}
}
private GitTreeObject ParseString(string itemsString)
{
if (string.IsNullOrWhiteSpace(itemsString) || (itemsString.Length <= 53))
return null;
var guidStart = itemsString.IndexOf(' ', 7);
var name = itemsString.Substring(guidStart + 42).Trim();
var fullName = this.FullName.Length == 0 ? name : this.FullName + "/" + name;
return new GitTreeObject
{
Mode = itemsString.Substring(0, 6),
Type = itemsString.Substring(7, guidStart - 7).ToLower(),
Id = itemsString.Substring(guidStart + 1, 40),
Name = name,
FullName = fullName,
Repository = this.Repository,
};
}
public bool IsExpanded
{
get { return isExpanded; }
set
{
isExpanded = value;
NotifyPropertyChanged("Children");
}
}
public byte[] Content
{
get
{
if (IsBlob && content == null)
{
try
{
var fileName = Path.GetTempFileName();
GitBash.RunCmd(string.Format("cat-file blob {0} > {1}", this.Id, fileName), this.Repository);
content = File.ReadAllBytes(fileName);
if (File.Exists(fileName)) File.Delete(fileName);
}
catch (Exception ex)
{
Log.WriteLine("GitTreeObject.Content: {0} - {1}\r\n{2}", Id, this.Repository, ex.ToString());
}
}
return content;
}
}
#region INotifyPropertyChanged
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}