kondo icon indicating copy to clipboard operation
kondo copied to clipboard

"kondo ." does not work inside $HOME

Open matthiaskrgr opened this issue 3 years ago • 14 comments

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

matthiaskrgr avatar Jan 06 '22 20:01 matthiaskrgr

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?

tbillington avatar Jan 09 '22 06:01 tbillington

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

tbillington avatar Jan 09 '22 06:01 tbillington

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.

matthiaskrgr avatar Jan 09 '22 06:01 matthiaskrgr

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 ..

mainrs avatar Aug 03 '22 16:08 mainrs

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 avatar Aug 05 '22 00:08 tbillington

@tbillington I used kondo . as the command. And my current directory was /home/user/dev.

mainrs avatar Aug 05 '22 09:08 mainrs

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()
}

tbillington avatar Aug 05 '22 10:08 tbillington

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

matthiaskrgr avatar Aug 06 '22 19:08 matthiaskrgr

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

matthiaskrgr avatar Aug 06 '22 19:08 matthiaskrgr

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..?

matthiaskrgr avatar Aug 06 '22 19:08 matthiaskrgr

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?

matthiaskrgr avatar Aug 06 '22 19:08 matthiaskrgr

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?

tbillington avatar Aug 07 '22 03:08 tbillington

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 avatar Oct 08 '22 12:10 matthiaskrgr

@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.

tbillington avatar Mar 05 '23 07:03 tbillington