Merge pull request #4651 from reitermarkus/fix-cleanup

Fix `brew cleanup`.
This commit is contained in:
Markus Reiter 2018-08-11 21:34:20 +02:00 committed by GitHub
commit 46f531b2b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 16 deletions

View File

@ -1,6 +1,7 @@
require "utils/bottles"
require "formula"
require "hbc/cask_loader"
require "set"
module CleanupRefinement
LATEST_CASK_DAYS = 7
@ -65,21 +66,29 @@ module CleanupRefinement
end
end
version ||= basename.to_s[/\A.*--(.*?)#{Regexp.escape(extname)}/, 1]
version ||= basename.to_s[/\A.*(?:\-\-.*?)*\-\-(.*?)#{Regexp.escape(extname)}\Z/, 1]
version ||= basename.to_s[/\A.*\-\-?(.*?)#{Regexp.escape(extname)}\Z/, 1]
return false unless version
version = Version.parse(version)
version = Version.new(version)
return false unless (name = basename.to_s[/\A(.*?)\-\-?(?:#{Regexp.escape(version)})/, 1])
return false unless formula_name = basename.to_s[/\A(.*?)(?:\-\-.*?)*\-\-?(?:#{Regexp.escape(version)})/, 1]
formula = begin
Formulary.from_rack(HOMEBREW_CELLAR/name)
Formulary.from_rack(HOMEBREW_CELLAR/formula_name)
rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
return false
end
if version.is_a?(PkgVersion)
resource_name = basename.to_s[/\A.*?\-\-(.*?)\-\-?(?:#{Regexp.escape(version)})/, 1]
if resource_name == "patch"
patch_hashes = formula.stable&.patches&.map(&:resource)&.map(&:version)
return true unless patch_hashes&.include?(Checksum.new(:sha256, version.to_s))
elsif resource_name && resource_version = formula.stable&.resources&.dig(resource_name)&.version
return true if resource_version != version
elsif version.is_a?(PkgVersion)
return true if formula.pkg_version > version
elsif formula.version > version
return true
@ -134,17 +143,18 @@ module Homebrew
@scrub = scrub
@days = days
@cache = cache
@cleaned_up_paths = Set.new
end
def clean!
if args.empty?
Formula.installed.each do |formula|
cleanup_lockfiles
Formula.installed.sort_by(&:name).each do |formula|
cleanup_formula(formula)
end
cleanup_cache
cleanup_logs
return if dry_run?
cleanup_lockfiles
rm_ds_store
else
args.each do |arg|
@ -220,6 +230,8 @@ module Homebrew
end
def cleanup_path(path)
return unless @cleaned_up_paths.add?(path)
disk_usage = path.disk_usage
if dry_run?
@ -242,7 +254,12 @@ module Homebrew
lockfiles.each do |file|
next unless file.readable?
next unless file.open(File::RDWR).flock(File::LOCK_EX | File::LOCK_NB)
cleanup_path(file) { file.unlink }
begin
cleanup_path(file) { file.unlink }
ensure
file.open(File::RDWR).flock(File::LOCK_UN) if file.exist?
end
end
end

View File

@ -213,11 +213,18 @@ class Pathname
# extended to support common double extensions
def extname(path = to_s)
bottle_ext = path[BOTTLE_EXTNAME_RX, 1]
basename = File.basename(path)
bottle_ext = basename[BOTTLE_EXTNAME_RX, 1]
return bottle_ext if bottle_ext
archive_ext = path[/(\.(tar|cpio|pax)\.(gz|bz2|lz|xz|Z))$/, 1]
archive_ext = basename[/(\.(tar|cpio|pax)\.(gz|bz2|lz|xz|Z))\Z/, 1]
return archive_ext if archive_ext
File.extname(path)
# Don't treat version numbers as extname.
return "" if basename.match?(/\b\d+\.\d+[^\.]*\Z/)
File.extname(basename)
end
# for filetypes we support, basename without extension

View File

@ -238,12 +238,14 @@ describe Homebrew::Cleanup do
end
context "cleans old files in HOMEBREW_CACHE" do
let(:bottle) { (HOMEBREW_CACHE/"testball--0.0.1.bottle.tar.gz") }
let(:bottle) { (HOMEBREW_CACHE/"testball--0.0.1.tag.bottle.tar.gz") }
let(:testball) { (HOMEBREW_CACHE/"testball--0.0.1") }
let(:testball_resource) { (HOMEBREW_CACHE/"testball--rsrc--0.0.1.txt") }
before do
FileUtils.touch(bottle)
FileUtils.touch(testball)
FileUtils.touch bottle
FileUtils.touch testball
FileUtils.touch testball_resource
(HOMEBREW_CELLAR/"testball"/"0.0.1").mkpath
FileUtils.touch(CoreTap.instance.formula_dir/"testball.rb")
end
@ -253,18 +255,21 @@ describe Homebrew::Cleanup do
subject.cleanup_cache
expect(bottle).not_to exist
expect(testball).not_to exist
expect(testball_resource).not_to exist
end
it "cleans up file if `scrub` is true and formula not installed" do
described_class.new(scrub: true).cleanup_cache
expect(bottle).not_to exist
expect(testball).not_to exist
expect(testball_resource).not_to exist
end
it "cleans up file if stale" do
subject.cleanup_cache
expect(bottle).not_to exist
expect(testball).not_to exist
expect(testball_resource).not_to exist
end
end
end

View File

@ -133,6 +133,11 @@ describe Pathname do
expect(described_class.new("foo-0.1.tar.gz").extname).to eq(".tar.gz")
expect(described_class.new("foo-0.1.cpio.gz").extname).to eq(".cpio.gz")
end
it "does not treat version numbers as extensions" do
expect(described_class.new("foo-0.1").extname).to eq("")
expect(described_class.new("foo-1.0-rc1").extname).to eq("")
end
end
describe "#stem" do

View File

@ -647,8 +647,6 @@ describe Version do
.to be_detected_from("https://codeload.github.com/gsamokovarov/jump/tar.gz/v0.7.1")
expect(described_class.create("0.9.1234"))
.to be_detected_from("https://my.datomic.com/downloads/free/0.9.1234")
expect(described_class.create("0.9"))
.to be_detected_from("https://my.datomic.com/downloads/free/0.9.1t34")
expect(described_class.create("1.2.3"))
.to be_detected_from("https://my.datomic.com/downloads/free/1.2.3")
end