octopolo 1.2.1 → 1.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6a67ceec3847ae82cd909737bf2b46f62158dab
4
- data.tar.gz: c4c8486b109e1a402c8cf77ad5af2f7cc4ebb249
3
+ metadata.gz: 1180ea8ecff06b1794c95afb8691c7577f9223c9
4
+ data.tar.gz: 1a5a2e430cfb10351f755df6c2614723f72872b8
5
5
  SHA512:
6
- metadata.gz: 94940d74fb753515939e99b38cd9ab386cff1b78ae1232f4f63a5442df0f30430555202b87f48b7c91d90db1ca48df4af203588fa265b592f35c6f669ed41596
7
- data.tar.gz: ea460b23ad0cbb4054936d5cf017480c1e04d1b1227164984b02a9e3f2611466ef555c09bf2d40b43f5e718d1a487a2d9a58780e8953c531e1fe9a69dfde46d2
6
+ metadata.gz: a21ed3bc2ce58fe993ec7212c78a71bb3598e5e3b88387ff9531ca4d28c467c32c8eb6277dfb1723f0e22a7f13bee03c8b24f5ef57e203ac3f6385ea4ccd5d0d
7
+ data.tar.gz: 11a8c5346bcd00e22bc3f1a257993aaa736f4d87a1d86c838001da4188b2ff9611dc6c120b4460e8b0eba4ec838a921f972ba36760b5fbb04daf3f353feabb2d
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.4
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,36 @@
1
+ #### v1.3.0
2
+ * IS-4641-spring-cleaning-jira-bomb
3
+
4
+ > newzac: Zach Serre, Carl Allen: https://github.com/sportngin/octopolo/pull/84
5
+
6
+ * Spring Cleaning IS-4644 Enable use of auto-merging resolver
7
+
8
+ > newzac: Carl Allen, Andy Fleener: https://github.com/sportngin/octopolo/pull/83
9
+
10
+ * Reserved branch warning
11
+
12
+ > Mykola, Brian Bergstrom: Matt Krieger: https://github.com/sportngin/octopolo/pull/82
13
+
14
+ * Exit with a status code of 1. Could also use abort, I guess
15
+
16
+ > AJ Stuyvenberg: Brian Bergstrom: https://github.com/sportngin/octopolo/pull/81
17
+
18
+ * Don't raise on missing config file
19
+
20
+ > Chris Arcand: Andy Fleener, Pete Anderson: https://github.com/sportngin/octopolo/pull/80
21
+
22
+ * Remove unwanted CLI output from tests
23
+
24
+ > Chris Arcand: : https://github.com/sportngin/octopolo/pull/79
25
+
26
+ * Use an rbenv/chruby compatible ruby-version
27
+
28
+ > Chris Arcand: Andy Fleener: https://github.com/sportngin/octopolo/pull/78
29
+
30
+ * Remove and ignore .DS_Store
31
+
32
+ > Chris Arcand: : https://github.com/sportngin/octopolo/pull/77
33
+
1
34
  #### v1.2.1
2
35
  #### v1.2.0
3
36
  * View PR in Browser
data/README.markdown CHANGED
@@ -47,6 +47,10 @@ another named branch) into your current branch.
47
47
 
48
48
  sync-branch
49
49
  sync-branch some-other-branch
50
+ #### Automatic Merge Conflict Resolution
51
+
52
+ Optionally you can add the line `merge_resolver: <path/to/script>` to the `.octopolo.yml` to
53
+ have Octopolo try to resolve conflicts automatically via a script upon merge failure.
50
54
 
51
55
  #### Review Changes In Releases
52
56
 
@@ -44,6 +44,10 @@ module Octopolo
44
44
  @github_repo || raise(MissingRequiredAttribute, "GitHub Repo is required")
45
45
  end
46
46
 
47
+ def merge_resolver
48
+ @merge_resolver
49
+ end
50
+
47
51
  def user_notifications
48
52
  if [NilClass, Array, String].include?(@user_notifications.class)
49
53
  Array(@user_notifications) if @user_notifications
data/lib/octopolo/git.rb CHANGED
@@ -6,6 +6,8 @@ module Octopolo
6
6
  NO_BRANCH = "(no branch)"
7
7
  DEFAULT_DIRTY_MESSAGE = "Your Git index is not clean. Commit, stash, or otherwise clean up the index before continuing."
8
8
  DIRTY_CONFIRM_MESSAGE = "Your Git index is not clean. Do you want to continue?"
9
+ RESERVED_BRANCH_MESSAGE = "Please choose another name for your new branch."
10
+ RESERVED_BRANCH_CONFIRM_MESSAGE = "Your new branch may be misidentified as a reserved branch based on its name. Do you want to continue?"
9
11
  # we use date-based tags, so look for anything starting with a 4-digit year
10
12
  RELEASE_TAG_FILTER = /^\d{4}.*/
11
13
  RECENT_TAG_LIMIT = 9
@@ -17,6 +19,11 @@ module Octopolo
17
19
  STAGING_PREFIX = "staging"
18
20
  QAREADY_PREFIX = "qaready"
19
21
 
22
+ # To check if the new branch's name starts with one of these
23
+ RESERVED_BRANCH_PREFIXES = [ DEPLOYABLE_PREFIX, STAGING_PREFIX, QAREADY_PREFIX ]
24
+
25
+ @resolver_used = nil
26
+
20
27
  include CLIWrapper
21
28
  extend CLIWrapper # add class-level .cli and .cli= methods
22
29
 
@@ -64,8 +71,8 @@ module Octopolo
64
71
  # Public: Determine if current_branch is reserved
65
72
  #
66
73
  # Returnsa boolean value
67
- def self.reserved_branch?
68
- !(current_branch =~ /^(?:#{Git::STAGING_PREFIX}|#{Git::DEPLOYABLE_PREFIX}|#{Git::QAREADY_PREFIX})/).nil?
74
+ def self.reserved_branch?(branch=current_branch)
75
+ !(branch =~ /^(?:#{Git::RESERVED_BRANCH_PREFIXES.join('|')})/).nil?
69
76
  end
70
77
 
71
78
  # Public: Check out the given branch name
@@ -114,6 +121,7 @@ module Octopolo
114
121
  yield
115
122
  else
116
123
  alert_dirty_index message
124
+ exit 1
117
125
  end
118
126
  end
119
127
 
@@ -126,11 +134,30 @@ module Octopolo
126
134
  raise DirtyIndex
127
135
  end
128
136
 
137
+ def self.alert_reserved_branch(message)
138
+ cli.say " "
139
+ cli.say message
140
+ cli.say " "
141
+ cli.say "Here's the list of the reserved branch prefixes:"
142
+ cli.say RESERVED_BRANCH_PREFIXES.join(" ")
143
+ cli.say " "
144
+ raise ReservedBranch
145
+ end
146
+
129
147
  # Public: Merge the given remote branch into the current branch
130
148
  def self.merge(branch_name)
131
149
  Git.if_clean do
132
150
  Git.fetch
133
151
  perform "merge --no-ff origin/#{branch_name}", :ignore_non_zero => true
152
+ unless Git.clean?
153
+ if @resolver_used.nil? && Octopolo.config.merge_resolver
154
+ %x(#{Octopolo.config.merge_resolver})
155
+ @resolver_used = true
156
+ if Git.clean?
157
+ merge(branch_name)
158
+ end
159
+ end
160
+ end
134
161
  raise MergeFailed unless Git.clean?
135
162
  Git.push
136
163
  end
@@ -279,5 +306,6 @@ module Octopolo
279
306
  MergeFailed = Class.new(StandardError)
280
307
  NoBranchOfType = Class.new(StandardError)
281
308
  DirtyIndex = Class.new(StandardError)
309
+ ReservedBranch = Class.new(StandardError)
282
310
  end
283
311
  end
@@ -14,12 +14,20 @@ module Octopolo
14
14
  jira_config.password = config.jira_password
15
15
  jira_config.uri = config.jira_url
16
16
  end
17
- self.issue = Jiralicious::Issue.find issue_id
17
+ begin
18
+ self.issue = Jiralicious::Issue.find issue_id
19
+ rescue => e
20
+ puts "Error: Invalid Jira Issue #{issue_id}"
21
+ end
18
22
  self.comment = comment
19
23
  end
20
24
 
21
25
  def perform
22
- issue.comments.add(comment)
26
+ begin
27
+ issue.comments.add(comment)
28
+ rescue => e
29
+ puts "Error: Failed to comment on Jira Issue #{issue_id}"
30
+ end
23
31
  end
24
32
  end
25
33
  end
@@ -6,6 +6,7 @@ module Octopolo
6
6
  class NewBranch
7
7
  include ConfigWrapper
8
8
  include GitWrapper
9
+ include CLIWrapper
9
10
 
10
11
  attr_accessor :new_branch_name
11
12
  attr_accessor :source_branch_name
@@ -22,7 +23,13 @@ module Octopolo
22
23
  # Public: Perform the script
23
24
  def execute
24
25
  raise ArgumentError unless new_branch_name
25
- git.new_branch(new_branch_name, source_branch_name)
26
+ if !git.reserved_branch?(new_branch_name) || cli.ask_boolean(Git::RESERVED_BRANCH_CONFIRM_MESSAGE)
27
+ git.new_branch(new_branch_name, source_branch_name)
28
+ else
29
+ message = Git::RESERVED_BRANCH_MESSAGE
30
+ git.alert_reserved_branch message
31
+ exit 1
32
+ end
26
33
  end
27
34
 
28
35
  # Public: Provide a default value if none is given
@@ -1,3 +1,3 @@
1
1
  module Octopolo
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -82,6 +82,16 @@ module Octopolo
82
82
  end
83
83
  end
84
84
 
85
+ context "#merge_resolver" do
86
+ it "is nil by default" do
87
+ Config.new.merge_resolver.should == nil
88
+ end
89
+
90
+ it "returns a string if it has a value" do
91
+ Config.new(merge_resolver: "/opt/resolver.sh").merge_resolver.should == "/opt/resolver.sh"
92
+ end
93
+ end
94
+
85
95
  context "#user_notifications" do
86
96
  it "is nil by default" do
87
97
  Config.new.user_notifications.should == nil
@@ -153,9 +153,11 @@ module Octopolo
153
153
  Git.should_receive(:alert_dirty_index).with(Git::DEFAULT_DIRTY_MESSAGE)
154
154
 
155
155
 
156
- Git.if_clean do
157
- Math.log 1
158
- end
156
+ expect do
157
+ Git.if_clean do
158
+ Math.log 1
159
+ end
160
+ end.to raise_error(SystemExit)
159
161
  end
160
162
 
161
163
  it "prints a custom message if git index is not clean and user responds no" do
@@ -164,9 +166,11 @@ module Octopolo
164
166
  Math.should_not_receive(:log)
165
167
  Git.should_receive(:alert_dirty_index).with(custom_message)
166
168
 
167
- Git.if_clean custom_message do
168
- Math.log 1
169
- end
169
+ expect do
170
+ Git.if_clean custom_message do
171
+ Math.log 1
172
+ end
173
+ end.to raise_error(SystemExit)
170
174
  end
171
175
  end
172
176
 
@@ -192,7 +196,7 @@ module Octopolo
192
196
  Git.should_receive(:if_clean).and_yield
193
197
  Git.should_receive(:fetch)
194
198
  Git.should_receive(:perform).with("merge --no-ff origin/#{branch_name}", :ignore_non_zero => true)
195
- Git.should_receive(:clean?) { true }
199
+ Git.should_receive(:clean?).twice { true }
196
200
  Git.should_receive(:push)
197
201
 
198
202
  Git.merge branch_name
@@ -202,7 +206,7 @@ module Octopolo
202
206
  Git.should_receive(:if_clean).and_yield
203
207
  Git.should_receive(:fetch)
204
208
  Git.should_receive(:perform).with("merge --no-ff origin/#{branch_name}", :ignore_non_zero => true)
205
- Git.should_receive(:clean?) { false }
209
+ Git.should_receive(:clean?).twice { false }
206
210
  Git.should_not_receive(:push)
207
211
 
208
212
  expect { Git.merge branch_name }.to raise_error(Git::MergeFailed)
@@ -6,13 +6,14 @@ module Octopolo
6
6
  describe NewBranch do
7
7
  let(:config) { stub(:config, :deploy_branch => "production") }
8
8
  let(:git) { stub(:Git) }
9
+ let(:cli) { stub(:Cli) }
9
10
  let(:new_branch_name) { stub(:string) }
10
11
  let(:custom_source_branch) { stub(:string) }
11
12
 
12
13
  subject { NewBranch }
13
14
 
14
15
  before do
15
- NewBranch.any_instance.stub(:config => config, :git => git)
16
+ NewBranch.any_instance.stub(:config => config, :git => git, :cli => cli)
16
17
  end
17
18
 
18
19
  context "::execute" do
@@ -22,15 +23,36 @@ module Octopolo
22
23
  end
23
24
  end
24
25
 
25
- context "with a only new branch name given" do
26
+
27
+ context "with reserved new branch name" do
28
+ it "exits when aborted" do
29
+ allow(git).to receive(:reserved_branch?) { true }
30
+ allow(cli).to receive(:ask_boolean) { false }
31
+ allow(cli).to receive(:say).with(anything)
32
+ git.should_receive(:alert_reserved_branch)
33
+ expect { subject.execute(new_branch_name) }.to raise_error(SystemExit)
34
+ end
35
+
36
+ it "proceeds when confirmed" do
37
+ allow(git).to receive(:reserved_branch?) { true }
38
+ allow(cli).to receive(:ask_boolean) { true }
39
+ allow(cli).to receive(:say).with(anything)
40
+ git.should_receive(:new_branch).with(new_branch_name, "production")
41
+ subject.execute(new_branch_name)
42
+ end
43
+ end
44
+
45
+ context "with only new branch name given" do
26
46
  it "delegates to Git.new_branch" do
47
+ allow(git).to receive(:reserved_branch?) { false }
27
48
  git.should_receive(:new_branch).with(new_branch_name, "production")
28
49
  subject.execute(new_branch_name)
29
50
  end
30
51
  end
31
52
 
32
- context "with a only new branch name given" do
53
+ context "with new and source branch names given" do
33
54
  it "delegates to Git.new_branch" do
55
+ allow(git).to receive(:reserved_branch?) { false }
34
56
  git.should_receive(:new_branch).with(new_branch_name, custom_source_branch)
35
57
  subject.execute(new_branch_name, custom_source_branch)
36
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octopolo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Byrne
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-05-13 00:00:00.000000000 Z
13
+ date: 2016-06-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gli
@@ -193,6 +193,7 @@ extra_rdoc_files: []
193
193
  files:
194
194
  - ".gitignore"
195
195
  - ".ruby-gemset"
196
+ - ".ruby-version"
196
197
  - ".soyuz.yml"
197
198
  - ".travis.yml"
198
199
  - CHANGELOG.markdown
@@ -332,7 +333,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
332
333
  version: '0'
333
334
  requirements: []
334
335
  rubyforge_project:
335
- rubygems_version: 2.4.3
336
+ rubygems_version: 2.4.8
336
337
  signing_key:
337
338
  specification_version: 4
338
339
  summary: A set of GitHub workflow scripts to provide a smooth development process