brew/Library/Homebrew/cmd/versions.rb

125 lines
3.2 KiB
Ruby
Raw Normal View History

2010-10-27 10:03:30 +02:00
require 'formula'
module Homebrew extend self
def versions
raise "Please `brew install git` first" unless which "git"
2012-03-16 00:35:49 +00:00
raise "Please `brew update' first" unless (HOMEBREW_REPOSITORY/".git").directory?
2010-10-27 10:03:30 +02:00
raise FormulaUnspecifiedError if ARGV.named.empty?
opoo <<-EOS.undent
brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
https://github.com/Homebrew/homebrew-versions
EOS
ARGV.formulae.all? do |f|
if ARGV.include? '--compact'
puts f.versions * " "
else
f.versions do |version, sha|
print Tty.white.to_s
print "#{version.to_s.ljust(8)} "
print Tty.reset.to_s
puts "git checkout #{sha} #{f.pretty_relative_path}"
end
2010-10-27 10:03:30 +02:00
end
end
end
end
2010-10-27 10:03:30 +02:00
class Formula
def versions
versions = []
rev_list do |sha|
version = version_for_sha sha
unless versions.include? version or version.nil?
yield version, sha if block_given?
versions << version
end
2010-10-27 10:03:30 +02:00
end
return versions
2010-10-27 10:03:30 +02:00
end
def bottle_version_map branch='HEAD'
map = Hash.new { |h, k| h[k] = [] }
rev_list(branch) do |rev|
formula_for_sha(rev) do |f|
bottle = f.stable.bottle_specification
unless bottle.checksums.empty?
map[f.pkg_version] << bottle.revision
end
end
end
map
end
def pretty_relative_path
if Pathname.pwd == repository
entry_name
else
repository/"#{entry_name}"
end
end
2010-10-27 10:03:30 +02:00
private
def repository
@repository ||= begin
2014-04-06 00:31:07 -05:00
if path.to_s =~ HOMEBREW_TAP_DIR_REGEX
HOMEBREW_REPOSITORY/"Library/Taps/#$1/#$2"
else
HOMEBREW_REPOSITORY
end
end
end
def entry_name
@entry_name ||= begin
repository == HOMEBREW_REPOSITORY ? "Library/Formula/#{name}.rb" : "#{name}.rb"
end
end
def rev_list branch='HEAD'
repository.cd do
IO.popen("git rev-list --abbrev-commit --remove-empty #{branch} -- #{entry_name}") do |io|
yield io.readline.chomp until io.eof?
end
end
end
2010-10-27 10:03:30 +02:00
def text_from_sha sha
repository.cd do
`git cat-file blob #{sha}:#{entry_name}`
end
end
2010-10-27 10:03:30 +02:00
IGNORED_EXCEPTIONS = [SyntaxError, TypeError, NameError,
ArgumentError, FormulaSpecificationError,
FormulaValidationError,]
def version_for_sha sha
formula_for_sha(sha) {|f| f.version }
end
def formula_for_sha sha, &block
mktemp do
path = Pathname.new(Pathname.pwd+"#{name}.rb")
path.write text_from_sha(sha)
# Unload the class so Formula#version returns the correct value
begin
old_const = Formulary.unload_formula name
nostdout { yield Formula.factory(path.to_s) }
rescue *IGNORED_EXCEPTIONS => e
# We rescue these so that we can skip bad versions and
# continue walking the history
2013-03-21 17:04:05 -05:00
ohai "#{e} in #{name} at revision #{sha}", e.backtrace if ARGV.debug?
rescue FormulaUnavailableError
# Suppress this error
ensure
Formulary.restore_formula name, old_const
end
end
2011-08-02 14:45:37 +01:00
end
2010-10-27 10:03:30 +02:00
end