Fix Pkg#uninstall not calling MacOS.undeletable? for all files.
				
					
				
			This commit is contained in:
		
							parent
							
								
									c2cbfc1526
								
							
						
					
					
						commit
						ffc47388bd
					
				@ -16,19 +16,17 @@ module Hbc
 | 
			
		||||
    def uninstall
 | 
			
		||||
      unless pkgutil_bom_files.empty?
 | 
			
		||||
        odebug "Deleting pkg files"
 | 
			
		||||
        @command.run("/usr/bin/xargs", args: ["-0", "--", "/bin/rm", "--"], input: pkgutil_bom_files.join("\0"), sudo: true)
 | 
			
		||||
        @command.run!("/usr/bin/xargs", args: ["-0", "--", "/bin/rm", "--"], input: pkgutil_bom_files.join("\0"), sudo: true)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      unless pkgutil_bom_specials.empty?
 | 
			
		||||
        odebug "Deleting pkg symlinks and special files"
 | 
			
		||||
        @command.run("/usr/bin/xargs", args: ["-0", "--", "/bin/rm", "--"], input: pkgutil_bom_specials.join("\0"), sudo: true)
 | 
			
		||||
        @command.run!("/usr/bin/xargs", args: ["-0", "--", "/bin/rm", "--"], input: pkgutil_bom_specials.join("\0"), sudo: true)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      unless pkgutil_bom_dirs.empty?
 | 
			
		||||
        odebug "Deleting pkg directories"
 | 
			
		||||
        deepest_path_first(pkgutil_bom_dirs).each do |dir|
 | 
			
		||||
          next if MacOS.undeletable?(dir)
 | 
			
		||||
 | 
			
		||||
          with_full_permissions(dir) do
 | 
			
		||||
            clean_broken_symlinks(dir)
 | 
			
		||||
            clean_ds_store(dir)
 | 
			
		||||
@ -67,6 +65,7 @@ module Hbc
 | 
			
		||||
                                   .stdout
 | 
			
		||||
                                   .split("\n")
 | 
			
		||||
                                   .map { |path| root.join(path) }
 | 
			
		||||
                                   .reject(&MacOS.public_method(:undeletable?))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def root
 | 
			
		||||
 | 
			
		||||
@ -5,16 +5,16 @@ describe Hbc::Pkg, :cask do
 | 
			
		||||
    let(:pkg) { described_class.new("my.fake.pkg", fake_system_command) }
 | 
			
		||||
 | 
			
		||||
    it "removes files and dirs referenced by the pkg" do
 | 
			
		||||
      some_files = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
 | 
			
		||||
      some_files = Array.new(3) { Pathname.new(Tempfile.new("plain_file").path) }
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_files).and_return(some_files)
 | 
			
		||||
 | 
			
		||||
      some_specials = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
 | 
			
		||||
      some_specials = Array.new(3) { Pathname.new(Tempfile.new("special_file").path) }
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_specials).and_return(some_specials)
 | 
			
		||||
 | 
			
		||||
      some_dirs = Array.new(3) { Pathname.new(Dir.mktmpdir) }
 | 
			
		||||
      some_dirs = Array.new(3) { mktmpdir }
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_dirs).and_return(some_dirs)
 | 
			
		||||
 | 
			
		||||
      root_dir = Pathname.new(Dir.mktmpdir)
 | 
			
		||||
      root_dir = Pathname.new(mktmpdir)
 | 
			
		||||
      allow(pkg).to receive(:root).and_return(root_dir)
 | 
			
		||||
 | 
			
		||||
      allow(pkg).to receive(:forget)
 | 
			
		||||
@ -55,8 +55,8 @@ describe Hbc::Pkg, :cask do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "removes broken symlinks" do
 | 
			
		||||
      fake_dir  = Pathname.new(Dir.mktmpdir)
 | 
			
		||||
      fake_root = Pathname.new(Dir.mktmpdir)
 | 
			
		||||
      fake_root = mktmpdir
 | 
			
		||||
      fake_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) }
 | 
			
		||||
@ -77,13 +77,13 @@ describe Hbc::Pkg, :cask do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "snags permissions on ornery dirs, but returns them afterwards" do
 | 
			
		||||
      fake_root = Pathname.new(Dir.mktmpdir)
 | 
			
		||||
      fake_dir = Pathname.new(Dir.mktmpdir)
 | 
			
		||||
      fake_file = fake_dir.join("ima_installed_file").tap { |path| FileUtils.touch(path) }
 | 
			
		||||
      fake_root = mktmpdir
 | 
			
		||||
      fake_dir = mktmpdir
 | 
			
		||||
      fake_file = fake_dir.join("ima_unrelated_file").tap { |path| FileUtils.touch(path) }
 | 
			
		||||
      fake_dir.chmod(0000)
 | 
			
		||||
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_files).and_return([fake_file])
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_files).and_return([])
 | 
			
		||||
      allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_dir])
 | 
			
		||||
      allow(pkg).to receive(:root).and_return(fake_root)
 | 
			
		||||
      allow(pkg).to receive(:forget)
 | 
			
		||||
@ -91,8 +91,12 @@ describe Hbc::Pkg, :cask do
 | 
			
		||||
      pkg.uninstall
 | 
			
		||||
 | 
			
		||||
      expect(fake_dir).to be_a_directory
 | 
			
		||||
      expect(fake_file).not_to be_a_file
 | 
			
		||||
      expect((fake_dir.stat.mode % 01000).to_s(8)).to eq("0")
 | 
			
		||||
      expect((fake_dir.stat.mode % 01000)).to eq(0)
 | 
			
		||||
 | 
			
		||||
      fake_dir.chmod(0777)
 | 
			
		||||
      expect(fake_file).to be_a_file
 | 
			
		||||
 | 
			
		||||
      FileUtils.rm_r fake_dir
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user