Fix file-not-found errors when handling broken symlinks#87
Merged
SuperCuber merged 2 commits intoSuperCuber:masterfrom Nov 10, 2021
Merged
Fix file-not-found errors when handling broken symlinks#87SuperCuber merged 2 commits intoSuperCuber:masterfrom
SuperCuber merged 2 commits intoSuperCuber:masterfrom
Conversation
Call real_path in filesystem::compare_symlink instead of at its call-sites in filesystem::RealFilesystem::compare_symlink and filesystem::DryRunFilesystem::compare_symlink, to avoid real_path being called unnecessarily and in particular when the path refers to a non-existent file, which would cause an unhandled error. This error would occur when deleting a file from within a source directory and running dotter deploy; instead of deleting the corresponding (now-broken) symlink, dotter would crash. This is not the only cause for this crash, unfortunately. I have not tested the changes to Windows code, but the only difference is a pair of logging macros, so I can't see this causing problems.
Use symlink_metadata() instead of metadata() to avoid errors when the file in question is a broken symlink. If path points to a symlink, the is_dir() check would return whether the link target is a directory, rather than returning false (as symlinks are not dirs), but thankfully remove_dir_all removes the link rather than recursively removing the link target in this case. I'm not certain this could actually happen in practice though, as Dotter generally checks things before calling remove_file() and does not currently create symlinks to directories.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
If a directory
source_direxists and contains a filefoo, and Dotter's config containssource_dir = "target_dir", Dotter will createtarget_dirand linktarget_dir/footosource_dir/foo. Ifsource_dir/foois then deleted,dotter deploywill fail:I believe this is the same problem reported by @lumbo7332 in #55 (comment), and this PR should fix it. It does not address #55 itself, as that seems to be caused by Dotter not handling nonexistent source files gracefully, rather than anything to do with broken symlinks.
As one of my commit messages says, this contains a very minor change to Windows-specific code which I have not tested. This change, however, mirrors the change to the corresponding non-Windows function verbatim (the code could be DRY-er, apparently, but that's an issue for another PR) and so I would be very surprised if it causes any issue.