Auto merge of #125628 - matthiaskrgr:rollup-3zk9v3w, r=matthiaskrgr · rust-lang/rust@84b40fc (original) (raw)
`@@ -12,6 +12,8 @@ pub mod rustc;
`
12
12
`pub mod rustdoc;
`
13
13
``
14
14
`use std::env;
`
``
15
`+
use std::fs;
`
``
16
`+
use std::io;
`
15
17
`use std::path::{Path, PathBuf};
`
16
18
`use std::process::{Command, Output};
`
17
19
``
`@@ -201,6 +203,71 @@ pub fn set_host_rpath(cmd: &mut Command) {
`
201
203
`});
`
202
204
`}
`
203
205
``
``
206
`+
/// Copy a directory into another.
`
``
207
`+
pub fn copy_dir_all(src: impl AsRef
`
``
208
`+
fn copy_dir_all_inner(src: impl AsRef
`
``
209
`+
let dst = dst.as_ref();
`
``
210
`+
if !dst.is_dir() {
`
``
211
`+
fs::create_dir_all(&dst)?;
`
``
212
`+
}
`
``
213
`+
for entry in fs::read_dir(src)? {
`
``
214
`+
let entry = entry?;
`
``
215
`+
let ty = entry.file_type()?;
`
``
216
`+
if ty.is_dir() {
`
``
217
`+
copy_dir_all_inner(entry.path(), dst.join(entry.file_name()))?;
`
``
218
`+
} else {
`
``
219
`+
fs::copy(entry.path(), dst.join(entry.file_name()))?;
`
``
220
`+
}
`
``
221
`+
}
`
``
222
`+
Ok(())
`
``
223
`+
}
`
``
224
+
``
225
`+
if let Err(e) = copy_dir_all_inner(&src, &dst) {
`
``
226
`+
// Trying to give more context about what exactly caused the failure
`
``
227
`+
panic!(
`
``
228
`` +
"failed to copy {}
to {}
: {:?}",
``
``
229
`+
src.as_ref().display(),
`
``
230
`+
dst.as_ref().display(),
`
``
231
`+
e
`
``
232
`+
);
`
``
233
`+
}
`
``
234
`+
}
`
``
235
+
``
236
`` +
/// Check that all files in dir1
exist and have the same content in dir2
. Panic otherwise.
``
``
237
`+
pub fn recursive_diff(dir1: impl AsRef
`
``
238
`+
fn read_file(path: &Path) -> Vec {
`
``
239
`+
match fs::read(path) {
`
``
240
`+
Ok(c) => c,
`
``
241
`` +
Err(e) => panic!("Failed to read {}
: {:?}", path.display(), e),
``
``
242
`+
}
`
``
243
`+
}
`
``
244
+
``
245
`+
let dir2 = dir2.as_ref();
`
``
246
`+
for entry in fs::read_dir(dir1).unwrap() {
`
``
247
`+
let entry = entry.unwrap();
`
``
248
`+
let entry_name = entry.file_name();
`
``
249
`+
let path = entry.path();
`
``
250
+
``
251
`+
if path.is_dir() {
`
``
252
`+
recursive_diff(&path, &dir2.join(entry_name));
`
``
253
`+
} else {
`
``
254
`+
let path2 = dir2.join(entry_name);
`
``
255
`+
let file1 = read_file(&path);
`
``
256
`+
let file2 = read_file(&path2);
`
``
257
+
``
258
`` +
// We don't use assert_eq!
because they are Vec<u8>
, so not great for display.
``
``
259
`+
// Why not using String? Because there might be minified files or even potentially
`
``
260
`+
// binary ones, so that would display useless output.
`
``
261
`+
assert!(
`
``
262
`+
file1 == file2,
`
``
263
`` +
"{}
and {}
have different content",
``
``
264
`+
path.display(),
`
``
265
`+
path2.display(),
`
``
266
`+
);
`
``
267
`+
}
`
``
268
`+
}
`
``
269
`+
}
`
``
270
+
204
271
`/// Implement common helpers for command wrappers. This assumes that the command wrapper is a struct
`
205
272
`` /// containing a cmd: Command
field and a output
function. The provided helpers are:
``
206
273
`///
`