Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"kondo ." does not work inside $HOME #55

Open
matthiaskrgr opened this issue Jan 6, 2022 · 14 comments
Open

"kondo ." does not work inside $HOME #55

matthiaskrgr opened this issue Jan 6, 2022 · 14 comments

Comments

@matthiaskrgr
Copy link

matthiaskrgr commented Jan 6, 2022

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 @ 71d7539

@tbillington
Copy link
Owner

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
Copy link
Owner

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

@matthiaskrgr
Copy link
Author

matthiaskrgr commented Jan 9, 2022

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.

@mainrs
Copy link

mainrs commented Aug 3, 2022

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

@tbillington
Copy link
Owner

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

let cd = current_dir()?;

@mainrs
Copy link

mainrs commented Aug 5, 2022

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

@tbillington
Copy link
Owner

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

pub fn path_canonicalise(

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

@matthiaskrgr
Copy link
Author

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
Copy link
Author

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 🤔

[kondo/src/main.rs:85] project_artifact_bytes == 0 = true

@matthiaskrgr
Copy link
Author

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
Copy link
Author

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?

@tbillington
Copy link
Owner

Thank you for digging into this @matthiaskrgr . I think you've stumbled onto this issue: #29 and #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?

@matthiaskrgr
Copy link
Author

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

@tbillington
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants