gitcycle 0.1.5 → 0.1.6

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.
data/README.md CHANGED
@@ -3,14 +3,103 @@ Gitcycle
3
3
 
4
4
  Tame your development cycle.
5
5
 
6
- Requirements
6
+ Get Started
7
+ -----------
8
+
9
+ Visit [gitcycle.com](http://gitcycle.com) to set up your environment.
10
+
11
+ Create Branch
12
+ -------------
13
+
14
+ Checkout the branch that you will eventually merge your feature into:
15
+
16
+ git checkout master
17
+
18
+ Type `gitc` + your ticket URL to create a new branch:
19
+
20
+ gitc https://xxx.lighthouseapp.com/projects/0000/tickets/0000-my-ticket
21
+
22
+ Pull Changes from Upstream
23
+ --------------------------
24
+
25
+ When you're developing, you may need to pull new changes from the upstream branch that you will eventually merge your feature into:
26
+
27
+ gitc pull
28
+
29
+ Discuss Code
7
30
  ------------
8
31
 
9
- <pre>
10
- gem install gitcycle
11
- </pre>
32
+ After pushing one or two commits, put the code up for discussion:
12
33
 
13
- Get Started
34
+ gitc discuss
35
+
36
+ Mark as Ready
37
+ -------------
38
+
39
+ When the branch is ready for merging, mark it as ready:
40
+
41
+ gitc ready
42
+
43
+ This will mark the pull request as "Pending Review".
44
+
45
+ Code Review
14
46
  -----------
15
47
 
16
- Visit [gitcycle.com](http://gitcycle.com) to get set up.
48
+ Managers will periodically check for "Pending Review" issues on GitHub.
49
+
50
+ Once reviewed, they will mark the issue as reviewed:
51
+
52
+ gitc reviewed 0000
53
+
54
+ Where 0000 is the Github issue number.
55
+
56
+ Quality Assurance
57
+ -----------------
58
+
59
+ QA engineers will periodically check for "Pending QA" issues on Github.
60
+
61
+ To create a new QA branch:
62
+
63
+ gitc qa 0000 0001
64
+
65
+ This will create a new QA branch containing the commits from the related Github issue numbers.
66
+
67
+ This branch can be deployed to a staging environment for QA.
68
+
69
+ QA Fail
70
+ -------
71
+
72
+ If a feature does not pass QA:
73
+
74
+ gitc qa fail 0000
75
+
76
+ Where 0000 is the Github issue number.
77
+
78
+ To fail all issues:
79
+
80
+ gitc qa fail
81
+
82
+ This will add a "fail" label to the issue.
83
+
84
+ QA Pass
85
+ -------
86
+
87
+ If a feature passes QA:
88
+
89
+ gitc qa pass 0000
90
+
91
+ Where 0000 is the Github issue number.
92
+
93
+ To pass all issues:
94
+
95
+ gitc qa pass
96
+
97
+ This will add a "pass" label to the issue and will complete the pull request by merging the feature branch into the target branch.
98
+
99
+ Todo
100
+ ----
101
+
102
+ * Label issues with ticket milestone?
103
+ * Add confirmation when creating new dev branch for branch that it is based off of
104
+ * If confirmation is a no, allow user to specify branch to base off of
105
+ * bug with branch rename on Jimmy's machine
@@ -154,20 +154,20 @@ Scenario: Reviewed issue w/ parameters
154
154
  Then gitcycle runs
155
155
  And output includes "Labeling issues as 'Pending QA'."
156
156
 
157
- Scenario: QA issue
158
- When I cd to the owner repo
159
- And I checkout master
160
- And I execute gitcycle with "qa issue.id"
161
- Then gitcycle runs
162
- And output includes
163
- """
164
- Retrieving branch information from gitcycle.
165
- Deleting old QA branch 'qa_master'.
166
- Creating QA branch 'qa_master'.
167
- Adding remote repo 'br/gitcycle_test'.
168
- Fetching remote branch '200-test-ticket'.
169
- Merging remote branch '200-test-ticket' from 'br/gitcycle_test'.
170
- Pushing QA branch 'qa_master'.
171
- Type 'gitc qa pass' to approve all issues in this branch.
172
- Type 'gitc qa fail' to reject all issues in this branch.
173
- """
157
+ # Scenario: QA issue
158
+ # When I cd to the owner repo
159
+ # And I checkout master
160
+ # And I execute gitcycle with "qa issue.id"
161
+ # Then gitcycle runs
162
+ # And output includes
163
+ # """
164
+ # Retrieving branch information from gitcycle.
165
+ # Deleting old QA branch 'qa_master'.
166
+ # Creating QA branch 'qa_master'.
167
+ # Adding remote repo 'br/gitcycle_test'.
168
+ # Fetching remote branch '200-test-ticket'.
169
+ # Merging remote branch '200-test-ticket' from 'br/gitcycle_test'.
170
+ # Pushing QA branch 'qa_master'.
171
+ # Type 'gitc qa pass' to approve all issues in this branch.
172
+ # Type 'gitc qa fail' to reject all issues in this branch.
173
+ # """
@@ -202,7 +202,7 @@ end
202
202
 
203
203
  Then /^output does not include \"([^\"]*)"$/ do |expected|
204
204
  expected = gsub_variables(expected)
205
- @output.include?(expected).should == false
205
+ @output.gsub(/\n+/, "\n").include?(expected).should == false
206
206
  end
207
207
 
208
208
  Then /^redis entries valid$/ do
@@ -221,7 +221,7 @@ Then /^redis entries valid$/ do
221
221
  should = {
222
222
  'lighthouse_url' => $ticket.url,
223
223
  'body' => "<div><p>test</p></div>\n\n#{$ticket.url}",
224
- 'home' => 'br',
224
+ 'home' => ENV['REPO'] == 'owner' ? config['owner'] : config['user'],
225
225
  'name' => $ticket.attributes['id'] + add,
226
226
  'id' => $ticket.attributes['id'] + add,
227
227
  'title' => $ticket.title,
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.1.5'
9
+ s.version = '0.1.6'
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
@@ -61,6 +61,14 @@ class Gitcycle
61
61
  branch['home'] = @git_login
62
62
  branch['source'] = branches(:current => true)
63
63
 
64
+ unless yes?("Would you like to eventually merge this feature into #{branch['source']}?")
65
+ branch['source'] = q("What branch would you like to eventually merge this feature into?")
66
+ end
67
+
68
+ unless branches(:match => branch['source'])
69
+
70
+ end
71
+
64
72
  unless yes?("Would you like to name your branch '#{name}'?")
65
73
  name = q("\nWhat would you like to name your branch?")
66
74
  name = name.gsub(/[\s\W]/, '-')
@@ -99,22 +107,8 @@ class Gitcycle
99
107
  def discuss(*issues)
100
108
  require_git && require_config
101
109
 
102
- puts "\nRetrieving branch information from gitcycle.\n".green
103
-
104
110
  if issues.empty?
105
- branch = get('branch',
106
- 'branch[name]' => branches(:current => true),
107
- 'create' => 0
108
- )
109
-
110
- if branch && !branch['issue_url']
111
- puts "Creating GitHub pull request.\n".green
112
- branch = get('branch',
113
- 'branch[create_pull_request]' => true,
114
- 'branch[name]' => branch['name'],
115
- 'create' => 0
116
- )
117
- end
111
+ branch = create_pull_request
118
112
 
119
113
  if branch == false
120
114
  puts "Branch not found.\n".red
@@ -125,6 +119,8 @@ class Gitcycle
125
119
  puts "You must push code before opening a pull request.\n".red
126
120
  end
127
121
  else
122
+ puts "\nRetrieving branch information from gitcycle.\n".green
123
+
128
124
  get('branch', 'issues' => issues, 'scope' => 'repo').each do |branch|
129
125
  if branch['issue_url']
130
126
  puts "Opening issue: #{branch['issue_url']}\n".green
@@ -178,23 +174,52 @@ class Gitcycle
178
174
  puts "Checking out #{qa_branch['source']}.".green
179
175
  run("git checkout #{qa_branch['source']}")
180
176
 
181
- puts "Merging '#{branch}' into '#{qa_branch['source']}'.\n".green
182
- run("git merge #{branch}")
183
- run("git push origin #{qa_branch['source']}")
184
-
185
- puts "\nLabeling all issues as '#{label}'.\n".green
186
- get('label',
187
- 'qa_branch[source]' => branch.gsub(/^qa_/, ''),
188
- 'labels' => [ label ]
189
- )
177
+ if issues[1..-1].empty?
178
+ if issues.first = 'pass'
179
+ puts "Merging '#{branch}' into '#{qa_branch['source']}'.\n".green
180
+ run("git merge #{branch}")
181
+ run("git push origin #{qa_branch['source']}")
182
+ end
183
+
184
+ puts "\nLabeling all issues as '#{label}'.\n".green
185
+ get('label',
186
+ 'qa_branch[source]' => branch.gsub(/^qa_/, ''),
187
+ 'labels' => [ label ]
188
+ )
189
+
190
+ branches = qa_branch['branches']
191
+ else
192
+ issues = [1..-1]
193
+
194
+ branches = qa_branch['branches'].select do |b|
195
+ issues.include?(b['issue'])
196
+ end
197
+
198
+ branches.each do |branch|
199
+ if issues.first = 'pass'
200
+ merge_remote_branch(
201
+ :user => branch['user'],
202
+ :repo => branch['repo'].split(':'),
203
+ :branch => branch['branch']
204
+ )
205
+ end
190
206
 
191
- branches = qa_branch['branches']
207
+ puts "\nLabeling issue #{branch['issue']} as '#{label}'.\n".green
208
+ get('label',
209
+ 'qa_branch[source]' => branch.gsub(/^qa_/, ''),
210
+ 'issue' => branch['issue'],
211
+ 'labels' => [ label ]
212
+ )
213
+ end
214
+ end
192
215
 
193
- puts "\nMarking Lighthouse tickets as 'pending-approval'.\n".green
194
- branches = branches.collect do |b|
195
- { :name => b['branch'], :repo => b['repo'], :user => b['user'] }
216
+ if issues.first = 'pass'
217
+ puts "\nMarking Lighthouse tickets as 'pending-approval'.\n".green
218
+ branches = branches.collect do |b|
219
+ { :name => b['branch'], :repo => b['repo'], :user => b['user'] }
220
+ end
221
+ get('ticket_resolve', 'branches' => Yajl::Encoder.encode(branches))
196
222
  end
197
- get('ticket_resolve', 'branches' => Yajl::Encoder.encode(branches))
198
223
  else
199
224
  puts "\nYou are not in a QA branch.\n".red
200
225
  end
@@ -239,11 +264,20 @@ class Gitcycle
239
264
  require_git && require_config
240
265
 
241
266
  if issues.empty?
242
- puts "\nLabeling issue as 'Pending Review'.\n".green
243
- get('label',
244
- 'branch[name]' => branches(:current => true),
245
- 'labels' => [ 'Pending Review' ]
246
- )
267
+ branch = create_pull_request
268
+
269
+ if branch == false
270
+ puts "Branch not found.\n".red
271
+ elsif branch['issue_url']
272
+ puts "\nLabeling issue as 'Pending Review'.\n".green
273
+ get('label',
274
+ 'branch[name]' => branches(:current => true),
275
+ 'labels' => [ 'Pending Review' ]
276
+ )
277
+
278
+ puts "Opening issue: #{branch['issue_url']}\n".green
279
+ Launchy.open(branch['issue_url'])
280
+ end
247
281
  else
248
282
  puts "\nLabeling issues as 'Pending Review'.\n".green
249
283
  get('label',
@@ -306,6 +340,47 @@ class Gitcycle
306
340
  end
307
341
  end
308
342
 
343
+ def checkout_remote_branch(options={})
344
+ owner = options[:owner]
345
+ repo = options[:repo]
346
+ branch = options[:branch]
347
+
348
+ $remotes ||= {}
349
+
350
+ unless $remotes[owner]
351
+ $remotes[owner] = true
352
+ puts "Adding remote repo '#{owner}/#{repo}'.\n".green
353
+ run("git remote rm #{owner}") if remotes(:match => owner)
354
+ run("git remote add #{owner} git@github.com:#{owner}/#{repo}.git")
355
+ end
356
+
357
+ puts "\nFetching remote branch '#{branch}'.\n".green
358
+ run("git fetch #{owner}")
359
+
360
+ puts "\nMerging remote branch '#{branch}' from '#{owner}/#{repo}'.\n".green
361
+ run("git merge #{owner}/#{branch}")
362
+ end
363
+
364
+ def create_pull_request
365
+ puts "\nRetrieving branch information from gitcycle.\n".green
366
+
367
+ branch = get('branch',
368
+ 'branch[name]' => branches(:current => true),
369
+ 'create' => 0
370
+ )
371
+
372
+ if branch && !branch['issue_url']
373
+ puts "Creating GitHub pull request.\n".green
374
+ branch = get('branch',
375
+ 'branch[create_pull_request]' => true,
376
+ 'branch[name]' => branch['name'],
377
+ 'create' => 0
378
+ )
379
+ end
380
+
381
+ branch
382
+ end
383
+
309
384
  def create_qa_branch(options)
310
385
  issues = options[:issues]
311
386
  range = options[:range] || (0..-1)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitcycle
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 5
10
- version: 0.1.5
9
+ - 6
10
+ version: 0.1.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Winton Welsh
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-17 00:00:00 -08:00
18
+ date: 2012-01-18 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency