From 95e398ab130b1edd5346b74e684c30f02ce61e62 Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Mon, 16 Nov 2009 15:31:15 -0800 Subject: [PATCH] Add alias support to formulae * brew install will find an aliased formula * aliases are searched against * warn when creating a new formula that has an existing alias. If Subversion has an alias "svn", then warn when the user tries to create a new formula "svn". The formula can still be created, though the user should make sure it's not a duplicate of the existing aliased one. Subversion and Objective-Caml formulas get some alises here, so we have something to test against. --- Library/Homebrew/brew.h.rb | 7 +++++++ Library/Homebrew/formula.rb | 36 ++++++++++++++++++++++++++++++++++-- bin/brew | 4 +++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/brew.h.rb b/Library/Homebrew/brew.h.rb index d8ab4305e2..b0b7959994 100644 --- a/Library/Homebrew/brew.h.rb +++ b/Library/Homebrew/brew.h.rb @@ -29,6 +29,13 @@ def __make url, name path = Formula.path name raise "#{path} already exists" if path.exist? + + # Check if a formula aliased to this name exists. + already_aka = Formulary.find_alias name + if already_aka != nil + opoo "Formula #{already_aka} is aliased to #{name}." + puts "Please check if you are creating a duplicate." + end template=<<-EOS require 'formula' diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 0cc0847059..029aef77c5 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -52,6 +52,22 @@ class Formulary yield name, klass end end + + def self.get_aliases + aliases = {} + Formulary.read_all do |name, klass| + aka = klass.aliases + next if aka == nil + + aka.each {|item| aliases[item.to_s] = name } + end + return aliases + end + + def self.find_alias name + aliases = Formulary.get_aliases + return aliases[name] + end end @@ -225,7 +241,15 @@ class Formula require name name = path.stem else - require self.path(name) + begin + require self.path(name) + rescue LoadError => e + # Couldn't find formula 'name', so look for an alias. + real_name = Formulary.find_alias name + raise e if real_name == nil + puts "#{name} is an alias for #{real_name}" + name = real_name + end end begin klass_name =self.class_s(name) @@ -418,7 +442,7 @@ private end end - attr_rw :url, :version, :homepage, :specs, :deps, *CHECKSUM_TYPES + attr_rw :url, :version, :homepage, :specs, :deps, :aliases, *CHECKSUM_TYPES def head val=nil, specs=nil if specs @@ -426,6 +450,14 @@ private end val.nil? ? @head : @head = val end + + def aka *args + @aliases ||= [] + + args.each do |item| + @aliases << item.to_s + end + end def depends_on name, *args @deps ||= [] diff --git a/bin/brew b/bin/brew index 7b42a8f19d..adc5e51c15 100755 --- a/bin/brew +++ b/bin/brew @@ -98,7 +98,9 @@ begin end when 'search', '-S' - formulae = (HOMEBREW_REPOSITORY+'Library/Formula').children.sort.map{|f| f.basename('.rb') } + require "formula" + formulae = Formulary.names with_aliases=true + if ARGV.first =~ /^\/(.*)\/$/ puts_columns formulae.grep(Regexp.new($1)) else