socialcast-git-extensions 3.3 → 4.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: 283e0ebc38ce457e94ca898703a5ab8df99835b6
4
- data.tar.gz: 61d4adc96c8f42e659a03320f2182d844c0aa4ef
3
+ metadata.gz: 1597af4201f51193d8caa155e504dd2c1a1708df
4
+ data.tar.gz: 3998e46534810aa2ab2245faaa69bdaf728a9e60
5
5
  SHA512:
6
- metadata.gz: 310fc3393cfae32881d2b4e5ce1ae3fe1645ba9aeff0a2278b60991a89eff7ccd8d4742e4a2191c1ac7424746063ccad0f8828d0dc681f0357796ef31b0ad0a8
7
- data.tar.gz: 2f8234257b185d9b817be64b9c9c1ca21b790bc2bf867513f66f795f3c6e253fe7141dcd76e3cf34e9b0cdcad381cb45d62df88c8aaf3e37427641edb7b723bd
6
+ metadata.gz: e80849b35dd2a830a8d555565f75084cac88d7abec267e1e98822f412ca5daaea88c6ad8a34b64b86f085f7797533d59d8022a0fcc2626c5fb6a0ae7a73ba302
7
+ data.tar.gz: 5bbd8a91ebff3c6952a0237e64a31d8712ada4af78a79c5bf520dd8616bb8d87f679bb952dcc7cae660660660b490c6463de2fb9e0a02d31d61999131da2f5d0
data/.gitignore CHANGED
@@ -17,6 +17,7 @@ tmtags
17
17
  coverage
18
18
  rdoc
19
19
  pkg
20
+ .byebug_history
20
21
 
21
22
  #bundler
22
23
  Gemfile.lock
data/README.md CHANGED
@@ -29,6 +29,8 @@ Test the token with the [`git findpr`](https://github.com/socialcast/socialcast-
29
29
 
30
30
  ### Options
31
31
  * ```--quiet```: suppress posting message in Socialcast
32
+ * config/scgitx.yml option `share_via_pr_comments`: Set to `true` to post reviewrequest and integration messages
33
+ as pull request comments instead of Socialcast posts.
32
34
 
33
35
  ## git start <new_branch_name (optional)>
34
36
 
@@ -50,9 +52,17 @@ Find pull requests on github including a given commit
50
52
 
51
53
  List branches merged into remote origin/`branch` and not also merged into origin/`base_branch`
52
54
 
55
+ ## git createpr
56
+
57
+ create a pull request on github for the current branch, without assigning it for review.
58
+
53
59
  ## git reviewrequest
54
60
 
55
- create a pull request on github for peer review of the current branch.
61
+ create and assign a pull request on github for peer review of the current branch. See `assignpr` for additional options.
62
+
63
+ ## git assignpr
64
+
65
+ assign the pull request on github for the current branch for peer review.
56
66
 
57
67
  ### Optional:
58
68
  Specify a Review Buddy mapping that will reference the local Github username and @mention a pre-assigned review buddy in the Socialcast Review Request message. Specify the mapping by creating a .scgitx YML file relative to the Repo Root: config/scgitx.yml with the following format:
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'socialcast-git-extensions', 'cli.rb')
4
+ Socialcast::Gitx::CLI.start (['assignpr'] + ARGV)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'socialcast-git-extensions', 'cli.rb')
4
+ Socialcast::Gitx::CLI.start (['createpr'] + ARGV)
@@ -28,13 +28,24 @@ module Socialcast
28
28
  RestClient.log = Logger.new(STDOUT) if options[:trace]
29
29
  end
30
30
 
31
- desc "reviewrequest", "Create a pull request on github"
31
+ desc "createpr", "Create a pull request on github"
32
32
  method_option :description, :type => :string, :aliases => '-d', :desc => 'pull request description'
33
+ # @see http://developer.github.com/v3/pulls/
34
+ def createpr
35
+ update unless @skip_update
36
+ description = options[:description] || editor_input(PULL_REQUEST_DESCRIPTION)
37
+ branch = current_branch
38
+ repo = current_repo
39
+ url = create_pull_request(branch, repo, description)['html_url']
40
+ say "Pull request created: #{url}"
41
+ end
42
+
43
+ desc "assignpr", "Assign the pull request on github for review"
33
44
  method_option :additional_reviewers, :type => :string, :aliases => '-a', :desc => 'add additional reviewers to mention automatically, and skips the prompt'
34
45
  method_option :skip_additional_reviewers, :type => :string, :aliases => '-s', :desc => 'Skips adding additional reviewers'
35
46
  # @see http://developer.github.com/v3/pulls/
36
- def reviewrequest(*additional_reviewers)
37
- update
47
+ def assignpr(*additional_reviewers)
48
+ update unless @skip_update
38
49
 
39
50
  primary_mention = if buddy = socialcast_review_buddy(current_user)
40
51
  "assigned to @#{buddy}"
@@ -58,16 +69,34 @@ module Socialcast
58
69
  end
59
70
  end
60
71
 
61
- assignee = github_review_buddy(current_user)
62
-
63
- description = options[:description] || editor_input(PULL_REQUEST_DESCRIPTION)
64
72
  branch = current_branch
65
73
  repo = current_repo
66
- url = create_pull_request branch, repo, description, assignee
67
- say "Pull request created: #{url}"
74
+ current_pr = current_pr_for_branch(repo, branch)
75
+ issue_url = current_pr['issue_url']
76
+ url = current_pr['html_url']
77
+
78
+ assignee = github_review_buddy(current_user)
79
+ assign_pull_request(assignee, issue_url) if assignee
68
80
 
69
- review_message = ["#reviewrequest for #{branch} in #{current_repo}", "PR #{url} #{primary_mention}", '', description, '', secondary_mention, "/cc @#{developer_group} #scgitx", '', changelog_summary(branch)].compact.join("\n").gsub(/\n{2,}/, "\n\n")
70
- post review_message, :message_type => 'review_request'
81
+ if use_pr_comments?
82
+ issue_message = ['#reviewrequest', primary_mention, secondary_mention, "\n/cc @#{developer_group} #scgitx"].compact.join(' ')
83
+ comment_on_issue(issue_url, issue_message)
84
+ else
85
+ review_message = ["#reviewrequest for #{branch} in #{current_repo}", "PR #{url} #{primary_mention}", '', current_pr['body'], '', secondary_mention, "/cc @#{developer_group} #scgitx", '', changelog_summary(branch)].compact.join("\n").gsub(/\n{2,}/, "\n\n")
86
+ post review_message, :message_type => 'review_request'
87
+ end
88
+ end
89
+
90
+ desc "reviewrequest", "Create and assign a pull request on github"
91
+ method_option :description, :type => :string, :aliases => '-d', :desc => 'pull request description'
92
+ method_option :additional_reviewers, :type => :string, :aliases => '-a', :desc => 'add additional reviewers to mention automatically, and skips the prompt'
93
+ method_option :skip_additional_reviewers, :type => :string, :aliases => '-s', :desc => 'Skips adding additional reviewers'
94
+ # @see http://developer.github.com/v3/pulls/
95
+ def reviewrequest(*additional_reviewers)
96
+ update
97
+ @skip_update = true
98
+ createpr
99
+ assignpr(*additional_reviewers)
71
100
  end
72
101
 
73
102
  desc "findpr", "Find pull requests including a given commit"
@@ -104,14 +133,21 @@ module Socialcast
104
133
  maintenance_branch_url = "https://github.com/#{repo}/tree/#{maintenance_branch}"
105
134
  description = "Backport ##{pull_request_num} to #{maintenance_branch_url}\n***\n#{pull_request_data['body']}"
106
135
 
107
- pull_request_url = create_pull_request(backport_branch, repo, description, assignee)
136
+ pr_hash = create_pull_request(backport_branch, repo, description)
137
+ assign_pull_request(assignee, pr_hash['issue_url']) if assignee
108
138
 
109
- review_message = ["#reviewrequest backport ##{pull_request_num} to #{maintenance_branch} in #{current_repo} #scgitx"]
110
- if socialcast_reviewer
111
- review_message << "/cc @#{socialcast_reviewer} for #backport track"
139
+ reviewer_mention = "@#{socialcast_reviewer}" if socialcast_reviewer
140
+ if use_pr_comments?
141
+ issue_message = ['#reviewrequest backport', reviewer_mention, "/cc @#{developer_group} #scgitx"].compact.join(' ')
142
+ comment_on_issue(pr_hash['issue_url'], issue_message)
143
+ else
144
+ review_message = ["#reviewrequest backport ##{pull_request_num} to #{maintenance_branch} in #{current_repo} #scgitx"]
145
+ if socialcast_reviewer
146
+ review_message << "/cc #{reviewer_mention} for #backport track"
147
+ end
148
+ review_message << "/cc @#{developer_group}"
149
+ post review_message.join("\n\n"), :url => pr_hash['html_url'], :message_type => 'review_request'
112
150
  end
113
- review_message << "/cc @#{developer_group}"
114
- post review_message.join("\n\n"), :url => pull_request_url, :message_type => 'review_request'
115
151
  ensure
116
152
  ENV['BASE_BRANCH'] = original_base_branch
117
153
  end
@@ -192,12 +228,26 @@ module Socialcast
192
228
  integrate_branch(target_branch, prototype_branch) if target_branch == staging_branch
193
229
  run_cmd "git checkout #{branch}"
194
230
 
195
- message = <<-EOS.strip_heredoc
196
- #worklog integrating #{branch} into #{target_branch} in #{current_repo} #scgitx
197
- /cc @#{developer_group}
198
- EOS
231
+ current_pr = begin
232
+ current_pr_for_branch(current_repo, current_branch)
233
+ rescue => e
234
+ say e.message.to_s
235
+ nil
236
+ end
199
237
 
200
- post message.strip
238
+ say("WARNING: Unable to find current pull request. Use `git createpr` to create one.", :red) unless current_pr
239
+
240
+ if use_pr_comments? && current_pr
241
+ issue_message = "Integrated into #{target_branch}"
242
+ comment_on_issue(current_pr['issue_url'], issue_message) unless options[:quiet]
243
+ else
244
+ message = <<-EOS.strip_heredoc
245
+ #worklog integrating #{branch} into #{target_branch} in #{current_repo} #scgitx
246
+ /cc @#{developer_group}
247
+ EOS
248
+
249
+ post message.strip
250
+ end
201
251
  end
202
252
 
203
253
  desc 'promote', '(DEPRECATED) promote the current branch into staging'
@@ -264,12 +314,14 @@ module Socialcast
264
314
  integrate_branch(base_branch, staging_branch)
265
315
  cleanup
266
316
 
267
- message = <<-EOS.strip_heredoc
268
- #worklog releasing #{branch} to #{base_branch} in #{current_repo} #scgitx
269
- /cc @#{developer_group}
270
- EOS
317
+ unless use_pr_comments?
318
+ message = <<-EOS.strip_heredoc
319
+ #worklog releasing #{branch} to #{base_branch} in #{current_repo} #scgitx
320
+ /cc @#{developer_group}
321
+ EOS
271
322
 
272
- post message.strip
323
+ post message.strip
324
+ end
273
325
  end
274
326
 
275
327
  private
@@ -282,6 +334,10 @@ module Socialcast
282
334
  !!config['enforce_staging_before_release']
283
335
  end
284
336
 
337
+ def use_pr_comments?
338
+ config['share_via_pr_comments'] == true
339
+ end
340
+
285
341
  # post a message in socialcast
286
342
  # skip sharing message if CLI quiet option is present
287
343
  def post(message, params = {})
@@ -31,9 +31,8 @@ module Socialcast
31
31
  throw e
32
32
  end
33
33
 
34
- # returns the url of the created pull request
35
34
  # @see http://developer.github.com/v3/pulls/
36
- def create_pull_request(branch, repo, body, assignee)
35
+ def create_pull_request(branch, repo, body)
37
36
  payload = {:title => branch, :base => base_branch, :head => branch, :body => body}.to_json
38
37
  say "Creating pull request for "
39
38
  say "#{branch} ", :green
@@ -41,11 +40,7 @@ module Socialcast
41
40
  say "#{base_branch} ", :green
42
41
  say "in "
43
42
  say repo, :green
44
- data = github_api_request("POST", "repos/#{repo}/pulls", payload)
45
- assign_pull_request(branch, assignee, data) if assignee ## Unfortunately this needs to be done in a seperate request.
46
-
47
- url = data['html_url']
48
- url
43
+ github_api_request("POST", "repos/#{repo}/pulls", payload)
49
44
  end
50
45
 
51
46
  # find the PRs matching the given commit hash
@@ -56,13 +51,33 @@ module Socialcast
56
51
  github_api_request "GET", "search/issues?q=#{query}"
57
52
  end
58
53
 
59
- def assign_pull_request(branch, assignee, data)
60
- issue_payload = { :title => branch, :assignee => assignee }.to_json
61
- github_api_request "PATCH", data['issue_url'], issue_payload
54
+ # find the PRs for a given branch
55
+ # https://developer.github.com/v3/pulls/#list-pull-requests
56
+ def pull_requests_for_branch(repo, branch)
57
+ head_name = "#{repo.split('/').first}:#{branch}"
58
+ github_api_request "GET", "repos/#{repo}/pulls?head=#{head_name}"
59
+ end
60
+
61
+ # find the current PR for a given branch
62
+ def current_pr_for_branch(repo, branch)
63
+ prs = pull_requests_for_branch(repo, branch)
64
+ raise "Multiple (#{prs.size}) open PRs for #{branch} found in #{repo}, unable to proceed" if prs.size > 1
65
+ prs.first
66
+ end
67
+
68
+ def assign_pull_request(assignee, issue_url)
69
+ issue_payload = { :assignee => assignee }.to_json
70
+ github_api_request "PATCH", issue_url, issue_payload
62
71
  rescue => e
63
72
  say "Failed to assign pull request: #{e.message}", :red
64
73
  end
65
74
 
75
+ # post a comment on an issue
76
+ # https://developer.github.com/v3/issues/comments/#create-a-comment
77
+ def comment_on_issue(issue_url, comment_body)
78
+ github_api_request 'POST', "#{issue_url}/comments", { :body => comment_body }.to_json
79
+ end
80
+
66
81
  # @returns [String] socialcast username to assign the review to
67
82
  # @returns [nil] when no buddy system configured or user not found
68
83
  def socialcast_review_buddy(current_user)
@@ -1,5 +1,5 @@
1
1
  module Socialcast
2
2
  module Gitx
3
- VERSION = "3.3"
3
+ VERSION = "4.0"
4
4
  end
5
5
  end
@@ -16,13 +16,14 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_runtime_dependency 'rugged', '>= 0.23'
18
18
  s.add_runtime_dependency 'socialcast', '~> 1.3.0'
19
- s.add_runtime_dependency 'activesupport', '~> 4.0'
19
+ s.add_runtime_dependency 'activesupport', '>= 4.0'
20
20
  s.add_runtime_dependency 'rest-client', '~> 1.7'
21
21
  s.add_runtime_dependency 'thor', '~> 0.19.1'
22
22
  s.add_runtime_dependency 'rake', '~> 10.3'
23
23
  s.add_development_dependency 'rspec', '~> 3.0'
24
24
  s.add_development_dependency 'pry', '~> 0.9.12.6'
25
25
  s.add_development_dependency 'webmock', '~> 1.21'
26
+ s.add_development_dependency 'byebug'
26
27
 
27
28
  s.files = `git ls-files`.split("\n")
28
29
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -3,10 +3,18 @@ require 'spec_helper'
3
3
  describe Socialcast::Gitx::CLI do
4
4
  let(:stubbed_executed_commands) { [] }
5
5
 
6
- def stub_message(message_body, params = {})
6
+ def expect_message(message_body, params = {})
7
7
  expect(Socialcast::CommandLine::Message).to receive(:create).with(params.merge(:body => message_body)).and_return(double(:permalink_url => 'https://community.socialcast.com/messages/1234'))
8
8
  end
9
9
 
10
+ let(:git_update_commands) do
11
+ [
12
+ "git pull origin FOO",
13
+ "git pull origin master",
14
+ "git push origin HEAD"
15
+ ]
16
+ end
17
+
10
18
  before do
11
19
  Socialcast::Gitx::CLI.instance_eval do # to supress warning from stubbing ldap_config
12
20
  @no_tasks = @no_commands = true
@@ -25,12 +33,10 @@ describe Socialcast::Gitx::CLI do
25
33
  end
26
34
 
27
35
  describe '#update' do
28
- before do
36
+ it do
29
37
  expect_any_instance_of(Socialcast::Gitx::CLI).not_to receive(:post)
30
38
  Socialcast::Gitx::CLI.start ['update']
31
- end
32
- it 'should not post message to socialcast' do end # see expectations
33
- it 'should run expected commands' do
39
+
34
40
  expect(stubbed_executed_commands).to eq([
35
41
  'git pull origin FOO',
36
42
  'git pull origin master',
@@ -40,107 +46,163 @@ describe Socialcast::Gitx::CLI do
40
46
  end
41
47
 
42
48
  describe '#integrate' do
43
- context 'when target branch is ommitted' do
44
- before do
45
- stub_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
46
-
47
- Socialcast::Gitx::CLI.start ['integrate']
49
+ context 'with no existing pull request' do
50
+ let!(:github_api_pulls_list) do
51
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
52
+ .to_return(:status => 200, :body => "[]", :headers => {})
48
53
  end
49
- it 'should post message to socialcast' do end # see expectations
50
- it 'should default to prototype' do
51
- expect(stubbed_executed_commands).to eq([
52
- "git pull origin FOO",
53
- "git pull origin master",
54
- "git push origin HEAD",
55
- "git branch -D prototype",
56
- "git fetch origin",
57
- "git checkout prototype",
58
- "git pull . FOO",
59
- "git push origin HEAD",
60
- "git checkout FOO",
61
- "git checkout FOO"
62
- ])
54
+ context 'when target branch is omitted' do
55
+ it 'defaults to prototype' do
56
+ expect_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
57
+
58
+ Socialcast::Gitx::CLI.start ['integrate']
59
+
60
+ expect(stubbed_executed_commands).to eq([
61
+ "git pull origin FOO",
62
+ "git pull origin master",
63
+ "git push origin HEAD",
64
+ "git branch -D prototype",
65
+ "git fetch origin",
66
+ "git checkout prototype",
67
+ "git pull . FOO",
68
+ "git push origin HEAD",
69
+ "git checkout FOO",
70
+ "git checkout FOO"
71
+ ])
72
+ expect(github_api_pulls_list).to have_been_requested
73
+ end
63
74
  end
64
- end
65
- context 'when target branch is ommitted with custom prototype branch' do
66
- before do
67
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:prototype_branch).and_return('special-prototype')
75
+ context 'when target branch is omitted with custom prototype branch' do
76
+ it 'defaults to the custom prototype branch' do
77
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:prototype_branch).and_return('special-prototype')
68
78
 
69
- stub_message "#worklog integrating FOO into special-prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
79
+ expect_message "#worklog integrating FOO into special-prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
70
80
 
71
- Socialcast::Gitx::CLI.start ['integrate']
81
+ Socialcast::Gitx::CLI.start ['integrate']
82
+
83
+ expect(stubbed_executed_commands).to eq([
84
+ "git pull origin FOO",
85
+ "git pull origin master",
86
+ "git push origin HEAD",
87
+ "git branch -D special-prototype",
88
+ "git fetch origin",
89
+ "git checkout special-prototype",
90
+ "git pull . FOO",
91
+ "git push origin HEAD",
92
+ "git checkout FOO",
93
+ "git checkout FOO"
94
+ ])
95
+ end
72
96
  end
73
- it 'should post message to socialcast' do end # see expectations
74
- it 'should default to prototype' do
75
- expect(stubbed_executed_commands).to eq([
76
- "git pull origin FOO",
77
- "git pull origin master",
78
- "git push origin HEAD",
79
- "git branch -D special-prototype",
80
- "git fetch origin",
81
- "git checkout special-prototype",
82
- "git pull . FOO",
83
- "git push origin HEAD",
84
- "git checkout FOO",
85
- "git checkout FOO"
86
- ])
97
+ context 'when target branch == prototype' do
98
+ it do
99
+ expect_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
100
+
101
+ Socialcast::Gitx::CLI.start ['integrate', 'prototype']
102
+
103
+ expect(stubbed_executed_commands).to eq([
104
+ "git pull origin FOO",
105
+ "git pull origin master",
106
+ "git push origin HEAD",
107
+ "git branch -D prototype",
108
+ "git fetch origin",
109
+ "git checkout prototype",
110
+ "git pull . FOO",
111
+ "git push origin HEAD",
112
+ "git checkout FOO",
113
+ "git checkout FOO"
114
+ ])
115
+ end
87
116
  end
88
- end
89
- context 'when target branch == prototype' do
90
- before do
91
- stub_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
117
+ context 'when target branch == staging' do
118
+ it do
119
+ expect_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
92
120
 
93
- Socialcast::Gitx::CLI.start ['integrate', 'prototype']
121
+ Socialcast::Gitx::CLI.start ['integrate', 'staging']
122
+
123
+ expect(stubbed_executed_commands).to eq([
124
+ "git pull origin FOO",
125
+ "git pull origin master",
126
+ "git push origin HEAD",
127
+ "git branch -D staging",
128
+ "git fetch origin",
129
+ "git checkout staging",
130
+ "git pull . FOO",
131
+ "git push origin HEAD",
132
+ "git checkout FOO",
133
+ "git branch -D prototype",
134
+ "git fetch origin",
135
+ "git checkout prototype",
136
+ "git pull . staging",
137
+ "git push origin HEAD",
138
+ "git checkout staging",
139
+ "git checkout FOO"
140
+ ])
141
+ end
94
142
  end
95
- it 'should post message to socialcast' do end # see expectations
96
- it 'should run expected commands' do
97
- expect(stubbed_executed_commands).to eq([
98
- "git pull origin FOO",
99
- "git pull origin master",
100
- "git push origin HEAD",
101
- "git branch -D prototype",
102
- "git fetch origin",
103
- "git checkout prototype",
104
- "git pull . FOO",
105
- "git push origin HEAD",
106
- "git checkout FOO",
107
- "git checkout FOO"
108
- ])
143
+ context 'when target branch != staging || prototype' do
144
+ it do
145
+ expect {
146
+ Socialcast::Gitx::CLI.start ['integrate', 'asdfasdfasdf']
147
+ }.to raise_error(/Only aggregate branches are allowed for integration/)
148
+ end
109
149
  end
110
150
  end
111
- context 'when target branch == staging' do
151
+ context 'with an existing pull request' do
152
+ let!(:github_api_pulls_list) do
153
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
154
+ .to_return(:status => 200, :body => %q([{"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1", "body":"testing"}]))
155
+ end
156
+ let!(:github_api_comments_create) do
157
+ stub_request(:post, "http://api.github.com/repos/repo/project/issues/1/comments")
158
+ .with(:body => "{\"body\":\"Integrated into prototype\"}")
159
+ .to_return(:status => 200, :body => "{}", :headers => {})
160
+ end
112
161
  before do
113
- stub_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
114
-
115
- Socialcast::Gitx::CLI.start ['integrate', 'staging']
162
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
116
163
  end
117
- it 'should post message to socialcast' do end # see expectations
118
- it 'should also integrate into prototype and run expected commands' do
119
- expect(stubbed_executed_commands).to eq([
120
- "git pull origin FOO",
121
- "git pull origin master",
122
- "git push origin HEAD",
123
- "git branch -D staging",
124
- "git fetch origin",
125
- "git checkout staging",
126
- "git pull . FOO",
127
- "git push origin HEAD",
128
- "git checkout FOO",
129
- "git branch -D prototype",
130
- "git fetch origin",
131
- "git checkout prototype",
132
- "git pull . staging",
133
- "git push origin HEAD",
134
- "git checkout staging",
135
- "git checkout FOO"
136
- ])
164
+ context 'when use_pr_comments? is false' do
165
+ let(:use_pr_comments) { false }
166
+ it 'does not comment on the PR posts a message' do
167
+ expect_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
168
+ Socialcast::Gitx::CLI.start ['integrate']
169
+
170
+ expect(stubbed_executed_commands).to eq([
171
+ "git pull origin FOO",
172
+ "git pull origin master",
173
+ "git push origin HEAD",
174
+ "git branch -D prototype",
175
+ "git fetch origin",
176
+ "git checkout prototype",
177
+ "git pull . FOO",
178
+ "git push origin HEAD",
179
+ "git checkout FOO",
180
+ "git checkout FOO"
181
+ ])
182
+ expect(github_api_pulls_list).to have_been_requested
183
+ expect(github_api_comments_create).to_not have_been_requested
184
+ end
137
185
  end
138
- end
139
- context 'when target branch != staging || prototype' do
140
- it 'should raise an error' do
141
- expect {
142
- Socialcast::Gitx::CLI.start ['integrate', 'asdfasdfasdf']
143
- }.to raise_error(/Only aggregate branches are allowed for integration/)
186
+ context 'when use_pr_comments? is true' do
187
+ let(:use_pr_comments) { true }
188
+ it 'comments on the PR and does not post a message' do
189
+ Socialcast::Gitx::CLI.start ['integrate']
190
+
191
+ expect(stubbed_executed_commands).to eq([
192
+ "git pull origin FOO",
193
+ "git pull origin master",
194
+ "git push origin HEAD",
195
+ "git branch -D prototype",
196
+ "git fetch origin",
197
+ "git checkout prototype",
198
+ "git pull . FOO",
199
+ "git push origin HEAD",
200
+ "git checkout FOO",
201
+ "git checkout FOO"
202
+ ])
203
+ expect(github_api_pulls_list).to have_been_requested
204
+ expect(github_api_comments_create).to have_been_requested
205
+ end
144
206
  end
145
207
  end
146
208
  end
@@ -163,38 +225,52 @@ describe Socialcast::Gitx::CLI do
163
225
  end
164
226
  context 'when user confirms release' do
165
227
  before do
166
- stub_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
167
-
168
228
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
169
229
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
170
- Socialcast::Gitx::CLI.start ['release']
171
230
  end
172
- it 'should post message to socialcast' do end # see expectations
173
- it 'should run expected commands' do
174
- expect(stubbed_executed_commands).to eq([
175
- "git branch -D last_known_good_staging",
176
- "git fetch origin",
177
- "git checkout last_known_good_staging",
178
- "git checkout FOO",
179
- "git pull origin FOO",
180
- "git pull origin master",
181
- "git push origin HEAD",
182
- "git checkout master",
183
- "git pull origin master",
184
- "git pull . FOO",
185
- "git push origin HEAD",
186
- "git branch -D staging",
187
- "git fetch origin",
188
- "git checkout staging",
189
- "git pull . master",
190
- "git push origin HEAD",
191
- "git checkout master"
192
- ])
231
+ shared_examples_for 'releasing the branch' do
232
+ it do
233
+ expect(stubbed_executed_commands).to eq([
234
+ "git branch -D last_known_good_staging",
235
+ "git fetch origin",
236
+ "git checkout last_known_good_staging",
237
+ "git checkout FOO",
238
+ "git pull origin FOO",
239
+ "git pull origin master",
240
+ "git push origin HEAD",
241
+ "git checkout master",
242
+ "git pull origin master",
243
+ "git pull . FOO",
244
+ "git push origin HEAD",
245
+ "git branch -D staging",
246
+ "git fetch origin",
247
+ "git checkout staging",
248
+ "git pull . master",
249
+ "git push origin HEAD",
250
+ "git checkout master"
251
+ ])
252
+ end
253
+ end
254
+ context 'when use_pr_comments? is false' do
255
+ before do
256
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(false)
257
+ expect_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
258
+ Socialcast::Gitx::CLI.start ['release']
259
+ end
260
+ it_behaves_like 'releasing the branch'
261
+ end
262
+ context 'when use_pr_comments? is true' do
263
+ before do
264
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(true)
265
+ Socialcast::Gitx::CLI.start ['release']
266
+ end
267
+ # does not post a message nor a pr comment (github reports "merged" event via webhook)'
268
+ it_behaves_like 'releasing the branch'
193
269
  end
194
270
  end
195
271
 
196
272
  context 'when the branch is not in last_known_good_staging' do
197
- context 'and enforce_staging_before_release = true' do
273
+ context 'when enforce_staging_before_release = true' do
198
274
  let(:branches_in_last_known_good_staging) { ['another-branch'] }
199
275
  before do
200
276
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:enforce_staging_before_release?).and_return(true)
@@ -204,16 +280,16 @@ describe Socialcast::Gitx::CLI do
204
280
  expect { Socialcast::Gitx::CLI.start ['release'] }.to raise_error(RuntimeError, 'Cannot release FOO unless it has already been promoted separately to staging and the build has passed.')
205
281
  end
206
282
  end
207
- context 'and enforce_staging_before_release = false' do
283
+ context 'when enforce_staging_before_release = false' do
208
284
  let(:branches_in_last_known_good_staging) { ['another-branch'] }
209
285
  before do
210
- stub_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
286
+ expect_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
211
287
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:enforce_staging_before_release?).and_return(false)
212
288
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
213
289
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
214
290
  Socialcast::Gitx::CLI.start ['release']
215
291
  end
216
- it 'should run expected commands' do
292
+ it do
217
293
  expect(stubbed_executed_commands).to eq([
218
294
  "git pull origin FOO",
219
295
  "git pull origin master",
@@ -235,9 +311,9 @@ describe Socialcast::Gitx::CLI do
235
311
 
236
312
  context 'with reserved_branches via config file' do
237
313
  before do
238
- stub_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
314
+ expect_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
239
315
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
240
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'reserved_branches' => ['dont-del-me','dont-del-me-2'] })
316
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('reserved_branches' => ['dont-del-me', 'dont-del-me-2'])
241
317
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
242
318
  Socialcast::Gitx::CLI.start ['release']
243
319
  end
@@ -248,19 +324,16 @@ describe Socialcast::Gitx::CLI do
248
324
  end
249
325
 
250
326
  context 'with alternative base branch via config file' do
251
- before do
252
- stub_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
327
+ it do
328
+ expect_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
253
329
 
254
330
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
255
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'base_branch' => 'special-master' })
331
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('base_branch' => 'special-master')
256
332
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
257
333
  Socialcast::Gitx::CLI.start ['release']
258
- end
259
- it 'should post message to socialcast' do end # see expectations
260
- it "treats the alternative base branch as reserved" do
334
+
261
335
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'special-master'
262
- end
263
- it 'should run expected commands' do
336
+
264
337
  expect(stubbed_executed_commands).to eq([
265
338
  "git branch -D last_known_good_staging",
266
339
  "git fetch origin",
@@ -285,7 +358,7 @@ describe Socialcast::Gitx::CLI do
285
358
 
286
359
  context 'with alternative base branch via environment variable' do
287
360
  before do
288
- stub_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
361
+ expect_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
289
362
 
290
363
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
291
364
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({})
@@ -296,11 +369,9 @@ describe Socialcast::Gitx::CLI do
296
369
  after do
297
370
  ENV.delete('BASE_BRANCH')
298
371
  end
299
- it "treats the alternative base branch as reserved" do
372
+ it do
300
373
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'special-master'
301
- end
302
- it 'should post message to socialcast' do end # see expectations
303
- it 'should run expected commands' do
374
+
304
375
  expect(stubbed_executed_commands).to eq([
305
376
  "git branch -D last_known_good_staging",
306
377
  "git fetch origin",
@@ -325,10 +396,10 @@ describe Socialcast::Gitx::CLI do
325
396
 
326
397
  context 'with alternative base branch via environment variable overriding base branch in config' do
327
398
  before do
328
- stub_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
399
+ expect_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
329
400
 
330
401
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
331
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({ 'base_branch' => 'extra-special-master' })
402
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('base_branch' => 'extra-special-master')
332
403
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
333
404
  ENV['BASE_BRANCH'] = 'special-master'
334
405
  Socialcast::Gitx::CLI.start ['release']
@@ -339,9 +410,7 @@ describe Socialcast::Gitx::CLI do
339
410
  it "treats the alternative base branch as reserved" do
340
411
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'special-master'
341
412
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'extra-special-master'
342
- end
343
- it 'should post message to socialcast' do end # see expectations
344
- it 'should run expected commands' do
413
+
345
414
  expect(stubbed_executed_commands).to eq([
346
415
  "git branch -D last_known_good_staging",
347
416
  "git fetch origin",
@@ -410,10 +479,10 @@ describe Socialcast::Gitx::CLI do
410
479
  before { allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:branches).and_return([]) }
411
480
  context 'when target branch == staging and --destination == last_known_good_staging' do
412
481
  before do
413
- stub_message "#worklog resetting staging branch to last_known_good_staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
482
+ expect_message "#worklog resetting staging branch to last_known_good_staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
414
483
  Socialcast::Gitx::CLI.start ['nuke', 'staging', '--destination', 'last_known_good_staging']
415
484
  end
416
- it 'should run expected commands' do
485
+ it do
417
486
  expect(stubbed_executed_commands).to eq([
418
487
  "git checkout master",
419
488
  "git branch -D last_known_good_staging",
@@ -430,12 +499,12 @@ describe Socialcast::Gitx::CLI do
430
499
  end
431
500
  context 'when target branch == qa and destination prompt == nil and using custom aggregate_branches config' do
432
501
  before do
433
- stub_message "#worklog resetting qa branch to last_known_good_qa in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
434
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'aggregate_branches' => ['staging', 'qa'] })
502
+ expect_message "#worklog resetting qa branch to last_known_good_qa in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
503
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('aggregate_branches' => ['staging', 'qa'])
435
504
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('')
436
505
  Socialcast::Gitx::CLI.start ['nuke', 'qa']
437
506
  end
438
- it 'defaults to last_known_good_qa and should run expected commands' do
507
+ it 'defaults to last_known_good_qa' do
439
508
  expect(stubbed_executed_commands).to eq([
440
509
  "git checkout master",
441
510
  "git branch -D last_known_good_qa",
@@ -452,12 +521,12 @@ describe Socialcast::Gitx::CLI do
452
521
  end
453
522
  context 'when target branch == qa and destination prompt = master and using custom aggregate_branches config' do
454
523
  before do
455
- stub_message "#worklog resetting qa branch to last_known_good_master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
456
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'aggregate_branches' => ['staging', 'qa'] })
524
+ expect_message "#worklog resetting qa branch to last_known_good_master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
525
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('aggregate_branches' => ['staging', 'qa'])
457
526
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('master')
458
527
  Socialcast::Gitx::CLI.start ['nuke', 'qa']
459
528
  end
460
- it 'should run expected commands' do
529
+ it do
461
530
  expect(stubbed_executed_commands).to eq([
462
531
  "git checkout master",
463
532
  "git branch -D last_known_good_master",
@@ -483,17 +552,17 @@ describe Socialcast::Gitx::CLI do
483
552
  end
484
553
  end
485
554
  it 'raises an error when target branch is not an aggregate branch' do
555
+ expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('master')
486
556
  expect {
487
- expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('master')
488
557
  Socialcast::Gitx::CLI.start ['nuke', 'asdfasdf']
489
558
  }.to raise_error(/Only aggregate branches are allowed to be reset/)
490
559
  end
491
560
  end
492
561
 
493
562
  describe '#backportpr' do
494
- before do
563
+ let(:pr_response) do
495
564
  # https://developer.github.com/v3/search/#search-issues
496
- pr_response = {
565
+ {
497
566
  "url" => "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59",
498
567
  "id" => 13712197,
499
568
  "html_url" => "https://github.com/socialcast/socialcast-git-extensions/pull/59",
@@ -792,8 +861,9 @@ describe Socialcast::Gitx::CLI do
792
861
  "deletions" => 2,
793
862
  "changed_files" => 2
794
863
  }
795
-
796
- commits_response = [
864
+ end
865
+ let(:commits_response) do
866
+ [
797
867
  {
798
868
  "sha" => "5e30d5af3f4d1bb3a34cc97568299be028b65f6f",
799
869
  "commit" => {
@@ -865,30 +935,87 @@ describe Socialcast::Gitx::CLI do
865
935
  ]
866
936
  }
867
937
  ]
938
+ end
939
+ let!(:github_pr_show) do
940
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59")
941
+ .to_return(:status => 200, :body => pr_response.to_json, :headers => {})
942
+ end
943
+ let!(:github_pr_commits_list) do
944
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59/commits")
945
+ .to_return(:status => 200, :body => commits_response.to_json, :headers => {})
946
+ end
947
+ let!(:github_pr_create) do
948
+ stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls")
949
+ .with(:body => "{\"title\":\"backport_59_to_v1.x\",\"base\":\"v1.x\",\"head\":\"backport_59_to_v1.x\",\"body\":\"Backport #59 to https://github.com/socialcast/socialcast-git-extensions/tree/v1.x\\n***\\nsimply testing this out\"}")
950
+ .to_return(:status => 200, :body => '{"html_url": "https://github.com/socialcast/socialcast-git-extensions/pulls/60", "issue_url": "https://api.github.com/repos/repo/project/issues/60"}', :headers => { 'Content-Type' => 'application/json' })
951
+ end
952
+ let!(:github_pr_comment_create) do
953
+ stub_request(:post, "https://api.github.com/repos/repo/project/issues/60/comments")
954
+ .with(:body => "{\"body\":\"#reviewrequest backport /cc @SocialcastDevelopers #scgitx\"}")
955
+ .to_return(:status => 200, :body => "{}", :headers => {})
956
+ end
957
+ let!(:socialcast_message_create) do
958
+ stub_request(:post, "https://testuser:testpassword@testdomain/api/messages.json")
959
+ .with(:body => "{\"message\":{\"url\":\"https://github.com/socialcast/socialcast-git-extensions/pulls/60\",\"message_type\":\"review_request\",\"body\":\"#reviewrequest backport #59 to v1.x in socialcast/socialcast-git-extensions #scgitx\\n\\n/cc @SocialcastDevelopers\"}}")
960
+ .to_return(:status => 200, :body => "", :headers => {})
961
+ end
962
+ before do
963
+ expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:backportpr).and_call_original
964
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
965
+ end
966
+ context 'when use_pr_comments? is false' do
967
+ let(:use_pr_comments) { false }
968
+ it 'creates a branch based on v1.x and cherry-picks in PR 59' do
969
+ Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
970
+ expect(github_pr_show).to have_been_requested
971
+ expect(github_pr_commits_list).to have_been_requested
972
+ expect(github_pr_create).to have_been_requested
868
973
 
869
- stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59").
870
- with(:headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent' => 'socialcast-git-extensions' }).
871
- to_return(:status => 200, :body => pr_response.to_json, :headers => {})
872
- stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59/commits").
873
- with(:headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent' => 'socialcast-git-extensions' }).
874
- to_return(:status => 200, :body => commits_response.to_json, :headers => {})
875
- stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls").
876
- with(:body => "{\"title\":\"backport_59_to_v1.x\",\"base\":\"v1.x\",\"head\":\"backport_59_to_v1.x\",\"body\":\"Backport #59 to https://github.com/socialcast/socialcast-git-extensions/tree/v1.x\\n***\\nsimply testing this out\"}",
877
- :headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent'=>'socialcast-git-extensions' }).
878
- to_return(:status => 200, :body => '{"html_url": "https://github.com/socialcast/socialcast-git-extensions/pulls/60"}', :headers => { 'Content-Type' => 'application/json' })
974
+ expect(github_pr_comment_create).to_not have_been_requested
975
+ expect(socialcast_message_create).to have_been_requested
976
+ end
977
+ end
978
+ context 'when use_pr_comments? is true' do
979
+ let(:use_pr_comments) { true }
980
+ it 'posts a pr comment instead of posting a socialcast message' do
981
+ Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
982
+ expect(github_pr_show).to have_been_requested
983
+ expect(github_pr_commits_list).to have_been_requested
984
+ expect(github_pr_create).to have_been_requested
879
985
 
880
- stub_message "#reviewrequest backport #59 to v1.x in socialcast/socialcast-git-extensions #scgitx\n\n/cc @SocialcastDevelopers", :url => 'https://github.com/socialcast/socialcast-git-extensions/pulls/60', :message_type => 'review_request'
986
+ expect(github_pr_comment_create).to have_been_requested
987
+ expect(socialcast_message_create).to_not have_been_requested
988
+ end
989
+ end
990
+ context 'when a backport reviewer is configured' do
991
+ before do
992
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:github_track_reviewer).with('Backport').and_return('janedoe')
993
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:socialcast_track_reviewer).with('Backport').and_return('JaneDoe')
994
+ end
995
+ let(:use_pr_comments) { true }
996
+ let!(:github_pr_comment_create) do
997
+ stub_request(:post, "https://api.github.com/repos/repo/project/issues/60/comments")
998
+ .with(:body => "{\"body\":\"#reviewrequest backport @JaneDoe /cc @SocialcastDevelopers #scgitx\"}")
999
+ .to_return(:status => 200, :body => "{}", :headers => {})
1000
+ end
1001
+ let!(:github_assign_pr) { stub_request(:patch, "https://api.github.com/repos/repo/project/issues/60").to_return(:status => 200) }
1002
+ it 'mentions the track reviewer' do
1003
+ Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
1004
+ expect(github_pr_show).to have_been_requested
1005
+ expect(github_pr_commits_list).to have_been_requested
1006
+ expect(github_pr_create).to have_been_requested
1007
+ expect(github_assign_pr).to have_been_requested
881
1008
 
882
- expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:backportpr).and_call_original
883
- Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
1009
+ expect(github_pr_comment_create).to have_been_requested
1010
+ expect(socialcast_message_create).to_not have_been_requested
1011
+ end
884
1012
  end
885
- it 'creates a branch based on v1.x and cherry-picks in PR 59' do end
886
1013
  end
887
1014
 
888
1015
  describe '#findpr' do
889
- before do
1016
+ let(:issue_response) do
890
1017
  # https://developer.github.com/v3/search/#search-issues
891
- stub_response = {
1018
+ {
892
1019
  "total_count"=> 280,
893
1020
  "items"=> [{
894
1021
  "url" => "https://api.github.com/repos/batterseapower/pinyin-toolkit/issues/132",
@@ -938,98 +1065,300 @@ describe Socialcast::Gitx::CLI do
938
1065
  "score" => 1.3859273
939
1066
  }]
940
1067
  }
941
-
942
- stub_request(:get, "https://api.github.com/search/issues?q=abc123%20type:pr%20repo:socialcast/socialcast-git-extensions").
943
- with(:headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent' => 'socialcast-git-extensions'}).
944
- to_return(:status => 200, :body => stub_response.to_json, :headers => {})
1068
+ end
1069
+ let!(:github_issue_search) do
1070
+ stub_request(:get, "https://api.github.com/search/issues?q=abc123%20type:pr%20repo:socialcast/socialcast-git-extensions")
1071
+ .to_return(:status => 200, :body => issue_response.to_json, :headers => {})
1072
+ end
1073
+ it do
945
1074
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:findpr).and_call_original
946
1075
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:say).with("Searching github pull requests for abc123")
947
1076
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:say).with("\nhttps://github.com/batterseapower/pinyin-toolkit/issues/132\n\tLine Number Indexes Beyond 20 Not Displayed\n\tNick3C 2009-07-12T20:10:41Z")
948
1077
  Socialcast::Gitx::CLI.start ['findpr', 'abc123']
1078
+ expect(github_issue_search).to have_been_requested
949
1079
  end
950
- it 'fetches the data from github and prints it out' do end
951
1080
  end
952
1081
 
953
1082
  describe '#reviewrequest' do
1083
+ let!(:github_create_pr) do
1084
+ stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls")
1085
+ .to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1"}), :headers => {})
1086
+ end
1087
+ let!(:github_find_pr_for_branch) do
1088
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
1089
+ .to_return(:status => 200, :body => %q([{"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1", "body":"testing"}]), :headers => {})
1090
+ end
1091
+ let(:stub_github_create_pr_comment) do
1092
+ stub_request(:post, "http://api.github.com/repos/repo/project/issues/1/comments")
1093
+ .with(:body => pr_comment_body)
1094
+ .to_return(:status => 200, :body => "{}", :headers => {})
1095
+ end
1096
+ let(:use_pr_comments) { false }
1097
+ before do
1098
+ stub_github_create_pr_comment
1099
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
1100
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1101
+ end
954
1102
  context 'when there are no review_buddies specified' do
955
1103
  before do
956
1104
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config_file).and_return(Pathname(''))
957
1105
  end
958
- context 'when description != nil' do
959
- before do
960
- stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls").
961
- to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1"}), :headers => {})
962
-
963
- stub_message "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 \n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed", :message_type => 'review_request'
964
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1106
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest \\n/cc @SocialcastDevelopers #scgitx\"}" }
1107
+ context 'when use_pr_comments? is false' do
1108
+ it do
1109
+ expect_message "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 \n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed", :message_type => 'review_request'
965
1110
  Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1111
+
1112
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1113
+ expect(github_create_pr).to have_been_requested
1114
+ expect(github_find_pr_for_branch).to have_been_requested
1115
+
1116
+ expect(stub_github_create_pr_comment).to_not have_been_requested
966
1117
  end
967
- it 'should create github pull request' do end # see expectations
968
- it 'should post socialcast message' do end # see expectations
969
- it 'should run expected commands' do
970
- expect(stubbed_executed_commands).to eq([
971
- "git pull origin FOO",
972
- "git pull origin master",
973
- "git push origin HEAD"
974
- ])
1118
+ end
1119
+ context 'when use_pr_comments? is true' do
1120
+ let(:use_pr_comments) { true }
1121
+ it do
1122
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1123
+
1124
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1125
+ expect(github_create_pr).to have_been_requested
1126
+ expect(github_find_pr_for_branch).to have_been_requested
1127
+
1128
+ expect(stub_github_create_pr_comment).to have_been_requested
975
1129
  end
976
1130
  end
977
1131
  end
978
1132
 
979
1133
  context 'when review_buddies are specified via a /config YML file' do
1134
+ let!(:github_assign_pr) { stub_request(:patch, "http://api.github.com/repos/repo/project/issues/1").to_return(:status => 200) }
980
1135
  before do
981
- stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls").
982
- to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://github.com/repos/repo/project/issues/1"}), :headers => {})
983
- stub_request(:patch, "http://github.com/repos/repo/project/issues/1").to_return(:status => 200)
984
1136
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:socialcast_review_buddy).and_return('JaneDoe')
985
- end
1137
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:github_review_buddy).and_return('janedoe')
1138
+ end
986
1139
  context 'and additional reviewers are specified' do
987
1140
  let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\nAssigned additionally to @JohnSmith for API review\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
988
- before do
989
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
990
- stub_message message_body, :message_type => 'review_request'
991
- Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-a', 'a']
1141
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\nAssigned additionally to @JohnSmith for API review \\n/cc @SocialcastDevelopers #scgitx\"}" }
1142
+ context 'when use_pr_comments? is false' do
1143
+ it do
1144
+ expect_message message_body, :message_type => 'review_request'
1145
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-a', 'a']
1146
+
1147
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1148
+ expect(github_create_pr).to have_been_requested
1149
+ expect(github_assign_pr).to have_been_requested
1150
+
1151
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1152
+ end
992
1153
  end
993
- it 'should create github pull request' do end # see expectations
994
- it 'should post socialcast message' do end # see expectations
995
- it 'should run expected commands' do
996
- expect(stubbed_executed_commands).to eq([
997
- "git pull origin FOO",
998
- "git pull origin master",
999
- "git push origin HEAD"
1000
- ])
1154
+ context 'when use_pr_comments? is true' do
1155
+ let(:use_pr_comments) { true }
1156
+ it do
1157
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-a', 'a']
1158
+
1159
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1160
+ expect(github_create_pr).to have_been_requested
1161
+ expect(github_assign_pr).to have_been_requested
1162
+
1163
+ expect(stub_github_create_pr_comment).to have_been_requested
1164
+ end
1001
1165
  end
1002
1166
  end
1003
1167
  context 'and a developer group is specified' do
1004
1168
  let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @#{another_group} #scgitx\n\n1 file changed" }
1169
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @#{another_group} #scgitx\"}" }
1005
1170
  let(:another_group) { 'AnotherDeveloperGroup' }
1006
1171
  before do
1007
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1008
1172
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({'developer_group' => another_group})
1009
- stub_message message_body, :message_type => 'review_request'
1010
- Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1011
1173
  end
1012
- it 'should create github pull request with a different group mentioned' do end # see expectations
1174
+ context 'when use_pr_comments? is false' do
1175
+ it do
1176
+ expect_message message_body, :message_type => 'review_request'
1177
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1178
+ expect(github_create_pr).to have_been_requested
1179
+ expect(github_assign_pr).to have_been_requested
1180
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1181
+ end
1182
+ end
1183
+ context 'when use_pr_comments? is true' do
1184
+ let(:use_pr_comments) { true }
1185
+ it do
1186
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1187
+ expect(github_create_pr).to have_been_requested
1188
+ expect(github_assign_pr).to have_been_requested
1189
+ expect(stub_github_create_pr_comment).to have_been_requested
1190
+ end
1191
+ end
1013
1192
  end
1014
1193
  context 'and additional reviewers are not specified' do
1015
1194
  let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
1195
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @SocialcastDevelopers #scgitx\"}" }
1196
+ context 'when use_pr_comments? is false' do
1197
+ it do
1198
+ expect_message message_body, :message_type => 'review_request'
1199
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1200
+ expect(github_create_pr).to have_been_requested
1201
+ expect(github_assign_pr).to have_been_requested
1202
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1203
+ end
1204
+ end
1205
+ context 'when use_pr_comments? is true' do
1206
+ let(:use_pr_comments) { true }
1207
+ it do
1208
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1209
+ expect(github_create_pr).to have_been_requested
1210
+ expect(github_assign_pr).to have_been_requested
1211
+ expect(stub_github_create_pr_comment).to have_been_requested
1212
+ end
1213
+ end
1214
+ end
1215
+ end
1216
+ end
1217
+
1218
+ describe '#createpr' do
1219
+ let!(:github_pr_create) do
1220
+ stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls")
1221
+ .to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1"}), :headers => {})
1222
+ end
1223
+ it do
1224
+ Socialcast::Gitx::CLI.start ['createpr', '--description', 'testing']
1225
+
1226
+ expect(stubbed_executed_commands).to eq git_update_commands
1227
+ expect(github_pr_create).to have_been_requested
1228
+ end
1229
+ end
1230
+
1231
+ describe '#assignpr' do
1232
+ let!(:github_find_pr_for_branch) do
1233
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
1234
+ .to_return(:status => 200, :body => %q([{"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1", "body":"testing"}]), :headers => {})
1235
+ end
1236
+ let(:stub_github_create_pr_comment) do
1237
+ stub_request(:post, "http://api.github.com/repos/repo/project/issues/1/comments")
1238
+ .with(:body => pr_comment_body)
1239
+ .to_return(:status => 200, :body => "{}", :headers => {})
1240
+ end
1241
+ let(:use_pr_comments) { false }
1242
+ before do
1243
+ stub_github_create_pr_comment
1244
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
1245
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1246
+ end
1247
+ context 'when there are no review_buddies specified' do
1248
+ before do
1249
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config_file).and_return(Pathname(''))
1250
+ end
1251
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest \\n/cc @SocialcastDevelopers #scgitx\"}" }
1252
+ context 'when use_pr_comments? is false' do
1253
+ it do
1254
+ expect_message "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 \n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed", :message_type => 'review_request'
1255
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1256
+
1257
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1258
+ expect(github_find_pr_for_branch).to have_been_requested
1259
+
1260
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1261
+ end
1262
+ end
1263
+ context 'when use_pr_comments? is true' do
1264
+ let(:use_pr_comments) { true }
1265
+ it do
1266
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1267
+
1268
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1269
+ expect(github_find_pr_for_branch).to have_been_requested
1270
+
1271
+ expect(stub_github_create_pr_comment).to have_been_requested
1272
+ end
1273
+ end
1274
+ end
1275
+
1276
+ context 'when review_buddies are specified via a /config YML file' do
1277
+ let!(:github_assign_pr) { stub_request(:patch, "http://api.github.com/repos/repo/project/issues/1").to_return(:status => 200) }
1278
+ before do
1279
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:socialcast_review_buddy).and_return('JaneDoe')
1280
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:github_review_buddy).and_return('janedoe')
1281
+ end
1282
+ context 'and additional reviewers are specified' do
1283
+ let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\nAssigned additionally to @JohnSmith for API review\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
1284
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\nAssigned additionally to @JohnSmith for API review \\n/cc @SocialcastDevelopers #scgitx\"}" }
1285
+ context 'when use_pr_comments? is false' do
1286
+ it do
1287
+ expect_message message_body, :message_type => 'review_request'
1288
+ Socialcast::Gitx::CLI.start ['assignpr', '-a', 'a']
1289
+
1290
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1291
+ expect(github_assign_pr).to have_been_requested
1292
+
1293
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1294
+ end
1295
+ end
1296
+ context 'when use_pr_comments? is true' do
1297
+ let(:use_pr_comments) { true }
1298
+ it do
1299
+ Socialcast::Gitx::CLI.start ['assignpr', '-a', 'a']
1300
+
1301
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1302
+ expect(github_assign_pr).to have_been_requested
1303
+
1304
+ expect(stub_github_create_pr_comment).to have_been_requested
1305
+ end
1306
+ end
1307
+ end
1308
+ context 'and a developer group is specified' do
1309
+ let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @#{another_group} #scgitx\n\n1 file changed" }
1310
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @#{another_group} #scgitx\"}" }
1311
+ let(:another_group) { 'AnotherDeveloperGroup' }
1016
1312
  before do
1017
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1018
- stub_message message_body, :message_type => 'review_request'
1019
- Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1313
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({'developer_group' => another_group})
1314
+ end
1315
+ context 'when use_pr_comments? is false' do
1316
+ it do
1317
+ expect_message message_body, :message_type => 'review_request'
1318
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1319
+ expect(github_assign_pr).to have_been_requested
1320
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1321
+ end
1322
+ end
1323
+ context 'when use_pr_comments? is true' do
1324
+ let(:use_pr_comments) { true }
1325
+ it do
1326
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1327
+ expect(github_assign_pr).to have_been_requested
1328
+ expect(stub_github_create_pr_comment).to have_been_requested
1329
+ end
1330
+ end
1331
+ end
1332
+ context 'and additional reviewers are not specified' do
1333
+ let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
1334
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @SocialcastDevelopers #scgitx\"}" }
1335
+ context 'when use_pr_comments? is false' do
1336
+ it do
1337
+ expect_message message_body, :message_type => 'review_request'
1338
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1339
+ expect(github_assign_pr).to have_been_requested
1340
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1341
+ end
1342
+ end
1343
+ context 'when use_pr_comments? is true' do
1344
+ let(:use_pr_comments) { true }
1345
+ it do
1346
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1347
+ expect(github_assign_pr).to have_been_requested
1348
+ expect(stub_github_create_pr_comment).to have_been_requested
1349
+ end
1020
1350
  end
1021
- it 'should create github pull request' do end # see expectations
1022
1351
  end
1023
1352
  end
1024
1353
  end
1025
1354
 
1026
1355
  describe '#promote' do
1027
1356
  before do
1028
- stub_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
1029
- Socialcast::Gitx::CLI.start ['promote']
1357
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
1358
+ .to_return(:status => 200, :body => "[]", :headers => {})
1030
1359
  end
1031
- it 'should integrate into staging' do
1032
- expect(stubbed_executed_commands).to eq([
1360
+ let(:staging_integration_commands) do
1361
+ [
1033
1362
  "git pull origin FOO",
1034
1363
  "git pull origin master",
1035
1364
  "git push origin HEAD",
@@ -1046,7 +1375,12 @@ describe Socialcast::Gitx::CLI do
1046
1375
  "git push origin HEAD",
1047
1376
  "git checkout staging",
1048
1377
  "git checkout FOO"
1049
- ])
1378
+ ]
1379
+ end
1380
+ it do
1381
+ expect_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
1382
+ Socialcast::Gitx::CLI.start ['promote']
1383
+ expect(stubbed_executed_commands).to eq staging_integration_commands
1050
1384
  end
1051
1385
  end
1052
1386
 
@@ -1056,7 +1390,7 @@ describe Socialcast::Gitx::CLI do
1056
1390
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:branches).with(:merged => true).and_return(['staging', 'bazquux', 'last_known_good_prototype'])
1057
1391
  Socialcast::Gitx::CLI.start ['cleanup']
1058
1392
  end
1059
- it 'should only cleanup non-reserved branches' do
1393
+ it 'only cleans up non-reserved branches' do
1060
1394
  expect(stubbed_executed_commands).to eq([
1061
1395
  "git checkout master",
1062
1396
  "git pull",