8000 Replace HistoryRewriter's shaMap with objectMap · philhack/libgit2sharp@adf9c29 · GitHub
[go: up one dir, main page]

Skip to content

Commit adf9c29

Browse files
committed
Replace HistoryRewriter's shaMap with objectMap
1 parent ea096f0 commit adf9c29

File tree

1 file changed

+20
-23
lines changed

1 file changed

+20
-23
lines changed

LibGit2Sharp/Core/HistoryRewriter.cs

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ internal class HistoryRewriter
1010
private readonly Repository repo;
1111

1212
private readonly HashSet<Commit> targetedCommits;
13-
private readonly Dictionary<ObjectId, ObjectId> shaMap = new Dictionary<ObjectId, ObjectId>();
13+
private readonly Dictionary<GitObject, GitObject> objectMap = new Dictionary<GitObject, GitObject>();
1414
private readonly Queue<Action> rollbackActions = new Queue<Action>();
1515

1616
private readonly string backupRefsNamespace;
@@ -104,7 +104,7 @@ private void RewriteReference(DirectReference oldRef)
104104

105105
var newTarget = RewriteTarget(oldRef.Target);
106106

107-
if (oldRef.Target.Id == newTarget && oldRef.CanonicalName == newRefName)
107+
if (oldRef.Target == newTarget && oldRef.CanonicalName == newRefName)
108108
{
109109
// The reference isn't rewritten
110110
return;
@@ -121,14 +121,14 @@ private void RewriteReference(DirectReference oldRef)
121121
repo.Refs.Add(backupName, oldRef.TargetIdentifier, false, "filter-branch: backup");
122122
rollbackActions.Enqueue(() => repo.Refs.Remove(backupName));
123123

124-
if (newTarget == ObjectId.Zero)
124+
if (newTarget == null)
125125
{
126126
repo.Refs.Remove(oldRef);
127127
rollbackActions.Enqueue(() => repo.Refs.Add(oldRef.CanonicalName, oldRef, true, "filter-branch: abort"));
128128
return;
129129
}
130130

131-
Reference newRef = repo.Refs.UpdateTarget(oldRef, newTarget, "filter-branch: rewrite");
131+
Reference newRef = repo.Refs.UpdateTarget(oldRef, newTarget.Id, "filter-branch: rewrite");
132132
rollbackActions.Enqueue(() => repo.Refs.UpdateTarget(oldRef, oldRef.Target.Id, "filter-branch: abort"));
133133

134134
if (newRef.CanonicalName == newRefName)
@@ -173,15 +173,14 @@ private void RewriteCommit(Commit commit)
173173
// Create the new commit
174174
var mappedNewParents = newParents
175175
.Select(oldParent =>
176-
shaMap.ContainsKey(oldParent.Id)
177-
? shaMap[oldParent.Id]
178-
: oldParent.Id)
179-
.Where(id => id != ObjectId.Zero)
180-
.Select(id => repo.Lookup<Commit>(id))
176+
objectMap.ContainsKey(oldParent)
177+
? objectMap[oldParent] as Commit
178+
: oldParent)
179+
.Where(newParent => newParent != null)
181180
.ToList();
182181

183182
if (options.PruneEmptyCommits &&
184-
TryPruneEmptyCommit(commit.Id, mappedNewParents, newTree))
183+
TryPruneEmptyCommit(commit, mappedNewParents, newTree))
185184
{
186185
return;
187186
}
@@ -191,36 +190,36 @@ private void RewriteCommit(Commit commit)
191190
mappedNewParents);
192191

193192
// Record the rewrite
194-
shaMap[commit.Id] = newCommit.Id;
193+
objectMap[commit] = newCommit;
195194
}
196195

197-
private bool TryPruneEmptyCommit(ObjectId commitId, IList<Commit> mappedNewParents, Tree newTree)
196+
private bool TryPruneEmptyCommit(Commit commit, IList<Commit> mappedNewParents, Tree newTree)
198197
{
199198
var parent = mappedNewParents.Count > 0 ? mappedNewParents[0] : null;
200199

201200
if (parent == null)
202201
{
203202
if (newTree.Count == 0)
204203
{
205-
shaMap[commitId] = ObjectId.Zero;
204+
objectMap[commit] = null;
206205
return true;
207206
}
208207
}
209208
else if (parent.Tree == newTree)
210209
{
211-
shaMap[commitId] = parent.Id;
210+
objectMap[commit] = parent;
212211
return true;
213212
}
214213

215214
return false;
216215
}
217216

218-
private ObjectId RewriteTarget(GitObject oldTarget)
217+
private GitObject RewriteTarget(GitObject oldTarget)
219218
{
220219
// Has this target already been rewritten?
221-
if (shaMap.ContainsKey(oldTarget.Id))
220+
if (objectMap.ContainsKey(oldTarget))
222221
{
223-
return shaMap[oldTarget.Id];
222+
return objectMap[oldTarget];
224223
}
225224

226225
Debug.Assert((oldTarget as Commit) == null);
@@ -229,13 +228,11 @@ private ObjectId RewriteTarget(GitObject oldTarget)
229228
if (annotation == null)
230229
{
231230
//TODO: Probably a Tree or a Blob. This is not covered by any test
232-
return oldTarget.Id;
231+
return oldTarget;
233232
}
234233

235234
// Recursively rewrite annotations if necessary
236-
ObjectId newTargetId = RewriteTarget(annotation.Target);
237-
238-
var newTarget = repo.Lookup(newTargetId);
235+
var newTarget = RewriteTarget(annotation.Target);
239236

240237
string newName = annotation.Name;
241238

@@ -246,8 +243,8 @@ private ObjectId RewriteTarget(GitObject oldTarget)
246243

247244
var newAnnotation = repo.ObjectDatabase.CreateTagAnnotation(newName, newTarget, annotation.Tagger,
248245
annotation.Message);
249-
shaMap[annotation.Id] = newAnnotation.Id;
250-
return newAnnotation.Id;
246+
objectMap[annotation] = newAnnotation;
247+
return newAnnotation;
251248
}
252249

253250
private int ReferenceDepth(Reference reference)

0 commit comments

Comments
 (0)
0