fix: stop deleting $CARGO_HOME during uninstall#4861
Conversation
|
I think I may need more tests against this PR, this includes:
Should there be more tests? Please let me know @FranciscoTGouveia @rami3l . |
|
I've add more tests about the PR here. Please review. |
4a4880a to
971dffa
Compare
Avoid removing $CARGO_HOME when running uninstall cleanup. Combine all follow-up work for PR rust-lang#4861: - keep $CARGO_HOME/bin when it is non-empty - cover cargo bin cleanup behavior in uninstall tests - update uninstall cleanup comments and related docs - rename cleanup internals for clearer intent
Avoid removing $CARGO_HOME when running uninstall cleanup. Combine all follow-up work for PR rust-lang#4861: - keep $CARGO_HOME/bin when it is non-empty - cover cargo bin cleanup behavior in uninstall tests - update uninstall cleanup comments and related docs - rename cleanup internals for clearer intent
This comment has been minimized.
This comment has been minimized.
Avoid removing $CARGO_HOME when running uninstall cleanup. Combine all follow-up work for PR rust-lang#4861: - keep $CARGO_HOME/bin when it is non-empty - cover cargo bin cleanup behavior in uninstall tests - update uninstall cleanup comments and related docs - rename cleanup internals for clearer intent
Avoid removing $CARGO_HOME when running uninstall cleanup. Combine all follow-up work for PR rust-lang#4861: - keep $CARGO_HOME/bin when it is non-empty - cover cargo bin cleanup behavior in uninstall tests - update uninstall cleanup comments and related docs - rename cleanup internals for clearer intent
Avoid removing $CARGO_HOME when running uninstall cleanup. Combine all follow-up work for PR rust-lang#4861: - keep $CARGO_HOME/bin when it is non-empty - cover cargo bin cleanup behavior in uninstall tests - update uninstall cleanup comments and related docs - rename cleanup internals for clearer intent
af1c3ac to
60c433c
Compare
0677697 to
d5e6935
Compare
| // .. augmented with this SO answer | ||
| // https://stackoverflow.com/questions/10319526/understanding-a-self-deleting-program-in-c | ||
| pub(crate) fn clean_cargo_bin(process: &Process) -> Result<()> { | ||
| pub(crate) fn spawn_uninstall_gc(process: &Process) -> Result<()> { |
There was a problem hiding this comment.
Suggest moving this commit earlier in the series (maybe the very first) to make this more obvious during the changes made earlier.
| } | ||
|
|
||
| pub(crate) fn delete_rustup_and_cargo_home(process: &Process) -> Result<()> { | ||
| pub(crate) fn clean_cargo_bin(process: &Process) -> Result<()> { |
There was a problem hiding this comment.
I think this rename should be postponed until the commit where the change actually happens (from home to just bin).
There was a problem hiding this comment.
@djc For extra clarity for @Cloud0310, do you mean right before the commit X where the change happens, after X, or within X?
| /// 2. Remove other tools in $CARGO_HOME/bin, but skipping rustup binary file and links to rustup. | ||
| /// 3. If no `--no-modify-path` is passed $CARGO_HOME/bin, clean up $PATH. | ||
| /// 4. Remove $CARGO_HOME | ||
| /// 2. Remove rustup tool links. |
There was a problem hiding this comment.
In the commit "fix: preserve CARGO_HOME during uninstall", we are not deleting rustup tool links yet.
The comments should really reflect what the code is doing in that particular commit.
| info!("removing cargo home"); | ||
|
|
||
| // Delete everything in CARGO_HOME *except* the rustup bin | ||
|
|
||
| // First everything except the bin directory | ||
| let diriter = fs::read_dir(&cargo_home).map_err(|e| CliError::ReadDirError { | ||
| p: cargo_home.clone(), | ||
| source: e, | ||
| })?; | ||
| for dirent in diriter { | ||
| let dirent = dirent.map_err(|e| CliError::ReadDirError { | ||
| p: cargo_home.clone(), | ||
| source: e, | ||
| })?; | ||
| if dirent.file_name().to_str() != Some("bin") { | ||
| if dirent.path().is_dir() { | ||
| utils::remove_dir("cargo_home", &dirent.path())?; | ||
| } else { | ||
| utils::remove_file("cargo_home", &dirent.path())?; | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
@Cloud0310 Really sorry for the back and forth, what you have implemented here matches the expected semantics in a future version, there's nothing wrong about it; but I think it might cause a downgrade in terms of UX within the scope of this PR, so it would be better if:
- The code that "removes everything except the bin directory" is kept;
- The code that "removes everything in bin except rustup and tools" is removed as you are doing right now.
When we move further into XDG support it is indeed intended to do this more precisely, but for now it might still feel surprising if self uninstall is not removing a bunch of cargo-specific stuff.
The comments and the tests should be updated accordingly.
My apologies for not having noticed this in advance 🙏
| info!("removing empty cargo bin directory `{cargo_bin_path_display}`"); | ||
|
|
||
| let Err(e) = fs::remove_dir(&cargo_bin_path) else { | ||
| if !no_modify_path { |
There was a problem hiding this comment.
Similar to 6aa45d2 (this PR), the user might want to see $CARGO_HOME being removed if it ends up empty at this point. In most cases this will be a no-op.
fix #285
This PR fix the cargo bin nuke and the path removing possilble toutoc issue.
Here's the implementation details:
This prevents
rustup self uninstallfrom nuking out the$CARGO_HOME/binand possible toctou problem of removing up the path.