Skip to content

Commit

Permalink
Merge pull request #87 from volllly/fix/dot-filtering
Browse files Browse the repository at this point in the history
Fix of dots filtering not working
  • Loading branch information
volllly authored Sep 12, 2022
2 parents 91a3c33 + 9baea69 commit 7a8ba14
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 57 deletions.
11 changes: 9 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.7.0] - 2022-09-09
## [0.7.1] - 2022-09-12

### Fixed

- Filtering of dots in commands was not working correctly

## [0.7.0] - 2022-09-11

### Changes

Expand Down Expand Up @@ -146,7 +152,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Dotfile linking
- Error handling

[Unreleased]: https://github.com/volllly/rotz/compare/v0.7.0...HEAD
[Unreleased]: https://github.com/volllly/rotz/compare/v0.7.1...HEAD
[0.7.1]: https://github.com/volllly/rotz/releases/tag/v0.7.1
[0.7.0]: https://github.com/volllly/rotz/releases/tag/v0.7.0
[0.6.1]: https://github.com/volllly/rotz/releases/tag/v0.6.1
[0.6.0]: https://github.com/volllly/rotz/releases/tag/v0.6.0
Expand Down
38 changes: 19 additions & 19 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rotz"
version = "0.7.0"
version = "0.7.1"
edition = "2021"
authors = ["Paul Volavsek <paul.volavsek@gmail.com>"]
license = "MIT"
Expand Down Expand Up @@ -32,7 +32,7 @@ crossterm = "0.25.0"
itertools = "0.10.3"
thiserror = "1.0.34"
somok = "1.5.0"
miette = { version = "5.3.1", features = ["fancy"] }
miette = { version = "5.3.0", features = ["fancy"] }
baker = "0.1.2"
indexmap = "1.9.1"
handlebars = "4.3.4"
Expand All @@ -41,7 +41,7 @@ shellwords = "1.1.0"
path-absolutize = "3.0.13"
walkdir = "2.3.2"
wax = { version = "0.5.0", features = ["miette"] }
whoami = "1.2.1"
whoami = "1.2.2"
path-slash = "0.2.1"
velcro = "0.5.3"

Expand Down
2 changes: 1 addition & 1 deletion src/commands/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ impl Command for Install {
type Result = Result<()>;

fn execute(&self, (globals, install_command): Self::Args) -> Self::Result {
let dots = crate::dot::read_dots(&self.config.dotfiles, &["**".to_owned()], &self.config)?
let dots = crate::dot::read_dots(&self.config.dotfiles, &["/**".to_owned()], &self.config)?
.into_iter()
.filter(|d| d.1.installs.is_some() || d.1.depends.is_some())
.map(|d| (d.0, (d.1.installs, d.1.depends)))
Expand Down
63 changes: 35 additions & 28 deletions src/dot/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -433,42 +433,23 @@ pub enum Error {
}

pub fn read_dots(dotfiles_path: &Path, dots: &[String], config: &Config) -> miette::Result<Vec<(String, Dot)>> {
let mut defaults = helpers::get_file_with_format(dotfiles_path, "dots");
if let Some(defaults) = &defaults {
let path = defaults.0.to_string_lossy().to_string();
println!(
"Warning: {:?}",
Report::new(Error::DotsDeprecated(defaults.1.to_string(), (path.rfind("dots").unwrap(), "dots".len()).into(), path))
);
} else {
defaults = helpers::get_file_with_format(dotfiles_path, "dots");
}

let defaults = if let Some(defaults) = defaults {
match fs::read_to_string(defaults.0) {
Ok(text) => (text, defaults.1).some(),
Err(err) => match err.kind() {
std::io::ErrorKind::NotFound => None,
_ => Error::ReadingDot(err).error()?,
},
}
} else {
None
};
let defaults = get_defaults(dotfiles_path)?;

let dots = helpers::glob_from_vec(dots, &format!("/dot.{FILE_EXTENSIONS_GLOB}"))?;

let paths = WalkDir::new(&dotfiles_path)
.into_iter()
.filter_ok(|e| !e.file_type().is_dir())
.map(|d| match d {
Ok(d) => d.path().strip_prefix(dotfiles_path).map(Path::to_path_buf).map_err(Error::PathStrip),
Err(err) => Error::WalkingDotfiles(err).error(),
.map(|d| -> Result<(std::string::String, std::path::PathBuf), Error> {
let d = d.map_err(Error::WalkingDotfiles)?;
let path = d.path().strip_prefix(dotfiles_path).map(Path::to_path_buf).map_err(Error::PathStrip)?;
let absolutized = helpers::absolutize_virtually(&path).map_err(|e| Error::ParseName(path.to_string_lossy().to_string(), e))?;
Ok((absolutized, path))
})
.filter_ok(|e| dots.is_match(e.as_path()))
.filter_ok(|e| dots.is_match(e.0.as_str()))
.map_ok(|e| {
let format = FileFormat::try_from(e.as_path()).unwrap();
(e, format)
let format = FileFormat::try_from(e.1.as_path()).unwrap();
(e.1, format)
});

let dotfiles = crate::helpers::join_err_result(paths.collect())?
Expand Down Expand Up @@ -538,6 +519,32 @@ pub fn read_dots(dotfiles_path: &Path, dots: &[String], config: &Config) -> miet
dots.okay()
}

fn get_defaults(dotfiles_path: &Path) -> Result<Option<(String, FileFormat)>, Error> {
let mut defaults = helpers::get_file_with_format(dotfiles_path, "dots");
if let Some(defaults) = &defaults {
let path = defaults.0.to_string_lossy().to_string();
println!(
"Warning: {:?}",
Report::new(Error::DotsDeprecated(defaults.1.to_string(), (path.rfind("dots").unwrap(), "dots".len()).into(), path))
);
} else {
defaults = helpers::get_file_with_format(dotfiles_path, "dots");
}

if let Some(defaults) = defaults {
match fs::read_to_string(defaults.0) {
Ok(text) => (text, defaults.1).some(),
Err(err) => match err.kind() {
std::io::ErrorKind::NotFound => None,
_ => Error::ReadingDot(err).error()?,
},
}
} else {
None
}
.okay()
}

fn canonicalize_dots(dots: Vec<(String, Dot)>) -> Result<Vec<(String, Dot)>, helpers::MultipleErrors> {
let dots = dots.into_iter().map(|mut dot| {
let name = helpers::absolutize_virtually(Path::new(&dot.0)).map_err(|e| Error::ParseName(dot.0.clone(), e))?;
Expand Down
13 changes: 9 additions & 4 deletions src/dot/test/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ mod data;

#[test]
fn read_all_dots() {
let dots = read_dots(Path::new(file!()).parent().unwrap().join("data/directory_structure").as_path(), &["**".to_owned()], &Default::default()).unwrap();
let dots = read_dots(
Path::new(file!()).parent().unwrap().join("data/directory_structure").as_path(),
&["/**".to_owned()],
&Default::default(),
)
.unwrap();

assert_that!(dots).has_length(4);
assert_that!(dots).mapped_contains(|d| &d.0, &"/test01");
Expand Down Expand Up @@ -40,7 +45,7 @@ fn read_all_dots() {
fn read_sub_dots() {
let dots = read_dots(
Path::new(file!()).parent().unwrap().join("data/directory_structure").as_path(),
&["test03/*".to_owned()],
&["/test03/*".to_owned()],
&Default::default(),
)
.unwrap();
Expand All @@ -52,7 +57,7 @@ fn read_sub_dots() {

#[test]
fn read_non_sub_dots() {
let dots = read_dots(Path::new(file!()).parent().unwrap().join("data/directory_structure").as_path(), &["*".to_owned()], &Default::default()).unwrap();
let dots = read_dots(Path::new(file!()).parent().unwrap().join("data/directory_structure").as_path(), &["/*".to_owned()], &Default::default()).unwrap();

assert_that!(dots).has_length(2);
assert_that!(dots).mapped_contains(|d| &d.0, &"/test01");
Expand All @@ -61,7 +66,7 @@ fn read_non_sub_dots() {

#[test]
fn read_all_file_formats() {
let dots = read_dots(Path::new(file!()).parent().unwrap().join("data/file_formats").as_path(), &["**".to_owned()], &Default::default()).unwrap();
let dots = read_dots(Path::new(file!()).parent().unwrap().join("data/file_formats").as_path(), &["/**".to_owned()], &Default::default()).unwrap();

assert_that!(dots).has_length(3);
assert_that!(dots).mapped_contains(|d| &d.0, &"/test01");
Expand Down

0 comments on commit 7a8ba14

Please sign in to comment.