@@ -69,6 +69,56 @@ unsafe AnnotatedCommitHandle AnnotatedCommitHandleFromRefHandle(ReferenceHandle
69
69
Proxy . git_annotated_commit_from_ref ( this . repository . Handle , refHandle ) ;
70
70
}
71
71
72
+ ReferenceHandle RefHandleFrom ( Branch b ) =>
73
+ ( b == null ) ? null : this . repository . Refs . RetrieveReferencePtr ( b . CanonicalName ) ;
74
+
75
+ ReferenceHandle RefHandleFrom ( string name ) =>
76
+ ( name == null ) ? null : this . repository . Refs . RetrieveReferencePtr ( name ) ;
77
+
78
+ class RebaseReferenceGuard : IDisposable
79
+ {
80
+ Reference rf ;
81
+ Action < Reference > disposeFn ;
82
+
83
+ public RebaseReferenceGuard ( Reference rf_ , Action < Reference > disposeFn_ )
84
+ {
85
+ rf = rf_ ;
86
+ disposeFn = disposeFn_ ;
87
+ }
88
+
89
+ public string CanonicalName => rf . CanonicalName ;
90
+
91
+ public void Dispose ( )
92
+ {
93
+ disposeFn ( rf ) ;
94
+ }
95
+ }
96
+
97
+ RebaseReferenceGuard ReferenceFrom ( Commit c )
98
+ {
99
+ if ( c == null )
100
+ return null ;
101
+
102
+ var rfname = $ "refs/rebase/{ c . Sha } ";
103
+ var rf = this . repository . Refs . Resolve < Reference > ( rfname ) ;
104
+ rf = rf ?? this . repository . Refs . Add ( rfname , c . Id ) ;
105
+
106
+ return new RebaseReferenceGuard ( rf , r => { try { this . repository . Refs . Remove ( r ) ; } catch { } } ) ;
107
+ }
108
+
109
+ public virtual RebaseResult Start ( Commit annotated , Commit upstream , Commit onto , Identity committer , RebaseOptions options )
110
+ {
111
+ Ensure . ArgumentNotNull ( upstream , "upstream" ) ;
112
+
113
+ // TODO: Rebase does not work with just references, is that a bug or design feature?
114
+ using ( var annotatedRef = ReferenceFrom ( annotated ) )
115
+ using ( var upstreamRef = ReferenceFrom ( upstream ) )
116
+ using ( var ontoRef = ReferenceFrom ( onto ) )
117
+ using ( ReferenceHandle annotatedRefPtr = RefHandleFrom ( annotatedRef ? . CanonicalName ) )
118
+ using ( ReferenceHandle upstreamRefPtr = RefHandleFrom ( upstreamRef ? . CanonicalName ) )
119
+ using ( ReferenceHandle ontoRefPtr = RefHandleFrom ( ontoRef ? . CanonicalName ) )
120
+ return Start ( annotatedRefPtr , upstreamRefPtr , ontoRefPtr , committer , options ) ;
121
+ }
72
122
/// <summary>
73
123
/// Start a rebase operation.
74
124
/// </summary>
@@ -82,6 +132,16 @@ public virtual RebaseResult Start(Branch branch, Branch upstream, Branch onto, I
82
132
{
83
133
Ensure . ArgumentNotNull ( upstream , "upstream" ) ;
84
134
135
+ using ( ReferenceHandle branchRefPtr = RefHandleFrom ( branch ) )
136
+ using ( ReferenceHandle upstreamRefPtr = RefHandleFrom ( upstream ) )
137
+ using ( ReferenceHandle ontoRefPtr = RefHandleFrom ( onto ) )
138
+ return Start ( branchRefPtr , upstreamRefPtr , ontoRefPtr , committer , options ) ;
139
+ }
140
+
141
+ internal virtual RebaseResult Start ( ReferenceHandle annotatedRefPtr , ReferenceHandle upstreamRefPtr , ReferenceHandle ontoRefPtr , Identity committer , RebaseOptions options )
142
+ {
143
+ Ensure . ArgumentNotNull ( upstreamRefPtr , "upstream" ) ;
144
+
85
145
options = options ?? new RebaseOptions ( ) ;
86
146
87
147
EnsureNonBareRepo ( ) ;
@@ -92,13 +152,6 @@ public virtual RebaseResult Start(Branch branch, Branch upstream, Branch onto, I
92
152
this . repository . Info . CurrentOperation ) ;
93
153
}
94
154
95
- Func < Branch , ReferenceHandle > RefHandleFromBranch = ( Branch b ) =>
96
- {
97
- return ( b == null ) ?
98
- null :
99
- this . repository . Refs . RetrieveReferencePtr ( b . CanonicalName ) ;
100
- } ;
101
-
102
155
using ( GitCheckoutOptsWrapper checkoutOptionsWrapper = new GitCheckoutOptsWrapper ( options ) )
103
156
{
104
157
GitRebaseOptions gitRebaseOptions = new GitRebaseOptions ( )
@@ -107,10 +160,7 @@ public virtual RebaseResult Start(Branch branch, Branch upstream, Branch onto, I
107
160
checkout_options = checkoutOptionsWrapper . Options ,
108
161
} ;
109
162
110
- using ( ReferenceHandle branchRefPtr = RefHandleFromBranch ( branch ) )
111
- using ( ReferenceHandle upstreamRefPtr = RefHandleFromBranch ( upstream ) )
112
- using ( ReferenceHandle ontoRefPtr = RefHandleFromBranch ( onto ) )
113
- using ( AnnotatedCommitHandle annotatedBranchCommitHandle = AnnotatedCommitHandleFromRefHandle ( branchRefPtr ) )
163
+ using ( AnnotatedCommitHandle annotatedBranchCommitHandle = AnnotatedCommitHandleFromRefHandle ( annotatedRefPtr ) )
114
164
using ( AnnotatedCommitHandle upstreamRefAnnotatedCommitHandle = AnnotatedCommitHandleFromRefHandle ( upstreamRefPtr ) )
115
165
using ( AnnotatedCommitHandle ontoRefAnnotatedCommitHandle = AnnotatedCommitHandleFromRefHandle ( ontoRefPtr ) )
116
166
using ( RebaseHandle rebaseOperationHandle = Proxy . git_rebase_init ( this . repository . Handle ,
@@ -119,6 +169,8 @@ public virtual RebaseResult Start(Branch branch, Branch upstream, Branch onto, I
119
169
ontoRefAnnotatedCommitHandle ,
120
170
gitRebaseOptions ) )
121
171
{
172
+ this . repository . Submodules . UpdateAll ( new SubmoduleUpdateOptions ( ) ) ;
173
+
122
174
RebaseResult rebaseResult = RebaseOperationImpl . Run ( rebaseOperationHandle ,
123
175
this . repository ,
124
176
committer ,
0 commit comments