| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "formula" | 
					
						
							|  |  |  | require "cmd/config" | 
					
						
							|  |  |  | require "net/http" | 
					
						
							|  |  |  | require "net/https" | 
					
						
							|  |  |  | require "stringio" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def gistify_logs(f) | 
					
						
							| 
									
										
										
										
											2015-04-25 22:07:06 -04:00
										 |  |  |     files = load_logs(f.logs) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s = StringIO.new | 
					
						
							|  |  |  |     Homebrew.dump_verbose_config(s) | 
					
						
							|  |  |  |     files["config.out"] = { :content => s.string } | 
					
						
							|  |  |  |     files["doctor.out"] = { :content => `brew doctor 2>&1` } | 
					
						
							| 
									
										
										
										
											2015-02-11 17:29:56 +08:00
										 |  |  |     unless f.core_formula? | 
					
						
							|  |  |  |       tap = <<-EOS.undent
 | 
					
						
							|  |  |  |         Formula: #{f.name} | 
					
						
							|  |  |  |         Tap: #{f.tap} | 
					
						
							|  |  |  |         Path: #{f.path} | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  |       files["tap.out"] = { :content => tap } | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     url = create_gist(files) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if ARGV.include?("--new-issue") || ARGV.switch?("n") | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |       auth = :AUTH_TOKEN | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       unless HOMEBREW_GITHUB_API_TOKEN | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         puts "You can create a personal access token: https://github.com/settings/tokens" | 
					
						
							|  |  |  |         puts "and then set HOMEBREW_GITHUB_API_TOKEN as authentication method." | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |         puts | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         auth = :AUTH_BASIC | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       url = new_issue(f.tap, "#{f.name} failed to build on #{MACOS_FULL_VERSION}", url, auth) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |     puts url if url | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   # Hack for ruby < 1.9.3 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |   def noecho_gets | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     system "stty -echo" | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |     result = $stdin.gets | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     system "stty echo" | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |     puts | 
					
						
							|  |  |  |     result | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def login(request) | 
					
						
							|  |  |  |     print "GitHub User: " | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |     user = $stdin.gets.chomp | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     print "Password: " | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |     password = noecho_gets.chomp | 
					
						
							|  |  |  |     puts | 
					
						
							|  |  |  |     request.basic_auth(user, password) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 22:07:06 -04:00
										 |  |  |   def load_logs(dir) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |     logs = {} | 
					
						
							|  |  |  |     dir.children.sort.each do |file| | 
					
						
							|  |  |  |       contents = file.size? ? file.read : "empty log" | 
					
						
							|  |  |  |       logs[file.basename.to_s] = { :content => contents } | 
					
						
							|  |  |  |     end if dir.exist? | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     raise "No logs." if logs.empty? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |     logs | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def create_gist(files) | 
					
						
							|  |  |  |     post("/gists", "public" => true, "files" => files)["html_url"] | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def new_issue(repo, title, body, auth) | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |     post("/repos/#{repo}/issues", { "title" => title, "body" => body }, auth)["html_url"] | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def http | 
					
						
							|  |  |  |     @http ||= begin | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       uri = URI.parse("https://api.github.com") | 
					
						
							|  |  |  |       p = ENV["http_proxy"] ? URI.parse(ENV["http_proxy"]) : nil | 
					
						
							|  |  |  |       if p.class == URI::HTTP || p.class == URI::HTTPS | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |         @http = Net::HTTP.new(uri.host, uri.port, p.host, p.port, p.user, p.password) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         @http = Net::HTTP.new(uri.host, uri.port) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @http.use_ssl = true | 
					
						
							|  |  |  |       @http | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |   def make_request(path, data, auth) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |     headers = { | 
					
						
							|  |  |  |       "User-Agent"   => HOMEBREW_USER_AGENT, | 
					
						
							|  |  |  |       "Accept"       => "application/vnd.github.v3+json", | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       "Content-Type" => "application/json" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if auth == :AUTH_TOKEN || (auth.nil? && HOMEBREW_GITHUB_API_TOKEN) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |       headers["Authorization"] = "token #{HOMEBREW_GITHUB_API_TOKEN}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     request = Net::HTTP::Post.new(path, headers) | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     login(request) if auth == :AUTH_BASIC | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |     request.body = Utils::JSON.dump(data) | 
					
						
							|  |  |  |     request | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |   def post(path, data, auth = nil) | 
					
						
							|  |  |  |     request = make_request(path, data, auth) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     case response = http.request(request) | 
					
						
							|  |  |  |     when Net::HTTPCreated | 
					
						
							|  |  |  |       Utils::JSON.load get_body(response) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       raise "HTTP #{response.code} #{response.message} (expected 201)" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def get_body(response) | 
					
						
							|  |  |  |     if !response.body.respond_to?(:force_encoding) | 
					
						
							|  |  |  |       response.body | 
					
						
							|  |  |  |     elsif response["Content-Type"].downcase == "application/json; charset=utf-8" | 
					
						
							|  |  |  |       response.body.dup.force_encoding(Encoding::UTF_8) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       response.body.encode(Encoding::UTF_8, :undef => :replace) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def gist_logs | 
					
						
							| 
									
										
										
										
											2015-05-17 20:27:43 +08:00
										 |  |  |     if ARGV.resolved_formulae.length != 1
 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:32:02 +01:00
										 |  |  |       puts "usage: brew gist-logs [--new-issue|-n] <formula>" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |       Homebrew.failed = true | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-17 20:27:43 +08:00
										 |  |  |     gistify_logs(ARGV.resolved_formulae[0]) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:25:09 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | end |