mr_bump 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +8 -8
  2. data/bin/mr_bump +60 -33
  3. data/lib/mr_bump.rb +35 -13
  4. data/spec/mr_bump_spec.rb +200 -1
  5. data/spec/mr_bump_spec.rb.orig +626 -0
  6. data/spec/spec_helper.rb +2 -1
  7. data/spec/version_spec.rb +115 -0
  8. metadata +7 -53
  9. data/spec/coverage/assets/0.10.0/application.css +0 -799
  10. data/spec/coverage/assets/0.10.0/application.js +0 -1707
  11. data/spec/coverage/assets/0.10.0/colorbox/border.png +0 -0
  12. data/spec/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  13. data/spec/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  14. data/spec/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  15. data/spec/coverage/assets/0.10.0/favicon_green.png +0 -0
  16. data/spec/coverage/assets/0.10.0/favicon_red.png +0 -0
  17. data/spec/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  18. data/spec/coverage/assets/0.10.0/loading.gif +0 -0
  19. data/spec/coverage/assets/0.10.0/magnify.png +0 -0
  20. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  21. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  22. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  23. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  24. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  25. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  26. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  27. data/spec/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  28. data/spec/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  29. data/spec/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  30. data/spec/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  31. data/spec/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  32. data/spec/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  33. data/spec/coverage/index.html +0 -72
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGZhYWYxMDg5ZWExMWU2ZDMyY2RkODBlMDhjMmI1ZGMxYTFmMjlmYg==
4
+ Mjc5ZWMwMzgzODBkNWFmOTJjYmM3MDdkZTA4N2YyOWNjMjYwMjQ3OA==
5
5
  data.tar.gz: !binary |-
6
- ODNmZjg2Y2JmM2QxNGU1MTBmOWU4ZTE3YjYyMjY5OWQzMjg3YzA0Zg==
6
+ MDQwYmQzMDQ5NmQ0ODcxNTlhNGM0OGJmZjFhNGVjMThjMTlmNTYxMg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDE2YmI0ODMyYTc0YWFmYTFkNGE4NjMwYjUwMjMwMTlhODk0M2YzYjg5OWI1
10
- ZmJlYjc2MDliYzliYzUzNDcwMWM4MDkyZjE1NTZlNDM3OThjZmU5YjkyMDI5
11
- MTk0NzA1ZWVjZDcxN2RkNWY2YzJiMjcxNzNlY2NlYjYyM2U0ODU=
9
+ MmRkYTUxZjBiOWU4OThhYzM0Njg0M2YyZjA4ZjJhM2FkOTRiNzY4ZDRjMTNm
10
+ ODhjYjNjNDBkNGI5YzE5NzU0Njc4ODM1ZmNmYTNhNGI4YzcyZjc0ZGUzNjdl
11
+ MTMxMThhZTY3MzIyNmJmMzkzOTYxZGFlNjQ1MGQ5MDYyODc2YjM=
12
12
  data.tar.gz: !binary |-
13
- M2Y3MWM4NTZmOWVlMzMzNmJlNDI5YjIxYjNmZWJmNjdhOTYxZWZmNTZjOGJm
14
- YzE0MzIzMTY2ZTY2NDAzOWVlZjVhODJiMTU2Y2E2NDcwMGIxMjZmMmFkNmNi
15
- ZWFiZGVjNTY0MDA5OGE4YzJiZWY3ODQ3MTNhN2I1NjJjYTAzOTk=
13
+ MzYwYzUyZWUzYTFlZmJkNWY4MTIxOThhMjg2OWNmNzc4NzI2OGFhODEzODFh
14
+ MWE0NDMzYTFjNWYzMmUxYWEzMDQ4MzliYTNjOGNkNzE1NDVjMjZmODNmZGE4
15
+ MmJjZjk5YWNjMWMxODJlNzk1ZDliZTE3MGRkZDYwZDRiY2Y1M2U=
data/bin/mr_bump CHANGED
@@ -60,15 +60,16 @@ end
60
60
 
61
61
  release = MrBump.on_release_branch?
62
62
  master = MrBump.on_master_branch?
63
+ develop = MrBump.on_develop_branch?
63
64
 
64
65
  changelog = "#{`git rev-parse --show-toplevel`.strip}/CHANGELOG.md"
65
66
 
66
- unless release || master
67
+ unless release || master || develop
67
68
  puts 'Need to be on either release or master branch'
68
69
  exit 1
69
70
  end
70
71
 
71
- unless master || MrBump.current_branch.to_s == MrBump.uat_branch
72
+ unless master || develop || MrBump.current_branch.to_s == MrBump.uat_branch
72
73
  puts "On release branch '#{MrBump.current_branch}'. " \
73
74
  "Expected release branch '#{MrBump.uat_branch}'"
74
75
  exit 1
@@ -82,22 +83,24 @@ unless MrBump.config_file['github_api_token']
82
83
  exit 1
83
84
  end
84
85
 
85
- puts 'Have you already closed your PR?'
86
-
87
- github_client = MrBump::GitApi.new(MrBump.config_file['github_api_token'])
88
- menu '[Y]es / [N]o' do |choice|
89
- if choice == 'N'
90
- puts 'Here are the 10 most recent PRs in your repo:'
91
- puts github_client.sorted_prs(MrBump.git_config.path)
92
- loop do
93
- print 'Enter the PR number to merge : '
94
- pr_id = gets.chomp
95
- if options[:dryrun]
96
- puts "dryrun: Would merge ##{pr_id}"
97
- else
98
- github_client.merge_pr(MrBump.git_config.path, pr_id)
86
+ unless develop
87
+ puts 'Have you already closed your PR?'
88
+
89
+ github_client = MrBump::GitApi.new(MrBump.config_file['github_api_token'])
90
+ menu '[Y]es / [N]o' do |choice|
91
+ if choice == 'N'
92
+ puts 'Here are the 10 most recent PRs in your repo:'
93
+ puts github_client.sorted_prs(MrBump.git_config.path)
94
+ loop do
95
+ print 'Enter the PR number to merge : '
96
+ pr_id = gets.chomp
97
+ if options[:dryrun]
98
+ puts "dryrun: Would merge ##{pr_id}"
99
+ else
100
+ github_client.merge_pr(MrBump.git_config.path, pr_id)
101
+ end
102
+ break
99
103
  end
100
- break
101
104
  end
102
105
  end
103
106
  end
@@ -129,21 +132,40 @@ unless File.file?(changelog)
129
132
  exit 1
130
133
  end
131
134
 
132
- if release
133
- last_release = MrBump.current_uat
134
- changes = MrBump.change_log_items_for_range(last_release, MrBump.uat_branch).map(&:to_md)
135
- else
136
- last_release = MrBump.current_master
137
- unless last_release
135
+ if MrBump.release_stale?
136
+ if release
137
+ puts 'Error: Master branch contains commits from the release branch.'
138
+ puts 'This means the release branch has been merged, and a new release branch needs to be made.'
139
+ puts 'Unable to continue on old release branch.'
140
+ exit 1
141
+ elsif master
142
+ puts 'WARNING: Master branch contains commits from the release branch.'
143
+ end
144
+ end
145
+
146
+ last_release = MrBump.last_release
147
+ unless last_release
148
+ if master
138
149
  puts "Couldn't detect the version of the master branch. " \
139
150
  'At least one tagged version with version less than the current release version ' \
140
151
  "(#{MrBump.current_uat_major}) needs to exist"
141
- exit 1
152
+ else
153
+ puts "Couldn't detect the version of this branch. "
142
154
  end
143
- changes = MrBump.change_log_items_for_range(last_release, 'master').map(&:to_md)
155
+ exit 1
144
156
  end
145
157
 
146
- new_release = last_release.bump_patch
158
+ new_release = MrBump.next_release
159
+ if develop
160
+ new_branch = MrBump.release_branch_for_version(new_release)
161
+ print "You are about to cut a release branch. If you are sure you want to do this type: \n" \
162
+ " #{new_branch}\n" \
163
+ 'Here: '
164
+ user_inp = STDIN.readline
165
+ exit 1 unless user_inp.strip == new_branch
166
+ end
167
+
168
+ changes = MrBump.change_log_items_for_range(last_release, MrBump.current_branch).map(&:to_md)
147
169
  changes = changes.join("\n")
148
170
  md_changes = "# #{new_release}\n#{changes}\n\n"
149
171
 
@@ -179,17 +201,22 @@ end
179
201
 
180
202
  if run("git commit -m 'Bump version to #{new_release}' -- #{changelog}") &&
181
203
  run("git tag #{new_release}") &&
182
- run('git push && git push --tags')
204
+ run('git push && git push --tags') &&
205
+ (!develop || run("git checkout -b #{new_branch} && git push origin #{new_branch}"))
183
206
  MrBump.slack_notifier(new_release, changes) unless options[:dryrun]
184
207
 
185
- config_file = MrBump.config_file()
186
- branch_type = release ? 'release' : 'master'
187
- bump_cmd = config_file.fetch('post_bump', {}).fetch(branch_type, '')
188
- unless bump_cmd.empty?
208
+ branch_type = master ? 'master' : 'release'
209
+ post_bump = MrBump.config_file.fetch('post_bump', {})
210
+ bump_cmds = [
211
+ develop ? post_bump['develop'] : nil,
212
+ post_bump[branch_type]
213
+ ].compact
214
+
215
+ unless bump_cmds.empty?
189
216
  puts 'Would you like to execute the following post bump commands?'
190
- puts " #{bump_cmd}"
217
+ bump_cmds.each.each { |cmd| puts " #{cmd}" }
191
218
  menu '[Y]es execute / [N]o Im done' do |choice|
192
- run(bump_cmd) if choice == 'Y'
219
+ bump_cmds.each { |cmd| run(cmd) } if choice == 'Y'
193
220
  end
194
221
  end
195
222
  else
data/lib/mr_bump.rb CHANGED
@@ -11,8 +11,7 @@ require 'mr_bump/change'
11
11
  # Add helper functions to the MrBump namespace
12
12
  module MrBump
13
13
  def self.current_branch
14
- @current_branch ||= `git rev-parse --abbrev-ref HEAD`
15
- @current_branch.strip
14
+ @current_branch ||= `git rev-parse --abbrev-ref HEAD`.strip.freeze
16
15
  end
17
16
 
18
17
  def self.release_branch_regex
@@ -21,6 +20,12 @@ module MrBump
21
20
  "#{prefix}(\\d+\\.\\d+)(\\.\\d+)?#{suffix}"
22
21
  end
23
22
 
23
+ def self.release_branch_for_version(ver)
24
+ prefix = config_file['release_prefix']
25
+ suffix = config_file['release_suffix']
26
+ "#{prefix}#{ver.major}.#{ver.minor}.0#{suffix}"
27
+ end
28
+
24
29
  def self.on_release_branch?
25
30
  regex = Regexp.new("^#{release_branch_regex}$")
26
31
  !MrBump.current_branch[regex].nil?
@@ -30,6 +35,33 @@ module MrBump
30
35
  !MrBump.current_branch[/^master$/].nil?
31
36
  end
32
37
 
38
+ def self.on_develop_branch?
39
+ !MrBump.current_branch[/^develop$/].nil?
40
+ end
41
+
42
+ def self.release_stale?
43
+ !`git branch master --contains #{MrBump.current_uat_major}`.strip.empty?
44
+ end
45
+
46
+ def self.last_release
47
+ if on_release_branch? || (on_master_branch? && release_stale?)
48
+ MrBump.current_uat
49
+ elsif on_master_branch?
50
+ MrBump.current_master
51
+ elsif on_develop_branch?
52
+ MrBump.current_uat_major
53
+ end
54
+ end
55
+
56
+ def self.next_release
57
+ return nil unless last_release
58
+ if on_release_branch? || on_master_branch?
59
+ last_release.bump_patch
60
+ elsif on_develop_branch?
61
+ last_release.bump_minor
62
+ end
63
+ end
64
+
33
65
  def self.latest_release_from_list(branches)
34
66
  regex = Regexp.new("^origin/#{release_branch_regex}$")
35
67
  branches.map do |branch|
@@ -44,8 +76,7 @@ module MrBump
44
76
  end
45
77
 
46
78
  def self.uat_branch
47
- config = MrBump.config_file
48
- "#{config['release_prefix']}#{current_uat_major}#{config['release_suffix']}"
79
+ release_branch_for_version(current_uat_major)
49
80
  end
50
81
 
51
82
  def self.all_tags
@@ -79,15 +110,6 @@ module MrBump
79
110
  log.each_line.map(&:strip).select { |str| !(str.nil? || str == '' || str[0] == '#') }
80
111
  end
81
112
 
82
- def self.ignored_merges_regex
83
- @ignored_merges_regex ||= begin
84
- ignored_branch = '(release|master|develop)'
85
- regex_pr = "^Merge pull request #\\d+ from Intellection/#{ignored_branch}"
86
- regex_manual = "^Merge branch '?#{ignored_branch}"
87
- Regexp.new("#{regex_pr}|#{regex_manual}")
88
- end
89
- end
90
-
91
113
  def self.change_log_items_for_range(rev, head)
92
114
  ignored_branch = Regexp.new("^(#{release_branch_regex}|master|develop)$")
93
115
  make_change = lambda do |title, comment = []|
data/spec/mr_bump_spec.rb CHANGED
@@ -317,6 +317,58 @@ describe MrBump do
317
317
  expect(MrBump.on_master_branch?).to eq(false)
318
318
  end
319
319
  end
320
+
321
+ context 'when on a branch called develop' do
322
+ let(:current_branch) { 'develop' }
323
+
324
+ it 'returns false' do
325
+ expect(MrBump.on_master_branch?).to eq(false)
326
+ end
327
+ end
328
+ end
329
+
330
+ describe '#on_develop_branch?' do
331
+ before(:each) { allow(MrBump).to receive(:current_branch).and_return(current_branch) }
332
+
333
+ context 'when on a branch called develop' do
334
+ let(:current_branch) { 'develop' }
335
+
336
+ it 'returns true' do
337
+ expect(MrBump.on_develop_branch?).to eq(true)
338
+ end
339
+ end
340
+
341
+ context 'when on a branch called develop$' do
342
+ let(:current_branch) { 'develop$' }
343
+
344
+ it 'returns false' do
345
+ expect(MrBump.on_develop_branch?).to eq(false)
346
+ end
347
+ end
348
+
349
+ context 'when on a branch called ^develop' do
350
+ let(:current_branch) { '^develop' }
351
+
352
+ it 'returns false' do
353
+ expect(MrBump.on_develop_branch?).to eq(false)
354
+ end
355
+ end
356
+
357
+ context 'when on a branch called release' do
358
+ let(:current_branch) { 'release' }
359
+
360
+ it 'returns false' do
361
+ expect(MrBump.on_develop_branch?).to eq(false)
362
+ end
363
+ end
364
+
365
+ context 'when on a branch called master' do
366
+ let(:current_branch) { 'master' }
367
+
368
+ it 'returns false' do
369
+ expect(MrBump.on_develop_branch?).to eq(false)
370
+ end
371
+ end
320
372
  end
321
373
 
322
374
  describe '#on_release_branch?' do
@@ -361,6 +413,14 @@ describe MrBump do
361
413
  expect(MrBump.on_release_branch?).to eq(true)
362
414
  end
363
415
  end
416
+
417
+ context 'when on a branch called develop' do
418
+ let(:current_branch) { 'develop' }
419
+
420
+ it 'returns false' do
421
+ expect(MrBump.on_master_branch?).to eq(false)
422
+ end
423
+ end
364
424
  end
365
425
 
366
426
  context 'with altered config' do
@@ -430,7 +490,7 @@ describe MrBump do
430
490
  end
431
491
  end
432
492
 
433
- describe '#' do
493
+ describe '#change_log_items_for_range' do
434
494
  let(:log) do
435
495
  [
436
496
  'Merge pull request #4 from mr_bump/hotfix/DEV-1261',
@@ -461,4 +521,143 @@ describe MrBump do
461
521
  end
462
522
  end
463
523
  end
524
+
525
+ describe '#last_release' do
526
+ before do
527
+ allow(MrBump).to receive(:current_uat).and_return(MrBump::Version.new('0.1.3'))
528
+ allow(MrBump).to receive(:current_uat_major).and_return(MrBump::Version.new('0.1.0'))
529
+ allow(MrBump).to receive(:current_master).and_return(MrBump::Version.new('0.0.1'))
530
+ end
531
+
532
+ context 'when on master branch' do
533
+ before do
534
+ allow(MrBump).to receive(:on_master_branch?).and_return(true)
535
+ allow(MrBump).to receive(:on_release_branch?).and_return(false)
536
+ allow(MrBump).to receive(:on_develop_branch?).and_return(false)
537
+ allow(MrBump).to receive(:release_stale?).and_return(false)
538
+ end
539
+
540
+ it 'returns the master version' do
541
+ expect(MrBump.last_release).to eq(MrBump::Version.new('0.0.1'))
542
+ end
543
+ end
544
+
545
+ context 'when on master with stale release branch' do
546
+ before do
547
+ allow(MrBump).to receive(:on_master_branch?).and_return(true)
548
+ allow(MrBump).to receive(:on_release_branch?).and_return(false)
549
+ allow(MrBump).to receive(:on_develop_branch?).and_return(false)
550
+ allow(MrBump).to receive(:release_stale?).and_return(true)
551
+ end
552
+
553
+ it 'returns the master version' do
554
+ expect(MrBump.last_release).to eq(MrBump::Version.new('0.1.3'))
555
+ end
556
+ end
557
+
558
+ context 'when on release branch' do
559
+ before do
560
+ allow(MrBump).to receive(:on_master_branch?).and_return(false)
561
+ allow(MrBump).to receive(:on_release_branch?).and_return(true)
562
+ allow(MrBump).to receive(:on_develop_branch?).and_return(false)
563
+ allow(MrBump).to receive(:release_stale?).and_return(false)
564
+ end
565
+
566
+ it 'returns the release version' do
567
+ expect(MrBump.last_release).to eq(MrBump::Version.new('0.1.3'))
568
+ end
569
+ end
570
+
571
+
572
+ context 'when on develop branch' do
573
+ before do
574
+ allow(MrBump).to receive(:on_master_branch?).and_return(false)
575
+ allow(MrBump).to receive(:on_release_branch?).and_return(false)
576
+ allow(MrBump).to receive(:on_develop_branch?).and_return(true)
577
+ allow(MrBump).to receive(:release_stale?).and_return(false)
578
+ end
579
+
580
+ it 'returns the last release version' do
581
+ expect(MrBump.last_release).to eq(MrBump::Version.new('0.1.0'))
582
+ end
583
+ end
584
+ end
585
+
586
+ describe '#next_release' do
587
+ before do
588
+ allow(MrBump).to receive(:current_uat).and_return(MrBump::Version.new('0.1.3'))
589
+ allow(MrBump).to receive(:current_uat_major).and_return(MrBump::Version.new('0.1.0'))
590
+ allow(MrBump).to receive(:current_master).and_return(MrBump::Version.new('0.0.1'))
591
+ end
592
+
593
+ context 'when on master branch' do
594
+ before do
595
+ allow(MrBump).to receive(:on_master_branch?).and_return(true)
596
+ allow(MrBump).to receive(:on_release_branch?).and_return(false)
597
+ allow(MrBump).to receive(:on_develop_branch?).and_return(false)
598
+ allow(MrBump).to receive(:release_stale?).and_return(false)
599
+ end
600
+
601
+ it 'returns the master version + a patch' do
602
+ expect(MrBump.next_release).to eq(MrBump::Version.new('0.0.2'))
603
+ end
604
+ end
605
+
606
+ context 'when on master with stale release branch' do
607
+ before do
608
+ allow(MrBump).to receive(:on_master_branch?).and_return(true)
609
+ allow(MrBump).to receive(:on_release_branch?).and_return(false)
610
+ allow(MrBump).to receive(:on_develop_branch?).and_return(false)
611
+ allow(MrBump).to receive(:release_stale?).and_return(true)
612
+ end
613
+
614
+ it 'returns the release version' do
615
+ expect(MrBump.next_release).to eq(MrBump::Version.new('0.1.4'))
616
+ end
617
+ end
618
+
619
+ context 'when on release branch' do
620
+ before do
621
+ allow(MrBump).to receive(:on_master_branch?).and_return(false)
622
+ allow(MrBump).to receive(:on_release_branch?).and_return(true)
623
+ allow(MrBump).to receive(:on_develop_branch?).and_return(false)
624
+ allow(MrBump).to receive(:release_stale?).and_return(false)
625
+ end
626
+
627
+ it 'returns the release version' do
628
+ expect(MrBump.next_release).to eq(MrBump::Version.new('0.1.4'))
629
+ end
630
+ end
631
+
632
+ context 'when on develop branch' do
633
+ before do
634
+ allow(MrBump).to receive(:on_master_branch?).and_return(false)
635
+ allow(MrBump).to receive(:on_release_branch?).and_return(false)
636
+ allow(MrBump).to receive(:on_develop_branch?).and_return(true)
637
+ allow(MrBump).to receive(:release_stale?).and_return(false)
638
+ end
639
+
640
+ it 'returns the release version plus a minor' do
641
+ expect(MrBump.next_release).to eq(MrBump::Version.new('0.2.0'))
642
+ end
643
+ end
644
+ end
645
+
646
+ describe '#file_prepend' do
647
+ it 'prepends to files' do
648
+ file = 'filename.md'
649
+ before = 'String before'
650
+ prepend_str = 'Sting to prepend. '
651
+ after = prepend_str + before
652
+
653
+ read_buffer = StringIO.new before
654
+ write_buffer = StringIO.new
655
+
656
+ allow(File).to receive(:open).with(file, 'r').and_yield(read_buffer)
657
+ allow(File).to receive(:open).with(file, 'w').and_yield(write_buffer)
658
+
659
+ MrBump.file_prepend(file, prepend_str)
660
+ expect(write_buffer.string).to eq(after)
661
+ end
662
+ end
464
663
  end