capistrano-committed 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +9 -4
- data/README.md +3 -3
- data/capistrano-committed.gemspec +1 -1
- data/lib/capistrano/committed/version.rb +1 -1
- data/lib/capistrano/committed.rb +154 -1
- data/lib/capistrano/tasks/committed.rake +21 -126
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fe7f70c9b07f59c5bc350622702aa0aa9ab7fec
|
4
|
+
data.tar.gz: 21b3b32dcc4195be1bd68cd5cff667ad6f4301ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4677d783f58853501d7705bde6e459916c642d467fe79f83ff02bd6fc814bbbf266b6c566a62fc1c72fef9a78f78ff1ebbe235e7286fa59081a26bee08544ab
|
7
|
+
data.tar.gz: bcc8b8781b1b674e5a026b42acc9cb7fd15ef96bdbc99de0bd93662b7581c6f78a4a694924130c3ae48ea497efff30b13c4f9502c10696efc803ea9d5c6462b9
|
data/.codeclimate.yml
CHANGED
@@ -6,15 +6,20 @@ engines:
|
|
6
6
|
- ruby
|
7
7
|
fixme:
|
8
8
|
enabled: true
|
9
|
-
exclude_fingerprints:
|
10
|
-
- ee0a31701f95b21db4aff40647a56a3d
|
11
|
-
- b86af833d6b2b1fa18da63471e2278d9
|
12
|
-
- cdc1cac1f5cb7afe72dca9f9bca8a237
|
13
9
|
rubocop:
|
14
10
|
enabled: true
|
15
11
|
ratings:
|
16
12
|
paths:
|
17
13
|
- "**.rb"
|
18
14
|
- "**.rake"
|
15
|
+
- "Rakefile"
|
19
16
|
exclude_paths:
|
17
|
+
- bin/**/*
|
18
|
+
- icons/**/*
|
20
19
|
- spec/**/*
|
20
|
+
- ".gitignore"
|
21
|
+
- ".rspec"
|
22
|
+
- ".rubocop.yml"
|
23
|
+
- ".travis.yml"
|
24
|
+
- "LICENSE.md"
|
25
|
+
- "README.md"
|
data/README.md
CHANGED
@@ -101,8 +101,7 @@ set :committed_output_path, '%s/public/committed.txt'
|
|
101
101
|
# descriptions. This example matches JIRA numbers enclosed in square braces -
|
102
102
|
# e.g. "[ABC-12345]" with the part inside the braces being captured "ABC-12345".
|
103
103
|
# Setting this to `nil` will disable issue matching altogether. Note that this
|
104
|
-
# setting should specify a string, not a Ruby Regexp object.
|
105
|
-
# object might work, but it is not tested.
|
104
|
+
# setting should specify a string, not a Ruby Regexp object.
|
106
105
|
set :committed_issue_match, '\[\s?([a-zA-Z0-9]+\-[0-9]+)\s?\]'
|
107
106
|
|
108
107
|
# This is an array of methods which should be applied to matched issue numbers
|
@@ -118,7 +117,8 @@ set :committed_issue_postprocess, -> { [] }
|
|
118
117
|
# disable issue matching altogether.
|
119
118
|
set :committed_issue_url, 'https://example.jira.com/browse/%s'
|
120
119
|
|
121
|
-
# Register deployments in GitHub via the GitHub Deployments API
|
120
|
+
# Register deployments in GitHub via the GitHub Deployments API (not
|
121
|
+
# implemented yet)
|
122
122
|
set :committed_deployments, false
|
123
123
|
```
|
124
124
|
|
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "capistrano-committed"
|
8
8
|
spec.version = Capistrano::Committed::VERSION
|
9
9
|
spec.authors = ["Sam Bauers"]
|
10
|
-
spec.email = ["sam@
|
10
|
+
spec.email = ["sam@wopr.com.au"]
|
11
11
|
spec.license = 'MIT'
|
12
12
|
|
13
13
|
spec.summary = %q{Tells you what Capistrano 3 is going to deploy based on GitHub commits since the last release.}
|
data/lib/capistrano/committed.rb
CHANGED
@@ -5,6 +5,144 @@ require 'capistrano/committed/github_api'
|
|
5
5
|
module Capistrano
|
6
6
|
module Committed
|
7
7
|
class << self
|
8
|
+
def revision_search_regex(revision_line)
|
9
|
+
check_type __callee__, 'revision_line', revision_line.is_a?(String)
|
10
|
+
|
11
|
+
search = Regexp.escape(revision_line)
|
12
|
+
search = search.gsub('%\{', '(?<').gsub('\}', '>.+)')
|
13
|
+
Regexp.new(search)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_revisions_from_lines(lines, search, branch, limit)
|
17
|
+
check_type __callee__, 'lines', lines.is_a?(Array)
|
18
|
+
lines.each_with_index { |line, index|
|
19
|
+
check_type __callee__,
|
20
|
+
format('lines[%d]', index),
|
21
|
+
line.is_a?(String)
|
22
|
+
}
|
23
|
+
check_type __callee__, 'search', search.is_a?(Regexp)
|
24
|
+
check_type __callee__, 'branch', (branch.is_a?(Symbol) || branch.is_a?(String))
|
25
|
+
check_type __callee__, 'limit', limit.is_a?(Integer)
|
26
|
+
|
27
|
+
revisions = {}
|
28
|
+
lines.each do |line|
|
29
|
+
matches = search.match(line)
|
30
|
+
next if matches.nil?
|
31
|
+
next unless matches[:branch].to_s == branch.to_s
|
32
|
+
revisions[matches[:release]] = {
|
33
|
+
branch: matches[:branch],
|
34
|
+
sha: matches[:sha],
|
35
|
+
release: matches[:release],
|
36
|
+
user: matches[:user],
|
37
|
+
entries: {}
|
38
|
+
}
|
39
|
+
# Only store a certain number of revisions
|
40
|
+
break if revisions.count == limit
|
41
|
+
end
|
42
|
+
pad_revisions(revisions)
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_dates_to_revisions(revisions, github, git_user, git_repo)
|
46
|
+
check_type __callee__, 'revisions', revisions.is_a?(Hash)
|
47
|
+
check_type __callee__, 'github', github.is_a?(Capistrano::Committed::GithubApi)
|
48
|
+
check_type __callee__, 'git_user', git_user.is_a?(String)
|
49
|
+
check_type __callee__, 'git_repo', git_repo.is_a?(String)
|
50
|
+
|
51
|
+
revisions.each do |release, revision|
|
52
|
+
next if release == :next || release == :previous
|
53
|
+
commit = github.get_commit(git_user,
|
54
|
+
git_repo,
|
55
|
+
revision[:sha])
|
56
|
+
unless commit.nil?
|
57
|
+
revisions[release][:date] = commit[:commit][:committer][:date]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
revisions
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_earliest_date_from_revisions(revisions)
|
64
|
+
check_type __callee__, 'revisions', revisions.is_a?(Hash)
|
65
|
+
|
66
|
+
revisions.values.map{ |r| Time.parse(r[:date]) unless r[:date].nil? }.compact.min
|
67
|
+
end
|
68
|
+
|
69
|
+
def days_to_seconds(days)
|
70
|
+
check_type __callee__, 'days', days.is_a?(Numeric)
|
71
|
+
|
72
|
+
days * 24 * 60 * 60
|
73
|
+
end
|
74
|
+
|
75
|
+
def add_buffer_to_time(time, buffer_in_days)
|
76
|
+
check_type __callee__, 'time', time.is_a?(Time)
|
77
|
+
check_type __callee__, 'buffer_in_days', buffer_in_days.is_a?(Numeric)
|
78
|
+
|
79
|
+
(time - days_to_seconds(buffer_in_days)).iso8601
|
80
|
+
end
|
81
|
+
|
82
|
+
def format_revision_header(release, revision)
|
83
|
+
check_type __callee__, 'release', (release.is_a?(Symbol) || release.is_a?(String))
|
84
|
+
check_type __callee__, 'revision', revision.is_a?(Hash)
|
85
|
+
|
86
|
+
output = ['']
|
87
|
+
output << ('=' * 94)
|
88
|
+
case release
|
89
|
+
when :next
|
90
|
+
output << t('committed.output.next_release')
|
91
|
+
when :previous
|
92
|
+
output << t('committed.output.previous_release',
|
93
|
+
time: revision[:date])
|
94
|
+
else
|
95
|
+
output << t('committed.output.current_release',
|
96
|
+
release_time: Time.parse(revision[:release]).iso8601,
|
97
|
+
sha: revision[:sha],
|
98
|
+
commit_time: revision[:date])
|
99
|
+
end
|
100
|
+
output << ('=' * 94)
|
101
|
+
output << ''
|
102
|
+
end
|
103
|
+
|
104
|
+
def format_commit(commit, pad, issue_pattern, postprocess, url_pattern)
|
105
|
+
check_type __callee__, 'commit', commit.is_a?(Hash)
|
106
|
+
check_type __callee__, 'pad', pad.is_a?(String)
|
107
|
+
# issue_pattern, postprocess, and url_pattern get type checked by `get_issue_urls`
|
108
|
+
|
109
|
+
# Print the commit ref
|
110
|
+
output = [format('%s * %s',
|
111
|
+
pad,
|
112
|
+
t('committed.output.commit_sha', sha: commit[:sha]))]
|
113
|
+
output << pad
|
114
|
+
|
115
|
+
# Print the commit message
|
116
|
+
lines = commit[:commit][:message].chomp.split("\n")
|
117
|
+
unless lines.empty?
|
118
|
+
lines.each do |line|
|
119
|
+
output << format('%s > %s', pad, line)
|
120
|
+
end
|
121
|
+
output << pad
|
122
|
+
|
123
|
+
# Get any issue numbers referred to in the commit message
|
124
|
+
# and print links to them
|
125
|
+
urls = get_issue_urls(issue_pattern,
|
126
|
+
postprocess,
|
127
|
+
url_pattern,
|
128
|
+
commit[:commit][:message])
|
129
|
+
output += format_issue_urls(urls, pad)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Committer details
|
133
|
+
output << format('%s %s',
|
134
|
+
pad,
|
135
|
+
t('committed.output.committed_on', time: commit[:commit][:committer][:date]))
|
136
|
+
output << format('%s %s',
|
137
|
+
pad,
|
138
|
+
t('committed.output.committed_by', login: commit[:committer][:login]))
|
139
|
+
output << pad
|
140
|
+
|
141
|
+
# Print a link to the commit in GitHub
|
142
|
+
output << format('%s %s', pad, commit[:html_url])
|
143
|
+
output << pad
|
144
|
+
end
|
145
|
+
|
8
146
|
def get_issue_urls(issue_pattern, postprocess, url_pattern, message)
|
9
147
|
check_type __callee__,
|
10
148
|
'issue_pattern',
|
@@ -22,13 +160,14 @@ module Capistrano
|
|
22
160
|
|
23
161
|
matches = message.scan(Regexp.new(issue_pattern))
|
24
162
|
return [] unless matches
|
25
|
-
matches.map { |match|
|
163
|
+
matches.map! { |match|
|
26
164
|
issue = match[0]
|
27
165
|
postprocess.each { |method|
|
28
166
|
issue = issue.send(method)
|
29
167
|
}
|
30
168
|
format(url_pattern, issue)
|
31
169
|
}
|
170
|
+
matches.uniq
|
32
171
|
end
|
33
172
|
|
34
173
|
def format_issue_urls(urls, pad = '')
|
@@ -47,6 +186,20 @@ module Capistrano
|
|
47
186
|
method: method,
|
48
187
|
param: param) unless condition
|
49
188
|
end
|
189
|
+
|
190
|
+
def pad_revisions(revisions)
|
191
|
+
check_type __callee__, 'revisions', revisions.is_a?(Hash)
|
192
|
+
|
193
|
+
unless revisions.empty?
|
194
|
+
# Sort revisions by release date
|
195
|
+
revisions = Hash[revisions.sort { |a, b| b[1][:release] <=> a[1][:release] }]
|
196
|
+
# Add the "previous" revision
|
197
|
+
revisions.merge!(previous: { entries: {} })
|
198
|
+
# Add the "next" revision
|
199
|
+
revisions = {next: { entries: {} }}.merge(revisions)
|
200
|
+
end
|
201
|
+
revisions
|
202
|
+
end
|
50
203
|
end
|
51
204
|
end
|
52
205
|
end
|
@@ -95,27 +95,10 @@ namespace :committed do
|
|
95
95
|
|
96
96
|
# Build the regex to search for revision data in the log, by default this
|
97
97
|
# is the localised string from Capistrano
|
98
|
-
search = fetch(:committed_revision_line)
|
99
|
-
search = Regexp.escape(search)
|
100
|
-
search = search.gsub('%\{', '(?<').gsub('\}', '>.+)')
|
101
|
-
search = Regexp.new(search)
|
98
|
+
search = ::Capistrano::Committed.revision_search_regex(fetch(:committed_revision_line))
|
102
99
|
|
103
100
|
# Build the revisions hash
|
104
|
-
revisions =
|
105
|
-
lines.each do |line|
|
106
|
-
matches = search.match(line)
|
107
|
-
next if matches.nil?
|
108
|
-
next unless matches[:branch].to_s == fetch(:branch).to_s
|
109
|
-
revisions[matches[:sha]] = {
|
110
|
-
branch: matches[:branch],
|
111
|
-
sha: matches[:sha],
|
112
|
-
release: matches[:release],
|
113
|
-
user: matches[:user],
|
114
|
-
entries: {}
|
115
|
-
}
|
116
|
-
# Only store a certain number of revisions
|
117
|
-
break if revisions.count == fetch(:committed_revision_limit)
|
118
|
-
end
|
101
|
+
revisions = ::Capistrano::Committed.get_revisions_from_lines(lines, search, fetch(:branch), fetch(:committed_revision_limit))
|
119
102
|
|
120
103
|
# No revisions, no log
|
121
104
|
if revisions.empty?
|
@@ -125,29 +108,14 @@ namespace :committed do
|
|
125
108
|
return
|
126
109
|
end
|
127
110
|
|
128
|
-
# Sort revisions by release date
|
129
|
-
revisions = revisions.sort_by { |_sha, matches| matches[:release] }.to_h
|
130
|
-
# Add the "next" revision
|
131
|
-
revisions.merge!(next: { entries: {} })
|
132
|
-
# Reverse the order of revisions in the hash (most recent first)
|
133
|
-
revisions = revisions.to_a.reverse.to_h
|
134
|
-
revisions.merge!(previous: { entries: {} })
|
135
|
-
|
136
111
|
# Initialize the GitHub API client
|
137
112
|
github = ::Capistrano::Committed::GithubApi.new(fetch(:committed_github_config))
|
138
113
|
|
139
114
|
# Get the actual date of the commit referenced to by the revision
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
fetch(:committed_repo),
|
145
|
-
sha)
|
146
|
-
unless commit.nil?
|
147
|
-
earliest_date = commit[:commit][:committer][:date]
|
148
|
-
revisions[sha][:date] = earliest_date
|
149
|
-
end
|
150
|
-
end
|
115
|
+
revisions = ::Capistrano::Committed.add_dates_to_revisions(revisions, github, fetch(:committed_user), fetch(:committed_repo))
|
116
|
+
|
117
|
+
# Get the earliest revision date
|
118
|
+
earliest_date = ::Capistrano::Committed.get_earliest_date_from_revisions(revisions)
|
151
119
|
|
152
120
|
# No commit data on revisions, no log
|
153
121
|
if earliest_date.nil?
|
@@ -157,9 +125,8 @@ namespace :committed do
|
|
157
125
|
return
|
158
126
|
end
|
159
127
|
|
160
|
-
# Go back an extra N
|
161
|
-
|
162
|
-
earliest_date = (Time.parse(earliest_date) - buffer).iso8601
|
128
|
+
# Go back an extra N days
|
129
|
+
earliest_date = ::Capistrano::Committed.add_buffer_to_time(earliest_date, fetch(:committed_commit_buffer))
|
163
130
|
revisions[:previous][:date] = earliest_date
|
164
131
|
|
165
132
|
# Get all the commits on this branch
|
@@ -245,27 +212,14 @@ namespace :committed do
|
|
245
212
|
|
246
213
|
# Loop through the revisions to create the output
|
247
214
|
output = []
|
248
|
-
revisions.each do |
|
215
|
+
revisions.each do |release, revision|
|
249
216
|
# Build the revision header
|
250
|
-
output
|
251
|
-
|
252
|
-
case sha
|
253
|
-
when :next
|
254
|
-
output << t('committed.output.next_release')
|
255
|
-
when :previous
|
256
|
-
output << t('committed.output.previous_release',
|
257
|
-
time: revision[:date])
|
258
|
-
else
|
259
|
-
output << t('committed.output.current_release',
|
260
|
-
release_time: Time.parse(revision[:release]).iso8601,
|
261
|
-
sha: revision[:sha],
|
262
|
-
commit_time: revision[:date])
|
263
|
-
end
|
264
|
-
output << ('=' * 94)
|
265
|
-
output << ''
|
217
|
+
output += ::Capistrano::Committed.format_revision_header(release,
|
218
|
+
revision)
|
266
219
|
|
267
220
|
# Loop through the entries in this revision
|
268
|
-
revision[:entries].sort_by { |date, _entries| date }.reverse
|
221
|
+
items = Hash[revision[:entries].sort_by { |date, _entries| date }.reverse]
|
222
|
+
items.each do |_date, entries|
|
269
223
|
entries.each do |entry|
|
270
224
|
case entry[:type]
|
271
225
|
when :pull_request
|
@@ -311,41 +265,11 @@ namespace :committed do
|
|
311
265
|
entry[:commits].each do |commit|
|
312
266
|
output << (' ' + ('-' * 90))
|
313
267
|
output << ' |'
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
t('committed.output.commit_sha',
|
318
|
-
sha: commit[:sha]))
|
319
|
-
output << ' |'
|
320
|
-
|
321
|
-
# Print the commit message
|
322
|
-
lines = commit[:commit][:message].chomp.split("\n")
|
323
|
-
unless lines.empty?
|
324
|
-
output << format(' | > %s', lines.join("\n | > "))
|
325
|
-
output << ' |'
|
326
|
-
|
327
|
-
# Get any issue numbers referred to in the commit message
|
328
|
-
# and print links to them
|
329
|
-
urls = ::Capistrano::Committed.get_issue_urls(fetch(:committed_issue_match),
|
268
|
+
output += ::Capistrano::Committed.format_commit(commit,
|
269
|
+
' |',
|
270
|
+
fetch(:committed_issue_match),
|
330
271
|
fetch(:committed_issue_postprocess),
|
331
|
-
fetch(:committed_issue_url)
|
332
|
-
commit[:commit][:message])
|
333
|
-
output += ::Capistrano::Committed.format_issue_urls(urls,
|
334
|
-
' |')
|
335
|
-
end
|
336
|
-
|
337
|
-
# Committer details
|
338
|
-
output << format(' | %s',
|
339
|
-
t('committed.output.committed_on',
|
340
|
-
time: commit[:commit][:committer][:date]))
|
341
|
-
output << format(' | %s',
|
342
|
-
t('committed.output.committed_by',
|
343
|
-
login: commit[:committer][:login]))
|
344
|
-
output << ' |'
|
345
|
-
|
346
|
-
# Print a link to the commit in GitHub
|
347
|
-
output << format(' | %s', commit[:html_url])
|
348
|
-
output << ' |'
|
272
|
+
fetch(:committed_issue_url))
|
349
273
|
end
|
350
274
|
output << (' ' + ('-' * 90))
|
351
275
|
output << ''
|
@@ -354,40 +278,11 @@ namespace :committed do
|
|
354
278
|
when :commit
|
355
279
|
# These are commits that are included in this revision, but are
|
356
280
|
# not in any pull requests
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
t('committed.output.commit_sha',
|
361
|
-
sha: entry[:info][:sha]))
|
362
|
-
output << ''
|
363
|
-
|
364
|
-
# Print the commit message
|
365
|
-
lines = entry[:info][:commit][:message].chomp.split("\n")
|
366
|
-
unless lines.empty?
|
367
|
-
output << format(' > %s', lines.join("\n > "))
|
368
|
-
output << ''
|
369
|
-
|
370
|
-
# Get any issue numbers referred to in the commit message and
|
371
|
-
# print links to them
|
372
|
-
urls = ::Capistrano::Committed.get_issue_urls(fetch(:committed_issue_match),
|
281
|
+
output += ::Capistrano::Committed.format_commit(entry[:info],
|
282
|
+
'',
|
283
|
+
fetch(:committed_issue_match),
|
373
284
|
fetch(:committed_issue_postprocess),
|
374
|
-
fetch(:committed_issue_url)
|
375
|
-
entry[:info][:commit][:message])
|
376
|
-
output += ::Capistrano::Committed.format_issue_urls(urls)
|
377
|
-
end
|
378
|
-
|
379
|
-
# Committer details
|
380
|
-
output << format(' %s',
|
381
|
-
t('committed.output.committed_on',
|
382
|
-
time: entry[:info][:commit][:committer][:date]))
|
383
|
-
output << format(' %s',
|
384
|
-
t('committed.output.committed_by',
|
385
|
-
login: entry[:info][:committer][:login]))
|
386
|
-
output << ''
|
387
|
-
|
388
|
-
# Print a link to the commit in GitHub
|
389
|
-
output << format(' %s', entry[:info][:html_url])
|
390
|
-
output << ''
|
285
|
+
fetch(:committed_issue_url))
|
391
286
|
end
|
392
287
|
|
393
288
|
output << ('-' * 94)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-committed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Bauers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -83,7 +83,7 @@ dependencies:
|
|
83
83
|
description: Tells you what Capistrano 3 is going to deploy based on GitHub commits
|
84
84
|
since the last release.
|
85
85
|
email:
|
86
|
-
- sam@
|
86
|
+
- sam@wopr.com.au
|
87
87
|
executables: []
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|