@@ -6,57 +6,65 @@ use serde::Serialize;
6
6
#[ derive( Serialize ) ]
7
7
#[ serde( rename_all = "camelCase" ) ]
8
8
pub struct PendingInfo {
9
- pub pending_changes : String ,
9
+ added : usize ,
10
+ deleted : usize ,
11
+ modified : usize ,
10
12
}
11
13
12
14
impl PendingInfo {
13
15
pub fn new ( repo : & Repository ) -> Result < Self > {
14
- let pending_changes = get_pending_changes ( repo) ?;
15
- Ok ( Self { pending_changes } )
16
+ let statuses = repo
17
+ . status ( gix:: progress:: Discard ) ?
18
+ . dirwalk_options ( |options| {
19
+ options. emit_untracked ( gix:: dir:: walk:: EmissionMode :: Matching )
20
+ } )
21
+ . into_index_worktree_iter ( Vec :: new ( ) ) ?;
22
+
23
+ let ( added, deleted, modified) = statuses
24
+ . take_while ( Result :: is_ok)
25
+ . filter_map ( Result :: ok)
26
+ . filter_map ( |item| item. summary ( ) )
27
+ . fold ( ( 0 , 0 , 0 ) , |( added, deleted, modified) , status| {
28
+ use gix:: status:: index_worktree:: iter:: Summary ;
29
+ match status {
30
+ Summary :: Removed => ( added, deleted + 1 , modified) ,
31
+ Summary :: Added | Summary :: Copied => ( added + 1 , deleted, modified) ,
32
+ Summary :: Modified | Summary :: TypeChange => ( added, deleted, modified + 1 ) ,
33
+ Summary :: Renamed => ( added + 1 , deleted + 1 , modified) ,
34
+ Summary :: IntentToAdd | Summary :: Conflict => ( added, deleted, modified) ,
35
+ }
36
+ } ) ;
37
+ Ok ( Self {
38
+ added,
39
+ deleted,
40
+ modified,
41
+ } )
16
42
}
17
43
}
18
44
19
- fn get_pending_changes ( repo : & Repository ) -> Result < String > {
20
- let statuses = repo
21
- . status ( gix:: progress:: Discard ) ?
22
- . dirwalk_options ( |options| options. emit_untracked ( gix:: dir:: walk:: EmissionMode :: Matching ) )
23
- . into_index_worktree_iter ( Vec :: new ( ) ) ?;
45
+ impl std:: fmt:: Display for PendingInfo {
46
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
47
+ let mut result = String :: new ( ) ;
48
+ if self . modified > 0 {
49
+ result = format ! ( "{}+-" , self . modified) ;
50
+ }
24
51
25
- let ( added, deleted, modified) = statuses
26
- . take_while ( Result :: is_ok)
27
- . filter_map ( Result :: ok)
28
- . filter_map ( |item| item. summary ( ) )
29
- . fold ( ( 0 , 0 , 0 ) , |( added, deleted, modified) , status| {
30
- use gix:: status:: index_worktree:: iter:: Summary ;
31
- match status {
32
- Summary :: Removed => ( added, deleted + 1 , modified) ,
33
- Summary :: Added | Summary :: Copied => ( added + 1 , deleted, modified) ,
34
- Summary :: Modified | Summary :: TypeChange => ( added, deleted, modified + 1 ) ,
35
- Summary :: Renamed => ( added + 1 , deleted + 1 , modified) ,
36
- Summary :: IntentToAdd | Summary :: Conflict => ( added, deleted, modified) ,
37
- }
38
- } ) ;
52
+ if self . added > 0 {
53
+ result = format ! ( "{result} {}+" , self . added) ;
54
+ }
39
55
40
- let mut result = String :: new ( ) ;
41
- if modified > 0 {
42
- result = format ! ( "{modified}+-" ) ;
43
- }
56
+ if self . deleted > 0 {
57
+ result = format ! ( "{result} {}-" , self . deleted) ;
58
+ }
44
59
45
- if added > 0 {
46
- result = format ! ( "{result} {added}+" ) ;
60
+ write ! ( f, "{}" , result. trim( ) )
47
61
}
48
-
49
- if deleted > 0 {
50
- result = format ! ( "{result} {deleted}-" ) ;
51
- }
52
-
53
- Ok ( result. trim ( ) . into ( ) )
54
62
}
55
63
56
64
#[ typetag:: serialize]
57
65
impl InfoField for PendingInfo {
58
66
fn value ( & self ) -> String {
59
- self . pending_changes . to_string ( )
67
+ self . to_string ( )
60
68
}
61
69
62
70
fn title ( & self ) -> String {
@@ -71,7 +79,9 @@ mod test {
71
79
#[ test]
72
80
fn test_display_pending_info ( ) {
73
81
let pending_info = PendingInfo {
74
- pending_changes : "4+-" . to_string ( ) ,
82
+ added : 0 ,
83
+ deleted : 0 ,
84
+ modified : 4 ,
75
85
} ;
76
86
77
87
assert_eq ! ( pending_info. value( ) , "4+-" . to_string( ) ) ;
0 commit comments