| 
									
										
										
										
											2016-11-20 13:00:01 -05:00
										 |  |  | require "json" | 
					
						
							| 
									
										
										
										
											2016-05-01 14:46:24 +03:00
										 |  |  | require "rexml/document" | 
					
						
							| 
									
										
										
										
											2016-06-03 13:46:18 +01:00
										 |  |  | require "time" | 
					
						
							| 
									
										
										
										
											2013-02-07 12:43:22 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  | class AbstractDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-09 15:55:28 -05:00
										 |  |  |   include FileUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |   attr_reader :meta, :name, :version, :resource | 
					
						
							| 
									
										
										
										
											2016-07-12 10:03:32 +03:00
										 |  |  |   attr_reader :shutup | 
					
						
							| 
									
										
										
										
											2013-09-23 21:39:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def initialize(name, resource) | 
					
						
							| 
									
										
										
										
											2013-09-23 21:39:19 -05:00
										 |  |  |     @name = name | 
					
						
							|  |  |  |     @resource = resource | 
					
						
							| 
									
										
										
										
											2014-12-09 19:59:16 -05:00
										 |  |  |     @url = resource.url | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |     @version = resource.version | 
					
						
							| 
									
										
										
										
											2014-12-09 19:59:16 -05:00
										 |  |  |     @meta = resource.specs | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2009-12-15 12:47:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 01:04:44 -05:00
										 |  |  |   # Download and cache the resource as {#cached_location}. | 
					
						
							|  |  |  |   def fetch | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 02:51:22 +00:00
										 |  |  |   # Suppress output | 
					
						
							| 
									
										
										
										
											2016-07-12 10:03:32 +03:00
										 |  |  |   def shutup! | 
					
						
							|  |  |  |     @shutup = true | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def puts(*args) | 
					
						
							|  |  |  |     super(*args) unless shutup | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def ohai(*args) | 
					
						
							|  |  |  |     super(*args) unless shutup | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 22:53:56 -04:00
										 |  |  |   # Unpack {#cached_location} into the current working directory, and possibly | 
					
						
							|  |  |  |   # chdir into the newly-unpacked directory. | 
					
						
							|  |  |  |   # Unlike {Resource#stage}, this does not take a block. | 
					
						
							| 
									
										
										
										
											2014-12-23 01:04:44 -05:00
										 |  |  |   def stage | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 01:27:10 -05:00
										 |  |  |   # @!attribute [r] cached_location | 
					
						
							| 
									
										
										
										
											2014-12-23 01:04:44 -05:00
										 |  |  |   # The path to the cached file or directory associated with the resource. | 
					
						
							|  |  |  |   def cached_location | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-14 18:57:31 +08:00
										 |  |  |   # @!attribute [r] | 
					
						
							|  |  |  |   # return most recent modified time for all files in the current working directory after stage. | 
					
						
							|  |  |  |   def source_modified_time | 
					
						
							|  |  |  |     Pathname.pwd.to_enum(:find).select(&:file?).map(&:mtime).max | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 01:04:44 -05:00
										 |  |  |   # Remove {#cached_location} and any other files associated with the resource | 
					
						
							|  |  |  |   # from the cache. | 
					
						
							|  |  |  |   def clear_cache | 
					
						
							| 
									
										
										
										
											2014-12-23 01:04:44 -05:00
										 |  |  |     rm_rf(cached_location) | 
					
						
							| 
									
										
										
										
											2014-12-23 01:04:44 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def expand_safe_system_args(args) | 
					
						
							| 
									
										
										
										
											2013-04-07 00:49:56 -05:00
										 |  |  |     args = args.dup | 
					
						
							| 
									
										
										
										
											2009-12-15 12:47:12 +00:00
										 |  |  |     args.each_with_index do |arg, ii| | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |       next unless arg.is_a? Hash | 
					
						
							|  |  |  |       if ARGV.verbose? | 
					
						
							|  |  |  |         args.delete_at ii | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         args[ii] = arg[:quiet_flag] | 
					
						
							| 
									
										
										
										
											2009-12-15 12:47:12 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |       return args | 
					
						
							| 
									
										
										
										
											2009-12-15 12:47:12 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |     # 2 as default because commands are eg. svn up, git pull | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     args.insert(2, "-q") unless ARGV.verbose? | 
					
						
							| 
									
										
										
										
											2013-04-07 00:49:56 -05:00
										 |  |  |     args | 
					
						
							| 
									
										
										
										
											2009-12-15 12:47:12 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-12 10:03:32 +03:00
										 |  |  |   def safe_system(*args) | 
					
						
							|  |  |  |     if @shutup | 
					
						
							|  |  |  |       quiet_system(*args) || raise(ErrorDuringExecution.new(args.shift, *args)) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       super(*args) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def quiet_safe_system(*args) | 
					
						
							| 
									
										
										
										
											2010-10-25 21:12:31 -07:00
										 |  |  |     safe_system(*expand_safe_system_args(args)) | 
					
						
							| 
									
										
										
										
											2009-12-15 12:47:12 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-05-26 09:15:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-09 16:46:28 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def xzpath | 
					
						
							|  |  |  |     "#{HOMEBREW_PREFIX}/opt/xz/bin/xz" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def lzippath | 
					
						
							|  |  |  |     "#{HOMEBREW_PREFIX}/opt/lzip/bin/lzip" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-26 11:11:33 -07:00
										 |  |  |   def lhapath | 
					
						
							|  |  |  |     "#{HOMEBREW_PREFIX}/opt/lha/bin/lha" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-09 16:46:28 -05:00
										 |  |  |   def cvspath | 
					
						
							|  |  |  |     @cvspath ||= %W[
 | 
					
						
							|  |  |  |       /usr/bin/cvs | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/bin/cvs | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/opt/cvs/bin/cvs | 
					
						
							|  |  |  |       #{which("cvs")} | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     ].find { |p| File.executable? p } | 
					
						
							| 
									
										
										
										
											2014-12-09 16:46:28 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def hgpath | 
					
						
							|  |  |  |     @hgpath ||= %W[
 | 
					
						
							|  |  |  |       #{which("hg")} | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/bin/hg | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/opt/mercurial/bin/hg | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     ].find { |p| File.executable? p } | 
					
						
							| 
									
										
										
										
											2014-12-09 16:46:28 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def bzrpath | 
					
						
							|  |  |  |     @bzrpath ||= %W[
 | 
					
						
							|  |  |  |       #{which("bzr")} | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/bin/bzr | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/opt/bazaar/bin/bzr | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     ].find { |p| File.executable? p } | 
					
						
							| 
									
										
										
										
											2014-12-09 16:46:28 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fossilpath | 
					
						
							|  |  |  |     @fossilpath ||= %W[
 | 
					
						
							|  |  |  |       #{which("fossil")} | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/bin/fossil | 
					
						
							|  |  |  |       #{HOMEBREW_PREFIX}/opt/fossil/bin/fossil | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     ].find { |p| File.executable? p } | 
					
						
							| 
									
										
										
										
											2014-12-09 16:46:28 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  | class VCSDownloadStrategy < AbstractDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-03-07 14:59:30 +00:00
										 |  |  |   REF_TYPES = [:tag, :branch, :revisions, :revision].freeze | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def initialize(name, resource) | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2014-12-09 19:59:16 -05:00
										 |  |  |     @ref_type, @ref = extract_ref(meta) | 
					
						
							| 
									
										
										
										
											2015-03-07 14:59:30 +00:00
										 |  |  |     @revision = meta[:revision] | 
					
						
							| 
									
										
										
										
											2014-07-16 23:19:58 -05:00
										 |  |  |     @clone = HOMEBREW_CACHE.join(cache_filename) | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |   def fetch | 
					
						
							|  |  |  |     ohai "Cloning #{@url}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if cached_location.exist? && repo_valid? | 
					
						
							|  |  |  |       puts "Updating #{cached_location}" | 
					
						
							|  |  |  |       update | 
					
						
							|  |  |  |     elsif cached_location.exist? | 
					
						
							|  |  |  |       puts "Removing invalid repository from cache" | 
					
						
							|  |  |  |       clear_cache | 
					
						
							|  |  |  |       clone_repo | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       clone_repo | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-03-07 14:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 10:11:59 +03:00
										 |  |  |     version.update_commit(last_commit) if head? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     return unless @ref_type == :tag | 
					
						
							|  |  |  |     return unless @revision && current_revision | 
					
						
							|  |  |  |     return if current_revision == @revision | 
					
						
							|  |  |  |     raise <<-EOS.undent
 | 
					
						
							|  |  |  |       #{@ref} tag should be #{@revision} | 
					
						
							|  |  |  |       but is actually #{current_revision} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-22 12:21:22 +03:00
										 |  |  |   def fetch_last_commit | 
					
						
							|  |  |  |     fetch | 
					
						
							|  |  |  |     last_commit | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def commit_outdated?(commit) | 
					
						
							|  |  |  |     @last_commit ||= fetch_last_commit | 
					
						
							|  |  |  |     commit != @last_commit | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-10 11:24:36 -05:00
										 |  |  |   def cached_location | 
					
						
							|  |  |  |     @clone | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-10-31 14:28:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-05 18:57:28 -05:00
										 |  |  |   def head? | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |     version.head? | 
					
						
							| 
									
										
										
										
											2014-12-05 18:57:28 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   # Return last commit's unique identifier for the repository. | 
					
						
							|  |  |  |   # Return most recent modified timestamp unless overridden. | 
					
						
							|  |  |  |   def last_commit | 
					
						
							|  |  |  |     source_modified_time.to_i.to_s | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cache_tag | 
					
						
							|  |  |  |     "__UNKNOWN__" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cache_filename | 
					
						
							|  |  |  |     "#{name}--#{cache_tag}" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def repo_valid? | 
					
						
							|  |  |  |     true | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def clone_repo | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def update | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-07 14:59:30 +00:00
										 |  |  |   def current_revision | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def extract_ref(specs) | 
					
						
							|  |  |  |     key = REF_TYPES.find { |type| specs.key?(type) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     [key, specs[key]] | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  | class AbstractFileDownloadStrategy < AbstractDownloadStrategy | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2016-10-15 13:10:35 +01:00
										 |  |  |     case type = cached_location.compression_type | 
					
						
							| 
									
										
										
										
											2012-04-29 11:45:46 -07:00
										 |  |  |     when :zip | 
					
						
							| 
									
										
										
										
											2016-09-27 18:26:04 -04:00
										 |  |  |       with_system_path { quiet_safe_system "unzip", "-qq", cached_location } | 
					
						
							| 
									
										
										
										
											2009-12-21 18:29:13 +00:00
										 |  |  |       chdir | 
					
						
							| 
									
										
										
										
											2013-06-08 10:27:47 -07:00
										 |  |  |     when :gzip_only | 
					
						
							| 
									
										
										
										
											2014-04-06 11:29:59 -05:00
										 |  |  |       with_system_path { buffered_write("gunzip") } | 
					
						
							| 
									
										
										
										
											2014-04-06 11:19:30 -05:00
										 |  |  |     when :bzip2_only | 
					
						
							| 
									
										
										
										
											2014-04-06 11:29:59 -05:00
										 |  |  |       with_system_path { buffered_write("bunzip2") } | 
					
						
							| 
									
										
										
										
											2016-10-15 13:10:35 +01:00
										 |  |  |     when :gzip, :bzip2, :xz, :compress, :tar | 
					
						
							| 
									
										
										
										
											2016-09-24 19:53:43 -04:00
										 |  |  |       tar_flags = "x" | 
					
						
							| 
									
										
										
										
											2016-10-15 13:10:35 +01:00
										 |  |  |       if type == :gzip | 
					
						
							| 
									
										
										
										
											2012-12-07 17:13:36 -08:00
										 |  |  |         tar_flags << "z" | 
					
						
							| 
									
										
										
										
											2016-10-15 13:10:35 +01:00
										 |  |  |       elsif type == :bzip2 | 
					
						
							| 
									
										
										
										
											2012-12-07 17:13:36 -08:00
										 |  |  |         tar_flags << "j" | 
					
						
							| 
									
										
										
										
											2016-10-15 13:10:35 +01:00
										 |  |  |       elsif type == :xz | 
					
						
							|  |  |  |         tar_flags << "J" | 
					
						
							| 
									
										
										
										
											2012-12-07 17:13:36 -08:00
										 |  |  |       end | 
					
						
							|  |  |  |       tar_flags << "f" | 
					
						
							| 
									
										
										
										
											2016-10-15 13:10:35 +01:00
										 |  |  |       with_system_path do | 
					
						
							|  |  |  |         if type == :xz && DependencyCollector.tar_needs_xz_dependency? | 
					
						
							|  |  |  |           pipe_to_tar(xzpath) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           safe_system "tar", tar_flags, cached_location | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-08-26 14:30:27 -05:00
										 |  |  |       chdir | 
					
						
							| 
									
										
										
										
											2013-11-29 10:10:28 -08:00
										 |  |  |     when :lzip | 
					
						
							| 
									
										
										
										
											2015-01-05 10:46:14 -05:00
										 |  |  |       with_system_path { pipe_to_tar(lzippath) } | 
					
						
							| 
									
										
										
										
											2013-11-29 10:10:28 -08:00
										 |  |  |       chdir | 
					
						
							| 
									
										
										
										
											2015-04-26 11:11:33 -07:00
										 |  |  |     when :lha | 
					
						
							|  |  |  |       safe_system lhapath, "x", cached_location | 
					
						
							| 
									
										
										
										
											2014-04-06 12:34:42 -05:00
										 |  |  |     when :xar | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |       safe_system "/usr/bin/xar", "-xf", cached_location | 
					
						
							| 
									
										
										
										
											2012-04-29 11:45:46 -07:00
										 |  |  |     when :rar | 
					
						
							| 
									
										
										
										
											2016-09-27 18:26:04 -04:00
										 |  |  |       quiet_safe_system "unrar", "x", "-inul", cached_location | 
					
						
							| 
									
										
										
										
											2012-10-28 19:29:24 +01:00
										 |  |  |     when :p7zip | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       safe_system "7zr", "x", cached_location | 
					
						
							| 
									
										
										
										
											2009-12-21 18:29:13 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |       cp cached_location, basename_without_params, preserve: true | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2009-12-07 10:12:38 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-07 00:49:56 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   def chdir | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     entries = Dir["*"] | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |     case entries.length | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:14 -05:00
										 |  |  |     when 0 then raise "Empty archive" | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |     when 1 then begin | 
					
						
							| 
									
										
										
										
											2016-09-17 17:01:04 +01:00
										 |  |  |         Dir.chdir entries.first | 
					
						
							|  |  |  |       rescue | 
					
						
							|  |  |  |         nil | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2009-12-07 10:12:38 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 10:46:14 -05:00
										 |  |  |   def pipe_to_tar(tool) | 
					
						
							|  |  |  |     Utils.popen_read(tool, "-dc", cached_location.to_s) do |rd| | 
					
						
							|  |  |  |       Utils.popen_write("tar", "xf", "-") do |wr| | 
					
						
							|  |  |  |         buf = "" | 
					
						
							|  |  |  |         wr.write(buf) while rd.read(16384, buf) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |   # gunzip and bunzip2 write the output file in the same directory as the input | 
					
						
							|  |  |  |   # file regardless of the current working directory, so we need to write it to | 
					
						
							|  |  |  |   # the correct location ourselves. | 
					
						
							|  |  |  |   def buffered_write(tool) | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |     target = File.basename(basename_without_params, cached_location.extname) | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |     Utils.popen_read(tool, "-f", cached_location.to_s, "-c") do |pipe| | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |       File.open(target, "wb") do |f| | 
					
						
							|  |  |  |         buf = "" | 
					
						
							| 
									
										
										
										
											2015-01-05 10:45:05 -05:00
										 |  |  |         f.write(buf) while pipe.read(16384, buf) | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-06 17:01:43 -07:00
										 |  |  |   def basename_without_params | 
					
						
							|  |  |  |     # Strip any ?thing=wad out of .c?thing=wad style extensions | 
					
						
							|  |  |  |     File.basename(@url)[/[^?]+/] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   def ext | 
					
						
							| 
									
										
										
										
											2014-07-17 15:14:16 -05:00
										 |  |  |     # We need a Pathname because we've monkeypatched extname to support double | 
					
						
							|  |  |  |     # extensions (e.g. tar.gz). | 
					
						
							|  |  |  |     # We can't use basename_without_params, because given a URL like | 
					
						
							| 
									
										
										
										
											2015-01-04 05:02:27 +01:00
										 |  |  |     #   https://example.com/download.php?file=foo-1.0.tar.gz | 
					
						
							| 
									
										
										
										
											2014-07-17 15:14:16 -05:00
										 |  |  |     # the extension we want is ".tar.gz", not ".php". | 
					
						
							|  |  |  |     Pathname.new(@url).extname[/[^?]+/] | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  | class CurlDownloadStrategy < AbstractFileDownloadStrategy | 
					
						
							|  |  |  |   attr_reader :mirrors, :tarball_path, :temporary_path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							|  |  |  |     @mirrors = resource.mirrors.dup | 
					
						
							|  |  |  |     @tarball_path = HOMEBREW_CACHE.join("#{name}-#{version}#{ext}") | 
					
						
							|  |  |  |     @temporary_path = Pathname.new("#{cached_location}.incomplete") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fetch | 
					
						
							|  |  |  |     ohai "Downloading #{@url}" | 
					
						
							| 
									
										
										
										
											2015-04-19 21:25:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |     if cached_location.exist? | 
					
						
							|  |  |  |       puts "Already downloaded: #{cached_location}" | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  |       had_incomplete_download = temporary_path.exist? | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         _fetch | 
					
						
							|  |  |  |       rescue ErrorDuringExecution | 
					
						
							|  |  |  |         # 33 == range not supported | 
					
						
							|  |  |  |         # try wiping the incomplete download and retrying once | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |         unless $?.exitstatus == 33 && had_incomplete_download | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |           raise CurlDownloadStrategyError, @url | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ohai "Trying a full download" | 
					
						
							|  |  |  |         temporary_path.unlink | 
					
						
							|  |  |  |         had_incomplete_download = false | 
					
						
							|  |  |  |         retry | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |       ignore_interrupts { temporary_path.rename(cached_location) } | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   rescue CurlDownloadStrategyError | 
					
						
							|  |  |  |     raise if mirrors.empty? | 
					
						
							|  |  |  |     puts "Trying a mirror..." | 
					
						
							|  |  |  |     @url = mirrors.shift | 
					
						
							|  |  |  |     retry | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cached_location | 
					
						
							|  |  |  |     tarball_path | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def clear_cache | 
					
						
							|  |  |  |     super | 
					
						
							|  |  |  |     rm_rf(temporary_path) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Private method, can be overridden if needed. | 
					
						
							|  |  |  |   def _fetch | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |     url = @url | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 11:43:43 +01:00
										 |  |  |     if ENV["HOMEBREW_ARTIFACT_DOMAIN"] | 
					
						
							| 
									
										
										
										
											2016-07-14 13:14:49 +08:00
										 |  |  |       url = url.sub(%r{^((ht|f)tps?://)?}, ENV["HOMEBREW_ARTIFACT_DOMAIN"].chomp("/") + "/") | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |       ohai "Downloading from #{url}" | 
					
						
							| 
									
										
										
										
											2016-07-13 11:43:43 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |     urls = actual_urls(url) | 
					
						
							| 
									
										
										
										
											2016-05-26 20:03:17 +08:00
										 |  |  |     unless urls.empty? | 
					
						
							|  |  |  |       ohai "Downloading from #{urls.last}" | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |       if !ENV["HOMEBREW_NO_INSECURE_REDIRECT"].nil? && url.start_with?("https://") && | 
					
						
							| 
									
										
										
										
											2016-05-26 20:03:17 +08:00
										 |  |  |          urls.any? { |u| !u.start_with? "https://" } | 
					
						
							|  |  |  |         puts "HTTPS to HTTP redirect detected & HOMEBREW_NO_INSECURE_REDIRECT is set." | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |         raise CurlDownloadStrategyError, url | 
					
						
							| 
									
										
										
										
											2016-05-26 20:03:17 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |       url = urls.last | 
					
						
							| 
									
										
										
										
											2016-05-26 20:03:17 +08:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |     curl url, "-C", downloaded_size, "-o", temporary_path | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-08 23:53:20 -05:00
										 |  |  |   # Curl options to be always passed to curl, | 
					
						
							|  |  |  |   # with raw head calls (`curl -I`) or with actual `fetch`. | 
					
						
							|  |  |  |   def _curl_opts | 
					
						
							|  |  |  |     copts = [] | 
					
						
							|  |  |  |     copts << "--user" << meta.fetch(:user) if meta.key?(:user) | 
					
						
							|  |  |  |     copts | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |   def actual_urls(url) | 
					
						
							| 
									
										
										
										
											2015-04-19 21:25:14 +01:00
										 |  |  |     urls = [] | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |     curl_args = _curl_opts << "-I" << "-L" << url | 
					
						
							| 
									
										
										
										
											2015-07-08 23:53:20 -05:00
										 |  |  |     Utils.popen_read("curl", *curl_args).scan(/^Location: (.+)$/).map do |m| | 
					
						
							| 
									
										
										
										
											2016-07-13 20:56:12 +08:00
										 |  |  |       urls << URI.join(urls.last || url, m.first.chomp).to_s | 
					
						
							| 
									
										
										
										
											2015-04-19 21:25:14 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |     urls | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  |   def downloaded_size | 
					
						
							|  |  |  |     temporary_path.size? || 0
 | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def curl(*args) | 
					
						
							| 
									
										
										
										
											2015-07-08 23:53:20 -05:00
										 |  |  |     args.concat _curl_opts | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     args << "--connect-timeout" << "5" unless mirrors.empty? | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-20 15:37:33 +02:00
										 |  |  | # Detect and download from Apache Mirror | 
					
						
							|  |  |  | class CurlApacheMirrorDownloadStrategy < CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2013-10-30 00:11:46 -05:00
										 |  |  |   def apache_mirrors | 
					
						
							|  |  |  |     rd, wr = IO.pipe | 
					
						
							|  |  |  |     buf = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pid = fork do | 
					
						
							| 
									
										
										
										
											2015-08-18 17:05:47 +08:00
										 |  |  |       ENV.delete "HOMEBREW_CURL_VERBOSE" | 
					
						
							| 
									
										
										
										
											2013-10-30 00:11:46 -05:00
										 |  |  |       rd.close | 
					
						
							|  |  |  |       $stdout.reopen(wr) | 
					
						
							|  |  |  |       $stderr.reopen(wr) | 
					
						
							|  |  |  |       curl "#{@url}&asjson=1" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     wr.close | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 12:35:51 -06:00
										 |  |  |     rd.readline if ARGV.verbose? # Remove Homebrew output | 
					
						
							| 
									
										
										
										
											2013-10-30 00:11:46 -05:00
										 |  |  |     buf << rd.read until rd.eof? | 
					
						
							|  |  |  |     rd.close | 
					
						
							|  |  |  |     Process.wait(pid) | 
					
						
							|  |  |  |     buf | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-20 15:37:33 +02:00
										 |  |  |   def _fetch | 
					
						
							| 
									
										
										
										
											2013-11-26 22:56:03 -06:00
										 |  |  |     return super if @tried_apache_mirror | 
					
						
							|  |  |  |     @tried_apache_mirror = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-20 13:00:01 -05:00
										 |  |  |     mirrors = JSON.parse(apache_mirrors) | 
					
						
							| 
									
										
										
										
											2015-04-09 20:52:49 +02:00
										 |  |  |     path_info = mirrors.fetch("path_info") | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @url = mirrors.fetch("preferred") + path_info | 
					
						
							| 
									
										
										
										
											2015-04-09 20:52:49 +02:00
										 |  |  |     @mirrors |= %W[https://archive.apache.org/dist/#{path_info}] | 
					
						
							| 
									
										
										
										
											2011-07-20 15:37:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-26 22:56:03 -06:00
										 |  |  |     ohai "Best Mirror #{@url}" | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2016-11-20 13:00:01 -05:00
										 |  |  |   rescue IndexError, JSON::ParserError | 
					
						
							| 
									
										
										
										
											2013-11-26 22:56:03 -06:00
										 |  |  |     raise CurlDownloadStrategyError, "Couldn't determine mirror, try again later." | 
					
						
							| 
									
										
										
										
											2011-07-20 15:37:33 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 19:13:20 -07:00
										 |  |  | # Download via an HTTP POST. | 
					
						
							| 
									
										
										
										
											2010-06-30 10:21:56 -07:00
										 |  |  | # Query parameters on the URL are converted into POST parameters | 
					
						
							| 
									
										
										
										
											2011-03-28 19:53:43 -07:00
										 |  |  | class CurlPostDownloadStrategy < CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2010-06-25 19:13:20 -07:00
										 |  |  |   def _fetch | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     base_url, data = @url.split("?") | 
					
						
							|  |  |  |     curl base_url, "-d", data, "-C", downloaded_size, "-o", temporary_path | 
					
						
							| 
									
										
										
										
											2010-06-25 19:13:20 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 12:01:05 -08:00
										 |  |  | # Use this strategy to download but not unzip a file. | 
					
						
							|  |  |  | # Useful for installing jars. | 
					
						
							| 
									
										
										
										
											2011-03-28 19:53:43 -07:00
										 |  |  | class NoUnzipCurlDownloadStrategy < CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2009-12-01 12:01:05 -08:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |     cp cached_location, basename_without_params, preserve: true | 
					
						
							| 
									
										
										
										
											2009-12-01 12:01:05 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-24 09:40:37 +00:00
										 |  |  | # This strategy extracts our binary packages. | 
					
						
							| 
									
										
										
										
											2012-01-23 19:29:55 -08:00
										 |  |  | class CurlBottleDownloadStrategy < CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2013-09-25 17:41:11 -05:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |     ohai "Pouring #{cached_location.basename}" | 
					
						
							| 
									
										
										
										
											2013-09-25 17:41:11 -05:00
										 |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-11-24 09:40:37 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 16:41:23 +01:00
										 |  |  | # This strategy extracts local binary packages. | 
					
						
							| 
									
										
										
										
											2015-01-04 15:33:25 -05:00
										 |  |  | class LocalBottleDownloadStrategy < AbstractFileDownloadStrategy | 
					
						
							|  |  |  |   attr_reader :cached_location | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-15 21:32:15 -04:00
										 |  |  |   def initialize(path) | 
					
						
							|  |  |  |     @cached_location = path | 
					
						
							| 
									
										
										
										
											2013-06-08 16:41:23 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-09-25 17:41:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-10 00:53:57 -05:00
										 |  |  |     ohai "Pouring #{cached_location.basename}" | 
					
						
							| 
									
										
										
										
											2013-09-25 17:41:11 -05:00
										 |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-06-08 16:41:23 +01:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  | # S3DownloadStrategy downloads tarballs from AWS S3. | 
					
						
							|  |  |  | # To use it, add ":using => S3DownloadStrategy" to the URL section of your | 
					
						
							|  |  |  | # formula.  This download strategy uses AWS access tokens (in the | 
					
						
							|  |  |  | # environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY) | 
					
						
							|  |  |  | # to sign the request.  This strategy is good in a corporate setting, | 
					
						
							|  |  |  | # because it lets you use a private S3 bucket as a repo for internal | 
					
						
							|  |  |  | # distribution.  (It will work for public buckets as well.) | 
					
						
							|  |  |  | class S3DownloadStrategy < CurlDownloadStrategy | 
					
						
							|  |  |  |   def _fetch | 
					
						
							|  |  |  |     # Put the aws gem requirement here (vs top of file) so it's only | 
					
						
							|  |  |  |     # a dependency of S3 users, not all Homebrew users | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     require "rubygems" | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  |     begin | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       require "aws-sdk-v1" | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  |     rescue LoadError | 
					
						
							|  |  |  |       onoe "Install the aws-sdk gem into the gem repo used by brew." | 
					
						
							|  |  |  |       raise | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 13:28:31 +08:00
										 |  |  |     if @url !~ %r{^https?://([^.].*)\.s3\.amazonaws\.com/(.+)$} | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  |       raise "Bad S3 URL: " + @url | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     bucket = $1 | 
					
						
							|  |  |  |     key = $2 | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     obj = AWS::S3.new.buckets[bucket].objects[key] | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  |     begin | 
					
						
							|  |  |  |       s3url = obj.url_for(:get) | 
					
						
							|  |  |  |     rescue AWS::Errors::MissingCredentialsError | 
					
						
							|  |  |  |       ohai "AWS credentials missing, trying public URL instead." | 
					
						
							|  |  |  |       s3url = obj.public_url | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     curl s3url, "-C", downloaded_size, "-o", temporary_path | 
					
						
							| 
									
										
										
										
											2013-09-24 01:34:28 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  | # GitHubPrivateRepositoryDownloadStrategy downloads contents from GitHub | 
					
						
							|  |  |  | # Private Repository. To use it, add | 
					
						
							|  |  |  | # ":using => GitHubPrivateRepositoryDownloadStrategy" to the URL section of | 
					
						
							|  |  |  | # your formula. This download strategy uses GitHub access tokens (in the | 
					
						
							|  |  |  | # environment variables HOMEBREW_GITHUB_API_TOKEN) to sign the request.  This | 
					
						
							|  |  |  | # strategy is suitable for corporate use just like S3DownloadStrategy, because | 
					
						
							|  |  |  | # it lets you use a private GttHub repository for internal distribution.  It | 
					
						
							|  |  |  | # works with public one, but in that case simply use CurlDownloadStrategy. | 
					
						
							|  |  |  | class GitHubPrivateRepositoryDownloadStrategy < CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2017-01-08 18:00:31 +09:00
										 |  |  |   require "utils/formatter" | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |   require "utils/github" | 
					
						
							| 
									
										
										
										
											2017-01-08 18:00:31 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |     parse_url_pattern | 
					
						
							| 
									
										
										
										
											2017-01-08 18:00:31 +09:00
										 |  |  |     set_github_token | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def parse_url_pattern | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     url_pattern = %r{https://github.com/([^/]+)/([^/]+)/(\S+)} | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |     unless @url =~ url_pattern | 
					
						
							|  |  |  |       raise CurlDownloadStrategyError, "Invalid url pattern for GitHub Repository." | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     _, @owner, @repo, @filepath = *@url.match(url_pattern) | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def download_url | 
					
						
							|  |  |  |     "https://#{@github_token}@github.com/#{@owner}/#{@repo}/#{@filepath}" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def _fetch | 
					
						
							|  |  |  |     curl download_url, "-C", downloaded_size, "-o", temporary_path | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |   def set_github_token | 
					
						
							| 
									
										
										
										
											2017-01-03 14:58:08 +09:00
										 |  |  |     @github_token = ENV["HOMEBREW_GITHUB_API_TOKEN"] | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |     unless @github_token | 
					
						
							|  |  |  |       raise CurlDownloadStrategyError, "Environmental variable HOMEBREW_GITHUB_API_TOKEN is required." | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-01-08 18:00:31 +09:00
										 |  |  |     validate_github_repository_access! | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def validate_github_repository_access! | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     # Test access to the repository | 
					
						
							|  |  |  |     GitHub.repository(@owner, @repo) | 
					
						
							|  |  |  |   rescue GitHub::HTTPNotFoundError | 
					
						
							|  |  |  |     # We only handle HTTPNotFoundError here, | 
					
						
							|  |  |  |     # becase AuthenticationFailedError is handled within util/github. | 
					
						
							|  |  |  |     message = <<-EOS.undent
 | 
					
						
							| 
									
										
										
										
											2017-01-08 18:00:31 +09:00
										 |  |  |         HOMEBREW_GITHUB_API_TOKEN can not access the repository: #{@owner}/#{@repo} | 
					
						
							|  |  |  |         This token may not have permission to access the repository or the url of formula may be incorrect. | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     EOS | 
					
						
							|  |  |  |     raise CurlDownloadStrategyError, message | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  | # GitHubPrivateRepositoryReleaseDownloadStrategy downloads tarballs from GitHub | 
					
						
							|  |  |  | # Release assets. To use it, add | 
					
						
							|  |  |  | # ":using => GitHubPrivateRepositoryReleaseDownloadStrategy" to the URL section | 
					
						
							|  |  |  | # of your formula. This download strategy uses GitHub access tokens (in the | 
					
						
							|  |  |  | # environment variables HOMEBREW_GITHUB_API_TOKEN) to sign the request. | 
					
						
							|  |  |  | class GitHubPrivateRepositoryReleaseDownloadStrategy < GitHubPrivateRepositoryDownloadStrategy | 
					
						
							|  |  |  |   def parse_url_pattern | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     url_pattern = %r{https://github.com/([^/]+)/([^/]+)/releases/download/([^/]+)/(\S+)} | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |     unless @url =~ url_pattern | 
					
						
							|  |  |  |       raise CurlDownloadStrategyError, "Invalid url pattern for GitHub Release." | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     _, @owner, @repo, @tag, @filename = *@url.match(url_pattern) | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |   def download_url | 
					
						
							|  |  |  |     "https://#{@github_token}@api.github.com/repos/#{@owner}/#{@repo}/releases/assets/#{asset_id}" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  |   def _fetch | 
					
						
							|  |  |  |     # HTTP request header `Accept: application/octet-stream` is required. | 
					
						
							|  |  |  |     # Without this, the GitHub API will respond with metadata, not binary. | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     curl download_url, "-C", downloaded_size, "-o", temporary_path, "-H", "Accept: application/octet-stream" | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def asset_id | 
					
						
							|  |  |  |     @asset_id ||= resolve_asset_id | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def resolve_asset_id | 
					
						
							|  |  |  |     release_metadata = fetch_release_metadata | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     assets = release_metadata["assets"].select { |a| a["name"] == @filename } | 
					
						
							| 
									
										
										
										
											2017-01-03 14:36:08 +09:00
										 |  |  |     raise CurlDownloadStrategyError, "Asset file not found." if assets.empty? | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 18:29:20 +09:00
										 |  |  |     assets.first["id"] | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fetch_release_metadata | 
					
						
							| 
									
										
										
										
											2017-01-08 16:44:54 +09:00
										 |  |  |     release_url = "https://api.github.com/repos/#{@owner}/#{@repo}/releases/tags/#{@tag}" | 
					
						
							| 
									
										
										
										
											2017-01-03 14:58:08 +09:00
										 |  |  |     GitHub.open(release_url) | 
					
						
							| 
									
										
										
										
											2017-01-02 12:56:20 +09:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  | class SubversionDownloadStrategy < VCSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2015-04-27 20:39:20 -04:00
										 |  |  |     @url = @url.sub("svn+http://", "") | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   def fetch | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     clear_cache unless @url.chomp("/") == repo_url || quiet_system("svn", "switch", @url, cached_location) | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-09-28 18:00:09 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-06 15:59:17 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     quiet_safe_system "svn", "export", "--force", cached_location, Dir.pwd | 
					
						
							| 
									
										
										
										
											2010-03-01 11:35:27 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-29 19:06:37 +03:00
										 |  |  |   def source_modified_time | 
					
						
							| 
									
										
										
										
											2016-05-01 14:46:24 +03:00
										 |  |  |     xml = REXML::Document.new(Utils.popen_read("svn", "info", "--xml", cached_location.to_s)) | 
					
						
							|  |  |  |     Time.parse REXML::XPath.first(xml, "//date/text()").to_s | 
					
						
							| 
									
										
										
										
											2016-04-29 19:06:37 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   def last_commit | 
					
						
							|  |  |  |     Utils.popen_read("svn", "info", "--show-item", "revision", cached_location.to_s).strip | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def repo_url | 
					
						
							| 
									
										
										
										
											2014-12-16 15:27:36 -05:00
										 |  |  |     Utils.popen_read("svn", "info", cached_location.to_s).strip[/^URL: (.+)$/, 1] | 
					
						
							| 
									
										
										
										
											2010-03-01 11:35:27 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 17:59:14 +02:00
										 |  |  |   def externals | 
					
						
							| 
									
										
										
										
											2014-12-16 15:27:36 -05:00
										 |  |  |     Utils.popen_read("svn", "propget", "svn:externals", @url).chomp.each_line do |line| | 
					
						
							| 
									
										
										
										
											2010-10-25 21:12:41 -07:00
										 |  |  |       name, url = line.split(/\s+/) | 
					
						
							| 
									
										
										
										
											2010-03-01 11:35:27 -08:00
										 |  |  |       yield name, url | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def fetch_repo(target, url, revision = nil, ignore_externals = false) | 
					
						
							| 
									
										
										
										
											2010-03-01 11:35:27 -08:00
										 |  |  |     # Use "svn up" when the repository already exists locally. | 
					
						
							|  |  |  |     # This saves on bandwidth and will have a similar effect to verifying the | 
					
						
							|  |  |  |     # cache as it will make any changes to get the right revision. | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     svncommand = target.directory? ? "up" : "checkout" | 
					
						
							|  |  |  |     args = ["svn", svncommand] | 
					
						
							| 
									
										
										
										
											2013-09-28 18:00:09 -05:00
										 |  |  |     args << url unless target.directory? | 
					
						
							| 
									
										
										
										
											2011-08-21 04:55:40 -07:00
										 |  |  |     args << target | 
					
						
							| 
									
										
										
										
											2015-10-16 03:59:19 -04:00
										 |  |  |     if revision | 
					
						
							| 
									
										
										
										
											2015-10-17 04:00:41 +08:00
										 |  |  |       ohai "Checking out #{@ref}" | 
					
						
							| 
									
										
										
										
											2015-10-16 03:59:19 -04:00
										 |  |  |       args << "-r" << revision | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     args << "--ignore-externals" if ignore_externals | 
					
						
							| 
									
										
										
										
											2010-10-25 21:12:31 -07:00
										 |  |  |     quiet_safe_system(*args) | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def cache_tag | 
					
						
							|  |  |  |     head? ? "svn-HEAD" : "svn" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def repo_valid? | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.join(".svn").directory? | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def clone_repo | 
					
						
							|  |  |  |     case @ref_type | 
					
						
							|  |  |  |     when :revision | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |       fetch_repo cached_location, @url, @ref | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |     when :revisions | 
					
						
							|  |  |  |       # nil is OK for main_revision, as fetch_repo will then get latest | 
					
						
							|  |  |  |       main_revision = @ref[:trunk] | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |       fetch_repo cached_location, @url, main_revision, true | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 17:59:14 +02:00
										 |  |  |       externals do |external_name, external_url| | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |         fetch_repo cached_location+external_name, external_url, @ref[external_name], true | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |       fetch_repo cached_location, @url | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:16 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:48 +02:00
										 |  |  |   alias update clone_repo | 
					
						
							| 
									
										
										
										
											2010-06-28 14:55:31 -07:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  | class GitDownloadStrategy < VCSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  |   SHALLOW_CLONE_WHITELIST = [ | 
					
						
							|  |  |  |     %r{git://}, | 
					
						
							|  |  |  |     %r{https://github\.com}, | 
					
						
							|  |  |  |     %r{http://git\.sv\.gnu\.org}, | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |     %r{http://llvm\.org}, | 
					
						
							|  |  |  |   ].freeze | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def initialize(name, resource) | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2014-12-03 17:25:51 -05:00
										 |  |  |     @ref_type ||= :branch | 
					
						
							|  |  |  |     @ref ||= "master" | 
					
						
							| 
									
										
										
										
											2014-12-09 19:59:16 -05:00
										 |  |  |     @shallow = meta.fetch(:shallow) { true } | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-06 15:59:17 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |     cp_r File.join(cached_location, "."), Dir.pwd, preserve: true | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-14 18:57:31 +08:00
										 |  |  |   def source_modified_time | 
					
						
							|  |  |  |     Time.parse Utils.popen_read("git", "--git-dir", git_dir, "show", "-s", "--format=%cD") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   def last_commit | 
					
						
							| 
									
										
										
										
											2016-07-07 02:14:31 +02:00
										 |  |  |     Utils.popen_read("git", "--git-dir", git_dir, "rev-parse", "--short=7", "HEAD").chomp | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def cache_tag | 
					
						
							|  |  |  |     "git" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-18 12:57:37 -05:00
										 |  |  |   def cache_version | 
					
						
							|  |  |  |     0
 | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def update | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.cd do | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |       config_repo | 
					
						
							|  |  |  |       update_repo | 
					
						
							|  |  |  |       checkout | 
					
						
							|  |  |  |       reset | 
					
						
							|  |  |  |       update_submodules if submodules? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  |   def shallow_clone? | 
					
						
							|  |  |  |     @shallow && support_depth? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:48:24 +02:00
										 |  |  |   def shallow_dir? | 
					
						
							| 
									
										
										
										
											2015-06-30 20:29:48 -07:00
										 |  |  |     git_dir.join("shallow").exist? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  |   def support_depth? | 
					
						
							| 
									
										
										
										
											2016-09-20 22:03:08 +02:00
										 |  |  |     @ref_type != :revision && SHALLOW_CLONE_WHITELIST.any? { |regex| @url =~ regex } | 
					
						
							| 
									
										
										
										
											2014-02-14 15:31:29 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   def git_dir | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.join(".git") | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:48:24 +02:00
										 |  |  |   def ref? | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     quiet_system "git", "--git-dir", git_dir, "rev-parse", "-q", "--verify", "#{@ref}^{commit}" | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-07 14:59:30 +00:00
										 |  |  |   def current_revision | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     Utils.popen_read("git", "--git-dir", git_dir, "rev-parse", "-q", "--verify", "HEAD").strip | 
					
						
							| 
									
										
										
										
											2015-03-07 14:59:30 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   def repo_valid? | 
					
						
							| 
									
										
										
										
											2013-10-11 00:11:59 -05:00
										 |  |  |     quiet_system "git", "--git-dir", git_dir, "status", "-s" | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   def submodules? | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.join(".gitmodules").exist? | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   def clone_args | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     args = %w[clone] | 
					
						
							|  |  |  |     args << "--depth" << "1" if shallow_clone? | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:14 -05:00
										 |  |  |     case @ref_type | 
					
						
							| 
									
										
										
										
											2016-09-21 08:32:57 +02:00
										 |  |  |     when :branch, :tag | 
					
						
							|  |  |  |       args << "--branch" << @ref | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     args << @url << cached_location | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def refspec | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:14 -05:00
										 |  |  |     case @ref_type | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when :branch then "+refs/heads/#{@ref}:refs/remotes/origin/#{@ref}" | 
					
						
							|  |  |  |     when :tag    then "+refs/tags/#{@ref}:refs/tags/#{@ref}" | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |     else              "+refs/heads/master:refs/remotes/origin/master" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def config_repo | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     safe_system "git", "config", "remote.origin.url", @url | 
					
						
							|  |  |  |     safe_system "git", "config", "remote.origin.fetch", refspec | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   def update_repo | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     return unless @ref_type == :branch || !ref? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if !shallow_clone? && shallow_dir? | 
					
						
							|  |  |  |       quiet_safe_system "git", "fetch", "origin", "--unshallow" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       quiet_safe_system "git", "fetch", "origin" | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def clone_repo | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     safe_system "git", *clone_args | 
					
						
							| 
									
										
										
										
											2014-12-18 12:57:37 -05:00
										 |  |  |     cached_location.cd do | 
					
						
							|  |  |  |       safe_system "git", "config", "homebrew.cacheversion", cache_version | 
					
						
							| 
									
										
										
										
											2015-10-16 03:59:19 -04:00
										 |  |  |       checkout | 
					
						
							| 
									
										
										
										
											2014-12-18 12:57:37 -05:00
										 |  |  |       update_submodules if submodules? | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-17 15:43:16 -06:00
										 |  |  |   def checkout | 
					
						
							| 
									
										
										
										
											2015-10-16 03:59:19 -04:00
										 |  |  |     ohai "Checking out #{@ref_type} #{@ref}" if @ref_type && @ref | 
					
						
							| 
									
										
										
										
											2014-12-03 17:25:51 -05:00
										 |  |  |     quiet_safe_system "git", "checkout", "-f", @ref, "--" | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-17 15:53:34 -06:00
										 |  |  |   def reset_args | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:14 -05:00
										 |  |  |     ref = case @ref_type | 
					
						
							| 
									
										
										
										
											2016-09-21 08:32:57 +02:00
										 |  |  |     when :branch | 
					
						
							|  |  |  |       "origin/#{@ref}" | 
					
						
							|  |  |  |     when :revision, :tag | 
					
						
							|  |  |  |       @ref | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-02-17 15:53:34 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     %W[reset --hard #{ref}] | 
					
						
							| 
									
										
										
										
											2013-02-17 15:53:34 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def reset | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     quiet_safe_system "git", *reset_args | 
					
						
							| 
									
										
										
										
											2013-02-17 15:53:34 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   def update_submodules | 
					
						
							| 
									
										
										
										
											2015-02-13 22:16:57 -05:00
										 |  |  |     quiet_safe_system "git", "submodule", "foreach", "--recursive", "git submodule sync" | 
					
						
							| 
									
										
										
										
											2014-12-06 20:57:23 -05:00
										 |  |  |     quiet_safe_system "git", "submodule", "update", "--init", "--recursive" | 
					
						
							| 
									
										
										
										
											2016-05-31 17:11:57 +02:00
										 |  |  |     fix_absolute_submodule_gitdir_references! | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fix_absolute_submodule_gitdir_references! | 
					
						
							|  |  |  |     # When checking out Git repositories with recursive submodules, some Git | 
					
						
							|  |  |  |     # versions create `.git` files with absolute instead of relative `gitdir:` | 
					
						
							|  |  |  |     # pointers. This works for the cached location, but breaks various Git | 
					
						
							|  |  |  |     # operations once the affected Git resource is staged, i.e. recursively | 
					
						
							|  |  |  |     # copied to a new location. (This bug was introduced in Git 2.7.0 and fixed | 
					
						
							|  |  |  |     # in 2.8.3. Clones created with affected version remain broken.) | 
					
						
							|  |  |  |     # See https://github.com/Homebrew/homebrew-core/pull/1520 for an example. | 
					
						
							|  |  |  |     submodule_dirs = Utils.popen_read( | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |       "git", "submodule", "--quiet", "foreach", "--recursive", "pwd" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-05-31 17:11:57 +02:00
										 |  |  |     submodule_dirs.lines.map(&:chomp).each do |submodule_dir| | 
					
						
							|  |  |  |       work_dir = Pathname.new(submodule_dir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Only check and fix if `.git` is a regular file, not a directory. | 
					
						
							|  |  |  |       dot_git = work_dir/".git" | 
					
						
							|  |  |  |       next unless dot_git.file? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       git_dir = dot_git.read.chomp[/^gitdir: (.*)$/, 1] | 
					
						
							|  |  |  |       if git_dir.nil? | 
					
						
							|  |  |  |         onoe "Failed to parse '#{dot_git}'." if ARGV.homebrew_developer? | 
					
						
							|  |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Only attempt to fix absolute paths. | 
					
						
							|  |  |  |       next unless git_dir.start_with?("/") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Make the `gitdir:` reference relative to the working directory. | 
					
						
							|  |  |  |       relative_git_dir = Pathname.new(git_dir).relative_path_from(work_dir) | 
					
						
							|  |  |  |       dot_git.atomic_write("gitdir: #{relative_git_dir}\n") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-02-14 17:29:58 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2009-08-21 20:30:13 +01:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-22 12:21:22 +03:00
										 |  |  | class GitHubGitDownloadStrategy < GitDownloadStrategy | 
					
						
							|  |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return unless %r{^https?://github\.com/(?<user>[^/]+)/(?<repo>[^/]+)\.git$} =~ @url | 
					
						
							|  |  |  |     @user = user | 
					
						
							|  |  |  |     @repo = repo | 
					
						
							| 
									
										
										
										
											2016-07-22 12:21:22 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def github_last_commit | 
					
						
							|  |  |  |     return if ENV["HOMEBREW_NO_GITHUB_API"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output, _, status = curl_output "-H", "Accept: application/vnd.github.v3.sha", \ | 
					
						
							|  |  |  |       "-I", "https://api.github.com/repos/#{@user}/#{@repo}/commits/#{@ref}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     commit = output[/^ETag: \"(\h+)\"/, 1] if status.success? | 
					
						
							|  |  |  |     version.update_commit(commit) if commit | 
					
						
							|  |  |  |     commit | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def multiple_short_commits_exist?(commit) | 
					
						
							|  |  |  |     return if ENV["HOMEBREW_NO_GITHUB_API"] | 
					
						
							|  |  |  |     output, _, status = curl_output "-H", "Accept: application/vnd.github.v3.sha", \ | 
					
						
							|  |  |  |       "-I", "https://api.github.com/repos/#{@user}/#{@repo}/commits/#{commit}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     !(status.success? && output && output[/^Status: (200)/, 1] == "200") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def commit_outdated?(commit) | 
					
						
							|  |  |  |     @last_commit ||= github_last_commit | 
					
						
							|  |  |  |     if !@last_commit | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2016-08-19 12:32:20 +02:00
										 |  |  |       return true unless commit | 
					
						
							| 
									
										
										
										
											2016-07-22 12:21:22 +03:00
										 |  |  |       return true unless @last_commit.start_with?(commit) | 
					
						
							| 
									
										
										
										
											2016-10-22 01:53:19 +03:00
										 |  |  |       if multiple_short_commits_exist?(commit) | 
					
						
							|  |  |  |         true | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         version.update_commit(commit) | 
					
						
							|  |  |  |         false | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-07-22 12:21:22 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:15 -05:00
										 |  |  | class CVSDownloadStrategy < VCSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @url = @url.sub(%r{^cvs://}, "") | 
					
						
							| 
									
										
										
										
											2014-12-22 00:43:02 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if meta.key?(:module) | 
					
						
							|  |  |  |       @module = meta.fetch(:module) | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     elsif @url !~ %r{:[^/]+$} | 
					
						
							| 
									
										
										
										
											2014-12-22 00:43:02 -05:00
										 |  |  |       @module = name | 
					
						
							| 
									
										
										
										
											2014-12-22 00:43:02 -05:00
										 |  |  |     else | 
					
						
							|  |  |  |       @module, @url = split_url(@url) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 12:19:18 +03:00
										 |  |  |   def source_modified_time | 
					
						
							|  |  |  |     # Filter CVS's files because the timestamp for each of them is the moment | 
					
						
							|  |  |  |     # of clone. | 
					
						
							|  |  |  |     max_mtime = Time.at(0) | 
					
						
							|  |  |  |     cached_location.find do |f| | 
					
						
							|  |  |  |       Find.prune if f.directory? && f.basename.to_s == "CVS" | 
					
						
							|  |  |  |       next unless f.file? | 
					
						
							|  |  |  |       mtime = f.mtime | 
					
						
							|  |  |  |       max_mtime = mtime if mtime > max_mtime | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     max_mtime | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |     cp_r File.join(cached_location, "."), Dir.pwd, preserve: true | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-07 00:49:56 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def cache_tag | 
					
						
							|  |  |  |     "cvs" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def repo_valid? | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.join("CVS").directory? | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def clone_repo | 
					
						
							|  |  |  |     HOMEBREW_CACHE.cd do | 
					
						
							| 
									
										
										
										
											2015-04-23 04:08:14 -07:00
										 |  |  |       # Login is only needed (and allowed) with pserver; skip for anoncvs. | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |       quiet_safe_system cvspath, { quiet_flag: "-Q" }, "-d", @url, "login" if @url.include? "pserver" | 
					
						
							|  |  |  |       quiet_safe_system cvspath, { quiet_flag: "-Q" }, "-d", @url, "checkout", "-d", cache_filename, @module | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def update | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |     cached_location.cd { quiet_safe_system cvspath, { quiet_flag: "-Q" }, "up" } | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |   def split_url(in_url) | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |     parts = in_url.split(/:/) | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |     mod=parts.pop | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     url=parts.join(":") | 
					
						
							|  |  |  |     [mod, url] | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2012-09-25 10:11:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | class MercurialDownloadStrategy < VCSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @url = @url.sub(%r{^hg://}, "") | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-06 15:59:17 -05:00
										 |  |  |     super | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 21:41:14 -05:00
										 |  |  |     dst = Dir.getwd | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.cd do | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if @ref_type && @ref | 
					
						
							| 
									
										
										
										
											2015-10-16 03:59:19 -04:00
										 |  |  |         ohai "Checking out #{@ref_type} #{@ref}" if @ref_type && @ref | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         safe_system hgpath, "archive", "--subrepos", "-y", "-r", @ref, "-t", "files", dst | 
					
						
							| 
									
										
										
										
											2009-10-17 14:35:24 +02:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         safe_system hgpath, "archive", "--subrepos", "-y", "-t", "files", dst | 
					
						
							| 
									
										
										
										
											2009-10-17 14:35:24 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2009-09-27 19:30:39 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-01 00:17:45 +03:00
										 |  |  |   def source_modified_time | 
					
						
							|  |  |  |     Time.parse Utils.popen_read("hg", "tip", "--template", "{date|isodate}", "-R", cached_location.to_s) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   def last_commit | 
					
						
							| 
									
										
										
										
											2016-08-01 16:18:26 +03:00
										 |  |  |     Utils.popen_read("hg", "parent", "--template", "{node|short}", "-R", cached_location.to_s) | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cache_tag | 
					
						
							|  |  |  |     "hg" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-02-02 13:43:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def repo_valid? | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.join(".hg").directory? | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def clone_repo | 
					
						
							| 
									
										
										
										
											2014-12-18 20:09:52 -05:00
										 |  |  |     safe_system hgpath, "clone", @url, cached_location | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def update | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.cd { quiet_safe_system hgpath, "pull", "--update" } | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2012-09-28 21:04:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | class BazaarDownloadStrategy < VCSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @url = @url.sub(%r{^bzr://}, "") | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 13:43:44 +01:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-06 15:53:37 -05:00
										 |  |  |     # The export command doesn't work on checkouts | 
					
						
							| 
									
										
										
										
											2011-11-29 10:17:38 +01:00
										 |  |  |     # See https://bugs.launchpad.net/bzr/+bug/897511 | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |     cp_r File.join(cached_location, "."), Dir.pwd, preserve: true | 
					
						
							| 
									
										
										
										
											2014-12-09 15:55:28 -05:00
										 |  |  |     rm_r ".bzr" | 
					
						
							| 
									
										
										
										
											2010-02-02 13:43:44 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-01 00:21:08 +03:00
										 |  |  |   def source_modified_time | 
					
						
							|  |  |  |     Time.parse Utils.popen_read("bzr", "log", "-l", "1", "--timezone=utc", cached_location.to_s)[/^timestamp: (.+)$/, 1] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   def last_commit | 
					
						
							|  |  |  |     Utils.popen_read("bzr", "revno", cached_location.to_s).chomp | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cache_tag | 
					
						
							|  |  |  |     "bzr" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-03-22 21:19:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def repo_valid? | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.join(".bzr").directory? | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def clone_repo | 
					
						
							|  |  |  |     # "lightweight" means history-less | 
					
						
							| 
									
										
										
										
											2014-12-18 20:09:52 -05:00
										 |  |  |     safe_system bzrpath, "checkout", "--lightweight", @url, cached_location | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def update | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     cached_location.cd { quiet_safe_system bzrpath, "update" } | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2012-09-28 21:04:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | class FossilDownloadStrategy < VCSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   def initialize(name, resource) | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @url = @url.sub(%r{^fossil://}, "") | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 20:22:34 +08:00
										 |  |  |   def stage | 
					
						
							| 
									
										
										
										
											2014-12-06 15:59:17 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     args = [fossilpath, "open", cached_location] | 
					
						
							| 
									
										
										
										
											2014-12-06 16:48:20 -05:00
										 |  |  |     args << @ref if @ref_type && @ref | 
					
						
							|  |  |  |     safe_system(*args) | 
					
						
							| 
									
										
										
										
											2010-09-29 20:22:34 +08:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-01 00:21:58 +03:00
										 |  |  |   def source_modified_time | 
					
						
							|  |  |  |     Time.parse Utils.popen_read("fossil", "info", "tip", "-R", cached_location.to_s)[/^uuid: +\h+ (.+)$/, 1] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:00:29 +03:00
										 |  |  |   def last_commit | 
					
						
							|  |  |  |     Utils.popen_read("fossil", "info", "tip", "-R", cached_location.to_s)[/^uuid: +(\h+) .+$/, 1] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cache_tag | 
					
						
							|  |  |  |     "fossil" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def clone_repo | 
					
						
							| 
									
										
										
										
											2014-12-18 20:09:52 -05:00
										 |  |  |     safe_system fossilpath, "clone", @url, cached_location | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   def update | 
					
						
							| 
									
										
										
										
											2014-12-09 14:22:35 -05:00
										 |  |  |     safe_system fossilpath, "pull", "-R", cached_location | 
					
						
							| 
									
										
										
										
											2014-12-06 12:29:15 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-09-29 20:22:34 +08:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-25 21:39:28 -05:00
										 |  |  | class DownloadStrategyDetector | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def self.detect(url, strategy = nil) | 
					
						
							| 
									
										
										
										
											2013-09-26 16:59:45 -05:00
										 |  |  |     if strategy.nil? | 
					
						
							|  |  |  |       detect_from_url(url) | 
					
						
							| 
									
										
										
										
											2016-09-20 22:03:08 +02:00
										 |  |  |     elsif strategy.is_a?(Class) && strategy < AbstractDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       strategy | 
					
						
							| 
									
										
										
										
											2016-09-20 22:03:08 +02:00
										 |  |  |     elsif strategy.is_a?(Symbol) | 
					
						
							| 
									
										
										
										
											2012-10-15 01:19:31 -05:00
										 |  |  |       detect_from_symbol(strategy) | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2013-09-26 16:59:45 -05:00
										 |  |  |       raise TypeError, | 
					
						
							|  |  |  |         "Unknown download strategy specification #{strategy.inspect}" | 
					
						
							| 
									
										
										
										
											2012-06-25 21:39:28 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-15 01:19:31 -05:00
										 |  |  |   def self.detect_from_url(url) | 
					
						
							|  |  |  |     case url | 
					
						
							| 
									
										
										
										
											2016-07-22 12:21:22 +03:00
										 |  |  |     when %r{^https?://github\.com/[^/]+/[^/]+\.git$} | 
					
						
							|  |  |  |       GitHubGitDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^https?://.+\.git$}, %r{^git://} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       GitDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-09-02 22:07:51 +02:00
										 |  |  |     when %r{^https?://www\.apache\.org/dyn/closer\.cgi}, %r{^https?://www\.apache\.org/dyn/closer\.lua} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       CurlApacheMirrorDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^https?://(.+?\.)?googlecode\.com/svn}, %r{^https?://svn\.}, %r{^svn://}, %r{^https?://(.+?\.)?sourceforge\.net/svnroot/} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       SubversionDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^cvs://} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       CVSDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^https?://(.+?\.)?googlecode\.com/hg} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       MercurialDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^hg://} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       MercurialDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^bzr://} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       BazaarDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^fossil://} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       FossilDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^http://svn\.apache\.org/repos/}, %r{^svn\+http://} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       SubversionDownloadStrategy | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     when %r{^https?://(.+?\.)?sourceforge\.net/hgweb/} | 
					
						
							| 
									
										
										
										
											2014-03-18 15:28:21 -05:00
										 |  |  |       MercurialDownloadStrategy | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2012-06-25 21:39:28 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-15 01:19:31 -05:00
										 |  |  |   def self.detect_from_symbol(symbol) | 
					
						
							|  |  |  |     case symbol | 
					
						
							| 
									
										
										
										
											2014-03-18 15:34:04 -05:00
										 |  |  |     when :hg      then MercurialDownloadStrategy | 
					
						
							| 
									
										
										
										
											2012-06-25 21:39:28 -05:00
										 |  |  |     when :nounzip then NoUnzipCurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-03-18 15:34:04 -05:00
										 |  |  |     when :git     then GitDownloadStrategy | 
					
						
							|  |  |  |     when :bzr     then BazaarDownloadStrategy | 
					
						
							|  |  |  |     when :svn     then SubversionDownloadStrategy | 
					
						
							|  |  |  |     when :curl    then CurlDownloadStrategy | 
					
						
							|  |  |  |     when :ssl3    then CurlSSL3DownloadStrategy | 
					
						
							|  |  |  |     when :cvs     then CVSDownloadStrategy | 
					
						
							|  |  |  |     when :post    then CurlPostDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-12-18 13:06:05 -05:00
										 |  |  |     when :fossil  then FossilDownloadStrategy | 
					
						
							| 
									
										
										
										
											2012-06-25 21:39:28 -05:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2016-07-03 23:58:44 -06:00
										 |  |  |       raise "Unknown download strategy #{symbol} was requested." | 
					
						
							| 
									
										
										
										
											2012-06-25 21:39:28 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-03-22 21:19:20 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | end |