@@ -6,10 +6,10 @@ use std::path::PathBuf;
6
6
7
7
use branchless:: core:: effects:: Effects ;
8
8
use branchless:: core:: formatting:: Glyphs ;
9
- use branchless:: git:: { hydrate_tree, process_diff_for_record, FileMode , Repo } ;
9
+ use branchless:: git:: { hydrate_tree, process_diff_for_record, FileMode , MaybeZeroOid , Repo } ;
10
10
use bstr:: ByteSlice ;
11
11
use eyre:: Context ;
12
- use scm_record:: { File , Section } ;
12
+ use scm_record:: { File , Section , SelectedContents } ;
13
13
14
14
fn main ( ) -> eyre:: Result < ( ) > {
15
15
let path_to_repo = std:: env:: var ( "PATH_TO_REPO" )
@@ -51,11 +51,16 @@ fn main() -> eyre::Result<()> {
51
51
}
52
52
}
53
53
Section :: FileMode {
54
- is_toggled : _ ,
54
+ is_toggled,
55
55
before : _,
56
56
after : _,
57
+ }
58
+ | Section :: Binary {
59
+ is_toggled,
60
+ old_description : _,
61
+ new_description : _,
57
62
} => {
58
- unimplemented ! ( "selecting Section::FileMode" ) ;
63
+ * is_toggled = true ;
59
64
}
60
65
}
61
66
}
@@ -65,17 +70,35 @@ fn main() -> eyre::Result<()> {
65
70
let entries: HashMap < _ , _ > = entries
66
71
. into_iter ( )
67
72
. map ( |file| {
73
+ let file_path = file. path . clone ( ) . into_owned ( ) ;
68
74
let value = {
69
- let new_file_mode = file
70
- . get_file_mode ( )
71
- . expect ( "File mode should have been set" ) ;
72
75
let ( selected, _unselected) = file. get_selected_contents ( ) ;
73
- let blob_oid = repo. create_blob_from_contents ( selected. as_bytes ( ) ) ?;
74
- let file_mode = i32:: try_from ( new_file_mode) . unwrap ( ) ;
75
- let file_mode = FileMode :: from ( file_mode) ;
76
- Some ( ( blob_oid, file_mode) )
76
+ let blob_oid = match selected {
77
+ SelectedContents :: Absent => return Ok ( ( file_path, None ) ) ,
78
+ SelectedContents :: Unchanged => {
79
+ old_tree. get_oid_for_path ( & file. path ) ?. unwrap_or_default ( )
80
+ }
81
+ SelectedContents :: Binary {
82
+ old_description : _,
83
+ new_description : _,
84
+ } => new_tree. get_oid_for_path ( & file. path ) ?. unwrap ( ) ,
85
+ SelectedContents :: Present { contents } => MaybeZeroOid :: NonZero (
86
+ repo. create_blob_from_contents ( contents. as_bytes ( ) ) ?,
87
+ ) ,
88
+ } ;
89
+ match blob_oid {
90
+ MaybeZeroOid :: Zero => None ,
91
+ MaybeZeroOid :: NonZero ( blob_oid) => {
92
+ let new_file_mode = file
93
+ . get_file_mode ( )
94
+ . expect ( "File mode should have been set" ) ;
95
+ let file_mode = i32:: try_from ( new_file_mode) . unwrap ( ) ;
96
+ let file_mode = FileMode :: from ( file_mode) ;
97
+ Some ( ( blob_oid, file_mode) )
98
+ }
99
+ }
77
100
} ;
78
- Ok ( ( file . path . clone ( ) . into_owned ( ) , value) )
101
+ Ok ( ( file_path , value) )
79
102
} )
80
103
. collect :: < eyre:: Result < _ > > ( ) ?;
81
104
0 commit comments