gitcycle 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,204 @@
1
+ class Gitcycle
2
+ module QA
3
+
4
+ def qa(*issues)
5
+ require_git && require_config
6
+
7
+ if issues.empty?
8
+ puts "\n"
9
+ get('qa_branch').each do |branches|
10
+ puts "qa_#{branches['source']}_#{branches['user']}".green
11
+ branches['branches'].each do |branch|
12
+ puts " #{"issue ##{branch['issue']}".yellow}\t#{branch['user']}/#{branch['branch']}"
13
+ end
14
+ puts "\n"
15
+ end
16
+ elsif issues.first == 'fail' || issues.first == 'pass'
17
+ branch = branches(:current => true)
18
+ pass_fail = issues.first
19
+ label = pass_fail.capitalize
20
+ issues = issues[1..-1]
21
+
22
+ if pass_fail == 'pass' && !issues.empty?
23
+ puts "\nWARNING: #{
24
+ issues.length == 1 ? "This issue" : "These issues"
25
+ } will merge straight into '#{branch}' without testing.\n".red
26
+
27
+ if yes?("Continue?")
28
+ qa_branch = create_qa_branch(
29
+ :instructions => false,
30
+ :issues => issues,
31
+ :source => branch
32
+ )
33
+ `git checkout qa_#{qa_branch['source']}_#{qa_branch['user']} -q`
34
+ $remotes = {}
35
+ qa('pass')
36
+ else
37
+ exit ERROR[:told_not_to_merge]
38
+ end
39
+ elsif branch =~ /^qa_/
40
+ puts "\nRetrieving branch information from gitcycle.\n".green
41
+ qa_branch = get('qa_branch', :source => branch.gsub(/^qa_/, ''))
42
+
43
+ if pass_fail == 'pass'
44
+ checkout_or_track(:name => qa_branch['source'], :remote => 'origin')
45
+ end
46
+
47
+ if issues.empty?
48
+ branches = qa_branch['branches']
49
+ else
50
+ branches = qa_branch['branches'].select do |b|
51
+ issues.include?(b['issue'])
52
+ end
53
+ end
54
+
55
+ if pass_fail == 'pass' && issues.empty?
56
+ owner, repo = qa_branch['repo'].split(':')
57
+ merge_remote_branch(
58
+ :owner => owner,
59
+ :repo => repo,
60
+ :branch => "qa_#{qa_branch['source']}_#{qa_branch['user']}",
61
+ :type => :from_qa
62
+ )
63
+ end
64
+
65
+ unless issues.empty?
66
+ branches.each do |branch|
67
+ puts "\nLabeling issue #{branch['issue']} as '#{label}'.\n".green
68
+ get('label',
69
+ 'qa_branch[source]' => qa_branch['source'],
70
+ 'issue' => branch['issue'],
71
+ 'labels' => [ label ]
72
+ )
73
+ end
74
+ end
75
+
76
+ if issues.empty?
77
+ puts "\nLabeling all issues as '#{label}'.\n".green
78
+ get('label',
79
+ 'qa_branch[source]' => qa_branch['source'],
80
+ 'labels' => [ label ]
81
+ )
82
+ end
83
+ else
84
+ puts "\nYou are not in a QA branch.\n".red
85
+ end
86
+ elsif issues.first == 'resolved'
87
+ branch = branches(:current => true)
88
+
89
+ if branch =~ /^qa_/
90
+ puts "\nRetrieving branch information from gitcycle.\n".green
91
+ qa_branch = get('qa_branch', :source => branch.gsub(/^qa_/, ''))
92
+
93
+ branches = qa_branch['branches']
94
+ conflict = branches.detect { |branch| branch['conflict'] }
95
+
96
+ if qa_branch && conflict
97
+ puts "Committing merge resolution of #{conflict['branch']} (issue ##{conflict['issue']}).\n".green
98
+ run("git add . && git add . -u && git commit -a -F .git/MERGE_MSG")
99
+
100
+ puts "Pushing merge resolution of #{conflict['branch']} (issue ##{conflict['issue']}).\n".green
101
+ run("git push origin qa_#{qa_branch['source']}_#{qa_branch['user']} -q")
102
+
103
+ puts "\nDe-conflicting on gitcycle.\n".green
104
+ get('qa_branch',
105
+ 'issues' => branches.collect { |branch| branch['issue'] }
106
+ )
107
+
108
+ create_qa_branch(
109
+ :preserve => true,
110
+ :range => (branches.index(conflict)+1..-1),
111
+ :qa_branch => qa_branch
112
+ )
113
+ else
114
+ puts "Couldn't find record of a conflicted merge.\n".red
115
+ end
116
+ else
117
+ puts "\nYou aren't on a QA branch.\n".red
118
+ end
119
+ else
120
+ create_qa_branch(:issues => issues)
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ def create_qa_branch(options)
127
+ instructions = options[:instructions]
128
+ issues = options[:issues]
129
+ range = options[:range] || (0..-1)
130
+ source = options[:source]
131
+
132
+ if (issues && !issues.empty?) || options[:qa_branch]
133
+ if options[:qa_branch]
134
+ qa_branch = options[:qa_branch]
135
+ else
136
+ unless source
137
+ source = branches(:current => true)
138
+
139
+ unless yes?("\nDo you want to create a QA branch from '#{source}'?")
140
+ source = q("What branch would you like to base this QA branch off of?")
141
+ end
142
+ end
143
+
144
+ puts "\nRetrieving branch information from gitcycle.\n".green
145
+ qa_branch = get('qa_branch', 'issues' => issues, 'source' => source)
146
+ end
147
+
148
+ source = qa_branch['source']
149
+ name = "qa_#{source}_#{qa_branch['user']}"
150
+
151
+ unless qa_branch['branches'].empty?
152
+ qa_branch['branches'][range].each do |branch|
153
+ if source != branch['source']
154
+ puts "You can only QA issues based on '#{source}'\n".red
155
+ exit ERROR[:cannot_qa]
156
+ end
157
+ end
158
+
159
+ unless options[:preserve]
160
+ if branches(:match => name, :all => true)
161
+ puts "Deleting old QA branch '#{name}'.\n".green
162
+ if branches(:match => name)
163
+ run("git checkout master -q")
164
+ run("git branch -D #{name}")
165
+ end
166
+ run("git push origin :#{name} -q")
167
+ end
168
+
169
+ checkout_remote_branch(
170
+ :owner => @git_login,
171
+ :repo => @git_repo,
172
+ :branch => source,
173
+ :target => name
174
+ )
175
+
176
+ puts "\n"
177
+ end
178
+
179
+ qa_branch['branches'][range].each do |branch|
180
+ issue = branch['issue']
181
+ owner, repo = branch['repo'].split(':')
182
+ home = branch['home']
183
+
184
+ output = merge_remote_branch(
185
+ :owner => home,
186
+ :repo => repo,
187
+ :branch => branch['branch'],
188
+ :issue => issue,
189
+ :issues => qa_branch['branches'].collect { |b| b['issue'] },
190
+ :type => :to_qa
191
+ )
192
+ end
193
+
194
+ unless options[:instructions] == false
195
+ puts "\nType '".yellow + "gitc qa pass".green + "' to approve all issues in this branch.\n".yellow
196
+ puts "Type '".yellow + "gitc qa fail".red + "' to reject all issues in this branch.\n".yellow
197
+ end
198
+ end
199
+
200
+ qa_branch
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,37 @@
1
+ class Gitcycle
2
+ module Ready
3
+
4
+ def ready(*issues)
5
+ require_git && require_config
6
+
7
+ branch = pull
8
+
9
+ if branch && !branch['collab']
10
+ # Recreate pull request if force == true
11
+ force = branch['labels'] && branch['labels'].include?('Pass')
12
+ force ||= branch['state'] && branch['state'] == 'closed'
13
+
14
+ branch = create_pull_request(branch, force)
15
+ end
16
+
17
+ if branch == false
18
+ puts "Branch not found.\n".red
19
+ elsif branch['collab']
20
+ remote, branch = branch['home'], branch['source']
21
+ puts "\nPushing branch '#{remote}/#{branch}'.\n".green
22
+ run("git push #{remote} #{branch} -q")
23
+ elsif branch['issue_url']
24
+ puts "\nLabeling issue as 'Pending Review'.\n".green
25
+ get('label',
26
+ 'branch[name]' => branch['name'],
27
+ 'labels' => [ 'Pending Review' ]
28
+ )
29
+
30
+ puts "Opening issue: #{branch['issue_url']}\n".green
31
+ Launchy.open(branch['issue_url'])
32
+ else
33
+ puts "You have not pushed any commits to '#{branch['name']}'.\n".red
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ class Gitcycle
2
+ module Review
3
+
4
+ def review(pass_fail, *issues)
5
+ require_git && require_config
6
+
7
+ if pass_fail == 'fail'
8
+ label = 'Fail'
9
+ else
10
+ label = 'Pending QA'
11
+ end
12
+
13
+ if issues.empty?
14
+ puts "\nLabeling issue as '#{label}'.\n".green
15
+ get('label',
16
+ 'branch[name]' => branches(:current => true),
17
+ 'labels' => [ label ]
18
+ )
19
+ else
20
+ puts "\nLabeling issues as '#{label}'.\n".green
21
+ get('label',
22
+ 'issues' => issues,
23
+ 'labels' => [ label ],
24
+ 'scope' => 'repo'
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ class Gitcycle
2
+ module Setup
3
+
4
+ def setup(login, repo, token)
5
+ repo = "#{login}/#{repo}" unless repo.include?('/')
6
+ @config[repo] = [ login, token ]
7
+ save_config
8
+ puts "\nConfiguration saved.\n".green
9
+ end
10
+ end
11
+ end