gitcycle 0.2.14 → 0.2.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ Feature: Setup
2
+
3
+ Scenario: Setup
4
+ When I execute gitcycle setup
5
+ And gitcycle runs
6
+ Then output includes "Configuration saved."
7
+ And gitcycle.yml should be valid
@@ -17,10 +17,18 @@ require "gitcycle"
17
17
  $redis = Redis.new
18
18
 
19
19
  Before do |scenario|
20
+ Launchy.stub :open do |url|
21
+ if url =~ /https:\/\/github.com\/.+\/issues\/\d+/
22
+ $github_url = url
23
+ end
24
+ $url = url
25
+ end
26
+
20
27
  @scenario_title = scenario.title
21
28
  $execute = []
22
29
  $input = []
23
30
  $remotes = nil
31
+ $ticket = nil
24
32
  end
25
33
 
26
34
  def branches(options={})
@@ -36,7 +44,7 @@ end
36
44
 
37
45
  def config(reload=false)
38
46
  @config = nil if reload
39
- @config ||= YAML.load(File.read("#{BASE}/features/config.yml"))
47
+ @config ||= YAML.load(File.read("#{BASE}/features/config/config.yml"))
40
48
  Lighthouse.account = @config['lighthouse']['account']
41
49
  Lighthouse.token = @config['lighthouse']['token']
42
50
  @config
@@ -46,8 +54,11 @@ def gsub_variables(str)
46
54
  if $ticket
47
55
  str = str.gsub('ticket.id', $ticket.attributes['id'])
48
56
  end
49
- if $url
50
- issue_id = $url.match(/https:\/\/github.com\/.+\/issues\/(\d+)/)[1]
57
+ if $tickets
58
+ str = str.gsub('last_ticket.id', $tickets.last.attributes['id'])
59
+ end
60
+ if $github_url
61
+ issue_id = $github_url.match(/https:\/\/github.com\/.+\/issues\/(\d+)/)[1]
51
62
  str = str.gsub('issue.id', issue_id)
52
63
  end
53
64
  str = str.gsub('env.home', ENV['REPO'] == 'owner' ? config['owner'] : config['user'])
@@ -63,23 +74,73 @@ def log(match)
63
74
  end
64
75
 
65
76
  def repos(reload=false)
66
- if $repos && !reload
67
- $repos
68
- else
69
- owner = "#{BASE}/features/fixtures/owner"
70
- user = "#{BASE}/features/fixtures/user"
71
-
72
- FileUtils.rm_rf(owner)
73
- FileUtils.rm_rf(user)
74
-
77
+ fixtures = "#{BASE}/features/fixtures"
78
+
79
+ if !$repo_cache_created || !$repos || reload
80
+ Dir.chdir(fixtures)
81
+ end
82
+
83
+ if !$repo_cache_created || reload
84
+ $stdout.puts "Creating cached fixture repositories..."
85
+
75
86
  system [
76
- "cd #{BASE}/features/fixtures",
77
- "git clone git@github.com:#{config['owner']}/#{config['repo']}.git owner",
78
- "git clone git@github.com:#{config['user']}/#{config['repo']}.git user"
87
+ "rm -rf #{fixtures}/owner_cache",
88
+ "rm -rf #{fixtures}/user_cache",
89
+ "mkdir -p #{fixtures}/owner_cache",
90
+ "cd #{fixtures}/owner_cache",
91
+ "git init . -q",
92
+ "git remote add origin git@github.com:#{config['owner']}/#{config['repo']}.git",
93
+ "echo 'first commit' > README",
94
+ "git add .",
95
+ "git commit -q -a -m 'First commit'",
96
+ "git push origin master --force -q",
97
+ "git fetch -q",
98
+ "cd #{fixtures}",
99
+ "rm -rf user_cache",
100
+ "cp -r owner_cache user_cache",
101
+ "cd user_cache",
102
+ "git remote rm origin",
103
+ "git remote add origin git@github.com:#{config['user']}/#{config['repo']}.git",
104
+ "git fetch -q",
105
+ "git push origin master --force -q"
79
106
  ].join(' && ')
80
107
 
81
- $repos = { :owner => owner, :user => user }
108
+ unless $repo_cache_created
109
+ $stdout.puts "Clearing old fixture branches..."
110
+
111
+ [ 'owner', 'user' ].each do |type|
112
+ system(
113
+ "cd #{fixtures}/#{type}_cache && " +
114
+ [
115
+ "git branch -r",
116
+ "grep origin/",
117
+ "grep -v master$",
118
+ "grep -v HEAD",
119
+ "cut -d/ -f2-",
120
+ "while read line; do git push origin :$line -q; git branch -D $line; done;"
121
+ ].join(' | ')
122
+ )
123
+ end
124
+ end
125
+
126
+ $repo_cache_created = true
82
127
  end
128
+
129
+ if !$repos || reload
130
+ $repos = {}
131
+
132
+ [ 'owner', 'user' ].each do |type|
133
+ FileUtils.rm_rf("#{fixtures}/#{type}")
134
+ $repos[type.to_sym] = "#{fixtures}/#{type}"
135
+
136
+ system [
137
+ "cd #{fixtures}",
138
+ "cp -R #{type}_cache #{type}"
139
+ ].join(' && ')
140
+ end
141
+ end
142
+
143
+ $repos
83
144
  end
84
145
 
85
146
  def run_gitcycle(cmd)
@@ -90,6 +151,9 @@ def run_gitcycle(cmd)
90
151
  @output << "#{str}\n"
91
152
  puts str
92
153
  end
154
+ if @scenario_title.include?('Collaborator')
155
+ @gitcycle.stub(:collab?).and_return(true)
156
+ end
93
157
  if cmd
94
158
  @gitcycle.start(Shellwords.split(cmd))
95
159
  else
@@ -105,15 +169,8 @@ Given /^a fresh set of repositories$/ do
105
169
  repos(true)
106
170
  end
107
171
 
108
- Given /^a new Lighthouse ticket$/ do
109
- $ticket = Lighthouse::Ticket.new(
110
- :body => "test",
111
- :project_id => config['lighthouse']['project'],
112
- :state => "open",
113
- :title => "Test ticket"
114
- )
115
- $ticket.save
116
- $ticket.attributes['id'] = "master-#{$ticket.attributes['id']}"
172
+ When /^I create a new branch "([^\"]*)"$/ do |branch|
173
+ `git branch #{branch}`
117
174
  end
118
175
 
119
176
  When /^I execute gitcycle with nothing$/ do
@@ -124,6 +181,11 @@ When /^I execute gitcycle with "([^\"]*)"$/ do |cmd|
124
181
  $execute << gsub_variables(cmd)
125
182
  end
126
183
 
184
+ When /^I give default input$/ do
185
+ step "I enter \"y\""
186
+ step "I enter \"y\""
187
+ end
188
+
127
189
  When /^I execute gitcycle setup$/ do
128
190
  FileUtils.rm(GITCYCLE) if File.exists?(GITCYCLE)
129
191
  $execute << [
@@ -140,10 +202,23 @@ When /^I execute gitcycle setup$/ do
140
202
  ].join(' ')
141
203
  end
142
204
 
143
- When /^I execute gitcycle (.*) with the Lighthouse ticket URL$/ do |cmd|
205
+ When /^I execute gitcycle (.*) with a new URL or string$/ do |cmd|
206
+ $ticket = Lighthouse::Ticket.new(
207
+ :body => "test",
208
+ :project_id => config['lighthouse']['project'],
209
+ :state => "open",
210
+ :title => "Test ticket"
211
+ )
212
+ $ticket.save
213
+ $tickets ||= []
214
+ $tickets << $ticket
144
215
  $execute << "#{cmd} #{$ticket.url}"
145
216
  end
146
217
 
218
+ When /^I execute gitcycle (.*) with the last URL or string$/ do |cmd|
219
+ $execute << "#{cmd} #{$tickets.last.url}"
220
+ end
221
+
147
222
  When /^I cd to the (.*) repo$/ do |user|
148
223
  if ENV['REPO']
149
224
  puts "(overiding repo as #{ENV['REPO']})"
@@ -160,19 +235,22 @@ When /^I commit something$/ do
160
235
  branch = branches(:current => true)
161
236
  $commit_msg = "#{@scenario_title} - #{rand}"
162
237
  File.open('README', 'w') {|f| f.write($commit_msg) }
163
- `git add . && git add . -u && git commit -a -m '#{$commit_msg}'`
164
- `git push origin #{branch}`
238
+ `git add . && git add . -u && git commit -q -a -m '#{$commit_msg}'`
239
+ `git push origin #{branch} -q`
165
240
  end
166
241
 
167
242
  When /^I checkout (.+)$/ do |branch|
168
243
  branch = gsub_variables(branch)
169
- `git checkout #{branch}`
244
+ `git checkout #{branch} -q`
170
245
  end
171
246
 
172
- Then /^gitcycle runs$/ do
173
- $execute.each do |cmd|
174
- run_gitcycle(cmd)
175
- end
247
+ When /^I push (.+)$/ do |branch|
248
+ branch = gsub_variables(branch)
249
+ `git push origin #{branch} -q`
250
+ end
251
+
252
+ When /^gitcycle runs$/ do
253
+ run_gitcycle($execute.shift) until $execute.empty?
176
254
  end
177
255
 
178
256
  Then /^gitcycle runs with exit$/ do
@@ -198,12 +276,12 @@ end
198
276
 
199
277
  Then /^output includes \"([^\"]*)" with URL$/ do |expected|
200
278
  expected = gsub_variables(expected)
201
- @output.include?(expected).should == true
202
- $url = @output.match(/#{expected}.*(https?:\/\/[^\s]+)/)[1]
279
+ @output.should =~ /#{expected}.*(https?:\/\/[^\s]+)/
203
280
  end
204
281
 
205
282
  Then /^output includes$/ do |expected|
206
283
  expected = gsub_variables(expected).gsub('\t', "\t")
284
+ $stdout.puts expected
207
285
  @output.gsub(/\n+/, "\n").include?(expected).should == true
208
286
  end
209
287
 
@@ -213,7 +291,20 @@ Then /^output does not include \"([^\"]*)"$/ do |expected|
213
291
  end
214
292
 
215
293
  Then /^redis entries valid$/ do
216
- add = @scenario_title.include?('custom branch name') ? "-rename" : ""
294
+ collab = @scenario_title.include?('Collaborator')
295
+ before =
296
+ if collab
297
+ "br-some_branch-"
298
+ else
299
+ "master-"
300
+ end
301
+ after =
302
+ if @scenario_title.include?('Custom branch name')
303
+ "-rename"
304
+ else
305
+ ""
306
+ end
307
+ ticket_id = "#{before}#{$ticket.attributes['id']}#{after}"
217
308
  branch = $redis.hget(
218
309
  [
219
310
  "users",
@@ -222,22 +313,22 @@ Then /^redis entries valid$/ do
222
313
  "#{config['owner']}:#{config['repo']}",
223
314
  "branches"
224
315
  ].join('/'),
225
- $ticket.attributes['id'] + add
316
+ ticket_id
226
317
  )
227
318
  branch = Yajl::Parser.parse(branch)
228
319
  should = {
229
320
  'lighthouse_url' => $ticket.url,
230
321
  'body' => "<div><p>test</p></div>\n\n#{$ticket.url}",
231
- 'home' => ENV['REPO'] == 'owner' ? config['owner'] : config['user'],
232
- 'name' => $ticket.attributes['id'] + add,
233
- 'id' => $ticket.attributes['id'] + add,
322
+ 'home' => collab || ENV['REPO'] == 'owner' ? config['owner'] : config['user'],
323
+ 'name' => ticket_id,
324
+ 'id' => ticket_id,
234
325
  'title' => $ticket.title,
235
326
  'repo' => "#{config['owner']}:#{config['repo']}",
236
327
  'user' => config['user'],
237
- 'source' => 'master'
328
+ 'source' => collab ? 'some_branch' : 'master'
238
329
  }
239
- if @scenario_title == 'Discuss commits w/ no parameters and something committed'
240
- should['issue_url'] = $url
330
+ if @scenario_title == 'No parameters and something committed'
331
+ should['issue_url'] = $github_url
241
332
  end
242
333
  branch.should == should
243
334
  end
@@ -251,5 +342,5 @@ Then /^git log should contain the last commit$/ do
251
342
  end
252
343
 
253
344
  Then /^URL is a valid issue$/ do
254
- $url.should =~ /https:\/\/github.com\/.+\/issues\/\d+/
345
+ $github_url.should =~ /https:\/\/github.com\/.+\/issues\/\d+/
255
346
  end
data/gitcycle.gemspec CHANGED
@@ -6,7 +6,7 @@ $:.unshift lib unless $:.include?(lib)
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "gitcycle"
9
- s.version = '0.2.14'
9
+ s.version = '0.2.15'
10
10
  s.platform = Gem::Platform::RUBY
11
11
  s.authors = [ 'Winton Welsh' ]
12
12
  s.email = [ 'mail@wintoni.us' ]
data/lib/gitcycle.rb CHANGED
@@ -25,6 +25,8 @@ class Gitcycle
25
25
  end
26
26
 
27
27
  def initialize(args=nil)
28
+ $remotes = {}
29
+
28
30
  if ENV['CONFIG']
29
31
  @config_path = File.expand_path(ENV['CONFIG'])
30
32
  else
@@ -65,6 +67,10 @@ class Gitcycle
65
67
  exec_git(:branch, args)
66
68
  end
67
69
 
70
+ unless yes?("\nYour work will eventually merge into '#{params['branch[source]']}'. Is this correct?")
71
+ params['branch[source]'] = q("What branch would you like to eventually merge into?")
72
+ end
73
+
68
74
  puts "\nRetrieving branch information from gitcycle.\n".green
69
75
  branch = get('branch', params)
70
76
  name = branch['name']
@@ -73,8 +79,8 @@ class Gitcycle
73
79
  owner, repo = branch['repo'].split(':')
74
80
  branch['home'] = @git_login
75
81
 
76
- unless yes?("\nYour work will eventually merge into '#{branch['source']}'. Is this correct?")
77
- branch['source'] = q("What branch would you like to eventually merge into?")
82
+ if branch['source'].include?('/')
83
+ branch['home'], branch['source'] = branch['source'].split('/')
78
84
  end
79
85
 
80
86
  unless yes?("Would you like to name your branch '#{name}'?")
@@ -145,14 +151,13 @@ class Gitcycle
145
151
  get('branch',
146
152
  'branch[home]' => remote,
147
153
  'branch[name]' => branch,
148
- 'branch[collab]' => 1,
149
154
  'create' => 1
150
155
  )
151
156
  end
152
157
  end
153
158
 
154
159
  puts "Checking out '#{branch}'.\n".green
155
- run("git checkout #{branch}")
160
+ run("git checkout -q #{branch}")
156
161
  end
157
162
  end
158
163
  alias :co :checkout
@@ -236,9 +241,7 @@ class Gitcycle
236
241
  'create' => 0
237
242
  )
238
243
 
239
- collab = branch && branch['collab'] == '1'
240
-
241
- if collab
244
+ if collab?(branch)
242
245
  # Merge from collab
243
246
  merge_remote_branch(
244
247
  :owner => branch['home'],
@@ -264,7 +267,7 @@ class Gitcycle
264
267
  )
265
268
  end
266
269
 
267
- unless collab
270
+ unless collab?(branch)
268
271
  # Merge from origin
269
272
  merge_remote_branch(
270
273
  :owner => @git_login,
@@ -281,12 +284,11 @@ class Gitcycle
281
284
 
282
285
  require_git && require_config
283
286
 
284
- branch = pull
285
- remote = branch && branch['collab'] == '1' ? branch['home'] : 'origin'
286
-
287
+ pull
287
288
  branch = branches(:current => true)
288
- puts "\nPushing branch '#{remote}/#{branch}'.\n".green
289
- run("git push #{remote} #{branch}")
289
+
290
+ puts "\nPushing branch 'origin/#{branch}'.\n".green
291
+ run("git push origin #{branch} -q")
290
292
  end
291
293
 
292
294
  def qa(*issues)
@@ -303,15 +305,31 @@ class Gitcycle
303
305
  end
304
306
  elsif issues.first == 'fail' || issues.first == 'pass'
305
307
  branch = branches(:current => true)
306
- label = issues.first.capitalize
307
-
308
- if branch =~ /^qa_/
308
+ pass_fail = issues.first
309
+ label = pass_fail.capitalize
310
+ issues = issues[1..-1]
311
+
312
+ if pass_fail == 'pass' && !issues.empty?
313
+ puts "\nWARNING: #{
314
+ issues.length == 1 ? "This issue" : "These issues"
315
+ } will merge straight into '#{branch}' without testing.\n".red
316
+
317
+ if yes?("Continue?")
318
+ qa_branch = create_qa_branch(
319
+ :instructions => false,
320
+ :issues => issues,
321
+ :source => branch
322
+ )
323
+ `git checkout qa_#{qa_branch['source']}_#{qa_branch['user']} -q`
324
+ $remotes = {}
325
+ qa('pass')
326
+ else
327
+ exit
328
+ end
329
+ elsif branch =~ /^qa_/
309
330
  puts "\nRetrieving branch information from gitcycle.\n".green
310
331
  qa_branch = get('qa_branch', :source => branch.gsub(/^qa_/, ''))
311
332
 
312
- pass_fail = issues.first
313
- issues = issues[1..-1]
314
-
315
333
  if pass_fail == 'pass'
316
334
  checkout_or_track(:name => qa_branch['source'], :remote => 'origin')
317
335
  end
@@ -324,19 +342,18 @@ class Gitcycle
324
342
  end
325
343
  end
326
344
 
327
- branches.each do |branch|
328
- if pass_fail == 'pass'
329
- merge_remote_branch(
330
- :owner => branch['home'],
331
- :repo => branch['repo'].split(':')[1],
332
- :branch => branch['branch'],
333
- :issue => branch['issue'],
334
- :issues => qa_branch['branches'].collect { |b| b['issue'] },
335
- :type => :from_qa
336
- )
337
- end
345
+ if pass_fail == 'pass' && issues.empty?
346
+ owner, repo = qa_branch['repo'].split(':')
347
+ merge_remote_branch(
348
+ :owner => owner,
349
+ :repo => repo,
350
+ :branch => "qa_#{qa_branch['source']}_#{qa_branch['user']}",
351
+ :type => :from_qa
352
+ )
353
+ end
338
354
 
339
- unless issues.empty?
355
+ unless issues.empty?
356
+ branches.each do |branch|
340
357
  puts "\nLabeling issue #{branch['issue']} as '#{label}'.\n".green
341
358
  get('label',
342
359
  'qa_branch[source]' => qa_branch['source'],
@@ -371,7 +388,7 @@ class Gitcycle
371
388
  run("git add . && git add . -u && git commit -a -F .git/MERGE_MSG")
372
389
 
373
390
  puts "Pushing merge resolution of #{conflict['branch']} (issue ##{conflict['issue']}).\n".green
374
- run("git push origin qa_#{qa_branch['source']}_#{qa_branch['user']}")
391
+ run("git push origin qa_#{qa_branch['source']}_#{qa_branch['user']} -q")
375
392
 
376
393
  puts "\nDe-conflicting on gitcycle.\n".green
377
394
  get('qa_branch',
@@ -397,31 +414,29 @@ class Gitcycle
397
414
  def ready(*issues)
398
415
  require_git && require_config
399
416
 
400
- if issues.empty?
401
- branch = pull
402
- branch = create_pull_request(branch)
417
+ branch = pull
403
418
 
404
- if branch == false
405
- puts "Branch not found.\n".red
406
- elsif branch['issue_url']
407
- puts "\nLabeling issue as 'Pending Review'.\n".green
408
- get('label',
409
- 'branch[name]' => branch['name'],
410
- 'labels' => [ 'Pending Review' ]
411
- )
419
+ if branch && !collab?(branch)
420
+ branch = create_pull_request(branch)
421
+ end
412
422
 
413
- puts "Opening issue: #{branch['issue_url']}\n".green
414
- Launchy.open(branch['issue_url'])
415
- else
416
- puts "You have not pushed any commits to '#{branch['name']}'.\n".red
417
- end
418
- else
419
- puts "\nLabeling issues as 'Pending Review'.\n".green
423
+ if branch == false
424
+ puts "Branch not found.\n".red
425
+ elsif collab?(branch)
426
+ remote, branch = branch['home'], branch['source']
427
+ puts "\nPushing branch '#{remote}/#{branch}'.\n".green
428
+ run("git push #{remote} #{branch} -q")
429
+ elsif branch['issue_url']
430
+ puts "\nLabeling issue as 'Pending Review'.\n".green
420
431
  get('label',
421
- 'issues' => issues,
422
- 'labels' => [ 'Pending Review' ],
423
- 'scope' => 'repo'
432
+ 'branch[name]' => branch['name'],
433
+ 'labels' => [ 'Pending Review' ]
424
434
  )
435
+
436
+ puts "Opening issue: #{branch['issue_url']}\n".green
437
+ Launchy.open(branch['issue_url'])
438
+ else
439
+ puts "You have not pushed any commits to '#{branch['name']}'.\n".red
425
440
  end
426
441
  end
427
442
 
@@ -483,8 +498,6 @@ class Gitcycle
483
498
  owner = options[:owner]
484
499
  repo = options[:repo]
485
500
 
486
- $remotes ||= {}
487
-
488
501
  unless $remotes[owner]
489
502
  $remotes[owner] = true
490
503
 
@@ -514,14 +527,14 @@ class Gitcycle
514
527
 
515
528
  if branches(:match => name)
516
529
  puts "Checking out branch '#{name}'.\n".green
517
- run("git checkout #{name}")
530
+ run("git checkout #{name} -q")
518
531
  else
519
532
  puts "Tracking branch '#{remote}/#{name}'.\n".green
520
533
  run("git fetch -q #{remote}")
521
- run("git checkout -b #{name} #{remote}/#{name}")
534
+ run("git checkout -q -b #{name} #{remote}/#{name}")
522
535
  end
523
536
 
524
- run("git pull #{remote} #{name}")
537
+ run("git pull #{remote} #{name} -q")
525
538
  end
526
539
 
527
540
  def checkout_remote_branch(options={})
@@ -532,12 +545,12 @@ class Gitcycle
532
545
 
533
546
  if branches(:match => target)
534
547
  if yes?("You already have a branch called '#{target}'. Overwrite?")
535
- run("git push origin :#{target}")
536
- run("git checkout master")
548
+ run("git push origin :#{target} -q")
549
+ run("git checkout master -q")
537
550
  run("branch -D #{target}")
538
551
  else
539
- run("git checkout #{target}")
540
- run("git pull origin #{target}")
552
+ run("git checkout #{target} -q")
553
+ run("git pull origin #{target} -q")
541
554
  return
542
555
  end
543
556
  end
@@ -545,18 +558,30 @@ class Gitcycle
545
558
  add_remote_and_fetch(options)
546
559
 
547
560
  puts "Checking out remote branch '#{target}' from '#{owner}/#{repo}/#{branch}'.\n".green
548
- run("git checkout -b #{target} #{owner}/#{branch}")
561
+ run("git checkout -q -b #{target} #{owner}/#{branch}")
549
562
 
550
563
  puts "Fetching remote 'origin'.\n".green
551
564
  run("git fetch -q origin")
552
565
 
553
566
  if branches(:remote => true, :match => "origin/#{target}")
554
567
  puts "Pulling 'origin/#{target}'.\n".green
555
- run("git pull origin #{target}")
568
+ run("git pull origin #{target} -q")
556
569
  end
557
570
 
558
571
  puts "Pushing 'origin/#{target}'.\n".green
559
- run("git push origin #{target}")
572
+ run("git push origin #{target} -q")
573
+ end
574
+
575
+ def collab?(branch)
576
+ return false unless branch
577
+ owner =
578
+ if branch['repo'].is_a?(::Hash)
579
+ branch['repo']['owner']
580
+ else
581
+ branch['repo'].split(':')[0]
582
+ end
583
+ branch['home'] != branch['user'] &&
584
+ branch['home'] != owner
560
585
  end
561
586
 
562
587
  def command_not_recognized
@@ -588,17 +613,21 @@ class Gitcycle
588
613
  end
589
614
 
590
615
  def create_qa_branch(options)
616
+ instructions = options[:instructions]
591
617
  issues = options[:issues]
592
618
  range = options[:range] || (0..-1)
619
+ source = options[:source]
593
620
 
594
621
  if (issues && !issues.empty?) || options[:qa_branch]
595
622
  if options[:qa_branch]
596
623
  qa_branch = options[:qa_branch]
597
624
  else
598
- source = branches(:current => true)
599
-
600
- unless yes?("\nDo you want to create a QA branch from '#{source}'?")
601
- source = q("What branch would you like to base this QA branch off of?")
625
+ unless source
626
+ source = branches(:current => true)
627
+
628
+ unless yes?("\nDo you want to create a QA branch from '#{source}'?")
629
+ source = q("What branch would you like to base this QA branch off of?")
630
+ end
602
631
  end
603
632
 
604
633
  puts "\nRetrieving branch information from gitcycle.\n".green
@@ -613,10 +642,10 @@ class Gitcycle
613
642
  if branches(:match => name, :all => true)
614
643
  puts "Deleting old QA branch '#{name}'.\n".green
615
644
  if branches(:match => name)
616
- run("git checkout master")
645
+ run("git checkout master -q")
617
646
  run("git branch -D #{name}")
618
647
  end
619
- run("git push origin :#{name}")
648
+ run("git push origin :#{name} -q")
620
649
  end
621
650
 
622
651
  checkout_remote_branch(
@@ -651,8 +680,10 @@ class Gitcycle
651
680
  )
652
681
  end
653
682
 
654
- puts "\nType '".yellow + "gitc qa pass".green + "' to approve all issues in this branch.\n".yellow
655
- puts "Type '".yellow + "gitc qa fail".red + "' to reject all issues in this branch.\n".yellow
683
+ unless options[:instructions] == false
684
+ puts "\nType '".yellow + "gitc qa pass".green + "' to approve all issues in this branch.\n".yellow
685
+ puts "Type '".yellow + "gitc qa fail".red + "' to reject all issues in this branch.\n".yellow
686
+ end
656
687
 
657
688
  unless warnings.empty?
658
689
  puts "\n#{"WARNING:".red} If you pass this QA branch, the following branches will merge into '#{source.yellow}':\n"
@@ -665,6 +696,8 @@ class Gitcycle
665
696
  puts "\nBe sure this is correct!\n".yellow
666
697
  end
667
698
  end
699
+
700
+ qa_branch
668
701
  end
669
702
  end
670
703
 
@@ -684,7 +717,7 @@ class Gitcycle
684
717
  if $? != 0
685
718
  puts "Conflict occurred when merging '#{branch}'#{" (issue ##{issue})" if issue}.\n".red
686
719
 
687
- if type # from_qa or to_qa
720
+ if type == :to_qa
688
721
  puts "Please resolve this conflict with '#{owner}'.\n".yellow
689
722
 
690
723
  puts "\nSending conflict information to gitcycle.\n".green
@@ -696,7 +729,7 @@ class Gitcycle
696
729
  elsif type # from_qa or to_qa
697
730
  branch = branches(:current => true)
698
731
  puts "Pushing branch '#{branch}'.\n".green
699
- run("git push origin #{branch}")
732
+ run("git push origin #{branch} -q")
700
733
  end
701
734
  end
702
735
 
@@ -765,7 +798,7 @@ class Gitcycle
765
798
 
766
799
  if branches(:remote => true, :match => "#{owner}/#{branch}")
767
800
  puts "\nMerging remote branch '#{branch}' from '#{owner}/#{repo}'.\n".green
768
- run("git merge #{owner}/#{branch}")
801
+ run("git merge #{owner}/#{branch} -q")
769
802
 
770
803
  fix_conflict(options)
771
804
  end