@@ -99,6 +99,51 @@ fn collect_all_files(root: &Directory<CustomMetadata>) -> Vec<PathBuf> {
99
99
return files;
100
100
}
101
101
102
+ fn get_deletions (
103
+ pristine : & Directory < CustomMetadata > ,
104
+ current : & Directory < CustomMetadata > ,
105
+ mut current_path : PathBuf ,
106
+ diff : & mut Diff ,
107
+ ) -> anyhow:: Result < ( ) > {
108
+ for ( file_name, inode) in pristine. entries ( ) {
109
+ current_path. push ( file_name) ;
110
+
111
+ match inode {
112
+ Inode :: Directory ( pristine_dir) => {
113
+ match current. get_directory ( file_name) {
114
+ Ok ( curr_dir) => {
115
+ get_deletions ( pristine_dir, curr_dir, current_path. clone ( ) , diff) ?
116
+ }
117
+
118
+ Err ( ImageError :: NotFound ( ..) ) => {
119
+ // Directory was deleted
120
+ diff. removed . push ( current_path. clone ( ) ) ;
121
+ }
122
+
123
+ Err ( e) => Err ( e) ?,
124
+ }
125
+ }
126
+
127
+ Inode :: Leaf ( ..) => match current. ref_leaf ( file_name) {
128
+ Ok ( ..) => {
129
+ // Empty as all additions/modifications are tracked above
130
+ }
131
+
132
+ Err ( ImageError :: NotFound ( ..) ) => {
133
+ // File was deleted
134
+ diff. removed . push ( current_path. clone ( ) ) ;
135
+ }
136
+
137
+ Err ( e) => Err ( e) ?,
138
+ } ,
139
+ }
140
+
141
+ current_path. pop ( ) ;
142
+ }
143
+
144
+ Ok ( ( ) )
145
+ }
146
+
102
147
// 1. Files in the currently booted deployment’s /etc which were modified from the default /usr/etc (of the same deployment) are retained.
103
148
//
104
149
// 2. Files in the currently booted deployment’s /etc which were not modified from the default /usr/etc (of the same deployment)
@@ -215,7 +260,12 @@ fn compute_diff(
215
260
& mut diff,
216
261
) ?;
217
262
218
- diff. removed = collect_all_files ( & pristine_etc_files) ;
263
+ get_deletions (
264
+ & pristine_etc_files,
265
+ & current_etc_files,
266
+ PathBuf :: new ( ) ,
267
+ & mut diff,
268
+ ) ?;
219
269
220
270
Ok ( diff)
221
271
}
@@ -334,9 +384,6 @@ mod tests {
334
384
p. create_dir_all ( "a/b/c" ) ?;
335
385
c. create_dir_all ( "a/b/c" ) ?;
336
386
337
- let mut open_options = cap_std:: fs:: OpenOptions :: new ( ) ;
338
- open_options. create ( true ) . write ( true ) ;
339
-
340
387
for ( file, content) in FILES {
341
388
p. write ( file, content. as_bytes ( ) ) ?;
342
389
c. write ( file, content. as_bytes ( ) ) ?;
0 commit comments