Created
April 14, 2016 21:52
-
-
Save metavida/4a408cf0bb01b54135cf6b2bb6499828 to your computer and use it in GitHub Desktop.
Attempting to determine FileUtils.rm_rf behavior when symlinks are involved
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
require 'fileutils' | |
@basedir = "/tmp/symlink_test" | |
def print_dir | |
Dir.glob('./**/*').each do |path| | |
if File.symlink?(path) | |
puts "#{path} -> #{File.readlink(path)}" | |
else | |
puts path | |
end | |
end | |
nil | |
end | |
def recreate_base_structure | |
FileUtils.mkdir_p @basedir | |
FileUtils.cd @basedir | |
FileUtils.mkdir_p("foo/fizz") | |
FileUtils.touch("foo/a.txt") | |
FileUtils.touch("foo/fizz/a.txt") | |
end | |
# Case 1: create a dir with a symlink to a file | |
recreate_base_structure | |
FileUtils.mkdir_p("bar") | |
FileUtils.ln_sf(File.join(@basedir, "foo/a.txt"), "bar/b.txt") | |
print_dir | |
# ./bar | |
# ./bar/b.txt -> /tmp/symlink_test/foo/a.txt | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# rm_rf the dir with the symlink | |
FileUtils.rm_rf("bar") | |
print_dir | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# Result 1: dst files remain | |
# Cast 2: create a dir with a symlink to a dir | |
recreate_base_structure | |
FileUtils.mkdir_p("bar") | |
FileUtils.ln_sf(File.join(@basedir, "foo"), "bar/baz") | |
print_dir | |
# ./bar | |
# ./bar/baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# rm_rf the dir with the symlink | |
FileUtils.rm_rf("bar") | |
print_dir | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# Result 2: dst files remain | |
# Case 3: create a symlink to a dir | |
recreate_base_structure | |
FileUtils.ln_sf(File.join(@basedir, "foo"), "baz") unless File.symlink?("baz") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# rm_rf the symlink | |
FileUtils.rm_rf("baz") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# Result 3: dst files remain | |
# Case 4: create a symlink to a dir | |
recreate_base_structure | |
FileUtils.ln_sf(File.join(@basedir, "foo"), "baz") unless File.symlink?("baz") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# rm_rf the symlink with a trailing slash | |
FileUtils.rm_rf("baz/") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# Result 4: !!! WARNING dst file deleted !!! | |
# Case 5: create a symlink to a dir | |
recreate_base_structure | |
FileUtils.ln_sf(File.join(@basedir, "foo"), "baz") unless File.symlink?("baz") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# rm_rf the symlink with a trailing slash+star | |
FileUtils.rm_rf("baz/*") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# Result 5: dst files remain | |
# Case 6: create a symlink to a dir | |
recreate_base_structure | |
FileUtils.ln_sf(File.join(@basedir, "foo"), "baz") unless File.symlink?("baz") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# rm_rf the symlink with a dir-recursive star | |
FileUtils.rm_rf("baz/**/*") | |
print_dir | |
# ./baz -> /tmp/symlink_test/foo | |
# ./foo | |
# ./foo/a.txt | |
# ./foo/fizz | |
# ./foo/fizz/a.txt | |
# Result 6: dst files remain |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment