abak-flow 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,12 +1,3 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gemspec
4
-
5
- group :linux do
6
- gem "libnotify"
7
- gem "rb-inotify"
8
- end
9
-
10
- group :mac do
11
- gem "terminal-notifier-guard"
12
- end
3
+ gemspec
data/README.md CHANGED
@@ -32,10 +32,10 @@ Github-flow же наоборот ведет основную разработк
32
32
  $ git config --global abak-flow.oauth-user YOUR_GITHUB_MAIL@gmail.com
33
33
  $ git config --global abak-flow.oauth-token 0123456789YOUR_GITHUB_API_TOKEN
34
34
  $ git remote add upstream git://github.com/GITHUB_PROJECT_USER/GITHUB_PROJECT_NAME.git
35
-
35
+
36
36
  ### А если я использую прокси, как быть?
37
37
  $ git config --global abak-flow.http-proxy http://my-proxy.com:3129
38
-
38
+
39
39
  Далее по приоритету идут переменные окружения. Сначала **http_proxy**, затем **HTTP_PROXY**
40
40
 
41
41
  Т.е если вы используете переменные окружения, то просто не указывайте прокси в конфиге
@@ -44,16 +44,16 @@ Github-flow же наоборот ведет основную разработк
44
44
 
45
45
  **Заметьте:** В конфиге git, значением *abak.oauth-user* должен являться тот email адрес, под которым вы заходите на github
46
46
 
47
- **Обратите внимание:** В данном контексте под **upstream** подразумевается адрес репозитория в который будут оформляться pull request. А репозиторием **origin** будет являться ваш форк
47
+ **Обратите внимание:** В данном контексте под **upstream** подразумевается адрес репозитория в который будут оформляться pull request. А репозиторием **origin** будет являться ваш форк
48
48
 
49
49
  # С чего начать?
50
50
 
51
51
  $ git request checkup
52
52
 
53
53
  или
54
-
54
+
55
55
  $ git request help
56
-
56
+
57
57
  **Примечание:** Вообще-то все комманды поддерживают опцию *--help*, но вот именно *git request --help* успевает перехватиться самим git и он конечно неодумевает как ему показать хэлп по внешней комманде
58
58
 
59
59
  # Примеры использования
@@ -96,3 +96,7 @@ Github-flow же наоборот ведет основную разработк
96
96
 
97
97
  # В заключении
98
98
  Данный репозиторий и изложенные в нем идеи ни в коем случае не претендуют на идеал и совершенство. Это всего лишь узко заточенная комбинация гемов
99
+
100
+ ## Лицензия
101
+
102
+ Abak-flow выпускается под лицензией [MIT](http://www.opensource.org/licenses/MIT).
data/abak-flow.gemspec CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.homepage = "https://github.com/Strech/abak-flow"
12
12
  gem.summary = "Совмещение 2-х подходов разработки Git-flow & Github-flow"
13
13
  gem.description = "Простой набор правил и комманд, заточеных для работы в git-flow с использование в качестве удаленного репозитория github"
14
+ gem.license = "MIT"
14
15
 
15
16
  gem.rubyforge_project = "abak-flow"
16
17
 
@@ -20,6 +21,7 @@ Gem::Specification.new do |gem|
20
21
  gem.require_paths = ["lib"]
21
22
 
22
23
  gem.add_runtime_dependency "octokit", "~> 1.19.0"
24
+ gem.add_dependency "faraday", "= 0.8.9" # TODO : remove after octokit upgrade
23
25
  gem.add_runtime_dependency "git", "~> 1.2.5"
24
26
  gem.add_runtime_dependency "commander", ">= 4.1.3"
25
27
  gem.add_runtime_dependency "ruler", ">= 1.4.2"
@@ -24,6 +24,7 @@ module Abak::Flow
24
24
  @branch.full
25
25
  end
26
26
 
27
+ # TODO : Брать коммит мессадж до перевода строки
27
28
  def message
28
29
  @branch.gcommit.message
29
30
  end
@@ -51,9 +52,18 @@ module Abak::Flow
51
52
  @manager.git.push(origin, @branch)
52
53
  end
53
54
 
54
- def pick_up_base_name
55
+ def delete_on_remote
56
+ origin = @manager.repository.origin.repo
57
+ @manager.git.push(origin, ":#{@branch}")
58
+ end
59
+
60
+ def delete_on_local
61
+ @branch.delete
62
+ end
63
+
64
+ def pick_up_base_name(options = Hash.new)
55
65
  mappable? ? MAPPING[folder]
56
- : name
66
+ : options.fetch(:or_use, name)
57
67
  end
58
68
 
59
69
  def pick_up_title
@@ -61,10 +71,20 @@ module Abak::Flow
61
71
  : message
62
72
  end
63
73
 
64
- # TODO : Вынести в i18n
74
+ # TODO : Сделать настраевыемым трекер и формат задачи
75
+ # TODO : Смотреть в коммит мессадж и искать там Fixes/Closes/Close/Fix
65
76
  def pick_up_body
66
- tracker_task? ? "http://jira.railsc.ru/browse/#{task}"
67
- : nil
77
+ head.mappable? &&
78
+ head.tracker_task? ? "http://jira.railsc.ru/browse/#{task}"
79
+ : I18n.t("commands.publish.nothing")
80
+ end
81
+
82
+ def develop?
83
+ @branch.name == DEVELOPMENT
84
+ end
85
+
86
+ def master?
87
+ @branch.name == MASTER
68
88
  end
69
89
 
70
90
  def hotfix?
@@ -43,6 +43,7 @@ module Abak::Flow
43
43
  end
44
44
 
45
45
  def setup_locale
46
+ I18n.enforce_available_locales = false
46
47
  I18n.load_path += Dir.glob(LOCALE_FILES)
47
48
  I18n.locale = locale
48
49
  end
@@ -15,6 +15,11 @@ en:
15
15
 
16
16
  pull_request:
17
17
  name: Pull Request
18
+ errors:
19
+ head_is_incorrect: Something wrong with 'head' branch
20
+ base_is_incorrect: Something wrong with 'base' branch
21
+ title_is_incorrect: Title is not specified
22
+ body_is_incorrect: Message body is not specified
18
23
 
19
24
  commands:
20
25
  checkup:
@@ -30,3 +35,8 @@ en:
30
35
  requesting: "Creating pull request %{branch} → %{upstream}"
31
36
  updating: "Updating %{branch} → %{upstream}"
32
37
  nothing: I have nothing to say ...
38
+ done:
39
+ fail: Something goes wrong!
40
+ deleting: "Deleting %{branch} in %{upstream}"
41
+ errors:
42
+ branch_is_incorrect: "You can't delete %{branch}"
@@ -15,6 +15,11 @@ ru:
15
15
 
16
16
  pull_request:
17
17
  name: Пулл реквест
18
+ errors:
19
+ head_is_incorrect: Что-то не так с 'head' веткой
20
+ base_is_incorrect: Что-то не так с 'base' веткой
21
+ title_is_incorrect: Не указан заголовок
22
+ body_is_incorrect: Не указано содержание
18
23
 
19
24
  commands:
20
25
  checkup:
@@ -30,3 +35,8 @@ ru:
30
35
  requesting: "Создание пулл реквеста %{branch} → %{upstream}"
31
36
  updating: "Обновление %{branch} → %{upstream}"
32
37
  nothing: Мне нечего добавить ...
38
+ done:
39
+ fail: Что-то пошло не так!
40
+ deleting: "Удаление %{branch} из %{upstream}"
41
+ errors:
42
+ branch_is_incorrect: "Вы не можете удалить %{branch}"
@@ -24,7 +24,7 @@ module Abak::Flow
24
24
  fact(:head_is_incorrect) { not @head.valid? }
25
25
  fact(:base_is_incorrect) { not @base.valid? }
26
26
  fact(:title_is_incorrect) { @title.empty? }
27
- fact(:body_is_incorrect) { @body.empty? }
27
+ fact(:body_is_incorrect) { @head.tracker_task? ? @body.empty? : false }
28
28
 
29
29
  rule([:head_is_incorrect]) { @errors << I18n.t("pull_request.errors.head_is_incorrect") }
30
30
  rule([:base_is_incorrect]) { @errors << I18n.t("pull_request.errors.base_is_incorrect") }
@@ -9,20 +9,17 @@ module Abak::Flow
9
9
 
10
10
  default_command :help
11
11
 
12
+ # TODO : Заменить команды классами
12
13
  command :checkup do |c|
13
14
  c.syntax = "git request checkup"
14
15
  c.description = "Проверить все ли настроено для работы с github и удаленными репозиториями"
15
16
 
16
17
  c.action do |args, options|
17
18
  m = Manager.new
18
- v = Visitor.new(m.configuration, m.repository, call: :ready?, look_for: :errors)
19
+ v = Visitor.new(m.configuration, m.repository, call: :ready?, inspect: :errors)
20
+ v.exit_on_fail(:checkup, 1)
19
21
 
20
- if v.ready?
21
- say ANSI.green { I18n.t("commands.checkup.success") }
22
- else
23
- say ANSI.red { I18n.t("commands.checkup.fail") }
24
- say ANSI.yellow { v.output }
25
- end
22
+ say ANSI.green { I18n.t("commands.checkup.success") }
26
23
  end
27
24
  end # command :checkup
28
25
 
@@ -34,16 +31,9 @@ module Abak::Flow
34
31
  c.option "--head STRING", String, "Имя ветки которую нужно сравнить"
35
32
 
36
33
  c.action do |args, options|
37
- # TODO : Вот это дубль, хочется его как-то более красиво
38
34
  m = Manager.new
39
- v = Visitor.new(m.configuration, m.repository, call: :ready?, look_for: :errors)
40
-
41
- unless v.ready?
42
- say ANSI.red { I18n.t("commands.compare.fail") }
43
- say ANSI.yellow { v.output }
44
-
45
- exit 1
46
- end
35
+ v = Visitor.new(m.configuration, m.repository, call: :ready?, inspect: :errors)
36
+ v.exit_on_fail(:compare, 1)
47
37
 
48
38
  current = m.git.current_branch
49
39
  head = Branch.new(options.head || current, m)
@@ -81,20 +71,12 @@ module Abak::Flow
81
71
  base = Branch.new(options.base || head.pick_up_base_name, m)
82
72
 
83
73
  title = options.title || head.pick_up_title
84
- body = [
85
- options.body || (head.mappable? ? nil : I18n.t("commands.publish.nothing")),
86
- head.pick_up_body
87
- ].compact * "\n\n"
74
+ body = options.body || head.pickup_up_body
88
75
 
89
76
  p = PullRequest.new({base: base, head: head, title: title, body: body}, m)
90
- v = Visitor.new(m.configuration, m.repository, p, call: :ready?, look_for: :errors)
91
-
92
- unless v.ready?
93
- say ANSI.red { I18n.t("commands.publish.fail") }
94
- say ANSI.yellow { v.output }
95
77
 
96
- exit 1
97
- end
78
+ v = Visitor.new(m.configuration, m.repository, p, call: :ready?, inspect: :errors)
79
+ v.exit_on_fail(:publish, 1)
98
80
 
99
81
  say ANSI.white {
100
82
  I18n.t("commands.publish.updating",
@@ -108,15 +90,55 @@ module Abak::Flow
108
90
  branch: ANSI.bold { "#{m.repository.origin.owner}:#{head}" },
109
91
  upstream: ANSI.bold { "#{m.repository.upstream.owner}:#{base}" }) }
110
92
 
111
- v = Visitor.new(p, call: :publish, look_for: :errors)
112
- if v.ready?
113
- say ANSI.green { I18n.t("commands.publish.success", link: p.link) }
114
- else
115
- say ANSI.red { I18n.t("commands.publish.fail") }
116
- say ANSI.yellow { v.output }
93
+ v = Visitor.new(p, call: :publish, inspect: :errors)
94
+ v.exit_on_fail(:publish, 2)
117
95
 
118
- exit 3
119
- end
96
+ say ANSI.green { I18n.t("commands.publish.success", link: p.link) }
120
97
  end
121
98
  end # command :publish
99
+
100
+ command :done do |c|
101
+ c.syntax = "git request done"
102
+ c.description = "Удалить ветки (local и origin) в которых велась работа"
103
+
104
+ c.action do |args, options|
105
+ m = Manager.new
106
+ v = Visitor.new(m.configuration, m.repository, call: :ready?, inspect: :errors)
107
+ v.exit_on_fail(:done, 1)
108
+
109
+ branch = Branch.new(m.git.current_branch, m)
110
+
111
+ if branch.develop? || branch.master?
112
+ say ANSI.red {
113
+ I18n.t("commands.done.errors.branch_is_incorrect",
114
+ branch: ANSI.bold { branch }) }
115
+ exit 2
116
+ end
117
+
118
+ say ANSI.white {
119
+ I18n.t("commands.done.deleting",
120
+ branch: ANSI.bold { branch },
121
+ upstream: ANSI.bold { "#{m.repository.origin}" }) }
122
+
123
+ # FIXME : Исправить молчаливую ситуацию
124
+ # Возможно стоит предупредить о ее отсутствии
125
+ branch.delete_on_remote rescue nil
126
+
127
+ say ANSI.white {
128
+ I18n.t("commands.done.deleting",
129
+ branch: ANSI.bold { branch },
130
+ upstream: ANSI.bold { "working tree" }) }
131
+
132
+ # TODO : Добавить проверку, что ветка,
133
+ # в которую надо попасть (master/develop)
134
+ # существует
135
+
136
+ # TODO : Быть может стоит вынести это в настройки
137
+ # и позволить выбирать, куда отправлять
138
+ # при удалении ветки, а по умолчанию использовать master
139
+ m.git.checkout(
140
+ branch.pick_up_base_name(or_use: Branch::DEVELOPMENT))
141
+ branch.delete_on_local
142
+ end
143
+ end # command :done
122
144
  end
@@ -1,5 +1,5 @@
1
1
  module Abak
2
2
  module Flow
3
- VERSION = '1.0.1'
3
+ VERSION = "1.0.2"
4
4
  end
5
5
  end
@@ -7,7 +7,7 @@ module Abak::Flow
7
7
 
8
8
  @objects = args
9
9
  @call = options.fetch(:call)
10
- @info = options.fetch(:look_for)
10
+ @inspect = options.fetch(:inspect)
11
11
 
12
12
  @asked = false
13
13
  end
@@ -23,11 +23,11 @@ module Abak::Flow
23
23
  ready? unless asked?
24
24
 
25
25
  @objects.map do |o|
26
- next if o.send(@info).empty?
26
+ next if o.send(@inspect).empty?
27
27
 
28
28
  info = ""
29
29
  name = o.respond_to?(:display_name) ? o.display_name : o.class.name
30
- o.send(@info).each_with_index do |inf, idx|
30
+ o.send(@inspect).each_with_index do |inf, idx|
31
31
  info << "\n #{idx + 1}. #{inf}"
32
32
  end
33
33
 
@@ -35,6 +35,15 @@ module Abak::Flow
35
35
  end * "\n"
36
36
  end
37
37
 
38
+ def exit_on_fail(command, code = 1)
39
+ return if ready?
40
+
41
+ say ANSI.red { I18n.t("commands.#{command}.fail") }
42
+ say ANSI.yellow { output }
43
+
44
+ exit(code)
45
+ end
46
+
38
47
  private
39
48
  def asked?
40
49
  @asked
metadata CHANGED
@@ -1,99 +1,128 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abak-flow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ prerelease:
5
+ version: 1.0.2
5
6
  platform: ruby
6
7
  authors:
7
8
  - Strech (aka Sergey Fedorov)
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-11-08 00:00:00.000000000 Z
12
+ date: 2014-02-10 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
15
+ name: octokit
14
16
  version_requirements: !ruby/object:Gem::Requirement
17
+ none: false
15
18
  requirements:
16
19
  - - ~>
17
20
  - !ruby/object:Gem::Version
18
21
  version: 1.19.0
19
- type: :runtime
20
- prerelease: false
21
- name: octokit
22
22
  requirement: !ruby/object:Gem::Requirement
23
+ none: false
23
24
  requirements:
24
25
  - - ~>
25
26
  - !ruby/object:Gem::Version
26
27
  version: 1.19.0
28
+ type: :runtime
29
+ prerelease: false
27
30
  - !ruby/object:Gem::Dependency
31
+ name: faraday
28
32
  version_requirements: !ruby/object:Gem::Requirement
33
+ none: false
29
34
  requirements:
30
- - - ~>
35
+ - - '='
31
36
  - !ruby/object:Gem::Version
32
- version: 1.2.5
37
+ version: 0.8.9
38
+ requirement: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - '='
42
+ - !ruby/object:Gem::Version
43
+ version: 0.8.9
33
44
  type: :runtime
34
45
  prerelease: false
46
+ - !ruby/object:Gem::Dependency
35
47
  name: git
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.2.5
36
54
  requirement: !ruby/object:Gem::Requirement
55
+ none: false
37
56
  requirements:
38
57
  - - ~>
39
58
  - !ruby/object:Gem::Version
40
59
  version: 1.2.5
60
+ type: :runtime
61
+ prerelease: false
41
62
  - !ruby/object:Gem::Dependency
63
+ name: commander
42
64
  version_requirements: !ruby/object:Gem::Requirement
65
+ none: false
43
66
  requirements:
44
67
  - - ! '>='
45
68
  - !ruby/object:Gem::Version
46
69
  version: 4.1.3
47
- type: :runtime
48
- prerelease: false
49
- name: commander
50
70
  requirement: !ruby/object:Gem::Requirement
71
+ none: false
51
72
  requirements:
52
73
  - - ! '>='
53
74
  - !ruby/object:Gem::Version
54
75
  version: 4.1.3
76
+ type: :runtime
77
+ prerelease: false
55
78
  - !ruby/object:Gem::Dependency
79
+ name: ruler
56
80
  version_requirements: !ruby/object:Gem::Requirement
81
+ none: false
57
82
  requirements:
58
83
  - - ! '>='
59
84
  - !ruby/object:Gem::Version
60
85
  version: 1.4.2
61
- type: :runtime
62
- prerelease: false
63
- name: ruler
64
86
  requirement: !ruby/object:Gem::Requirement
87
+ none: false
65
88
  requirements:
66
89
  - - ! '>='
67
90
  - !ruby/object:Gem::Version
68
91
  version: 1.4.2
92
+ type: :runtime
93
+ prerelease: false
69
94
  - !ruby/object:Gem::Dependency
95
+ name: i18n
70
96
  version_requirements: !ruby/object:Gem::Requirement
97
+ none: false
71
98
  requirements:
72
99
  - - ! '>='
73
100
  - !ruby/object:Gem::Version
74
101
  version: 0.6.1
75
- type: :runtime
76
- prerelease: false
77
- name: i18n
78
102
  requirement: !ruby/object:Gem::Requirement
103
+ none: false
79
104
  requirements:
80
105
  - - ! '>='
81
106
  - !ruby/object:Gem::Version
82
107
  version: 0.6.1
108
+ type: :runtime
109
+ prerelease: false
83
110
  - !ruby/object:Gem::Dependency
111
+ name: ansi
84
112
  version_requirements: !ruby/object:Gem::Requirement
113
+ none: false
85
114
  requirements:
86
115
  - - ! '>='
87
116
  - !ruby/object:Gem::Version
88
117
  version: 1.4.3
89
- type: :runtime
90
- prerelease: false
91
- name: ansi
92
118
  requirement: !ruby/object:Gem::Requirement
119
+ none: false
93
120
  requirements:
94
121
  - - ! '>='
95
122
  - !ruby/object:Gem::Version
96
123
  version: 1.4.3
124
+ type: :runtime
125
+ prerelease: false
97
126
  description: Простой набор правил и комманд, заточеных для работы в git-flow с использование
98
127
  в качестве удаленного репозитория github
99
128
  email:
@@ -133,26 +162,38 @@ files:
133
162
  - spec/abak-flow/system_spec.rb
134
163
  - spec/spec_helper.rb
135
164
  homepage: https://github.com/Strech/abak-flow
136
- licenses: []
137
- metadata: {}
165
+ licenses:
166
+ - MIT
138
167
  post_install_message:
139
168
  rdoc_options: []
140
169
  require_paths:
141
170
  - lib
142
171
  required_ruby_version: !ruby/object:Gem::Requirement
172
+ none: false
143
173
  requirements:
144
174
  - - ! '>='
145
175
  - !ruby/object:Gem::Version
146
176
  version: '0'
147
177
  required_rubygems_version: !ruby/object:Gem::Requirement
178
+ none: false
148
179
  requirements:
149
180
  - - ! '>='
150
181
  - !ruby/object:Gem::Version
151
182
  version: '0'
152
183
  requirements: []
153
184
  rubyforge_project: abak-flow
154
- rubygems_version: 2.0.5
185
+ rubygems_version: 1.8.25
155
186
  signing_key:
156
- specification_version: 4
187
+ specification_version: 3
157
188
  summary: Совмещение 2-х подходов разработки Git-flow & Github-flow
158
- test_files: []
189
+ test_files:
190
+ - spec/abak-flow/branch_spec.rb
191
+ - spec/abak-flow/branches_spec.rb
192
+ - spec/abak-flow/configuration_spec.rb
193
+ - spec/abak-flow/git_spec.rb
194
+ - spec/abak-flow/github_client_spec.rb
195
+ - spec/abak-flow/messages_spec.rb
196
+ - spec/abak-flow/project_spec.rb
197
+ - spec/abak-flow/pull_request_spec.rb
198
+ - spec/abak-flow/system_spec.rb
199
+ - spec/spec_helper.rb
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MDFkNDI2YTZiMTk4Y2Q4YTQxNzlmMzc3MGMzOGNmOTk5ODg3ZWM3Nw==
5
- data.tar.gz: !binary |-
6
- YjMxMzFkNjQ1MWNlMTZkZjMxMmY5ZDZkMGYwYzk2NmYyNzZjNTQ2Zg==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- ZWI2OTM3ZTlmY2I4NWE0NTUxMDYzODY2OTBjMDZmZDQ4Yzk5NjFjZmM4Y2U3
10
- YmM0NjE2MDFkM2M2NjRjNzE5MTg3MmU1ODJiZjI4OGE3ZDAzNjAxMzNhYzMx
11
- NWRhYmU0YmVhZTRmMTY0YmZiNDRiOTQyYjY3YTk1OGY0Y2EzZDA=
12
- data.tar.gz: !binary |-
13
- ODEwY2Y3YWQyNzc5NzYzMmJjMzE4MDI5MTYxNjJhMDY3MTM5NGIyM2E4NmMz
14
- MmZiMzhkYTdlOWQwN2QxOGIyN2MwNDMyNWJmN2NjZWJhNDRjNzE5NWExNzUx
15
- NWEzZTdiMGNkMzI3ZDc4Yjg0ZDhhNTUyOGNkMTdkMjdiODBiNTc=