2019-04-19 15:38:03 +09:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-02-27 11:28:12 +01:00
|
|
|
require "cleaner"
|
|
|
|
require "formula"
|
|
|
|
|
2024-02-18 15:11:11 -08:00
|
|
|
RSpec.describe Cleaner do
|
2017-02-27 11:28:12 +01:00
|
|
|
include FileUtils
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
describe "#clean" do
|
|
|
|
subject(:cleaner) { described_class.new(f) }
|
2018-03-25 13:30:37 +01:00
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
let(:f) { formula("cleaner_test") { url "foo-1.0" } }
|
2017-02-27 11:28:12 +01:00
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
before do
|
|
|
|
f.prefix.mkpath
|
|
|
|
end
|
2017-02-27 11:28:12 +01:00
|
|
|
|
2017-11-29 18:27:16 +00:00
|
|
|
it "cleans files" do
|
2017-02-27 11:28:12 +01:00
|
|
|
f.bin.mkpath
|
|
|
|
f.lib.mkpath
|
|
|
|
|
2017-11-29 18:27:16 +00:00
|
|
|
if OS.mac?
|
|
|
|
cp "#{TEST_FIXTURE_DIR}/mach/a.out", f.bin
|
|
|
|
cp Dir["#{TEST_FIXTURE_DIR}/mach/*.dylib"], f.lib
|
|
|
|
elsif OS.linux?
|
|
|
|
cp "#{TEST_FIXTURE_DIR}/elf/hello", f.bin
|
|
|
|
cp Dir["#{TEST_FIXTURE_DIR}/elf/libhello.so.0"], f.lib
|
|
|
|
end
|
2017-03-14 22:38:43 -07:00
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-03-14 22:38:43 -07:00
|
|
|
|
2017-11-29 18:27:16 +00:00
|
|
|
if OS.mac?
|
|
|
|
expect((f.bin/"a.out").stat.mode).to eq(0100555)
|
|
|
|
expect((f.lib/"fat.dylib").stat.mode).to eq(0100444)
|
|
|
|
expect((f.lib/"x86_64.dylib").stat.mode).to eq(0100444)
|
|
|
|
expect((f.lib/"i386.dylib").stat.mode).to eq(0100444)
|
|
|
|
elsif OS.linux?
|
|
|
|
expect((f.bin/"hello").stat.mode).to eq(0100555)
|
|
|
|
expect((f.lib/"libhello.so.0").stat.mode).to eq(0100555)
|
|
|
|
end
|
2017-03-14 22:38:43 -07:00
|
|
|
end
|
|
|
|
|
2017-02-27 11:28:12 +01:00
|
|
|
it "prunes the prefix if it is empty" do
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
expect(f.prefix).not_to be_a_directory
|
|
|
|
end
|
|
|
|
|
|
|
|
it "prunes empty directories" do
|
|
|
|
subdir = f.bin/"subdir"
|
|
|
|
subdir.mkpath
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(f.bin).not_to be_a_directory
|
|
|
|
expect(subdir).not_to be_a_directory
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes a symlink when its target was pruned before" do
|
|
|
|
dir = f.prefix/"b"
|
|
|
|
symlink = f.prefix/"a"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
ln_s dir.basename, symlink
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(dir).not_to exist
|
|
|
|
expect(symlink).not_to be_a_symlink
|
|
|
|
expect(symlink).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes symlinks pointing to an empty directory" do
|
|
|
|
dir = f.prefix/"b"
|
|
|
|
symlink = f.prefix/"c"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
ln_s dir.basename, symlink
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(dir).not_to exist
|
|
|
|
expect(symlink).not_to be_a_symlink
|
|
|
|
expect(symlink).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes broken symlinks" do
|
|
|
|
symlink = f.prefix/"symlink"
|
|
|
|
ln_s "target", symlink
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(symlink).not_to be_a_symlink
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes '.la' files" do
|
|
|
|
file = f.lib/"foo.la"
|
|
|
|
|
2022-04-28 10:21:13 -04:00
|
|
|
file.dirname.mkpath
|
2017-02-27 11:28:12 +01:00
|
|
|
touch file
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes 'perllocal' files" do
|
|
|
|
file = f.lib/"perl5/darwin-thread-multi-2level/perllocal.pod"
|
|
|
|
|
2022-04-28 10:21:13 -04:00
|
|
|
file.dirname.mkpath
|
2017-02-27 11:28:12 +01:00
|
|
|
touch file
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes '.packlist' files" do
|
|
|
|
file = f.lib/"perl5/darwin-thread-multi-2level/auto/test/.packlist"
|
|
|
|
|
2022-04-28 10:21:13 -04:00
|
|
|
file.dirname.mkpath
|
2017-02-27 11:28:12 +01:00
|
|
|
touch file
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes 'charset.alias' files" do
|
|
|
|
file = f.lib/"charset.alias"
|
|
|
|
|
2022-04-28 10:21:13 -04:00
|
|
|
file.dirname.mkpath
|
2017-02-27 11:28:12 +01:00
|
|
|
touch file
|
|
|
|
|
2021-01-31 13:14:23 -05:00
|
|
|
cleaner.clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
end
|
2022-04-27 23:34:14 -04:00
|
|
|
|
|
|
|
it "removes 'info/**/dir' files except for 'info/<name>/dir'" do
|
|
|
|
file = f.info/"dir"
|
|
|
|
arch_file = f.info/"i686-elf/dir"
|
2022-04-28 10:19:16 -04:00
|
|
|
name_file = f.info/f.name/"dir"
|
2022-04-27 23:34:14 -04:00
|
|
|
|
2022-04-28 10:19:16 -04:00
|
|
|
file.dirname.mkpath
|
|
|
|
arch_file.dirname.mkpath
|
|
|
|
name_file.dirname.mkpath
|
2022-04-27 23:34:14 -04:00
|
|
|
|
|
|
|
touch file
|
|
|
|
touch arch_file
|
|
|
|
touch name_file
|
|
|
|
|
|
|
|
cleaner.clean
|
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
expect(arch_file).not_to exist
|
|
|
|
expect(name_file).to exist
|
|
|
|
end
|
2024-03-08 13:23:25 -05:00
|
|
|
|
|
|
|
it "removes '*.dist-info/direct_url.json' files" do
|
|
|
|
dir = f.lib/"python3.12/site-packages/test.dist-info"
|
|
|
|
file = dir/"direct_url.json"
|
|
|
|
unrelated_file = dir/"METADATA"
|
|
|
|
unrelated_dir_file = f.lib/"direct_url.json"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
touch file
|
|
|
|
touch unrelated_file
|
|
|
|
touch unrelated_dir_file
|
|
|
|
|
|
|
|
cleaner.clean
|
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
expect(unrelated_file).to exist
|
|
|
|
expect(unrelated_dir_file).to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes '*.dist-info/RECORD' files" do
|
|
|
|
dir = f.lib/"python3.12/site-packages/test.dist-info"
|
|
|
|
file = dir/"RECORD"
|
|
|
|
unrelated_file = dir/"METADATA"
|
|
|
|
unrelated_dir_file = f.lib/"RECORD"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
touch file
|
|
|
|
touch unrelated_file
|
|
|
|
touch unrelated_dir_file
|
|
|
|
|
|
|
|
cleaner.clean
|
|
|
|
|
|
|
|
expect(file).not_to exist
|
|
|
|
expect(unrelated_file).to exist
|
|
|
|
expect(unrelated_dir_file).to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "modifies '*.dist-info/INSTALLER' files" do
|
|
|
|
file = f.lib/"python3.12/site-packages/test.dist-info/INSTALLER"
|
|
|
|
file.dirname.mkpath
|
|
|
|
file.write "pip\n"
|
|
|
|
|
|
|
|
cleaner.clean
|
|
|
|
|
|
|
|
expect(file.read).to eq "brew\n"
|
|
|
|
end
|
2017-02-27 11:28:12 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "::skip_clean" do
|
2022-08-24 23:52:40 +01:00
|
|
|
def stub_formula_skip_clean(skip_paths)
|
|
|
|
formula("cleaner_test") do
|
|
|
|
url "foo-1.0"
|
|
|
|
|
|
|
|
skip_clean skip_paths
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-27 11:28:12 +01:00
|
|
|
it "adds paths that should be skipped" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("bin")
|
2017-02-27 11:28:12 +01:00
|
|
|
f.bin.mkpath
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(f.bin).to be_a_directory
|
|
|
|
end
|
|
|
|
|
|
|
|
it "also skips empty sub-directories under the added paths" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("bin")
|
2017-02-27 11:28:12 +01:00
|
|
|
subdir = f.bin/"subdir"
|
|
|
|
subdir.mkpath
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(f.bin).to be_a_directory
|
|
|
|
expect(subdir).to be_a_directory
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows skipping broken symlinks" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("symlink")
|
|
|
|
f.prefix.mkpath
|
2017-02-27 11:28:12 +01:00
|
|
|
symlink = f.prefix/"symlink"
|
|
|
|
ln_s "target", symlink
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(symlink).to be_a_symlink
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows skipping symlinks pointing to an empty directory" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("c")
|
2017-02-27 11:28:12 +01:00
|
|
|
dir = f.prefix/"b"
|
|
|
|
symlink = f.prefix/"c"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
ln_s dir.basename, symlink
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(dir).not_to exist
|
|
|
|
expect(symlink).to be_a_symlink
|
|
|
|
expect(symlink).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows skipping symlinks whose target was pruned before" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("a")
|
2017-02-27 11:28:12 +01:00
|
|
|
dir = f.prefix/"b"
|
|
|
|
symlink = f.prefix/"a"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
ln_s dir.basename, symlink
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(dir).not_to exist
|
|
|
|
expect(symlink).to be_a_symlink
|
|
|
|
expect(symlink).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows skipping '.la' files" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean(:la)
|
|
|
|
|
2017-02-27 11:28:12 +01:00
|
|
|
file = f.lib/"foo.la"
|
|
|
|
|
|
|
|
f.lib.mkpath
|
|
|
|
touch file
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(file).to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows skipping sub-directories" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("lib/subdir")
|
|
|
|
|
2017-02-27 11:28:12 +01:00
|
|
|
dir = f.lib/"subdir"
|
|
|
|
|
|
|
|
dir.mkpath
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(dir).to be_a_directory
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows skipping paths relative to prefix" do
|
2022-08-24 23:52:40 +01:00
|
|
|
f = stub_formula_skip_clean("bin/a")
|
|
|
|
|
2017-02-27 11:28:12 +01:00
|
|
|
dir1 = f.bin/"a"
|
|
|
|
dir2 = f.lib/"bin/a"
|
|
|
|
|
|
|
|
dir1.mkpath
|
|
|
|
dir2.mkpath
|
|
|
|
|
2022-08-24 23:52:40 +01:00
|
|
|
described_class.new(f).clean
|
2017-02-27 11:28:12 +01:00
|
|
|
|
|
|
|
expect(dir1).to exist
|
|
|
|
expect(dir2).not_to exist
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|