@@ -11,6 +11,7 @@ internal class HistoryRewriter
11
11
12
12
private readonly HashSet < Commit > targetedCommits ;
13
13
private readonly Dictionary < ObjectId , ObjectId > shaMap = new Dictionary < ObjectId , ObjectId > ( ) ;
14
+ private readonly Queue < Action > rollbackActions = new Queue < Action > ( ) ;
14
15
15
16
private readonly string backupRefsNamespace ;
16
17
private readonly RewriteHistoryOptions options ;
@@ -49,8 +50,6 @@ public void Execute()
49
50
RewriteCommit ( commit ) ;
50
51
}
51
52
52
- var rollbackActions = new Queue < Action > ( ) ;
53
-
54
53
try
55
54
{
56
55
// Ordering matters. In the case of `A -> B -> commit`, we need to make sure B is rewritten
@@ -59,17 +58,7 @@ public void Execute()
59
58
{
60
59
// TODO: Check how rewriting of notes actually behaves
61
60
62
- var dref = reference as DirectReference ;
63
- if ( dref == null )
64
- {
65
- // TODO: Handle a cornercase where a symbolic reference
66
- // points to a Tag which name has been rewritten
67
- continue ;
68
- }
69
-
70
- var newTarget = RewriteTarget ( dref . Target ) ;
71
-
72
- RewriteReference ( dref , newTarget , backupRefsNamespace , rollbackActions ) ;
61
+ RewriteReference ( reference ) ;
73
62
}
74
63
}
75
64
catch ( Exception )
@@ -81,9 +70,30 @@ public void Execute()
81
70
82
71
throw ;
83
72
}
73
+ finally
74
+ {
75
+ rollbackActions . Clear ( ) ;
76
+ }
77
+ }
78
+
79
+ private void RewriteReference ( Reference reference )
80
+ {
81
+ var sref = reference as SymbolicReference ;
82
+ if ( sref != null )
83
+ {
84
+ // TODO: Handle a cornercase where a symbolic reference
85
+ // points to a Tag which name has been rewritten
86
+ return ;
87
+ }
88
+
89
+ var dref = reference as DirectReference ;
90
+ if ( dref != null )
91
+ {
92
+ RewriteReference ( dref ) ;
93
+ }
84
94
}
85
95
86
- private void RewriteReference ( DirectReference oldRef , ObjectId newTarget , string backupNamePrefix , Queue < Action > rollbackActions )
96
+ private void RewriteReference ( DirectReference oldRef )
87
97
{
88
98
string newRefName = oldRef . CanonicalName ;
89
99
if ( oldRef . IsTag ( ) && options . TagNameRewriter != null )
@@ -92,13 +102,15 @@ private void RewriteReference(DirectReference oldRef, ObjectId newTarget, string
92
102
options . TagNameRewriter ( oldRef . CanonicalName . Substring ( Reference . TagPrefix . Length ) , false , oldRef . Target ) ;
93
103
}
94
104
105
+ var newTarget = RewriteTarget ( oldRef . Target ) ;
106
+
95
107
if ( oldRef . Target . Id == newTarget && oldRef . CanonicalName == newRefName )
96
108
{
97
109
// The reference isn't rewritten
98
110
return ;
99
111
}
100
112
101
- string backupName = backupNamePrefix + oldRef . CanonicalName . Substring ( "refs/" . Length ) ;
113
+ string backupName = backupRefsNamespace + oldRef . CanonicalName . Substring ( "refs/" . Length ) ;
102
114
103
115
if ( repo . Refs . Resolve < Reference > ( backupName ) != null )
104
116
{
0 commit comments