Merge pull request #10851 from kthchew/audit-empty-files

audit: check for installed empty files
This commit is contained in:
Mike McQuaid 2021-03-29 11:55:56 +01:00 committed by GitHub
commit 9d70b48e93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 1 deletions

View File

@ -432,6 +432,7 @@ class Pathname
def install_metafiles(from = Pathname.pwd)
Pathname(from).children.each do |p|
next if p.directory?
next if File.zero?(p)
next unless Metafiles.copy?(p.basename.to_s)
# Some software symlinks these files (see help2man.rb)

View File

@ -275,6 +275,48 @@ module FormulaCellarChecks
"Python formulae that are keg-only should not create `pip3` and `wheel3` symlinks."
end
INVALID_EMPTY_FILE_NAMES = %w[AUTHORS ChangeLog changes COPYING LICENSE NEWS README TODO].freeze
INVALID_EMPTY_FILE_EXTENSIONS = %w[.html .md .rst .txt].freeze
INVALID_EMPTY_FILE_DIRECTORIES = %w[bin libexec share/man share/doc].freeze
# Names and extensions to ignore, even if they are in a location within prefix given above
VALID_EMPTY_FILE_NAMES = %w[__init__ empty REQUESTED].freeze
VALID_EMPTY_FILE_EXTENSIONS = %w[.gitkeep .keep .keepme .stamp .typed].freeze
def check_empty_files(prefix)
return unless prefix.directory?
empty_files = prefix.children.select do |f|
next if INVALID_EMPTY_FILE_NAMES.exclude?(f.basename(".*").to_s) &&
INVALID_EMPTY_FILE_EXTENSIONS.exclude?(f.extname)
next unless File.zero?(f)
true
end
INVALID_EMPTY_FILE_DIRECTORIES.each do |dir|
path = prefix/dir
next unless path.directory?
# search all directories in INVALID_EMPTY_FILE_LOCATIONS and their subdirectories
Pathname.glob(path/"**/*").each do |p|
# Any files in the "valid" list should be skipped because they are expected to be empty
next if VALID_EMPTY_FILE_NAMES.include?(p.basename(".*").to_s)
next if VALID_EMPTY_FILE_EXTENSIONS.include?(p.extname)
next unless File.zero?(p)
empty_files << p
end
end
return if empty_files.empty?
<<~EOS
Unexpected empty files were installed.
The offending files are:
#{empty_files * "\n "}
EOS
end
def audit_installed
@new_formula ||= false
@ -293,6 +335,7 @@ module FormulaCellarChecks
problem_if_output(check_shim_references(formula.prefix))
problem_if_output(check_plist(formula.prefix, formula.plist))
problem_if_output(check_python_symlinks(formula.name, formula.keg_only?))
problem_if_output(check_empty_files(formula.prefix))
end
alias generic_audit_installed audit_installed

View File

@ -51,7 +51,8 @@ describe FormulaInstaller do
specify "basic installation" do
temporary_install(Testball.new) do |f|
# Test that things made it into the Keg
expect(f.prefix/"readme").to exist
# "readme" is empty, so it should not be installed
expect(f.prefix/"readme").not_to exist
expect(f.bin).to be_a_directory
expect(f.bin.children.count).to eq(3)