bin/git-pivotal-pr in git-whistles-1.2.1 vs bin/git-pivotal-pr in git-whistles-1.3

- old
+ new

@@ -7,177 +7,12 @@ # # Assumes the branches are named # <team>/<branch-title>-<story-id> # require 'rubygems' -require 'pivotal-tracker' require 'optparse' require 'cgi' require 'term/ansicolor' require 'git-whistles/app' +require 'git-whistles/pull_request/pivotal' - -class App < Git::Whistles::App - - BROWSERS = %w(xdg-open open firefox iceweasel) - SAFE_QUERY_STRING_SIZE = 8000 - - def initialize - super - end - - - def main(args) - super - parse_args!(args) - - if args.count > 0 - die "Too many arguments", :usage => true - end - - if options.from == options.to - die "You cannot issue a pull request to the same branch (#{options.from})." - end - - query = { } - - # guess team name - if options.from =~ %r{^(\w+)/.*} - team = $1.capitalize - else - team = nil - end - - # guess title. - title = options.from.split('/').last.split(/[_-]/).delete_if { |word| word =~ /^\d+$/ }.join(' ').capitalize - query[:"pull_request[title]"] = team ? "#{team}: #{title}" : title - - # add Pivotal infos - add_pivotal_info(query, $1.to_i) if options.from =~ /(\d+)$/ - - query_string = query.map { |key,value| - "#{CGI.escape key.to_s}=#{CGI.escape value}" - }.join('&') - url = "https://github.com/#{repo}/compare/#{options.to}...#{options.from}?#{query_string}" - - puts "Preparing a pull request for branch #{options.from}" - - unless launch_browser(url) - log.warn "Sorry, I don't know how to launch a web browser on your system. You can open it yourself and paste this URL:\n#{url}" - end - end - - private - - def defaults - { - :from => run!('git symbolic-ref HEAD').strip.gsub(%r(^refs/heads/), ""), - :to => 'master', - :remote => 'origin' - } - end - - def option_parser - @option_parser ||= OptionParser.new do |op| - op.banner = "Usage: git pivotal-pr [options]" - - op.on("-f", "--from YOUR_BRANCH", "Branch to issue pull request for [head]") do |v| - options.from = v - end - - op.on("-to", "--to UPSTREAM_BRANCH", "Branch into which you want your code merged [master]") do |v| - options.to = v - end - - op.on("-r", "--remote NAME", "The remote you're sending this to [origin]") do |v| - options.to = v - end - end - end - - - def origin_url - @origin_url ||= begin - run!("git config --get remote.#{options.remote}.url").strip.tap do |url| - url =~ /github\.com/ or die "origin does not have a Github URL !" - end - end - end - - - def repo - @repo ||= origin_url.sub(/.*github\.com[\/:]/,'').sub(/\.git$/,'') - end - - - def add_pivotal_info(query, story_id) - token = `git config pivotal-tracker.token`.strip - if token.empty? - puts Term::ANSIColor.yellow %Q{ - Your branch appears to have a story ID, - but I don't know your Pivotal Tracker token! - Please set it with: - $ git config [--global] pivotal-tracker.token <token> - } - die "Aborting." - end - - log.info "Finding your project and story¬" - - PivotalTracker::Client.token = token - begin - story, project = PivotalTracker::Project.all.find do |project| - log.info '.¬' - story = project.stories.find(story_id) and break story, project - end - log.info '.' - rescue RestClient::Unauthorized - log.info '.' - die "Your token is not authorized by Pivotal Tracker! Please make sure you have the correct one" - end - - if story.nil? - log.warn "Apologies... I could not find story #{story_id}." - return - end - - log.info "Found story #{story_id} in '#{project.name}'" - - title = "#{project.name}: #{story.name} [##{story.id}]" - headline = "Pivotal tracker story [##{story_id}](#{story.url}) in project *#{project.name}*:" - description = story.description.split("\n").map { |line| "> #{line}" }.join("\n") - - query.merge! subject: story.name, :"pull_request[title]" => title - - if (headline.length + description.length) > SAFE_QUERY_STRING_SIZE - log.warn "Oops looks like your story body exceeds maximum allowed caracters to send a github request" - log.warn "Please copy the info below to your pull request body:" - puts - puts headline - puts - puts - puts description - puts - puts - puts "Press any key to continue..." - gets - query.merge! :"pull_request[body]" => "Please check your command line for the story body" - else - body = "TODO: describe your changes\n\n===\n\n#{headline}\n\n#{description}" - query.merge! :"pull_request[body]" => body - end - end - - def launch_browser(url) - BROWSERS.each do |command| - next if run("which #{command}").strip.empty? - system(command, url) and return true - end - false - end - - -end - -############################################################################ - -App.run! +Git::Whistles::PullRequest::Pivotal.run!