From ffafb7de6acf40a2e1e506d1b23f84539712a3af Mon Sep 17 00:00:00 2001
From: Awiteb
Date: Mon, 23 Dec 2024 01:16:54 +0300
Subject: [PATCH] feat: Hide files in `.gitignore` and `.git` folder from path
node
- Updated path node to exclude files listed in `.gitignore`
- Added functionality to hide the `.git` folder
Signed-off-by: Awiteb
---
src/model/config/mod.rs | 6 ++---
src/model/path_node/mod.rs | 46 ++++++++++++++++++--------------------
src/utils.rs | 36 ++++++++++++++---------------
3 files changed, 42 insertions(+), 46 deletions(-)
diff --git a/src/model/config/mod.rs b/src/model/config/mod.rs
index 8ff86dc..a0b77bf 100644
--- a/src/model/config/mod.rs
+++ b/src/model/config/mod.rs
@@ -10,10 +10,10 @@ use crate::model::config::keybinding::Keybinding;
use crate::model::config::setup::Setup;
use crate::utils::get_config_dir;
use crate::utils::print_help;
-use crate::utils::read_file;
use log::{info, warn};
use serde::Deserialize;
use std::env::args;
+use std::fs;
use std::process::exit;
mod behavior;
@@ -119,10 +119,8 @@ impl Config {
fn read_config_file() -> std::io::Result {
let config_dir = get_config_dir()?;
-
let config_file = format!("{}/twilight-commander.toml", config_dir);
-
- let config_file_content = read_file(&config_file)?;
+ let config_file_content = fs::read_to_string(&config_file)?;
toml::from_str(&config_file_content).map_err(|_| {
std::io::Error::new(
diff --git a/src/model/path_node/mod.rs b/src/model/path_node/mod.rs
index 5b7e701..fd07898 100644
--- a/src/model/path_node/mod.rs
+++ b/src/model/path_node/mod.rs
@@ -1,12 +1,14 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2019-2022 golmman
+// Copyright (c) 2024 Awiteb
use crate::model::compare_functions::PathNodeCompare;
use crate::model::config::Config;
use crate::model::tree_index::TreeIndex;
+use crate::utils;
use log::info;
use std::fs::canonicalize;
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
mod debug;
@@ -18,30 +20,25 @@ pub struct PathNode {
pub is_err: bool,
pub is_expanded: bool,
pub path: PathBuf,
+ pub gitignore: Vec,
}
-impl From<&str> for PathNode {
- fn from(working_dir: &str) -> Self {
+impl From for PathNode
+where
+ T: AsRef,
+{
+ fn from(working_dir: T) -> Self {
+ let mut gitignore =
+ utils::parse_gitignore(Path::new(working_dir.as_ref()).join(".gitignore"));
+ gitignore.push(working_dir.as_ref().join(".git").display().to_string());
Self {
children: Vec::new(),
- display_text: String::from(working_dir),
+ display_text: working_dir.as_ref().display().to_string(),
is_dir: true,
is_err: false,
is_expanded: false,
- path: PathBuf::from(working_dir),
- }
- }
-}
-
-impl From for PathNode {
- fn from(working_dir: String) -> Self {
- Self {
- children: Vec::new(),
- display_text: working_dir.clone(),
- is_dir: true,
- is_err: false,
- is_expanded: false,
- path: PathBuf::from(working_dir),
+ path: PathBuf::from(working_dir.as_ref()),
+ gitignore,
}
}
}
@@ -50,7 +47,7 @@ impl PathNode {
pub fn new_expanded(config: Config) -> Self {
info!("initializing path node");
- let mut path_node = Self::from(config.setup.working_dir.clone());
+ let mut path_node = Self::from(&config.setup.working_dir);
let path_node_compare = Self::get_path_node_compare(&config);
path_node.expand_dir(&TreeIndex::new(), path_node_compare);
@@ -72,17 +69,18 @@ impl PathNode {
let mut path_nodes = dirs
.unwrap()
- .map(|dir_entry| {
+ .filter_map(|dir_entry| {
let dir_entry = dir_entry.unwrap();
-
- PathNode {
+ let entry_name = dir_entry.file_name().into_string().unwrap();
+ (!self.gitignore.contains(&entry_name)).then(|| PathNode {
children: Vec::new(),
- display_text: dir_entry.file_name().into_string().unwrap(),
+ display_text: entry_name,
is_dir: dir_entry.path().is_dir(),
is_err: false,
is_expanded: false,
path: dir_entry.path(),
- }
+ gitignore: self.gitignore.clone(),
+ })
})
.collect::>();
diff --git a/src/utils.rs b/src/utils.rs
index f9f0d8f..6d8463a 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -1,19 +1,13 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2019-2022 golmman
+// Copyright (c) 2024 Awiteb
use log::info;
-use std::fs::File;
-use std::io::Read;
+use std::fs;
use std::panic::set_hook;
+use std::path::Path;
use std::process::exit;
-pub fn read_file(file_name: &str) -> std::io::Result {
- let mut file = File::open(file_name)?;
- let mut contents = String::new();
- file.read_to_string(&mut contents)?;
- Ok(contents)
-}
-
pub fn print_help() {
println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
println!(r#"usage: twilight-tree [--key1=value1 --key2=value2 ...]"#);
@@ -51,15 +45,6 @@ pub fn setup_logger() -> Result<(), fern::InitError> {
}
}));
- info!(
- r#"starting...
-
-_|_ o|o _ |__|_ _ _ ._ _ ._ _ _.._ _| _ ._
- |_\/\/|||(_|| ||_ (_(_)| | || | |(_|| |(_|(/_|
- _|
- "#
- );
-
info!("logger initialized");
Ok(())
@@ -77,3 +62,18 @@ pub fn get_config_dir() -> std::io::Result {
))
}
}
+
+pub fn parse_gitignore(gitignore_path: impl AsRef) -> Vec {
+ if Path::exists(gitignore_path.as_ref()) {
+ fs::read_to_string(&gitignore_path)
+ .map(|content| {
+ content
+ .split('\n')
+ .map(|path| path.trim_matches('/').to_owned())
+ .collect()
+ })
+ .unwrap_or_default()
+ } else {
+ Vec::new()
+ }
+}