abak-flow 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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=