| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  | require "cleaner" | 
					
						
							|  |  |  | require "formula" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe Cleaner do | 
					
						
							|  |  |  |   include FileUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |   subject(:cleaner) { described_class.new(f) } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  |   let(:f) { formula("cleaner_test") { url "foo-1.0" } } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  |   before do | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  |     f.prefix.mkpath | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#clean" do | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "::skip_clean" do | 
					
						
							|  |  |  |     it "adds paths that should be skipped" do | 
					
						
							|  |  |  |       f.class.skip_clean "bin" | 
					
						
							|  |  |  |       f.bin.mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |       cleaner.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 | 
					
						
							|  |  |  |       f.class.skip_clean "bin" | 
					
						
							|  |  |  |       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).to be_a_directory | 
					
						
							|  |  |  |       expect(subdir).to be_a_directory | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allows skipping broken symlinks" do | 
					
						
							|  |  |  |       f.class.skip_clean "symlink" | 
					
						
							|  |  |  |       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).to be_a_symlink | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allows skipping symlinks pointing to an empty directory" do | 
					
						
							|  |  |  |       f.class.skip_clean "c" | 
					
						
							|  |  |  |       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).to be_a_symlink | 
					
						
							|  |  |  |       expect(symlink).not_to exist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allows skipping symlinks whose target was pruned before" do | 
					
						
							|  |  |  |       f.class.skip_clean "a" | 
					
						
							|  |  |  |       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).to be_a_symlink | 
					
						
							|  |  |  |       expect(symlink).not_to exist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allows skipping '.la' files" do | 
					
						
							|  |  |  |       file = f.lib/"foo.la" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       f.class.skip_clean :la | 
					
						
							|  |  |  |       f.lib.mkpath | 
					
						
							|  |  |  |       touch file | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |       cleaner.clean | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(file).to exist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allows skipping sub-directories" do | 
					
						
							|  |  |  |       dir = f.lib/"subdir" | 
					
						
							|  |  |  |       f.class.skip_clean "lib/subdir" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dir.mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |       cleaner.clean | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(dir).to be_a_directory | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allows skipping paths relative to prefix" do | 
					
						
							|  |  |  |       dir1 = f.bin/"a" | 
					
						
							|  |  |  |       dir2 = f.lib/"bin/a" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       f.class.skip_clean "bin/a" | 
					
						
							|  |  |  |       dir1.mkpath | 
					
						
							|  |  |  |       dir2.mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |       cleaner.clean | 
					
						
							| 
									
										
										
										
											2017-02-27 11:28:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(dir1).to exist | 
					
						
							|  |  |  |       expect(dir2).not_to exist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |