@@ -8,27 +8,22 @@ namespace SourceGit.ViewModels
88{
99 public class BranchCompare : ObservableObject
1010 {
11- public string RepositoryPath
12- {
13- get => _repo ;
14- }
15-
1611 public bool IsLoading
1712 {
1813 get => _isLoading ;
1914 private set => SetProperty ( ref _isLoading , value ) ;
2015 }
2116
22- public Models . Branch Base
17+ public string BaseName
2318 {
24- get => _based ;
25- private set => SetProperty ( ref _based , value ) ;
19+ get => _baseName ;
20+ private set => SetProperty ( ref _baseName , value ) ;
2621 }
2722
28- public Models . Branch To
23+ public string ToName
2924 {
30- get => _to ;
31- private set => SetProperty ( ref _to , value ) ;
25+ get => _toName ;
26+ private set => SetProperty ( ref _toName , value ) ;
3227 }
3328
3429 public Models . Commit BaseHead
@@ -63,7 +58,7 @@ public List<Models.Change> SelectedChanges
6358 if ( SetProperty ( ref _selectedChanges , value ) )
6459 {
6560 if ( value is { Count : 1 } )
66- DiffContext = new DiffContext ( _repo , new Models . DiffOption ( _based . Head , _to . Head , value [ 0 ] ) , _diffContext ) ;
61+ DiffContext = new DiffContext ( _repo , new Models . DiffOption ( _based , _to , value [ 0 ] ) , _diffContext ) ;
6762 else
6863 DiffContext = null ;
6964 }
@@ -86,11 +81,13 @@ public DiffContext DiffContext
8681 private set => SetProperty ( ref _diffContext , value ) ;
8782 }
8883
89- public BranchCompare ( string repo , Models . Branch baseBranch , Models . Branch toBranch )
84+ public BranchCompare ( string repo , object based , object to )
9085 {
9186 _repo = repo ;
92- _based = baseBranch ;
93- _to = toBranch ;
87+ _based = GetSHA ( based ) ;
88+ _to = GetSHA ( to ) ;
89+ _baseName = GetName ( based ) ;
90+ _toName = GetName ( to ) ;
9491
9592 Refresh ( ) ;
9693 }
@@ -113,10 +110,8 @@ public void NavigateTo(string commitSHA)
113110
114111 public void Swap ( )
115112 {
116- ( Base , To ) = ( _to , _based ) ;
117-
118- VisibleChanges = [ ] ;
119- SelectedChanges = [ ] ;
113+ ( _based , _to ) = ( _to , _based ) ;
114+ ( BaseName , ToName ) = ( _toName , _baseName ) ;
120115
121116 if ( _baseHead != null )
122117 ( BaseHead , ToHead ) = ( _toHead , _baseHead ) ;
@@ -134,26 +129,33 @@ public string GetAbsPath(string path)
134129 return Native . OS . GetAbsPath ( _repo , path ) ;
135130 }
136131
132+ public void OpenInExternalDiffTool ( Models . Change change )
133+ {
134+ new Commands . DiffTool ( _repo , new Models . DiffOption ( _based , _to , change ) ) . Open ( ) ;
135+ }
136+
137137 public async Task SaveChangesAsPatchAsync ( List < Models . Change > changes , string saveTo )
138138 {
139- var succ = await Commands . SaveChangesAsPatch . ProcessRevisionCompareChangesAsync ( _repo , changes , _based . Head , _to . Head , saveTo ) ;
139+ var succ = await Commands . SaveChangesAsPatch . ProcessRevisionCompareChangesAsync ( _repo , changes , _based , _to , saveTo ) ;
140140 if ( succ )
141141 App . SendNotification ( _repo , App . Text ( "SaveAsPatchSuccess" ) ) ;
142142 }
143143
144144 private void Refresh ( )
145145 {
146146 IsLoading = true ;
147+ VisibleChanges = [ ] ;
148+ SelectedChanges = [ ] ;
147149
148150 Task . Run ( async ( ) =>
149151 {
150152 if ( _baseHead == null )
151153 {
152- var baseHead = await new Commands . QuerySingleCommit ( _repo , _based . Head )
154+ var baseHead = await new Commands . QuerySingleCommit ( _repo , _based )
153155 . GetResultAsync ( )
154156 . ConfigureAwait ( false ) ;
155157
156- var toHead = await new Commands . QuerySingleCommit ( _repo , _to . Head )
158+ var toHead = await new Commands . QuerySingleCommit ( _repo , _to )
157159 . GetResultAsync ( )
158160 . ConfigureAwait ( false ) ;
159161
@@ -164,7 +166,7 @@ private void Refresh()
164166 } ) ;
165167 }
166168
167- _changes = await new Commands . CompareRevisions ( _repo , _based . Head , _to . Head )
169+ _changes = await new Commands . CompareRevisions ( _repo , _based , _to )
168170 . ReadAsync ( )
169171 . ConfigureAwait ( false ) ;
170172
@@ -215,10 +217,34 @@ private void RefreshVisible()
215217 }
216218 }
217219
220+ private string GetName ( object obj )
221+ {
222+ return obj switch
223+ {
224+ Models . Branch b => b . FriendlyName ,
225+ Models . Tag t => t . Name ,
226+ Models . Commit c => c . SHA . Substring ( 0 , 10 ) ,
227+ _ => "HEAD" ,
228+ } ;
229+ }
230+
231+ private string GetSHA ( object obj )
232+ {
233+ return obj switch
234+ {
235+ Models . Branch b => b . Head ,
236+ Models . Tag t => t . SHA ,
237+ Models . Commit c => c . SHA ,
238+ _ => "HEAD" ,
239+ } ;
240+ }
241+
218242 private string _repo ;
219243 private bool _isLoading = true ;
220- private Models . Branch _based = null ;
221- private Models . Branch _to = null ;
244+ private string _based = string . Empty ;
245+ private string _to = string . Empty ;
246+ private string _baseName = string . Empty ;
247+ private string _toName = string . Empty ;
222248 private Models . Commit _baseHead = null ;
223249 private Models . Commit _toHead = null ;
224250 private int _totalChanges = 0 ;
0 commit comments