story_branch 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +28 -28
- data/exe/git-finish +1 -1
- data/lib/story_branch/commands/add.rb +6 -6
- data/lib/story_branch/git_utils.rb +2 -2
- data/lib/story_branch/github/project.rb +1 -1
- data/lib/story_branch/jira/project.rb +2 -2
- data/lib/story_branch/main.rb +59 -20
- data/lib/story_branch/pivotal/project.rb +1 -1
- data/lib/story_branch/string_utils.rb +6 -0
- data/lib/story_branch/version.rb +1 -1
- data/story_branch.gemspec +2 -1
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0adf65a12d1ab52998ada7760645345d76c1dbe817ce52724005a71cf1b7bb30
|
4
|
+
data.tar.gz: 63a19f6f253be9459618ecfb8d23f099c1e2ea5c65b3152394b49a6dce335094
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7a2c1923c37f423f7f2a946e6ecf19371cae814b33489ec59069567711b3de50a3c49e054d4c30042c04ebfe4b16c032584f854a758ab1f0871bb7f27d67ca7
|
7
|
+
data.tar.gz: a59cb14660ed656598170978e63ccc2e51e414028d28a6af35c3e0de82d96fd9cea10c93e033c4c9a12850b880fbd922b1b60a035e700fea8b73ee292b59ad11
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
story_branch (0.6.
|
4
|
+
story_branch (0.6.1)
|
5
5
|
blanket_wrapper (~> 3.0)
|
6
6
|
damerau-levenshtein (~> 1.3)
|
7
7
|
jira-ruby (~> 1.7)
|
@@ -14,12 +14,12 @@ PATH
|
|
14
14
|
GEM
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
|
-
activesupport (6.0.
|
17
|
+
activesupport (6.0.2.1)
|
18
18
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
19
|
i18n (>= 0.7, < 2)
|
20
20
|
minitest (~> 5.1)
|
21
21
|
tzinfo (~> 1.1)
|
22
|
-
zeitwerk (~> 2.
|
22
|
+
zeitwerk (~> 2.2)
|
23
23
|
atlassian-jwt (0.2.0)
|
24
24
|
jwt (~> 2.1.0)
|
25
25
|
blanket_wrapper (3.0.2)
|
@@ -27,12 +27,12 @@ GEM
|
|
27
27
|
recursive-open-struct
|
28
28
|
coderay (1.1.2)
|
29
29
|
concurrent-ruby (1.1.5)
|
30
|
-
damerau-levenshtein (1.3.
|
30
|
+
damerau-levenshtein (1.3.2)
|
31
31
|
diff-lcs (1.3)
|
32
32
|
equatable (0.6.1)
|
33
33
|
fakefs (0.20.1)
|
34
34
|
git (1.5.0)
|
35
|
-
httparty (0.17.
|
35
|
+
httparty (0.17.3)
|
36
36
|
mime-types (~> 3.0)
|
37
37
|
multi_xml (>= 0.5.2)
|
38
38
|
i18n (1.7.0)
|
@@ -46,41 +46,41 @@ GEM
|
|
46
46
|
method_source (0.9.2)
|
47
47
|
mime-types (3.3)
|
48
48
|
mime-types-data (~> 3.2015)
|
49
|
-
mime-types-data (3.2019.
|
50
|
-
minitest (5.
|
49
|
+
mime-types-data (3.2019.1009)
|
50
|
+
minitest (5.13.0)
|
51
51
|
multi_xml (0.6.0)
|
52
52
|
multipart-post (2.1.1)
|
53
|
-
necromancer (0.5.
|
53
|
+
necromancer (0.5.1)
|
54
54
|
oauth (0.5.4)
|
55
55
|
ostruct (0.1.0)
|
56
56
|
pastel (0.7.3)
|
57
57
|
equatable (~> 0.6)
|
58
58
|
tty-color (~> 0.5)
|
59
|
-
pry (0.
|
59
|
+
pry (0.12.2)
|
60
60
|
coderay (~> 1.1.0)
|
61
61
|
method_source (~> 0.9.0)
|
62
62
|
rake (10.5.0)
|
63
63
|
recursive-open-struct (1.1.0)
|
64
|
-
rspec (3.
|
65
|
-
rspec-core (~> 3.
|
66
|
-
rspec-expectations (~> 3.
|
67
|
-
rspec-mocks (~> 3.
|
68
|
-
rspec-core (3.
|
69
|
-
rspec-support (~> 3.
|
70
|
-
rspec-expectations (3.
|
64
|
+
rspec (3.9.0)
|
65
|
+
rspec-core (~> 3.9.0)
|
66
|
+
rspec-expectations (~> 3.9.0)
|
67
|
+
rspec-mocks (~> 3.9.0)
|
68
|
+
rspec-core (3.9.0)
|
69
|
+
rspec-support (~> 3.9.0)
|
70
|
+
rspec-expectations (3.9.0)
|
71
71
|
diff-lcs (>= 1.2.0, < 2.0)
|
72
|
-
rspec-support (~> 3.
|
73
|
-
rspec-mocks (3.
|
72
|
+
rspec-support (~> 3.9.0)
|
73
|
+
rspec-mocks (3.9.0)
|
74
74
|
diff-lcs (>= 1.2.0, < 2.0)
|
75
|
-
rspec-support (~> 3.
|
76
|
-
rspec-support (3.
|
75
|
+
rspec-support (~> 3.9.0)
|
76
|
+
rspec-support (3.9.0)
|
77
77
|
rspec_junit_formatter (0.4.1)
|
78
78
|
rspec-core (>= 2, < 4, != 2.12.0)
|
79
|
-
strings (0.1.
|
79
|
+
strings (0.1.8)
|
80
80
|
strings-ansi (~> 0.1)
|
81
81
|
unicode-display_width (~> 1.5)
|
82
82
|
unicode_utils (~> 1.4)
|
83
|
-
strings-ansi (0.
|
83
|
+
strings-ansi (0.2.0)
|
84
84
|
thor (0.20.3)
|
85
85
|
thread_safe (0.3.6)
|
86
86
|
tty-color (0.5.0)
|
@@ -92,11 +92,11 @@ GEM
|
|
92
92
|
strings (~> 0.1.4)
|
93
93
|
tty-screen (~> 0.6)
|
94
94
|
tty-which (~> 0.4)
|
95
|
-
tty-prompt (0.
|
95
|
+
tty-prompt (0.20.0)
|
96
96
|
necromancer (~> 0.5.0)
|
97
97
|
pastel (~> 0.7.0)
|
98
|
-
tty-reader (~> 0.
|
99
|
-
tty-reader (0.
|
98
|
+
tty-reader (~> 0.7.0)
|
99
|
+
tty-reader (0.7.0)
|
100
100
|
tty-cursor (~> 0.7)
|
101
101
|
tty-screen (~> 0.7)
|
102
102
|
wisper (~> 2.0.0)
|
@@ -106,8 +106,8 @@ GEM
|
|
106
106
|
thread_safe (~> 0.1)
|
107
107
|
unicode-display_width (1.6.0)
|
108
108
|
unicode_utils (1.4.0)
|
109
|
-
wisper (2.0.
|
110
|
-
zeitwerk (2.
|
109
|
+
wisper (2.0.1)
|
110
|
+
zeitwerk (2.2.2)
|
111
111
|
|
112
112
|
PLATFORMS
|
113
113
|
ruby
|
@@ -124,4 +124,4 @@ DEPENDENCIES
|
|
124
124
|
story_branch!
|
125
125
|
|
126
126
|
BUNDLED WITH
|
127
|
-
1.
|
127
|
+
2.1.2
|
data/exe/git-finish
CHANGED
@@ -46,10 +46,10 @@ module StoryBranch
|
|
46
46
|
|
47
47
|
return unless tracker == 'jira'
|
48
48
|
|
49
|
-
# rubocop:disable
|
49
|
+
# rubocop:disable Layout/LineLength
|
50
50
|
username = prompt.ask('Please provide username (email most of the times) for this key:',
|
51
51
|
required: true)
|
52
|
-
# rubocop:enable
|
52
|
+
# rubocop:enable Layout/LineLength
|
53
53
|
@config.set(project_id, :username, value: username)
|
54
54
|
@config.write(force: true)
|
55
55
|
end
|
@@ -58,15 +58,15 @@ module StoryBranch
|
|
58
58
|
return @project_id if @project_id
|
59
59
|
|
60
60
|
if tracker == 'jira'
|
61
|
-
# rubocop:disable
|
61
|
+
# rubocop:disable Layout/LineLength
|
62
62
|
project_domain = prompt.ask("What is your JIRA's subdomain?", required: true)
|
63
63
|
project_key = prompt.ask("What is your JIRA's project key?", required: true)
|
64
|
-
# rubocop:enable
|
64
|
+
# rubocop:enable Layout/LineLength
|
65
65
|
@project_id = "#{project_domain}|#{project_key}"
|
66
66
|
else
|
67
|
-
# rubocop:disable
|
67
|
+
# rubocop:disable Layout/LineLength
|
68
68
|
@project_id = prompt.ask("Please provide this project's id:", required: true)
|
69
|
-
# rubocop:enable
|
69
|
+
# rubocop:enable Layout/LineLength
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -7,7 +7,7 @@ module StoryBranch
|
|
7
7
|
# Class used to interact with git. It relies on git gem as the wrapper
|
8
8
|
# and levenshtein algo to determine branch name proximity
|
9
9
|
class GitUtils
|
10
|
-
def self.
|
10
|
+
def self.similar_branch?(name)
|
11
11
|
GitWrapper.branch_names.each do |n|
|
12
12
|
return true if DamerauLevenshtein.distance(n, name) < 3
|
13
13
|
|
@@ -35,7 +35,7 @@ module StoryBranch
|
|
35
35
|
|
36
36
|
def self.current_branch_story_parts
|
37
37
|
matches = current_story
|
38
|
-
return {} unless matches
|
38
|
+
return {} unless matches&.length == 3
|
39
39
|
|
40
40
|
title = matches[1].tr('-', ' ').strip
|
41
41
|
{ title: title, id: matches[2].to_i }
|
@@ -17,11 +17,11 @@ module StoryBranch
|
|
17
17
|
stories = if options[:id]
|
18
18
|
[@project.issues.find(options[:id])]
|
19
19
|
else
|
20
|
-
# rubocop:disable
|
20
|
+
# rubocop:disable Layout/LineLength
|
21
21
|
@project.client.Issue.jql(
|
22
22
|
"project=#{@project.key} AND status='To Do' AND assignee=currentUser()"
|
23
23
|
)
|
24
|
-
# rubocop:enable
|
24
|
+
# rubocop:enable Layout/LineLength
|
25
25
|
end
|
26
26
|
|
27
27
|
stories.map { |s| Issue.new(s, @project) }
|
data/lib/story_branch/main.rb
CHANGED
@@ -25,7 +25,7 @@ module StoryBranch
|
|
25
25
|
@local_config = ConfigManager.init_config('.')
|
26
26
|
@global_config = ConfigManager.init_config(Dir.home)
|
27
27
|
initialize_tracker
|
28
|
-
|
28
|
+
abort('Invalid tracker configuration setting.') unless @tracker.valid?
|
29
29
|
end
|
30
30
|
|
31
31
|
def create_story_branch
|
@@ -42,7 +42,7 @@ module StoryBranch
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def story_finish
|
45
|
-
current_story
|
45
|
+
return unless current_story
|
46
46
|
return if unstaged_changes?
|
47
47
|
return if nothing_to_add?
|
48
48
|
|
@@ -93,6 +93,7 @@ module StoryBranch
|
|
93
93
|
end
|
94
94
|
|
95
95
|
prompt.error('No tracked feature associated with this branch')
|
96
|
+
nil
|
96
97
|
end
|
97
98
|
|
98
99
|
def unstaged_changes?
|
@@ -168,6 +169,17 @@ module StoryBranch
|
|
168
169
|
@finish_tag
|
169
170
|
end
|
170
171
|
|
172
|
+
def issue_placement
|
173
|
+
return @issue_placement if @issue_placement
|
174
|
+
|
175
|
+
fallback = @global_config.fetch(project_id,
|
176
|
+
:issue_placement,
|
177
|
+
default: 'End')
|
178
|
+
@issue_placement = @local_config.fetch(:issue_placement,
|
179
|
+
default: fallback)
|
180
|
+
@issue_placement
|
181
|
+
end
|
182
|
+
|
171
183
|
def build_finish_message
|
172
184
|
message_tag = [finish_tag, "##{current_story.id}"].join(' ').strip
|
173
185
|
"[#{message_tag}] #{current_story.title}"
|
@@ -176,33 +188,56 @@ module StoryBranch
|
|
176
188
|
def create_feature_branch(story)
|
177
189
|
return if story.nil?
|
178
190
|
|
179
|
-
|
191
|
+
if GitUtils.branch_for_story_exists? story.id
|
192
|
+
prompt.error("An existing branch has the same story id: #{story.id}")
|
193
|
+
return
|
194
|
+
end
|
195
|
+
|
196
|
+
branch_name = valid_branch_name(story)
|
197
|
+
return unless branch_name
|
198
|
+
|
199
|
+
# rubocop:disable Layout/LineLength
|
200
|
+
feature_branch_name_with_story_id = build_branch_name(branch_name, story.id)
|
201
|
+
prompt.say("Creating: #{feature_branch_name_with_story_id} with #{current_branch} as parent")
|
202
|
+
# rubocop:enable Layout/LineLength
|
203
|
+
GitWrapper.create_branch feature_branch_name_with_story_id
|
204
|
+
end
|
205
|
+
|
206
|
+
def valid_branch_name(story)
|
180
207
|
prompt.say "You are checked out at: #{current_branch}"
|
181
208
|
branch_name = prompt.ask('Provide a new branch name',
|
182
209
|
default: story.dashed_title)
|
183
|
-
feature_branch_name = branch_name.chomp
|
184
|
-
return unless validate_branch_name(feature_branch_name, story.id)
|
210
|
+
feature_branch_name = StringUtils.truncate(branch_name.chomp)
|
185
211
|
|
186
|
-
|
187
|
-
# rubocop:disable Metrics/LineLength
|
188
|
-
prompt.say("Creating: #{feature_branch_name_with_story_id} with #{current_branch} as parent")
|
189
|
-
# rubocop:enable Metrics/LineLength
|
190
|
-
GitWrapper.create_branch feature_branch_name_with_story_id
|
212
|
+
validate_branch_name(feature_branch_name)
|
191
213
|
end
|
192
214
|
|
193
215
|
# Branch name validation
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
216
|
+
# rubocop:disable Metrics/MethodLength
|
217
|
+
def validate_branch_name(name)
|
218
|
+
if GitUtils.similar_branch? name
|
219
|
+
prompt.warn('This name is very similar to an existing branch.'\
|
220
|
+
' It is recommended to use a more unique name.')
|
221
|
+
decision = prompt.select('What to do?') do |menu|
|
222
|
+
menu.choice 'Rename the branch', 1
|
223
|
+
menu.choice 'Proceed with branch name', 2
|
224
|
+
menu.choice 'Abort branch creation', 3
|
225
|
+
end
|
226
|
+
return nil if decision == 3
|
227
|
+
return name if decision == 2
|
228
|
+
|
229
|
+
return prompt.ask('Provide a new branch name', default: name)
|
198
230
|
end
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
231
|
+
name
|
232
|
+
end
|
233
|
+
# rubocop:enable Metrics/MethodLength
|
234
|
+
|
235
|
+
def build_branch_name(branch_name, story_id)
|
236
|
+
if issue_placement.casecmp('beginning').zero?
|
237
|
+
"#{story_id}-#{branch_name}"
|
238
|
+
else
|
239
|
+
"#{branch_name}-#{story_id}"
|
204
240
|
end
|
205
|
-
true
|
206
241
|
end
|
207
242
|
|
208
243
|
def project_id
|
@@ -227,6 +262,10 @@ module StoryBranch
|
|
227
262
|
@username ||= @global_config.fetch(project_id, :username)
|
228
263
|
end
|
229
264
|
|
265
|
+
def current_branch
|
266
|
+
@current_branch ||= GitWrapper.current_branch
|
267
|
+
end
|
268
|
+
|
230
269
|
# rubocop:disable Metrics/AbcSize
|
231
270
|
# rubocop:disable Metrics/MethodLength
|
232
271
|
def initialize_tracker
|
@@ -14,7 +14,7 @@ module StoryBranch
|
|
14
14
|
# TODO: add other possible args
|
15
15
|
def stories(options = {}, estimated = true)
|
16
16
|
stories = if options[:id]
|
17
|
-
[@project.stories(options[:id]).get]
|
17
|
+
[@project.stories(options[:id]).get.payload]
|
18
18
|
else
|
19
19
|
@project.stories.get(params: options)
|
20
20
|
end
|
data/lib/story_branch/version.rb
CHANGED
data/story_branch.gemspec
CHANGED
@@ -31,11 +31,12 @@ Gem::Specification.new do |spec|
|
|
31
31
|
JIRA. Different workflows shall be supported in the next versions.
|
32
32
|
DESCRIPTION
|
33
33
|
|
34
|
+
spec.homepage = 'https://github.com/story-branch/story_branch'
|
35
|
+
|
34
36
|
spec.metadata = {
|
35
37
|
'bug_tracker_uri' => 'https://github.com/story-branch/story_branch/issues',
|
36
38
|
'changelog_uri' => 'https://github.com/story-branch/story_branch/blob/master/Changelog.md',
|
37
39
|
'documentation_uri' => 'https://github.com/story-branch/story_branch/blob/master/README.md',
|
38
|
-
'homepage_uri' => 'https://github.com/story-branch/story_branch',
|
39
40
|
'source_code_uri' => 'https://github.com/story-branch/story_branch'
|
40
41
|
}
|
41
42
|
spec.required_ruby_version = ['>= 2.4', '< 2.7']
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: story_branch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rui Baltazar
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: exe
|
14
14
|
cert_chain: []
|
15
|
-
date: 2019-
|
15
|
+
date: 2019-12-23 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: blanket_wrapper
|
@@ -315,14 +315,13 @@ files:
|
|
315
315
|
- lib/story_branch/templates/unstart/.gitkeep
|
316
316
|
- lib/story_branch/version.rb
|
317
317
|
- story_branch.gemspec
|
318
|
-
homepage:
|
318
|
+
homepage: https://github.com/story-branch/story_branch
|
319
319
|
licenses:
|
320
320
|
- MIT
|
321
321
|
metadata:
|
322
322
|
bug_tracker_uri: https://github.com/story-branch/story_branch/issues
|
323
323
|
changelog_uri: https://github.com/story-branch/story_branch/blob/master/Changelog.md
|
324
324
|
documentation_uri: https://github.com/story-branch/story_branch/blob/master/README.md
|
325
|
-
homepage_uri: https://github.com/story-branch/story_branch
|
326
325
|
source_code_uri: https://github.com/story-branch/story_branch
|
327
326
|
post_install_message:
|
328
327
|
rdoc_options: []
|
@@ -342,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
342
341
|
- !ruby/object:Gem::Version
|
343
342
|
version: '0'
|
344
343
|
requirements: []
|
345
|
-
rubygems_version: 3.0.
|
344
|
+
rubygems_version: 3.0.1
|
346
345
|
signing_key:
|
347
346
|
specification_version: 4
|
348
347
|
summary: Create git branches based on your preferred tracker tickets
|