diff options
| author | Sebastian Staudt | 2010-10-27 10:03:30 +0200 | 
|---|---|---|
| committer | Max Howell | 2011-08-02 10:35:30 +0100 | 
| commit | 0b1f677b82eb30eae9aa4d873eb3d8752cb584fe (patch) | |
| tree | 54473478404339fbfdcb002d93307037ac972631 /Library/Homebrew/cmd/versions.rb | |
| parent | 4fa84719b4e752cccb7f98a05413f4f2123c6428 (diff) | |
| download | homebrew-0b1f677b82eb30eae9aa4d873eb3d8752cb584fe.tar.bz2 | |
Added new command "versions"
Diffstat (limited to 'Library/Homebrew/cmd/versions.rb')
| -rw-r--r-- | Library/Homebrew/cmd/versions.rb | 91 | 
1 files changed, 91 insertions, 0 deletions
diff --git a/Library/Homebrew/cmd/versions.rb b/Library/Homebrew/cmd/versions.rb new file mode 100644 index 000000000..15a0a7780 --- /dev/null +++ b/Library/Homebrew/cmd/versions.rb @@ -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  | 
