summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock109
-rw-r--r--README.md10
-rw-r--r--src/display.rs18
-rw-r--r--src/meta/mod.rs4
-rw-r--r--src/meta/name.rs2
-rw-r--r--src/meta/owner.rs75
-rw-r--r--src/theme/icon.rs2
7 files changed, 129 insertions, 91 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 1a749ed..99f8e55 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
[[package]]
name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
@@ -107,9 +107,9 @@ dependencies = [
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
[[package]]
name = "bitflags"
@@ -119,9 +119,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.4.2"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
dependencies = [
"serde",
]
@@ -161,9 +161,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
-version = "0.4.35"
+version = "0.4.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a"
+checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e"
dependencies = [
"android-tzdata",
"iana-time-zone",
@@ -277,7 +277,7 @@ version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
"crossterm_winapi",
"libc",
"mio",
@@ -361,9 +361,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.0.1"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
[[package]]
name = "float-cmp"
@@ -473,11 +473,11 @@ dependencies = [
[[package]]
name = "git2"
-version = "0.18.2"
+version = "0.18.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b3ba52851e73b46a4c3df1d89343741112003f0f6f13beb0dfac9e457c3fdcd"
+checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
"libc",
"libgit2-sys",
"log",
@@ -509,7 +509,7 @@ version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
"ignore",
"walkdir",
]
@@ -589,9 +589,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.2.5"
+version = "2.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [
"equivalent",
"hashbrown",
@@ -621,9 +621,9 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "jobserver"
@@ -669,20 +669,19 @@ dependencies = [
[[package]]
name = "libredox"
-version = "0.0.1"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
"libc",
- "redox_syscall",
]
[[package]]
name = "libz-sys"
-version = "1.1.15"
+version = "1.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6"
+checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
dependencies = [
"cc",
"libc",
@@ -774,9 +773,9 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.1"
+version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]]
name = "mio"
@@ -857,9 +856,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]]
name = "pin-utils"
@@ -905,9 +904,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.78"
+version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
+checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
dependencies = [
"unicode-ident",
]
@@ -938,9 +937,9 @@ dependencies = [
[[package]]
name = "redox_users"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
dependencies = [
"getrandom",
"libredox",
@@ -949,9 +948,9 @@ dependencies = [
[[package]]
name = "regex"
-version = "1.10.3"
+version = "1.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
+checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
dependencies = [
"aho-corasick",
"memchr",
@@ -972,9 +971,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
[[package]]
name = "rustix"
@@ -992,11 +991,11 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.31"
+version = "0.38.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
+checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
"errno",
"libc",
"linux-raw-sys 0.4.13",
@@ -1046,9 +1045,9 @@ dependencies = [
[[package]]
name = "serde_yaml"
-version = "0.9.32"
+version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f"
+checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [
"indexmap",
"itoa",
@@ -1123,9 +1122,9 @@ dependencies = [
[[package]]
name = "smallvec"
-version = "1.13.1"
+version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "strsim"
@@ -1135,9 +1134,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "syn"
-version = "2.0.52"
+version = "2.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
+checksum = "11a6ae1e52eb25aab8f3fb9fca13be982a373b8f1157ca14b897a825ba4a2d35"
dependencies = [
"proc-macro2",
"quote",
@@ -1161,7 +1160,7 @@ checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
dependencies = [
"cfg-if",
"fastrand",
- "rustix 0.38.31",
+ "rustix 0.38.32",
"windows-sys 0.52.0",
]
@@ -1190,7 +1189,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
dependencies = [
- "rustix 0.38.31",
+ "rustix 0.38.32",
"windows-sys 0.48.0",
]
@@ -1202,18 +1201,18 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
[[package]]
name = "thiserror"
-version = "1.0.57"
+version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
+checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.57"
+version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
+checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [
"proc-macro2",
"quote",
@@ -1264,9 +1263,9 @@ checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]]
name = "unsafe-libyaml"
-version = "0.2.10"
+version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b"
+checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
[[package]]
name = "url"
@@ -1638,7 +1637,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
dependencies = [
"libc",
"linux-raw-sys 0.4.13",
- "rustix 0.38.31",
+ "rustix 0.38.32",
]
[[package]]
diff --git a/README.md b/README.md
index 940519b..b5c0131 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,13 @@
<br>
<br>
<a href="https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=lsd_20231001">
- <div>
- <img src="https://user-images.githubusercontent.com/3764335/271887540-b782d11d-d122-484d-8cd3-7fdff3b4ac4d.png" width="230" alt="Warp">
- </div>
+<div>
+ <picture>
+ <source media="(prefers-color-scheme: dark)" srcset="https://github.com/lsd-rs/lsd/assets/3764335/61c7471f-ade1-42ea-9829-ac381c92b28a">
+ <source media="(prefers-color-scheme: light)" srcset="https://github.com/lsd-rs/lsd/assets/3764335/40e5d173-603c-45c8-90fa-50ba6c48a813">
+ <img alt="Warp" width="230" src="https://github.com/lsd-rs/lsd/assets/3764335/40e5d173-603c-45c8-90fa-50ba6c48a813">
+ </picture>
+</div>
<b>Warp is a blazingly fast, Rust-based terminal reimagined to work like a modern app.</b>
<div>
<sup>Get more done in the CLI with real text editing, block-based output, and AI command search.</sup>
diff --git a/src/display.rs b/src/display.rs
index 72515f6..a923d1a 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -4,7 +4,7 @@ use crate::flags::{Display, Flags, HyperlinkOption, Layout};
use crate::git_theme::GitTheme;
use crate::icon::Icons;
use crate::meta::name::DisplayOption;
-use crate::meta::{FileType, Meta};
+use crate::meta::{FileType, Meta, OwnerCache};
use std::collections::HashMap;
use term_grid::{Cell, Direction, Filling, Grid, GridOptions};
use terminal_size::terminal_size;
@@ -23,10 +23,12 @@ pub fn grid(
git_theme: &GitTheme,
) -> String {
let term_width = terminal_size().map(|(w, _)| w.0 as usize);
+ let owner_cache = OwnerCache::default();
inner_display_grid(
&DisplayOption::None,
metas,
+ &owner_cache,
flags,
colors,
icons,
@@ -57,8 +59,11 @@ pub fn tree(
}
}
+ let owner_cache = OwnerCache::default();
+
for cell in inner_display_tree(
metas,
+ &owner_cache,
flags,
colors,
icons,
@@ -77,6 +82,7 @@ pub fn tree(
fn inner_display_grid(
display_option: &DisplayOption,
metas: &[Meta],
+ owner_cache: &OwnerCache,
flags: &Flags,
colors: &Colors,
icons: &Icons,
@@ -117,6 +123,7 @@ fn inner_display_grid(
let blocks = get_output(
meta,
+ owner_cache,
colors,
icons,
git_theme,
@@ -176,6 +183,7 @@ fn inner_display_grid(
output += &inner_display_grid(
&display_option,
content,
+ owner_cache,
flags,
colors,
icons,
@@ -223,6 +231,7 @@ fn add_header(flags: &Flags, cells: &[Cell], grid: &mut Grid) {
#[allow(clippy::too_many_arguments)]
fn inner_display_tree(
metas: &[Meta],
+ owner_cache: &OwnerCache,
flags: &Flags,
colors: &Colors,
icons: &Icons,
@@ -248,6 +257,7 @@ fn inner_display_tree(
for block in get_output(
meta,
+ owner_cache,
colors,
icons,
git_theme,
@@ -276,6 +286,7 @@ fn inner_display_tree(
cells.extend(inner_display_tree(
content,
+ owner_cache,
flags,
colors,
icons,
@@ -314,6 +325,7 @@ fn display_folder_path(meta: &Meta) -> String {
#[allow(clippy::too_many_arguments)]
fn get_output(
meta: &Meta,
+ owner_cache: &OwnerCache,
colors: &Colors,
icons: &Icons,
git_theme: &GitTheme,
@@ -357,11 +369,11 @@ fn get_output(
]);
}
Block::User => block_vec.push(match &meta.owner {
- Some(owner) => owner.render_user(colors, flags),
+ Some(owner) => owner.render_user(colors, owner_cache, flags),
None => colorize_missing("?"),
}),
Block::Group => block_vec.push(match &meta.owner {
- Some(owner) => owner.render_group(colors, flags),
+ Some(owner) => owner.render_group(colors, owner_cache, flags),
None => colorize_missing("?"),
}),
Block::Context => block_vec.push(match &meta.access_control {
diff --git a/src/meta/mod.rs b/src/meta/mod.rs
index 6c65147..70624a1 100644
--- a/src/meta/mod.rs
+++ b/src/meta/mod.rs
@@ -7,7 +7,7 @@ mod inode;
mod links;
mod locale;
pub mod name;
-mod owner;
+pub mod owner;
mod permissions;
mod permissions_or_attributes;
mod size;
@@ -26,7 +26,7 @@ pub use self::indicator::Indicator;
pub use self::inode::INode;
pub use self::links::Links;
pub use self::name::Name;
-pub use self::owner::Owner;
+pub use self::owner::{Cache as OwnerCache, Owner};
pub use self::permissions::Permissions;
use self::permissions_or_attributes::PermissionsOrAttributes;
pub use self::size::Size;
diff --git a/src/meta/name.rs b/src/meta/name.rs
index 81f28b0..788c890 100644
--- a/src/meta/name.rs
+++ b/src/meta/name.rs
@@ -686,7 +686,7 @@ mod test {
)
);
- let file_path = tmp_dir.path().join("\\.txt");
+ let file_path = tmp_dir.path().join(PathBuf::from("\\.txt"));
File::create(&file_path).expect("failed to create file");
let meta = file_path.metadata().expect("failed to get metas");
diff --git a/src/meta/owner.rs b/src/meta/owner.rs
index 247a8c9..132df3b 100644
--- a/src/meta/owner.rs
+++ b/src/meta/owner.rs
@@ -2,46 +2,47 @@ use crate::color::{ColoredString, Colors, Elem};
use crate::Flags;
#[cfg(unix)]
use std::fs::Metadata;
+#[cfg(unix)]
+use users::{Groups, Users, UsersCache};
+
+#[derive(Default)]
+pub struct Cache {
+ #[cfg(unix)]
+ users: UsersCache,
+ #[cfg(unix)]
+ groups: UsersCache,
+}
+
+#[cfg(unix)]
+#[derive(Clone, Debug, Default)]
+pub struct Owner {
+ user: u32,
+ group: u32,
+}
-#[derive(Clone, Debug)]
+#[cfg(windows)]
+#[derive(Clone, Debug, Default)]
pub struct Owner {
user: String,
group: String,
}
impl Owner {
- #[cfg_attr(unix, allow(dead_code))]
+ #[cfg(windows)]
pub fn new(user: String, group: String) -> Self {
Self { user, group }
}
}
-impl Default for Owner {
- fn default() -> Owner {
- Owner {
- user: String::from("-"),
- group: String::from("-"),
- }
- }
-}
-
#[cfg(unix)]
impl From<&Metadata> for Owner {
fn from(meta: &Metadata) -> Self {
use std::os::unix::fs::MetadataExt;
- use users::{get_group_by_gid, get_user_by_uid};
- let user = match get_user_by_uid(meta.uid()) {
- Some(res) => res.name().to_string_lossy().to_string(),
- None => meta.uid().to_string(),
- };
-
- let group = match get_group_by_gid(meta.gid()) {
- Some(res) => res.name().to_string_lossy().to_string(),
- None => meta.gid().to_string(),
- };
-
- Self { user, group }
+ Self {
+ user: meta.uid(),
+ group: meta.gid(),
+ }
}
}
@@ -62,10 +63,20 @@ fn truncate(input: &str, after: Option<usize>, marker: Option<String>) -> String
}
impl Owner {
- pub fn render_user(&self, colors: &Colors, flags: &Flags) -> ColoredString {
+ // allow unused variables because cache is used in unix, maybe we can cache for windows in the future
+ #[allow(unused_variables)]
+ pub fn render_user(&self, colors: &Colors, cache: &Cache, flags: &Flags) -> ColoredString {
+ #[cfg(unix)]
+ let user = &match cache.users.get_user_by_uid(self.user) {
+ Some(user) => user.name().to_string_lossy().to_string(),
+ None => self.user.to_string(),
+ };
+ #[cfg(windows)]
+ let user = &self.user;
+
colors.colorize(
truncate(
- &self.user,
+ user,
flags.truncate_owner.after,
flags.truncate_owner.marker.clone(),
),
@@ -73,10 +84,20 @@ impl Owner {
)
}
- pub fn render_group(&self, colors: &Colors, flags: &Flags) -> ColoredString {
+ // allow unused variables because cache is used in unix, maybe we can cache for windows in the future
+ #[allow(unused_variables)]
+ pub fn render_group(&self, colors: &Colors, cache: &Cache, flags: &Flags) -> ColoredString {
+ #[cfg(unix)]
+ let group = &match cache.groups.get_group_by_gid(self.group) {
+ Some(group) => group.name().to_string_lossy().to_string(),
+ None => self.group.to_string(),
+ };
+ #[cfg(windows)]
+ let group = &self.group;
+
colors.colorize(
truncate(
- &self.group,
+ group,
flags.truncate_owner.after,
flags.truncate_owner.marker.clone(),
),
diff --git a/src/theme/icon.rs b/src/theme/icon.rs
index 7429ef3..f88a1e4 100644
--- a/src/theme/icon.rs
+++ b/src/theme/icon.rs
@@ -430,6 +430,8 @@ impl IconTheme {
("bat", "\u{f17a}"), // ""
("bin", "\u{eae8}"), // ""
("bio", "\u{f0411}"), // "󰐑"
+ ("blend", "\u{f00ab}"), // "󰂫"
+ ("blend1", "\u{f00ab}"), // "󰂫"
("bmp", "\u{f1c5}"), // ""
("bz2", "\u{f410}"), // ""
("cc", "\u{e61d}"), // ""