diff --git a/Library/Homebrew/cleaner.rb b/Library/Homebrew/cleaner.rb index ec60e9eac9f6e..32954f6b0c8c4 100644 --- a/Library/Homebrew/cleaner.rb +++ b/Library/Homebrew/cleaner.rb @@ -29,9 +29,31 @@ def clean [@f.bin, @f.sbin, @f.lib].each { |d| clean_dir(d) if d.exist? } # Get rid of any info 'dir' files, so they don't conflict at the link stage + # + # The 'dir' files come in at least 3 locations: + # + # 1. 'info/dir' + # 2. 'info/#{name}/dir' + # 3. 'info/#{arch}/dir' + # + # Of these 3 only 'info/#{name}/dir' is safe to keep since the rest will + # conflict with other formulae because they use a shared location. + # + # See [cleaner: recursively delete info `dir`s by gromgit · Pull Request + # #11597][1], [emacs 28.1 bottle does not contain `dir` file · Issue + # #100190][2], and [Keep `info/#{f.name}/dir` files in cleaner by + # timvisher][3] for more info. + # + # [1]: https://github.com/Homebrew/brew/pull/11597 + # [2]: https://github.com/Homebrew/homebrew-core/issues/100190 + # [3]: https://github.com/Homebrew/brew/pull/13215 Dir.glob(@f.info/"**/dir").each do |f| info_dir_file = Pathname(f) - observe_file_removal info_dir_file if info_dir_file.file? && !@f.skip_clean?(info_dir_file) + next unless info_dir_file.file? + next if info_dir_file == @f.info/@f.name/"dir" + next if @f.skip_clean?(info_dir_file) + + observe_file_removal info_dir_file end rewrite_shebangs diff --git a/Library/Homebrew/test/cleaner_spec.rb b/Library/Homebrew/test/cleaner_spec.rb index dee1108929bec..a9c3d1f667a0e 100644 --- a/Library/Homebrew/test/cleaner_spec.rb +++ b/Library/Homebrew/test/cleaner_spec.rb @@ -96,7 +96,7 @@ it "removes '.la' files" do file = f.lib/"foo.la" - f.lib.mkpath + file.dirname.mkpath touch file cleaner.clean @@ -107,7 +107,7 @@ it "removes 'perllocal' files" do file = f.lib/"perl5/darwin-thread-multi-2level/perllocal.pod" - (f.lib/"perl5/darwin-thread-multi-2level").mkpath + file.dirname.mkpath touch file cleaner.clean @@ -118,7 +118,7 @@ it "removes '.packlist' files" do file = f.lib/"perl5/darwin-thread-multi-2level/auto/test/.packlist" - (f.lib/"perl5/darwin-thread-multi-2level/auto/test").mkpath + file.dirname.mkpath touch file cleaner.clean @@ -129,12 +129,32 @@ it "removes 'charset.alias' files" do file = f.lib/"charset.alias" - f.lib.mkpath + file.dirname.mkpath + touch file + + cleaner.clean + + expect(file).not_to exist + end + + it "removes 'info/**/dir' files except for 'info//dir'" do + file = f.info/"dir" + arch_file = f.info/"i686-elf/dir" + name_file = f.info/f.name/"dir" + + file.dirname.mkpath + arch_file.dirname.mkpath + name_file.dirname.mkpath + 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 end