97 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require 'ostruct'
 | |
| 
 | |
| require 'formula'
 | |
| require 'vendor/multi_json'
 | |
| 
 | |
| # Inherit from OpenStruct to gain a generic initialization method that takes a
 | |
| # hash and creates an attribute for each key and value. `Tab.new` probably
 | |
| # should not be called directly, instead use one of the class methods like
 | |
| # `Tab.for_install`.
 | |
| class Tab < OpenStruct
 | |
|   def self.for_install f, args
 | |
|     sha = `cd '#{HOMEBREW_REPOSITORY}' && git rev-parse --verify -q HEAD 2>/dev/null`.chuzzle
 | |
|     Tab.new :used_options => args.used_options(f),
 | |
|             :unused_options => args.unused_options(f),
 | |
|             :tabfile => f.prefix + "INSTALL_RECEIPT.json",
 | |
|             :built_as_bottle => !!args.build_bottle?,
 | |
|             :tapped_from => f.tap,
 | |
|             :time => Time.now.to_i, # to_s would be better but Ruby has no from_s function :P
 | |
|             :HEAD => sha
 | |
|   end
 | |
| 
 | |
|   def self.from_file path
 | |
|     tab = Tab.new MultiJson.decode(open(path).read)
 | |
|     tab.tabfile = path
 | |
|     return tab
 | |
|   end
 | |
| 
 | |
|   def self.for_keg keg
 | |
|     path = keg+'INSTALL_RECEIPT.json'
 | |
| 
 | |
|     if path.exist?
 | |
|       self.from_file path
 | |
|     else
 | |
|       begin
 | |
|         self.dummy_tab Formula.factory(keg.parent.basename)
 | |
|       rescue FormulaUnavailableError
 | |
|         Tab.new :used_options => [],
 | |
|                 :unused_options => [],
 | |
|                 :built_as_bottle => false,
 | |
|                 :tapped_from => "",
 | |
|                 :time => nil,
 | |
|                 :HEAD => nil
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.for_formula f
 | |
|     f = Formula.factory f unless f.kind_of? Formula
 | |
|     path = f.linked_keg/'INSTALL_RECEIPT.json'
 | |
| 
 | |
|     if path.exist?
 | |
|       self.from_file path
 | |
|     else
 | |
|       # Really should bail out with an error if a formula was not installed
 | |
|       # with a Tab. However, there will be lots of legacy installs that have no
 | |
|       # receipt---so we fabricate one that claims the formula was installed with
 | |
|       # no options.
 | |
|       #
 | |
|       # TODO:
 | |
|       # This isn't the best behavior---perhaps a future version of Homebrew can
 | |
|       # treat missing Tabs as errors.
 | |
|       self.dummy_tab f
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.dummy_tab f
 | |
|     Tab.new :used_options => [],
 | |
|             :unused_options => f.build.as_flags,
 | |
|             :built_as_bottle => false,
 | |
|             :tapped_from => "",
 | |
|             :time => nil,
 | |
|             :HEAD => nil
 | |
|   end
 | |
| 
 | |
|   def installed_with? opt
 | |
|     used_options.include? opt
 | |
|   end
 | |
| 
 | |
|   def options
 | |
|     used_options + unused_options
 | |
|   end
 | |
| 
 | |
|   def to_json
 | |
|     MultiJson.encode({
 | |
|       :used_options => used_options,
 | |
|       :unused_options => unused_options,
 | |
|       :built_as_bottle => built_as_bottle,
 | |
|       :tapped_from => tapped_from,
 | |
|       :time => time,
 | |
|       :HEAD => send("HEAD")})
 | |
|   end
 | |
| 
 | |
|   def write
 | |
|     tabfile.write to_json
 | |
|   end
 | |
| end
 | 
