diff --git a/Library/Homebrew/test/unpack_strategy/directory_spec.rb b/Library/Homebrew/test/unpack_strategy/directory_spec.rb index 1207454aec..dc321a4644 100644 --- a/Library/Homebrew/test/unpack_strategy/directory_spec.rb +++ b/Library/Homebrew/test/unpack_strategy/directory_spec.rb @@ -9,6 +9,8 @@ describe UnpackStrategy::Directory do mktmpdir.tap do |path| FileUtils.touch path/"file" FileUtils.ln_s "file", path/"symlink" + FileUtils.mkdir path/"folder" + FileUtils.ln_s "folder", path/"folderSymlink" end } @@ -19,6 +21,11 @@ describe UnpackStrategy::Directory do expect(unpack_dir/"symlink").to be_a_symlink end + it "does not follow top level symlinks to directories" do + strategy.extract(to: unpack_dir) + expect(unpack_dir/"folderSymlink").to be_a_symlink + end + it "preserves permissions of contained files" do FileUtils.chmod 0644, path/"file" diff --git a/Library/Homebrew/unpack_strategy/directory.rb b/Library/Homebrew/unpack_strategy/directory.rb index 66353f279d..d749339835 100644 --- a/Library/Homebrew/unpack_strategy/directory.rb +++ b/Library/Homebrew/unpack_strategy/directory.rb @@ -19,7 +19,8 @@ module UnpackStrategy def extract_to_dir(unpack_dir, basename:, verbose:) path.children.each do |child| system_command! "cp", - args: ["-pR", child.directory? ? "#{child}/." : child, unpack_dir/child.basename], + args: ["-pR", (child.directory? && !child.symlink?) ? "#{child}/." : child, + unpack_dir/child.basename], verbose: verbose end end