summaryrefslogtreecommitdiff
path: root/cli/ops
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2020-04-29 22:00:31 +0200
committerGitHub <noreply@github.com>2020-04-29 16:00:31 -0400
commit3e6ea6284178df0be4982d9775f47b47b14c6139 (patch)
treeed684ea536e32023e72004110556ad8285126676 /cli/ops
parent721a4ad59d4a8bdd8470d6b98839137f14c84ba9 (diff)
BREAKING: Include limited metadata in 'DirEntry' objects (#4941)
This change is to prevent needed a separate stat syscall for each file when using readdir. For consistency, this PR also modifies std's `WalkEntry` interface to extend `DirEntry` with an additional `path` field.
Diffstat (limited to 'cli/ops')
-rw-r--r--cli/ops/fs.rs28
1 files changed, 11 insertions, 17 deletions
diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs
index 28e260694..55ee1afa3 100644
--- a/cli/ops/fs.rs
+++ b/cli/ops/fs.rs
@@ -460,10 +460,7 @@ fn to_msec(maybe_time: Result<SystemTime, io::Error>) -> serde_json::Value {
}
#[inline(always)]
-fn get_stat_json(
- metadata: std::fs::Metadata,
- maybe_name: Option<String>,
-) -> JsonResult {
+fn get_stat_json(metadata: std::fs::Metadata) -> JsonResult {
// Unix stat member (number types only). 0 if not on unix.
macro_rules! usm {
($member: ident) => {{
@@ -480,7 +477,7 @@ fn get_stat_json(
#[cfg(unix)]
use std::os::unix::fs::MetadataExt;
- let mut json_val = json!({
+ let json_val = json!({
"isFile": metadata.is_file(),
"isDirectory": metadata.is_dir(),
"isSymlink": metadata.file_type().is_symlink(),
@@ -502,14 +499,6 @@ fn get_stat_json(
"blksize": usm!(blksize),
"blocks": usm!(blocks),
});
-
- // "name" is an optional field by our design.
- if let Some(name) = maybe_name {
- if let serde_json::Value::Object(ref mut m) = json_val {
- m.insert("name".to_owned(), json!(name));
- }
- }
-
Ok(json_val)
}
@@ -540,7 +529,7 @@ fn op_stat(
} else {
std::fs::metadata(&path)?
};
- get_stat_json(metadata, None)
+ get_stat_json(metadata)
})
}
@@ -599,10 +588,15 @@ fn op_read_dir(
let entries: Vec<_> = std::fs::read_dir(path)?
.filter_map(|entry| {
let entry = entry.unwrap();
- let metadata = entry.metadata().unwrap();
+ let file_type = entry.file_type().unwrap();
// Not all filenames can be encoded as UTF-8. Skip those for now.
- if let Ok(filename) = into_string(entry.file_name()) {
- Some(get_stat_json(metadata, Some(filename)).unwrap())
+ if let Ok(name) = into_string(entry.file_name()) {
+ Some(json!({
+ "name": name,
+ "isFile": file_type.is_file(),
+ "isDirectory": file_type.is_dir(),
+ "isSymlink": file_type.is_symlink()
+ }))
} else {
None
}