story_branch 0.6.0 → 0.6.1
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.
- 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
|