Added new command "versions"

This commit is contained in:
Sebastian Staudt 2010-10-27 10:03:30 +02:00 committed by Max Howell
parent f30893a968
commit 6726fe090f
2 changed files with 93 additions and 2 deletions

View File

@ -11,7 +11,7 @@ _brew_to_completion()
[[ ${COMP_CWORD} -eq 1 ]] && { [[ ${COMP_CWORD} -eq 1 ]] && {
local actions="--cache --cellar --config --env --prefix --repository audit cat cleanup local actions="--cache --cellar --config --env --prefix --repository audit cat cleanup
configure create deps doctor edit fetch help home info install link list log options configure create deps doctor edit fetch help home info install link list log options
outdated prune remove search test uninstall unlink update uses" outdated prune remove search test uninstall unlink update uses versions"
local ext=$(\ls $(brew --repository)/Library/Contributions/examples | local ext=$(\ls $(brew --repository)/Library/Contributions/examples |
sed -e "s/\.rb//g" -e "s/brew-//g") sed -e "s/\.rb//g" -e "s/brew-//g")
COMPREPLY=( $(compgen -W "${actions} ${ext}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${actions} ${ext}" -- ${cur}) )
@ -28,7 +28,7 @@ _brew_to_completion()
case "$prev" in case "$prev" in
# Commands that take a formula # Commands that take a formula
cat|deps|edit|fetch|home|homepage|info|install|log|missing|options|uses) cat|deps|edit|fetch|home|homepage|info|install|log|missing|options|uses|versions)
# handle standard --options # handle standard --options
if [[ "$prev" == "install" && "$cur" == --* ]]; then if [[ "$prev" == "install" && "$cur" == --* ]]; then
local opts=$( local opts=$(

View File

@ -0,0 +1,91 @@
require 'formula'
module Homebrew extend self
module Versions
# The commit SHA for a specific version of a formula
def self.sha_for name, version
shas_for(name).each do |sha|
return sha if version == version_for(name, sha)
end
nil
end
# All SHAs of the commits the named formula has been changed in
def self.shas_for name
`git --git-dir=#{HOMEBREW_REPOSITORY}/.git rev-list HEAD^ -- Library/Formula/#{name}.rb`.split
end
# Returns the version number for the named formula and the given commit SHA
def self.version_for name, sha
code = `git --git-dir=#{HOMEBREW_REPOSITORY}/.git show #{sha}:Library/Formula/#{name}.rb`
version = code.match(/class #{Formula.class_s name} < ?Formula.*?(?:version\s|@version\s*=)\s*(?:'|")(.+?)(?:'|").*?end\s/m)
if version.nil?
url = code.match(/class #{Formula.class_s name} < ?Formula.*?(?:url\s|@url\s*=)\s*(?:'|")(.+?)(?:'|").*?end\s/m)
if url.nil?
head = code.match(/class #{Formula.class_s name} < ?Formula.*?head\s'(.*?)'.*?end\s\s/m)
if head.nil?
opoo "Version of #{name} could not be determined for #{sha}."
nil
else
'HEAD'
end
else
Pathname.new(url[1]).version
end
else
version[1]
end
end
# All older versions of a formula together with the SHA of their most recent
# revision
def self.old_versions(formula)
old_versions = []
shas_for(formula.name).each do |sha|
old_version = version_for formula.name, sha
if old_version != formula.version &&
(old_versions.empty? || old_version != old_versions.last[0])
old_versions << [old_version, sha]
end
end
old_versions
end
end
def versions
puts "Listing older versions for: #{ARGV.formulae.join(', ')}"
puts <<-EOS.undent
If you want to install one of these old versions run `git reset --hard
$COMMIT_ID_OF_VERSION` in "#{HOMEBREW_REPOSITORY}". After that you can install the formula
like usual with `brew install formula`. When you're done use `git reset --hard
master@{1}` in "#{HOMEBREW_REPOSITORY}" to get back to the most recent versions again.
WARNING: This also reverts Homebrew itself to an old revision. This may lead to
broken installations and/or not being able to install an old formula at all.
EOS
ARGV.formulae.all? do |f|
old_versions = Versions.old_versions f
if old_versions.empty?
puts "\nThere are no older versions for \"#{f.name}\" (current: #{f.version})."
else
puts "\nOlder versions for \"#{f.name}\" (current: #{f.version}):\n"
max_size = 0
old_versions.each { |v| max_size = v[0].size if v[0].size > max_size }
old_versions.each { |v| puts ' %s (%s)' % [v[0].ljust(max_size), v[1]] }
end
end
end
end