kondo
kondo copied to clipboard
"kondo ." does not work inside $HOME
When cwd is the root of my home directory (~
) and I run kondo
or kondo .
, it just displays Total bytes deleted: 0.0B
and does not even start searching through any directories it looks like.
kondo 0.4.0
edit: same with kondo @ 71d75390f1aa3d5a298e0c086643805cd032c664
That doesn't sound good! Which OS are you on?
Also, does it find the project when you supply a path of a project as an argument?
If you'd like to have a crack at debugging it, you can put this statement in between these two lines then run from root of kondo
cargo run -- ~
(or whichever path to test)
println!("{}", entry.path().to_string_lossy());
https://github.com/tbillington/kondo/blob/master/kondo-lib/src/lib.rs#L221-L222
kondo .
[kondo-lib/src/lib.rs:223] entry.path() = "/home/matthias"
[kondo-lib/src/lib.rs:224] entry.path().read_dir() = Ok(
ReadDir(
"/home/matthias",
),
)
Projects cleaned: 0, Bytes deleted: 0.0B
I can also see that the for dir_entry in rd.filter_map(|rd| rd.ok()).map(|de| de.file_name()) {
loop loops through all entries at home directory root level.
I'm on majaro linux.
When I use "kondo ." from a different directory, or "kondo some/directory/" from withing my home directory root, it works fine.
It does not work in NixOS as well. However, I am actually not inside home but a subdirectory: /home/user/dev/
. Output is only Projects cleaned: 0, Bytes deleted: 0.0B
. 0.4.0 ..
Hmm, are you supplying the path, or relying on kondo detecting the current dir? If you don't supply the path it will fall back to std::env::current_dir
https://doc.rust-lang.org/stable/std/env/fn.set_current_dir.html#platform-specific-behavior
https://github.com/tbillington/kondo/blob/72f9b5cdc3dd4c1ac85a09351eb1006e979ef0b4/kondo/src/main.rs#L32
@tbillington I used kondo .
as the command. And my current directory was /home/user/dev
.
Hmmm, potentially some combo with current env..
If it's not an absolute path according to std it will join it with what std detects as the current env...
https://github.com/tbillington/kondo/blob/72f9b5cdc3dd4c1ac85a09351eb1006e979ef0b4/kondo-lib/src/lib.rs#L358
If you have the rust toolchain could you please modify prepare_dictionaries
like this and see what it says? Apologies I don't have your system/OS combo to test with.
fn prepare_directories(dirs: Vec<PathBuf>) -> Result<Vec<PathBuf>, Box<dyn Error>> {
let cd = dbg!(current_dir()?);
if dirs.is_empty() {
return Ok(vec![cd]);
}
dirs.into_iter()
.map(|d| dbg!(path_canonicalise(&cd, d)))
.collect()
}
Hmm, I can see that in both case, kondo
and kondo .
inside $HOME, prepare_directories
returns the same path /home/matthias
~/vcs/github/kondo/target/debug/kondo
[kondo/src/main.rs:34] Ok(vec![cd]) = Ok(
[
"/home/matthias",
],
)
Projects cleaned: 0, Bytes deleted: 0.0B
~/vcs/github/kondo/target/debug/kondo .
[kondo/src/main.rs:37] dirs.into_iter().map(|d| path_canonicalise(&cd, d)).collect() = Ok(
[
"/home/matthias",
],
)
Projects cleaned: 0, Bytes deleted: 0.0B
Mmh, it seems that in both cases, project_artifact_bytes
is actually zero, so we enter the "continue" and don't do any cleaning at all :thinking:
[kondo/src/main.rs:85] project_artifact_bytes == 0 = true
Oooh!
[kondo/src/main.rs:37] dirs.into_iter().map(|d| path_canonicalise(&cd, d)).collect() = Ok(
[
"/home/matthias",
],
)
[kondo/src/main.rs:64] p.ok() = Some(
Project {
project_type: Node,
path: "/home/matthias",
},
)
[kondo/src/main.rs:67] &project = Project {
project_type: Node,
path: "/home/matthias",
}
[kondo/src/main.rs:86] project_artifact_bytes == 0 = true
Projects cleaned: 0, Bytes deleted: 0.0B
So I guess what happens is, kondo searches for a directory, and checks if it is some kind of project directory IF IT IS NOT it recurses into it and walks it recursively BUT IF IT IS, it is marked for cache-scrubbing or something.
I assume in my case, I have something in my $HOME root that makes kondo think "this is a node project!" so it tries to delete whatever node uses as target-dir equivalent (compared to rust), fails and then gives up, because it only had that one "project" to check?
The solution might be still recurse into project directories and look for further project dirs, even after we deleted whatever cache there was in..?
So I have not tried this, but you can probably also confuse kondo by adding something like a Cargo.toml
into your home and then running kondo ~
which might also prevent it from recursing?
Thank you for digging into this @matthiaskrgr . I think you've stumbled onto this issue: https://github.com/tbillington/kondo/issues/29 and https://github.com/tbillington/kondo/pull/32.
As you've discovered, kondo bails when it detects a directory as a project, and won't recurse further.
In a much earlier version the behaviour was the opposite. However, certain types of projects, like node
will recursively have projects within them that look like normal projects, which caused an explosion of output and made the tool unusable.
There is a middle ground where you recurse directories that aren't marked as artifact directories, however I just haven't spent the time to sit down and refactor the walking logic to support that yet.
Do you have any thoughts on how you'd prefer it act in this situation?
I guess we could treat directories that we get passed explicitly such as .
, ~
, some/path/
special and still walk them recursively BUT also print a warning at the same time that this was found to be a project directory:
Warning: recursing int rust project dir '.' because it was passed explicitly
@matthiaskrgr I think that would be too opinionated. I commonly run kondo while in a project directory I want to clean/check, or pass the project dir to kondo like kondo my_proj
.