Merge pull request #1743 from toonetown/robust-pkgutil-cleanup

Delete pkgutil directories that are really files.
This commit is contained in:
Markus Reiter 2017-02-04 23:53:16 +01:00 committed by GitHub
commit 33fa80944e
2 changed files with 30 additions and 5 deletions

View File

@ -26,6 +26,7 @@ module Hbc
_deepest_path_first(pkgutil_bom_dirs).each do |dir|
next unless dir.exist? && !MacOS.undeletable?(dir)
_with_full_permissions(dir) do
_delete_broken_file_dir(dir) && next
_clean_broken_symlinks(dir)
_clean_ds_store(dir)
_rmdir(dir)
@ -97,6 +98,13 @@ module Hbc
end
end
# Some pkgs incorrectly report files (generally nibs)
# as directories; we remove these as files instead.
def _delete_broken_file_dir(path)
return unless path.file? && !path.symlink?
@command.run!("/bin/rm", args: ["-f", "--", path], sudo: true)
end
# Some pkgs leave broken symlinks hanging around; we clean them out before
# attempting to rmdir to prevent extra cruft from lying around after
# uninstall

View File

@ -5,13 +5,13 @@ describe Hbc::Pkg do
it "removes files and dirs referenced by the pkg" do
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
some_files = Array.new(3) { Pathname(Tempfile.new("testfile").path) }
some_files = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
pkg.stubs(:pkgutil_bom_files).returns some_files
some_specials = Array.new(3) { Pathname(Tempfile.new("testfile").path) }
some_specials = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
pkg.stubs(:pkgutil_bom_specials).returns some_specials
some_dirs = Array.new(3) { Pathname(Dir.mktmpdir) }
some_dirs = Array.new(3) { Pathname.new(Dir.mktmpdir) }
pkg.stubs(:pkgutil_bom_dirs).returns some_dirs
pkg.stubs(:forget)
@ -50,7 +50,7 @@ describe Hbc::Pkg do
it "cleans broken symlinks, but leaves AOK symlinks" do
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
fake_dir = Pathname(Dir.mktmpdir)
fake_dir = Pathname.new(Dir.mktmpdir)
fake_file = fake_dir.join("ima_file").tap { |path| FileUtils.touch(path) }
intact_symlink = fake_dir.join("intact_symlink").tap { |path| path.make_symlink(fake_file) }
@ -68,10 +68,27 @@ describe Hbc::Pkg do
fake_dir.must_be :exist?
end
it "cleans files incorrectly reported as directories" do
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
fake_dir = Pathname.new(Dir.mktmpdir)
fake_file = fake_dir.join("ima_file_pretending_to_be_a_dir").tap { |path| FileUtils.touch(path) }
pkg.stubs(:pkgutil_bom_specials).returns([])
pkg.stubs(:pkgutil_bom_files).returns([])
pkg.stubs(:pkgutil_bom_dirs).returns([fake_file, fake_dir])
pkg.stubs(:forget)
pkg.uninstall
fake_file.wont_be :exist?
fake_dir.wont_be :exist?
end
it "snags permissions on ornery dirs, but returns them afterwords" do
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
fake_dir = Pathname(Dir.mktmpdir)
fake_dir = Pathname.new(Dir.mktmpdir)
fake_file = fake_dir.join("ima_installed_file").tap { |path| FileUtils.touch(path) }