lib/abak-flow/request.rb in abak-flow-0.1.6 vs lib/abak-flow/request.rb in abak-flow-0.2.1

- old
+ new

@@ -14,81 +14,106 @@ # Опции нужны, если человек хочет запушить ветку, с именем отличным от стандарта 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) title = args.first.to_s.strip title = task if task =~ /^\w+\-\d{1,}$/ && title.empty? + api_user = Hub::Commands.send(:git_reader).read_config('abak.apiuser') + api_token = Hub::Commands.send(:git_reader).read_config('abak.apitoken') + api_client = Octokit::Client.new(:login => api_user, :oauth_token => api_token) + # Проверим, что мы не в мастере или девелопе if [:master, :develop].include? current_branch.to_sym - say 'Нельзя делать pull request из меток master или develop' + say color('Нельзя делать pull request из меток master или develop', :error).to_s exit end # Проверим, что у нас настроен origin if repository.remote_by_name('origin').nil? - say 'Необходимо настроить репозиторий origin (форк) для текущего пользователя' - say '=> git remote add origin https://Developer@github.com/abak-press/sample.git' + 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 # Проверим, что у нас настроен upstream if repository.remote_by_name('upstream').nil? - say 'Необходимо настроить репозиторий upstream (главный) для текущего пользователя' - say '=> git remote add upstream https://Developer@github.com/abak-press/sample.git' + 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 if title.empty? - say 'Пожалуйста, укажите что-нибудь для заголовка pull request, например номер вашей задачи вот так:' - say '=> git request publish "PC-001"' + 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? + # TODO Может быть лучше достать дерективу конфига origin? say "=> Обновляю ветку #{current_branch} на origin" Hub::Runner.execute('push', 'origin', current_branch) # Запостим pull request на upstream - command_options = ['pull-request', title, '-b', base, '-h', head] - command_options |= ['-d', jira_browse_url + task] if task =~ /^\w+\-\d{1,}$/ + body = jira_browse_url + task if task =~ /^\w+\-\d{1,}$/ + body ||= 'Я забыл какая это задача :(' say '=> Делаю pull request на upstream' - say Hub::Runner.execute(*command_options) + result = api_client.create_pull_request("#{upstream_project.owner}/#{upstream_project.name}", base, head, title, body) + say result._links.self.href 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 + repository = Hub::Commands.send :local_repo current_branch = repository.current_branch.short_name # Проверим, что у нас настроен origin if repository.remote_by_name('origin').nil? - say 'Необходимо настроить репозиторий origin (форк) для текущего пользователя' - say '=> git remote add origin https://Developer@github.com/abak-press/sample.git' + 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 @@ -100,14 +125,16 @@ command :feature do |c| c.syntax = 'git request feature <Название задачи>' c.description = 'Создать ветку для выполнения задачи. Лучше всего, если название задачи, будет ее номером из jira' c.action do |args, options| + HighLine.color_scheme = HighLine::SampleColorScheme.new + task = args.shift.to_s if task.empty? - say 'Необходимо указать имя задачи, а лучше всего ее номер из jira' + say color('Необходимо указать имя задачи, а лучше всего ее номер из jira', :error).to_s exit end unless task =~ /^\w+\-\d{1,}$/ say '=> Вы приняли верное решение :)' && exit if agree("Лучше всего завести задачу с именем примерно такого формата PC-001, может попробуем заново? [y/n]:") @@ -120,14 +147,16 @@ command :hotfix do |c| c.syntax = 'git request hotfix <Название задачи>' c.description = 'Создать ветку для выполнения bugfix задачи. Лучше всего, если название задачи, будет ее номером из jira' c.action do |args, options| + HighLine.color_scheme = HighLine::SampleColorScheme.new + task = args.shift.to_s if task.empty? - say 'Необходимо указать имя задачи, а лучше всего ее номер из jira' + say color('Необходимо указать имя задачи, а лучше всего ее номер из jira', :error).to_s exit end unless task =~ /^\w+\-\d{1,}$/ say '=> Вы приняли верное решение :)' && exit if agree("Лучше всего завести задачу с именем примерно такого формата PC-001, может попробуем заново? [y/n]:") @@ -145,21 +174,23 @@ c.option '--all', 'Удаляет ветку в локальном репозитории и в удалнном (local + origin) (по умолчанию)' c.option '--local', 'Удаляет ветку только в локальном репозитории (local)' c.option '--origin', 'Удаляет ветку в удаленном репозитории (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 branch = options.branch || current_branch type = :all if [options.local, options.origin].compact.count == 1 type = options.local ? :local : :origin end if [:master, :develop].include? branch.to_sym - say 'Извините, но нельзя удалить ветку develop или master' + say color('Извините, но нельзя удалить ветку develop или master', :error).to_s exit end warning = "Внимание! Alarm! Danger! Achtung\nЕсли вы удалите ветку на удаленном репозитории, а ваш pull request еще не приняли, вы рискуете потерять проделанную работу.\nВы уверены, что хотите продолжить?" if [:all, :origin].include?(type) @@ -173,12 +204,67 @@ end if [:all, :local].include? type remote_branch, task = current_branch.split('/').push(nil).map(&:to_s) - say "=> Удаляю локальную ветку #{branch}" + say "=> Удаляю локальную ветку #{branch}" Hub::Runner.execute('checkout', 'develop') Hub::Runner.execute('branch', '-D', branch) end + end + end + + # TODO Отрефакторить эту какашку + 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 + + 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 + + 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 + + errors.each do |error| + say "#{color(error.first, :error)}\n#{color(error.last, :info)}" + end + + say color('Хм ... кажется у вас все готово к работе', :debug).to_s if errors.count.zero? end end end \ No newline at end of file