@@ -9,12 +9,29 @@ use gitbutler_command_context::CommandContext;
9
9
use gitbutler_commit:: commit_ext:: CommitExt ;
10
10
use gitbutler_oxidize:: OidExt ;
11
11
use gitbutler_project:: Project ;
12
+ use serde:: Serialize ;
12
13
use std:: collections:: BTreeMap ;
13
14
use std:: path:: Path ;
14
15
pub ( crate ) mod assignment;
15
16
16
17
use crate :: id:: CliId ;
17
18
19
+ type StackDetail = ( Option < StackDetails > , Vec < FileAssignment > ) ;
20
+ type StackEntry = ( Option < gitbutler_stack:: StackId > , StackDetail ) ;
21
+
22
+ #[ derive( Serialize ) ]
23
+ struct CommonMergeBase {
24
+ target_name : String ,
25
+ common_merge_base : String ,
26
+ message : String ,
27
+ }
28
+
29
+ #[ derive( Serialize ) ]
30
+ struct WorktreeStatus {
31
+ stacks : Vec < StackEntry > ,
32
+ common_merge_base : CommonMergeBase ,
33
+ }
34
+
18
35
pub ( crate ) fn worktree ( repo_path : & Path , json : bool , show_files : bool ) -> anyhow:: Result < ( ) > {
19
36
let project = Project :: find_by_path ( repo_path) . expect ( "Failed to create project from path" ) ;
20
37
let ctx = & mut CommandContext :: open ( & project, AppSettings :: load_from_default_path_creating ( ) ?) ?;
@@ -37,7 +54,7 @@ pub(crate) fn worktree(repo_path: &Path, json: bool, show_files: bool) -> anyhow
37
54
FileAssignment :: from_assignments ( path, assignments) ,
38
55
) ;
39
56
}
40
- let mut stack_details = vec ! [ ] ;
57
+ let mut stack_details: Vec < StackEntry > = vec ! [ ] ;
41
58
42
59
let unassigned = assignment:: filter_by_stack_id ( assignments_by_file. values ( ) , & None ) ;
43
60
stack_details. push ( ( None , ( None , unassigned) ) ) ;
@@ -47,8 +64,31 @@ pub(crate) fn worktree(repo_path: &Path, json: bool, show_files: bool) -> anyhow
47
64
stack_details. push ( ( stack. id , ( Some ( details) , assignments) ) ) ;
48
65
}
49
66
67
+ // Calculate common_merge_base data
68
+ let stack = gitbutler_stack:: VirtualBranchesHandle :: new ( ctx. project ( ) . gb_dir ( ) ) ;
69
+ let target = stack. get_default_target ( ) ?;
70
+ let target_name = format ! ( "[{}/{}]" , target. branch. remote( ) , target. branch. branch( ) ) ;
71
+ let repo = ctx. gix_repo ( ) ?;
72
+ let base_commit = repo. find_commit ( target. sha . to_gix ( ) ) ?;
73
+ let message = base_commit
74
+ . message_bstr ( )
75
+ . to_string ( )
76
+ . replace ( '\n' , " " )
77
+ . chars ( )
78
+ . take ( 50 )
79
+ . collect :: < String > ( ) ;
80
+ let common_merge_base_data = CommonMergeBase {
81
+ target_name : target_name. clone ( ) ,
82
+ common_merge_base : target. sha . to_string ( ) [ ..7 ] . to_string ( ) ,
83
+ message : message. clone ( ) ,
84
+ } ;
85
+
50
86
if json {
51
- let json_output = serde_json:: to_string_pretty ( & stack_details) ?;
87
+ let worktree_status = WorktreeStatus {
88
+ stacks : stack_details,
89
+ common_merge_base : common_merge_base_data,
90
+ } ;
91
+ let json_output = serde_json:: to_string_pretty ( & worktree_status) ?;
52
92
println ! ( "{json_output}" ) ;
53
93
return Ok ( ( ) ) ;
54
94
}
@@ -72,20 +112,12 @@ pub(crate) fn worktree(repo_path: &Path, json: bool, show_files: bool) -> anyhow
72
112
ctx,
73
113
) ?;
74
114
}
75
- let stack = gitbutler_stack:: VirtualBranchesHandle :: new ( ctx. project ( ) . gb_dir ( ) ) ;
76
- let target = stack. get_default_target ( ) ?;
77
- let target_name = format ! ( "[{}/{}]" , target. branch. remote( ) , target. branch. branch( ) ) ;
78
- let repo = ctx. gix_repo ( ) ?;
79
- let base_commit = repo. find_commit ( target. sha . to_gix ( ) ) ?;
80
- let message = base_commit
81
- . message_bstr ( )
82
- . to_string ( )
83
- . replace ( '\n' , " " )
84
- . chars ( )
85
- . take ( 50 )
86
- . collect :: < String > ( ) ;
87
- let common_merge_base = target. sha . to_string ( ) [ ..7 ] . to_string ( ) ;
88
- println ! ( "◉ {common_merge_base} (common base) {target_name} {message}" ) ;
115
+ println ! (
116
+ "◉ {} (common base) {} {}" ,
117
+ common_merge_base_data. common_merge_base,
118
+ common_merge_base_data. target_name,
119
+ common_merge_base_data. message
120
+ ) ;
89
121
Ok ( ( ) )
90
122
}
91
123
0 commit comments