@@ -17,32 +17,8 @@ namespace LibGit2Sharp
17
17
[ DebuggerDisplay ( "{DebuggerDisplay,nq}" ) ]
18
18
public class TreeChanges : IEnumerable < TreeEntryChanges > , IDiffResult
19
19
{
20
- private readonly List < TreeEntryChanges > changes = new List < TreeEntryChanges > ( ) ;
21
- private readonly List < TreeEntryChanges > added = new List < TreeEntryChanges > ( ) ;
22
- private readonly List < TreeEntryChanges > deleted = new List < TreeEntryChanges > ( ) ;
23
- private readonly List < TreeEntryChanges > modified = new List < TreeEntryChanges > ( ) ;
24
- private readonly List < TreeEntryChanges > typeChanged = new List < TreeEntryChanges > ( ) ;
25
- private readonly List < TreeEntryChanges > unmodified = new List < TreeEntryChanges > ( ) ;
26
- private readonly List < TreeEntryChanges > renamed = new List < TreeEntryChanges > ( ) ;
27
- private readonly List < TreeEntryChanges > copied = new List < TreeEntryChanges > ( ) ;
28
- private readonly List < TreeEntryChanges > conflicted = new List < TreeEntryChanges > ( ) ;
29
-
30
- private readonly IDictionary < ChangeKind , Action < TreeChanges , TreeEntryChanges > > fileDispatcher = Build ( ) ;
31
-
32
- private static IDictionary < ChangeKind , Action < TreeChanges , TreeEntryChanges > > Build ( )
33
- {
34
- return new Dictionary < ChangeKind , Action < TreeChanges , TreeEntryChanges > >
35
- {
36
- { ChangeKind . Modified , ( de , d ) => de . modified . Add ( d ) } ,
37
- { ChangeKind . Deleted , ( de , d ) => de . deleted . Add ( d ) } ,
38
- { ChangeKind . Added , ( de , d ) => de . added . Add ( d ) } ,
39
- { ChangeKind . TypeChanged , ( de , d ) => de . typeChanged . Add ( d ) } ,
40
- { ChangeKind . Unmodified , ( de , d ) => de . unmodified . Add ( d ) } ,
41
- { ChangeKind . Renamed , ( de , d ) => de . renamed . Add ( d ) } ,
42
- { ChangeKind . Copied , ( de , d ) => de . copied . Add ( d ) } ,
43
- { ChangeKind . Conflicted , ( de , d ) => de . conflicted . Add ( d ) } ,
44
- } ;
45
- }
20
+ private readonly DiffSafeHandle diff ;
21
+ private readonly Lazy < int > count ;
46
22
47
23
/// <summary>
48
24
/// Needed for mocking purposes.
@@ -52,22 +28,28 @@ protected TreeChanges()
52
28
53
29
internal TreeChanges ( DiffSafeHandle diff )
54
30
{
55
- using ( diff )
56
- Proxy . git_diff_foreach ( diff , FileCallback , null , null ) ;
31
+ this . diff = diff ;
32
+ this . count = new Lazy < int > ( ( ) => Proxy . git_diff_num_deltas ( diff ) ) ;
57
33
}
58
34
59
- private int FileCallback ( GitDiffDelta delta , float progress , IntPtr payload )
35
+ /// <summary>
36
+ /// Enumerates the diff and yields deltas with the specified change kind.
37
+ /// </summary>
38
+ /// <param name="changeKind">Change type to filter on.</param>
39
+ private IEnumerable < TreeEntryChanges > GetChangesOfKind ( ChangeKind changeKind )
60
40
{
61
- AddFileChange ( delta ) ;
62
- return 0 ;
41
+ for ( int i = 0 ; i < count . Value ; i ++ )
42
+ {
43
+ var delta = Proxy . git_diff_get_delta ( diff , i ) ;
44
+
45
+ if ( TreeEntryChanges . GetStatusFromChangeKind ( delta . Status ) == changeKind )
46
+ yield return new TreeEntryChanges ( delta ) ;
47
+ }
63
48
}
64
49
65
- private void AddFileChange ( GitDiffDelta delta )
50
+ private static TreeEntryChanges ToTreeEntryChange ( GitDiffDelta delta )
66
51
{
67
- var treeEntryChanges = new TreeEntryChanges ( delta ) ;
68
-
69
- fileDispatcher [ treeEntryChanges . Status ] ( this , treeEntryChanges ) ;
70
- changes . Add ( treeEntryChanges ) ;
52
+ return new TreeEntryChanges ( delta ) ;
71
53
}
72
54
73
55
#region IEnumerable<TreeEntryChanges> Members
@@ -78,7 +60,10 @@ private void AddFileChange(GitDiffDelta delta)
78
60
/// <returns>An <see cref="IEnumerator{T}"/> object that can be used to iterate through the collection.</returns>
79
61
public virtual IEnumerator < TreeEntryChanges > GetEnumerator ( )
80
62
{
81
- return changes . GetEnumerator ( ) ;
63
+ for ( int i = 0 ; i < count . Value ; i ++ )
64
+ {
65
+ yield return new TreeEntryChanges ( Proxy . git_diff_get_delta ( diff , i ) ) ;
66
+ }
82
67
}
83
68
84
69
/// <summary>
@@ -97,63 +82,63 @@ IEnumerator IEnumerable.GetEnumerator()
97
82
/// </summary>
98
83
public virtual IEnumerable < TreeEntryChanges > Added
99
84
{
100
- get { return added ; }
85
+ get { return GetChangesOfKind ( ChangeKind . Added ) ; }
101
86
}
102
87
103
88
/// <summary>
104
89
/// List of <see cref="TreeEntryChanges"/> that have been deleted.
105
90
/// </summary>
106
91
public virtual IEnumerable < TreeEntryChanges > Deleted
107
92
{
108
- get { return deleted ; }
93
+ get { return GetChangesOfKind ( ChangeKind . Deleted ) ; }
109
94
}
110
95
111
96
/// <summary>
112
97
/// List of <see cref="TreeEntryChanges"/> that have been modified.
113
98
/// </summary>
114
99
public virtual IEnumerable < TreeEntryChanges > Modified
115
100
{
116
- get { return modified ; }
101
+ get { return GetChangesOfKind ( ChangeKind . Modified ) ; }
117
102
}
118
103
119
104
/// <summary>
120
105
/// List of <see cref="TreeEntryChanges"/> which type have been changed.
121
106
/// </summary>
122
107
public virtual IEnumerable < TreeEntryChanges > TypeChanged
123
108
{
124
- get { return typeChanged ; }
109
+ get { return GetChangesOfKind ( ChangeKind . TypeChanged ) ; }
125
110
}
126
111
127
112
/// <summary>
128
113
/// List of <see cref="TreeEntryChanges"/> which have been renamed
129
114
/// </summary>
130
115
public virtual IEnumerable < TreeEntryChanges > Renamed
131
116
{
132
- get { return renamed ; }
117
+ get { return GetChangesOfKind ( ChangeKind . Renamed ) ; }
133
118
}
134
119
135
120
/// <summary>
136
121
/// List of <see cref="TreeEntryChanges"/> which have been copied
137
122
/// </summary>
138
123
public virtual IEnumerable < TreeEntryChanges > Copied
139
124
{
140
- get { return copied ; }
125
+ get { return GetChangesOfKind ( ChangeKind . Copied ) ; }
141
126
}
142
127
143
128
/// <summary>
144
129
/// List of <see cref="TreeEntryChanges"/> which are unmodified
145
130
/// </summary>
146
131
public virtual IEnumerable < TreeEntryChanges > Unmodified
147
132
{
148
- get { return unmodified ; }
133
+ get { return GetChangesOfKind ( ChangeKind . Unmodified ) ; }
149
134
}
150
135
151
136
/// <summary>
152
137
/// List of <see cref="TreeEntryChanges"/> which are conflicted
153
138
/// </summary>
154
139
public virtual IEnumerable < TreeEntryChanges > Conflicted
155
140
{
156
- get { return conflicted ; }
141
+ get { return GetChangesOfKind ( ChangeKind . Conflicted ) ; }
157
142
}
158
143
159
144
private string DebuggerDisplay
@@ -179,8 +164,7 @@ public void Dispose()
179
164
180
165
protected virtual void Dispose ( bool disposing )
181
166
{
182
- // This doesn't do anything yet because it loads everything
183
- // eagerly and disposes of the diff handle in the constructor.
167
+ diff . SafeDispose ( ) ;
184
168
}
185
169
}
186
170
}
0 commit comments