lib/abak-flow/request.rb in abak-flow-0.2.3 vs lib/abak-flow/request.rb in abak-flow-0.3.0
- old
+ new
@@ -1,141 +1,82 @@
# -*- encoding: utf-8 -*-
module Abak::Flow
- # @TODO Сделать класс, в котором собрать общие куски из задач
-
program :name, 'Утилита для оформления pull request на github.com'
program :version, Abak::Flow::VERSION
program :description, 'Утилита, заточенная под git-flow но с использованием github.com'
default_command :help
command :publish do |c|
c.syntax = 'git request publish <Заголовок>'
c.description = 'Оформить pull request из текущей ветки (feature -> develop, hotfix -> master)'
- # Опции нужны, если человек хочет запушить ветку, с именем отличным от стандарта
+ # Опции нужны, если человек хочет запушить `` ветку, с именем отличным от стандарта
c.option '--head STRING', String, 'Имя ветки, которую нужно принять в качестве изменений'
c.option '--base STRING', String, 'Имя ветки, в которую нужно принять изменения'
c.action do |args, options|
- HighLine.color_scheme = HighLine::SampleColorScheme.new
-
- request_rules = {:feature => :develop, :hotfix => :master}
jira_browse_url = 'http://jira.dev.apress.ru/browse/'
- repository = Hub::Commands.send :local_repo
- current_branch = repository.current_branch.short_name
- remote_branch, task = current_branch.split('/').push(nil).map(&:to_s)
+ config = Abak::Flow::Config.current
+ github_client = Abak::Flow::GithubClient.connect(config)
+ request = Abak::Flow::PullRequest.new(config, :head => options.head, :base => options.base)
title = args.first.to_s.strip
- title = task if task =~ /^\w+\-\d{1,}$/ && title.empty?
+ body = 'Я забыл какая это задача :('
- api_user = Hub::Commands.send(:git_reader).read_config('abak.apiuser')
- api_token = Hub::Commands.send(:git_reader).read_config('abak.apitoken')
- config_proxy = Hub::Commands.send(:git_reader).read_config('abak.proxy')
- env_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
-
- client_opts = {:proxy => config_proxy || env_proxy} if config_proxy || env_proxy
- client_opts ||= {}
-
- api_client = Octokit::Client.new({:login => api_user, :oauth_token => api_token}.merge(client_opts))
-
- # Проверим, что мы не в мастере или девелопе
- if [:master, :develop].include? current_branch.to_sym
- say color('Нельзя делать pull request из меток master или develop', :error).to_s
- exit
+ if request.default_task =~ /^\w+\-\d{1,}$/
+ title = request.default_task if title.empty?
+ body = jira_browse_url + request.default_task
end
- # Проверим, что у нас настроен origin
- if repository.remote_by_name('origin').nil?
- say color('Необходимо настроить репозиторий origin (форк) для текущего пользователя', :error).to_s
- say color('=> git remote add origin https://Developer@github.com/abak-press/sample.git', :info).to_s
- exit
- end
+ request.title = title
+ request.body = body
- # Проверим, что у нас настроен upstream
- if repository.remote_by_name('upstream').nil?
- say color('Необходимо настроить репозиторий upstream (главный) для текущего пользователя', :error).to_s
- say color('=> git remote add upstream https://Developer@github.com/abak-press/sample.git', :info).to_s
- exit
- end
+ exit unless request.valid?
- if title.empty?
- say color('Пожалуйста, укажите что-нибудь для заголовка pull request, например номер вашей задачи вот так:', :error).to_s
- say color('=> git request publish "PC-001"', :info).to_s
- exit
- end
-
- # Проверим, что у нас указан апи юзер
- if api_user.empty?
- say color('Необходимо указать своего пользователя API github', :error).to_s
- say color('=> https://github.com/Strech/abak-flow/blob/master/README.md', :info).to_s
- exit
- end
-
- # Проверим, что у нас указан токен
- if api_token.empty?
- say color('Необходимо указать токен своего пользователя API github', :error).to_s
- say color('=> https://github.com/Strech/abak-flow/blob/master/README.md', :info).to_s
- exit
- end
-
- upstream_project = repository.remote_by_name('upstream').project
-
- # Расставим ветки согласно правилам
- head = "#{repository.repo_owner}:#{current_branch}"
- base = "#{repository.remote_by_name('upstream').project.owner}:#{request_rules.fetch(remote_branch.to_sym, '')}"
-
- head = options.head unless options.head.nil?
- base = options.base unless options.base.nil?
-
# Запушим текущую ветку на origin
- # TODO Может быть лучше достать дерективу конфига origin?
- say "=> Обновляю ветку #{current_branch} на origin"
- Hub::Runner.execute('push', 'origin', current_branch)
+ say "=> Обновляю ветку #{request.current_branch} на origin"
+ Hub::Runner.execute('push', 'origin', request.current_branch)
# Запостим pull request на upstream
- body = jira_browse_url + task if task =~ /^\w+\-\d{1,}$/
- body ||= 'Я забыл какая это задача :('
-
say '=> Делаю pull request на upstream'
- result = api_client.create_pull_request("#{upstream_project.owner}/#{upstream_project.name}", base, head, title, body)
- say result._links.html.href
+ begin
+ result = github_client.create_pull_request(request.from_repo, request.base, request.head, request.title, request.body)
+ say color(result._links.html.href, :green).to_s
+ rescue => e
+ say color(e.message, :error).to_s
+ say "\nПроблемы? Попробуйте заглянуть сюда:"
+ say color('=> cписок кодов статуса ответа http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html', :info).to_s
+ end
end
end
command :update do |c|
c.syntax = 'git request update'
c.description = 'Обновить ветку на удаленном (origin) репозитории'
c.option '--branch STRING', String, 'Имя ветки, которую нужно обновить'
c.action do |args, options|
- HighLine.color_scheme = HighLine::SampleColorScheme.new
+ config = Abak::Flow::Config.current
+ request = Abak::Flow::PullRequest.new(config, :strategy => :update)
- repository = Hub::Commands.send :local_repo
- current_branch = repository.current_branch.short_name
+ exit unless request.valid?
- # Проверим, что у нас настроен origin
- if repository.remote_by_name('origin').nil?
- say color('Необходимо настроить репозиторий origin (форк) для текущего пользователя', :error).to_s
- say color('=> git remote add origin https://Developer@github.com/abak-press/sample.git', :info).to_s
- exit
- end
-
# Запушим текущую ветку на origin
- branch = options.branch || current_branch
+ branch = options.branch || request.current_branch
say "=> Обновляю ветку #{branch} на origin"
Hub::Runner.execute('push', 'origin', branch)
end
end
command :feature do |c|
c.syntax = 'git request feature <Название задачи>'
c.description = 'Создать ветку для выполнения задачи. Лучше всего, если название задачи, будет ее номером из jira'
c.action do |args, options|
- HighLine.color_scheme = HighLine::SampleColorScheme.new
+ config = Abak::Flow::Config.current
task = args.shift.to_s
if task.empty?
say color('Необходимо указать имя задачи, а лучше всего ее номер из jira', :error).to_s
@@ -153,11 +94,11 @@
command :hotfix do |c|
c.syntax = 'git request hotfix <Название задачи>'
c.description = 'Создать ветку для выполнения bugfix задачи. Лучше всего, если название задачи, будет ее номером из jira'
c.action do |args, options|
- HighLine.color_scheme = HighLine::SampleColorScheme.new
+ config = Abak::Flow::Config.current
task = args.shift.to_s
if task.empty?
say color('Необходимо указать имя задачи, а лучше всего ее номер из jira', :error).to_s
@@ -180,40 +121,34 @@
c.option '--all', 'Удаляет ветку в локальном репозитории и в удалнном (local + origin) (по умолчанию)'
c.option '--local', 'Удаляет ветку только в локальном репозитории (local)'
c.option '--origin', 'Удаляет ветку в удаленном репозитории (origin)'
c.action do |args, options|
- HighLine.color_scheme = HighLine::SampleColorScheme.new
+ config = Abak::Flow::Config.current
+ request = Abak::Flow::PullRequest.new(config, :strategy => :done)
+ branch = options.branch || request.current_branch
- repository = Hub::Commands.send :local_repo
- current_branch = repository.current_branch.short_name
- branch = options.branch || current_branch
+ exit unless request.valid?
type = :all
if [options.local, options.origin].compact.count == 1
type = options.local ? :local : :origin
end
- if [:master, :develop].include? branch.to_sym
- say color('Извините, но нельзя удалить ветку develop или master', :error).to_s
- exit
- end
-
- warning = "Внимание! Alarm! Danger! Achtung\nЕсли вы удалите ветку на удаленном репозитории, а ваш pull request еще не приняли, вы рискуете потерять проделанную работу.\nВы уверены, что хотите продолжить?"
+ warning = color('Внимание! Alarm! Danger! Achtung!', :error).to_s +
+ "\nЕсли вы удалите ветку на удаленном (remote) репозитории, а ваш pull request еще не приняли, вы рискуете потерять проделанную работу.\nВы уверены, что хотите продолжить?"
if [:all, :origin].include?(type)
say '=> Вы приняли верное решение :)' && exit unless agree("#{warning} [y/n]:")
end
- # @TODO Проверку на наличие ветки на origin
- if [:all, :origin].include? type
+ # TODO Проверку на наличие ветки на origin
+ if [:all, :origin].include?(type)
say "=> Удаляю ветку #{branch} на origin"
- Hub::Runner.execute('push', repository.main_project.remote.name, ':' + branch)
+ Hub::Runner.execute('push', request.origin_repo, ':' + branch)
end
- if [:all, :local].include? type
- remote_branch, task = current_branch.split('/').push(nil).map(&:to_s)
-
+ if [:all, :local].include?(type)
say "=> Удаляю локальную ветку #{branch}"
Hub::Runner.execute('checkout', 'develop')
Hub::Runner.execute('branch', '-D', branch)
end
end
@@ -223,63 +158,19 @@
command :readycheck do |c|
c.syntax = 'git request readycheck'
c.description = 'Проверить все ли настроено для работы с github и удаленным (origin) репозиторием'
c.action do |args, options|
- HighLine.color_scheme = HighLine::SampleColorScheme.new
- repository = Hub::Commands.send :local_repo
- current_branch = repository.current_branch.short_name
+ config = Abak::Flow::Config.current
+ request = Abak::Flow::PullRequest.new(config, :strategy => :readycheck)
- api_user = Hub::Commands.send(:git_reader).read_config('abak.apiuser').to_s
- api_token = Hub::Commands.send(:git_reader).read_config('abak.apitoken').to_s
- config_proxy = Hub::Commands.send(:git_reader).read_config('abak.proxy')
- env_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
-
- errors = []
-
- # Проверим, что у нас настроен origin
- if repository.remote_by_name('origin').nil?
- errors << [
- 'Необходимо настроить репозиторий origin (форк) для текущего пользователя',
- '=> git remote add origin https://Developer@github.com/abak-press/sample.git'
- ]
- end
-
- # Проверим, что у нас настроен upstream
- if repository.remote_by_name('upstream').nil?
- errors << [
- 'Необходимо настроить репозиторий upstream (главный) для текущего пользователя',
- '=> git remote add upstream https://Developer@github.com/abak-press/sample.git'
- ]
- end
-
- # Проверим, что у нас указан апи юзер
- if api_user.empty?
- errors << [
- 'Необходимо указать своего пользователя API github',
- '=> https://github.com/Strech/abak-flow/blob/master/README.md'
- ]
- end
-
- # Проверим, что у нас указан токен
- if api_token.empty?
- errors << [
- 'Необходимо указать токен своего пользователя API github',
- '=> https://github.com/Strech/abak-flow/blob/master/README.md'
- ]
- end
-
- if config_proxy || env_proxy
- message = "== В качестве прокси будет установлено значение #{config_proxy || env_proxy} =="
+ if config.proxy?
+ message = "== В качестве прокси будет установлено значение #{config.proxy} =="
say color('=' * message.length, :info).to_s
say color(message, :info).to_s
say color('=' * message.length + "\n", :info).to_s
end
- errors.each do |error|
- say "#{color(error.first, :error)}\n#{color(error.last, :info)}"
- end
-
- say color('Хм ... кажется у вас все готово к работе', :debug).to_s if errors.count.zero?
+ say color('Хм ... кажется у вас все готово к работе', :debug).to_s if request.valid?
end
end
end
\ No newline at end of file