11using System . IO ;
22using System . Threading . Tasks ;
3+ using Avalonia . Threading ;
4+ using CommunityToolkit . Mvvm . ComponentModel ;
35
46namespace SourceGit . ViewModels
57{
6- public class Conflict
8+ public class Conflict : ObservableObject
79 {
810 public string Marker
911 {
@@ -15,52 +17,57 @@ public string Description
1517 get => _change . ConflictDesc ;
1618 }
1719
18- public object Theirs
20+ public Models . ConflictFileState State
1921 {
20- get ;
21- private set ;
22+ get => _state ;
23+ private set => SetProperty ( ref _state , value ) ;
2224 }
2325
24- public object Mine
26+ public object Theirs
2527 {
26- get ;
27- private set ;
28+ get => _theirs ;
29+ private set => SetProperty ( ref _theirs , value ) ;
2830 }
2931
30- public bool IsResolved
31- {
32- get ;
33- private set ;
34- } = false ;
35-
36- public bool CanMerge
32+ public object Mine
3733 {
38- get ;
39- private set ;
40- } = false ;
34+ get => _mine ;
35+ private set => SetProperty ( ref _mine , value ) ;
36+ }
4137
4238 public Conflict ( Repository repo , WorkingCopy wc , Models . Change change )
4339 {
4440 _repo = repo ;
4541 _wc = wc ;
42+ _canMerge = ( change . ConflictReason is Models . ConflictReason . BothAdded or Models . ConflictReason . BothModified ) && ! Directory . Exists ( Path . Combine ( repo . FullPath , change . Path ) ) ;
4643 _change = change ;
4744
48- CanMerge = _change . ConflictReason is Models . ConflictReason . BothAdded or Models . ConflictReason . BothModified ;
49- if ( CanMerge )
50- CanMerge = ! Directory . Exists ( Path . Combine ( repo . FullPath , change . Path ) ) ; // Cannot merge directories (submodules)
45+ Task . Run ( async ( ) =>
46+ {
47+ _head = new Commands . QuerySingleCommit ( repo . FullPath , "HEAD" ) . GetResult ( ) ;
5148
52- if ( CanMerge )
53- IsResolved = new Commands . IsConflictResolved ( repo . FullPath , change ) . GetResult ( ) ;
49+ var ( mine , theirs ) = wc . InProgressContext switch
50+ {
51+ CherryPickInProgress cherryPick => ( _head , cherryPick . Head ) ,
52+ RebaseInProgress rebase => ( rebase . Onto , rebase . StoppedAt ) ,
53+ RevertInProgress revert => ( _head , revert . Head ) ,
54+ MergeInProgress merge => ( _head , merge . Source ) ,
55+ _ => ( _head , ( object ) "Stash or Patch" ) ,
56+ } ;
5457
55- _head = new Commands . QuerySingleCommit ( repo . FullPath , "HEAD" ) . GetResult ( ) ;
56- ( Mine , Theirs ) = wc . InProgressContext switch
57- {
58- CherryPickInProgress cherryPick => ( _head , cherryPick . Head ) ,
59- RebaseInProgress rebase => ( rebase . Onto , rebase . StoppedAt ) ,
60- RevertInProgress revert => ( _head , revert . Head ) ,
61- MergeInProgress merge => ( _head , merge . Source ) ,
62- _ => ( _head , ( object ) "Stash or Patch" ) ,
63- } ;
58+ var state = Models . ConflictFileState . Unknown ;
59+ if ( _canMerge )
60+ state = await new Commands . QueryConflictFileState ( repo . FullPath , change )
61+ . GetResultAsync ( )
62+ . ConfigureAwait ( false ) ;
63+
64+ Dispatcher . UIThread . Post ( ( ) =>
65+ {
66+ State = state ;
67+ Mine = mine ;
68+ Theirs = theirs ;
69+ } ) ;
70+ } ) ;
6471 }
6572
6673 public async Task UseTheirsAsync ( )
@@ -75,18 +82,22 @@ public async Task UseMineAsync()
7582
7683 public MergeConflictEditor CreateOpenMergeEditorRequest ( )
7784 {
78- return CanMerge ? new MergeConflictEditor ( _repo , _head , _change . Path ) : null ;
85+ return _canMerge ? new MergeConflictEditor ( _repo , _head , _change . Path ) : null ;
7986 }
8087
8188 public async Task MergeExternalAsync ( )
8289 {
83- if ( CanMerge )
90+ if ( _canMerge )
8491 await _wc . UseExternalMergeToolAsync ( _change ) ;
8592 }
8693
8794 private Repository _repo = null ;
8895 private WorkingCopy _wc = null ;
89- private Models . Commit _head = null ;
96+ private bool _canMerge = false ;
9097 private Models . Change _change = null ;
98+ private Models . Commit _head = null ;
99+ private Models . ConflictFileState _state = Models . ConflictFileState . Unknown ;
100+ private object _mine = null ;
101+ private object _theirs = null ;
91102 }
92103}
0 commit comments