capistrano-committed 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -3
- data/capistrano-committed.gemspec +1 -0
- data/lib/capistrano/committed.rb +44 -90
- data/lib/capistrano/committed/i18n.rb +2 -0
- data/lib/capistrano/committed/output.rb +147 -0
- data/lib/capistrano/committed/output/output_html.mustache +13 -0
- data/lib/capistrano/committed/output/output_txt.mustache +63 -0
- data/lib/capistrano/committed/version.rb +1 -1
- data/lib/capistrano/tasks/committed.rake +68 -99
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53f9838f0ee36a0fc450a0d4c554aacb0f2c8eff
|
4
|
+
data.tar.gz: e51d3b4e484f15f51d0a3261a99b8cb23c2903e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d25d95dba27120f8cbabc51390886b284787ae1d839c49762da5356bccfbd7a2c60bb890550be10c836be934380211e7de005a7a18e306db329949ec42edd8e5
|
7
|
+
data.tar.gz: beac303f7200b7d85ae0303706d3cb619031bd15b7c952fceaa6dfabd954dcb4b06aff0e87ce1f79c5f4643aa7e64550543a3caa167bc67c9b37da3f6347bdcf
|
data/README.md
CHANGED
@@ -93,9 +93,14 @@ set :committed_revision_limit, 10
|
|
93
93
|
# How many days beyond the last revision we fetch should we look for commits
|
94
94
|
set :committed_commit_buffer, 1
|
95
95
|
|
96
|
-
# Where to upload the report - '%s' is replaced with `current_path` if
|
97
|
-
# `nil` will stop the report from uploading at all, and print to STDOUT
|
98
|
-
|
96
|
+
# Where to upload the text report - '%s' is replaced with `current_path` if
|
97
|
+
# present. `nil` will stop the report from uploading at all, and print to STDOUT
|
98
|
+
# instead.
|
99
|
+
set :committed_output_text_path, '%s/public/committed.txt'
|
100
|
+
|
101
|
+
# Where to upload the html report - '%s' is replaced with `current_path` if
|
102
|
+
# present. `nil` will stop the report from uploading at all.
|
103
|
+
set :committed_output_html_path, '%s/public/committed.html'
|
99
104
|
|
100
105
|
# This is a regexp pattern that describes issue numbers in commit titles and
|
101
106
|
# descriptions. This example matches JIRA numbers enclosed in square braces -
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency "capistrano", '~> 3.4'
|
23
23
|
spec.add_dependency "github_api", "~> 0.13.0"
|
24
|
+
spec.add_dependency "mustache", "~> 1.0"
|
24
25
|
|
25
26
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
data/lib/capistrano/committed.rb
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
require 'capistrano/committed/version'
|
2
2
|
require 'capistrano/committed/i18n'
|
3
3
|
require 'capistrano/committed/github_api'
|
4
|
+
require 'capistrano/committed/output'
|
4
5
|
|
5
6
|
module Capistrano
|
6
7
|
module Committed
|
7
8
|
class << self
|
8
|
-
|
9
|
+
@@settings = {}
|
10
|
+
|
11
|
+
def import_settings(settings, merge = nil)
|
12
|
+
merge.nil? ? @@settings = settings : @@settings.merge!(settings)
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_setting(setting, variable = nil)
|
16
|
+
variable.nil? ? @@settings[setting] : variable
|
17
|
+
end
|
18
|
+
|
19
|
+
def revision_search_regex(revision_line = nil)
|
20
|
+
revision_line = get_setting(:revision_line, revision_line)
|
9
21
|
check_type __callee__, 'revision_line', revision_line.is_a?(String)
|
10
22
|
|
11
23
|
search = Regexp.escape(revision_line)
|
@@ -13,15 +25,21 @@ module Capistrano
|
|
13
25
|
Regexp.new(search)
|
14
26
|
end
|
15
27
|
|
16
|
-
def get_revisions_from_lines(lines, search, branch, limit)
|
28
|
+
def get_revisions_from_lines(lines, search = nil, branch = nil, limit = nil)
|
17
29
|
check_type __callee__, 'lines', lines.is_a?(Array)
|
18
30
|
lines.each_with_index { |line, index|
|
19
31
|
check_type __callee__,
|
20
32
|
format('lines[%d]', index),
|
21
33
|
line.is_a?(String)
|
22
34
|
}
|
35
|
+
|
36
|
+
search = revision_search_regex if search.nil?
|
23
37
|
check_type __callee__, 'search', search.is_a?(Regexp)
|
38
|
+
|
39
|
+
branch = get_setting(:branch, branch)
|
24
40
|
check_type __callee__, 'branch', (branch.is_a?(Symbol) || branch.is_a?(String))
|
41
|
+
|
42
|
+
limit = get_setting(:revision_limit, limit)
|
25
43
|
check_type __callee__, 'limit', limit.is_a?(Integer)
|
26
44
|
|
27
45
|
revisions = {}
|
@@ -42,10 +60,14 @@ module Capistrano
|
|
42
60
|
pad_revisions(revisions)
|
43
61
|
end
|
44
62
|
|
45
|
-
def add_dates_to_revisions(revisions, github, git_user, git_repo)
|
63
|
+
def add_dates_to_revisions(revisions, github, git_user = nil, git_repo = nil)
|
46
64
|
check_type __callee__, 'revisions', revisions.is_a?(Hash)
|
47
65
|
check_type __callee__, 'github', github.is_a?(Capistrano::Committed::GithubApi)
|
66
|
+
|
67
|
+
git_user = get_setting(:user, git_user)
|
48
68
|
check_type __callee__, 'git_user', git_user.is_a?(String)
|
69
|
+
|
70
|
+
git_repo = get_setting(:repo, git_repo)
|
49
71
|
check_type __callee__, 'git_repo', git_repo.is_a?(String)
|
50
72
|
|
51
73
|
revisions.each do |release, revision|
|
@@ -72,114 +94,46 @@ module Capistrano
|
|
72
94
|
days * 24 * 60 * 60
|
73
95
|
end
|
74
96
|
|
75
|
-
def add_buffer_to_time(time, buffer_in_days)
|
97
|
+
def add_buffer_to_time(time, buffer_in_days = nil)
|
76
98
|
check_type __callee__, 'time', time.is_a?(Time)
|
99
|
+
|
100
|
+
buffer_in_days = get_setting(:commit_buffer, buffer_in_days)
|
77
101
|
check_type __callee__, 'buffer_in_days', buffer_in_days.is_a?(Numeric)
|
78
102
|
|
79
103
|
(time - days_to_seconds(buffer_in_days)).iso8601
|
80
104
|
end
|
81
105
|
|
82
|
-
def
|
83
|
-
check_type __callee__, '
|
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
|
106
|
+
def get_issue_urls(message, issue_match = nil, issue_postprocess = nil, issue_url = nil)
|
107
|
+
check_type __callee__, 'message', message.is_a?(String)
|
145
108
|
|
146
|
-
|
109
|
+
issue_match = get_setting(:issue_match, issue_match)
|
147
110
|
check_type __callee__,
|
148
|
-
'
|
149
|
-
(
|
111
|
+
'issue_match',
|
112
|
+
(issue_match.is_a?(String) || issue_match.is_a?(Regexp))
|
150
113
|
|
151
|
-
|
152
|
-
|
114
|
+
issue_postprocess = get_setting(:issue_postprocess, issue_postprocess)
|
115
|
+
check_type __callee__, 'issue_postprocess', issue_postprocess.is_a?(Array)
|
116
|
+
issue_postprocess.each { |method|
|
153
117
|
check_type __callee__,
|
154
|
-
format('
|
118
|
+
format('issue_postprocess[:%s]', method.to_s),
|
155
119
|
method.is_a?(Symbol)
|
156
120
|
}
|
157
121
|
|
158
|
-
|
159
|
-
check_type __callee__, '
|
122
|
+
issue_url = get_setting(:issue_url, issue_url)
|
123
|
+
check_type __callee__, 'issue_url', issue_url.is_a?(String)
|
160
124
|
|
161
|
-
matches = message.scan(Regexp.new(
|
125
|
+
matches = message.scan(Regexp.new(issue_match))
|
162
126
|
return [] unless matches
|
163
127
|
matches.map! { |match|
|
164
128
|
issue = match[0]
|
165
|
-
|
129
|
+
issue_postprocess.each { |method|
|
166
130
|
issue = issue.send(method)
|
167
131
|
}
|
168
|
-
format(
|
132
|
+
format(issue_url, issue)
|
169
133
|
}
|
170
134
|
matches.uniq
|
171
135
|
end
|
172
136
|
|
173
|
-
def format_issue_urls(urls, pad = '')
|
174
|
-
return [] if urls.nil? || urls.empty?
|
175
|
-
output = []
|
176
|
-
output << format('%s %s', pad, t('committed.output.issue_links'))
|
177
|
-
urls.each do |url|
|
178
|
-
output << format('%s - %s', pad, url)
|
179
|
-
end
|
180
|
-
output << format('%s', pad)
|
181
|
-
end
|
182
|
-
|
183
137
|
private
|
184
138
|
def check_type(method, param, condition)
|
185
139
|
fail TypeError, t('committed.error.helpers.valid_param',
|
@@ -194,9 +148,9 @@ module Capistrano
|
|
194
148
|
# Sort revisions by release date
|
195
149
|
revisions = Hash[revisions.sort { |a, b| b[1][:release] <=> a[1][:release] }]
|
196
150
|
# Add the "previous" revision
|
197
|
-
revisions.merge!(previous: { entries: {} })
|
151
|
+
revisions.merge!(previous: { release: :previous, entries: {} })
|
198
152
|
# Add the "next" revision
|
199
|
-
revisions = {next: { entries: {} }}.merge(revisions)
|
153
|
+
revisions = {next: { release: :next, entries: {} }}.merge(revisions)
|
200
154
|
end
|
201
155
|
revisions
|
202
156
|
end
|
@@ -16,6 +16,7 @@ en = {
|
|
16
16
|
string_or_nil: '`:%{variable}` variable is not a string or `nil`.',
|
17
17
|
string_or_regexp_or_nil: '`:%{variable}` variable is not a string or `Regexp` object or `nil`.'
|
18
18
|
},
|
19
|
+
deprecated: '`%{deprecated}` variable is deprecated. Use `%{replacement}` instead.',
|
19
20
|
runtime: {
|
20
21
|
revisions_empty: 'The %{branch} branch has never been deployed to the %{stage} stage. No log has been generated.',
|
21
22
|
revision_commit_missing: 'No commit data has been found for the %{branch} branch on the %{stage} stage. No log has been generated.',
|
@@ -23,6 +24,7 @@ en = {
|
|
23
24
|
}
|
24
25
|
},
|
25
26
|
output: {
|
27
|
+
page_title: 'Git Deployment Report for %{repo}',
|
26
28
|
next_release: 'Next release',
|
27
29
|
previous_release: 'Commits before %{time} are omitted from the report ¯\_(ツ)_/¯',
|
28
30
|
current_release: 'Release on %{release_time} from commit %{sha} at %{commit_time}',
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'mustache'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module Committed
|
5
|
+
class Output < Mustache
|
6
|
+
@@template_format = 'txt'
|
7
|
+
|
8
|
+
self.template_path = format('%s/output', File.dirname(__FILE__))
|
9
|
+
self.template_file = format('%s/output/output_%s.mustache', File.dirname(__FILE__), @@template_format)
|
10
|
+
|
11
|
+
def get_output_path(file)
|
12
|
+
format('%s/output/%s', File.dirname(__FILE__), file)
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_output_template_path(format = 'txt', set_template_format = true)
|
16
|
+
@@template_format = format if set_template_format
|
17
|
+
get_output_path(format('output_%s.mustache', format))
|
18
|
+
end
|
19
|
+
|
20
|
+
def release_header
|
21
|
+
case context.current[:release]
|
22
|
+
when :next
|
23
|
+
t('committed.output.next_release')
|
24
|
+
when :previous
|
25
|
+
t('committed.output.previous_release',
|
26
|
+
time: context.current[:date])
|
27
|
+
else
|
28
|
+
t('committed.output.current_release',
|
29
|
+
release_time: Time.parse(context.current[:release]).iso8601,
|
30
|
+
sha: context.current[:sha],
|
31
|
+
commit_time: context.current[:date])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def items
|
36
|
+
return unless context.current[:entries]
|
37
|
+
Hash[context.current[:entries].sort_by { |date, _entries| date }.reverse].values.flatten
|
38
|
+
end
|
39
|
+
|
40
|
+
def item_title
|
41
|
+
return unless context.current[:info]
|
42
|
+
case context.current[:type]
|
43
|
+
when :commit
|
44
|
+
t('committed.output.commit_sha',
|
45
|
+
sha: context.current[:info][:sha])
|
46
|
+
when :pull_request
|
47
|
+
t('committed.output.pull_request_number',
|
48
|
+
number: context.current[:info][:number])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def item_subtitle
|
53
|
+
return unless context.current[:type] == :pull_request
|
54
|
+
return unless context.current[:info]
|
55
|
+
context.current[:info][:title]
|
56
|
+
end
|
57
|
+
|
58
|
+
def has_item_subtitle
|
59
|
+
!item_subtitle.nil?
|
60
|
+
end
|
61
|
+
|
62
|
+
def item_lines
|
63
|
+
return unless context.current[:info]
|
64
|
+
case context.current[:type]
|
65
|
+
when :commit
|
66
|
+
context.current[:info][:commit][:message].chomp.delete("\r").split("\n")
|
67
|
+
when :pull_request
|
68
|
+
context.current[:info][:body].chomp.delete("\r").split("\n")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def has_item_lines
|
73
|
+
!item_lines.empty?
|
74
|
+
end
|
75
|
+
|
76
|
+
def issue_links
|
77
|
+
return unless context.current[:info]
|
78
|
+
case context.current[:type]
|
79
|
+
when :commit
|
80
|
+
::Capistrano::Committed.get_issue_urls(context.current[:info][:commit][:message])
|
81
|
+
when :pull_request
|
82
|
+
::Capistrano::Committed.get_issue_urls(context.current[:info][:title] + context.current[:info][:body])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def issue_link
|
87
|
+
format_link(context.current)
|
88
|
+
end
|
89
|
+
|
90
|
+
def has_issue_links
|
91
|
+
!issue_links.empty?
|
92
|
+
end
|
93
|
+
|
94
|
+
def item_created_on
|
95
|
+
return unless context.current[:info]
|
96
|
+
case context.current[:type]
|
97
|
+
when :commit
|
98
|
+
t('committed.output.committed_on', time: context.current[:info][:commit][:committer][:date])
|
99
|
+
when :pull_request
|
100
|
+
t('committed.output.merged_on', time: context.current[:info][:merged_at])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def item_created_by
|
105
|
+
return unless context.current[:info]
|
106
|
+
case context.current[:type]
|
107
|
+
when :commit
|
108
|
+
t('committed.output.committed_by', login: context.current[:info][:committer][:login])
|
109
|
+
when :pull_request
|
110
|
+
t('committed.output.merged_by', login: context.current[:info][:merged_by][:login])
|
111
|
+
else
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def item_link
|
117
|
+
case context.current[:type]
|
118
|
+
when :commit, :pull_request
|
119
|
+
return unless context.current[:info]
|
120
|
+
format_link(context.current[:info][:html_url])
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def commits
|
125
|
+
return unless context.current[:type] == :pull_request
|
126
|
+
return if context.current[:commits].nil?
|
127
|
+
return if context.current[:commits].empty?
|
128
|
+
context.current[:commits].flatten
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_commits
|
132
|
+
!commits.nil?
|
133
|
+
end
|
134
|
+
|
135
|
+
private
|
136
|
+
|
137
|
+
def format_link(url)
|
138
|
+
case @@template_format
|
139
|
+
when 'html'
|
140
|
+
format('<a href="%s">%s</a>', url, url)
|
141
|
+
when 'txt'
|
142
|
+
url
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
{{page_title}}
|
2
|
+
{{#revisions}}
|
3
|
+
|
4
|
+
==============================================================================================
|
5
|
+
{{release_header}}
|
6
|
+
==============================================================================================
|
7
|
+
{{#items}}
|
8
|
+
|
9
|
+
* {{item_title}}
|
10
|
+
{{#has_item_subtitle}}
|
11
|
+
{{item_subtitle}}
|
12
|
+
{{/has_item_subtitle}}
|
13
|
+
{{#has_item_lines}}
|
14
|
+
|
15
|
+
{{#item_lines}}
|
16
|
+
> {{.}}
|
17
|
+
{{/item_lines}}
|
18
|
+
{{#has_issue_links}}
|
19
|
+
|
20
|
+
Issue links:
|
21
|
+
{{#issue_links}}
|
22
|
+
- {{{issue_link}}}
|
23
|
+
{{/issue_links}}
|
24
|
+
{{/has_issue_links}}
|
25
|
+
{{/has_item_lines}}
|
26
|
+
|
27
|
+
{{item_created_on}}
|
28
|
+
{{item_created_by}}
|
29
|
+
|
30
|
+
{{{item_link}}}
|
31
|
+
|
32
|
+
{{#has_commits}}
|
33
|
+
{{#commits}}
|
34
|
+
------------------------------------------------------------------------------------------
|
35
|
+
|
|
36
|
+
| * {{item_title}}
|
37
|
+
{{#has_item_lines}}
|
38
|
+
|
|
39
|
+
{{#item_lines}}
|
40
|
+
| > {{.}}
|
41
|
+
{{/item_lines}}
|
42
|
+
{{#has_issue_links}}
|
43
|
+
|
|
44
|
+
| Issue links:
|
45
|
+
{{#issue_links}}
|
46
|
+
| - {{{issue_link}}}
|
47
|
+
{{/issue_links}}
|
48
|
+
{{/has_issue_links}}
|
49
|
+
{{/has_item_lines}}
|
50
|
+
|
|
51
|
+
| {{item_created_on}}
|
52
|
+
| {{item_created_by}}
|
53
|
+
|
|
54
|
+
| {{{item_link}}}
|
55
|
+
|
|
56
|
+
{{/commits}}
|
57
|
+
------------------------------------------------------------------------------------------
|
58
|
+
|
59
|
+
{{/has_commits}}
|
60
|
+
----------------------------------------------------------------------------------------------
|
61
|
+
{{/items}}
|
62
|
+
|
63
|
+
{{/revisions}}
|
@@ -33,10 +33,20 @@ namespace :committed do
|
|
33
33
|
variable: 'committed_commit_buffer') unless
|
34
34
|
fetch(:committed_commit_buffer).is_a?(Integer)
|
35
35
|
|
36
|
+
fail TypeError, t('committed.error.deprecated',
|
37
|
+
deprecated: 'committed_output_path',
|
38
|
+
replacement: 'committed_output_text_path') if
|
39
|
+
fetch(:committed_output_path).is_a?(String)
|
40
|
+
|
41
|
+
fail TypeError, t('committed.error.prerequisites.string_or_nil',
|
42
|
+
variable: 'committed_output_text_path') unless
|
43
|
+
fetch(:committed_output_text_path).is_a?(String) ||
|
44
|
+
fetch(:committed_output_text_path).nil?
|
45
|
+
|
36
46
|
fail TypeError, t('committed.error.prerequisites.string_or_nil',
|
37
|
-
variable: '
|
38
|
-
fetch(:
|
39
|
-
fetch(:
|
47
|
+
variable: 'committed_output_html_path') unless
|
48
|
+
fetch(:committed_output_html_path).is_a?(String) ||
|
49
|
+
fetch(:committed_output_html_path).nil?
|
40
50
|
|
41
51
|
fail TypeError, t('committed.error.prerequisites.string_or_regexp_or_nil',
|
42
52
|
variable: 'committed_issue_match') unless
|
@@ -88,17 +98,30 @@ namespace :committed do
|
|
88
98
|
invoke 'committed:check_prerequisites'
|
89
99
|
invoke 'committed:check_report_prerequisites'
|
90
100
|
|
101
|
+
::Capistrano::Committed.import_settings({
|
102
|
+
branch: fetch(:branch),
|
103
|
+
user: fetch(:committed_user),
|
104
|
+
repo: fetch(:committed_repo),
|
105
|
+
revision_line: fetch(:committed_revision_line),
|
106
|
+
github_config: fetch(:committed_github_config),
|
107
|
+
revision_limit: fetch(:committed_revision_limit),
|
108
|
+
commit_buffer: fetch(:committed_commit_buffer),
|
109
|
+
output_text_path: fetch(:committed_output_text_path),
|
110
|
+
output_html_path: fetch(:committed_output_html_path),
|
111
|
+
issue_match: fetch(:committed_issue_match),
|
112
|
+
issue_postprocess: fetch(:committed_issue_postprocess),
|
113
|
+
issue_url: fetch(:committed_issue_url),
|
114
|
+
deployments: fetch(:committed_deployments),
|
115
|
+
deployment_id: fetch(:committed_deployment_id)
|
116
|
+
})
|
117
|
+
|
91
118
|
# Only do this on the primary web server
|
92
119
|
on primary :web do
|
93
120
|
# Get the Capistrano revision log
|
94
121
|
lines = capture(:cat, revision_log).split("\n").reverse
|
95
122
|
|
96
|
-
# Build the regex to search for revision data in the log, by default this
|
97
|
-
# is the localised string from Capistrano
|
98
|
-
search = ::Capistrano::Committed.revision_search_regex(fetch(:committed_revision_line))
|
99
|
-
|
100
123
|
# Build the revisions hash
|
101
|
-
revisions = ::Capistrano::Committed.get_revisions_from_lines(lines
|
124
|
+
revisions = ::Capistrano::Committed.get_revisions_from_lines(lines)
|
102
125
|
|
103
126
|
# No revisions, no log
|
104
127
|
if revisions.empty?
|
@@ -112,7 +135,7 @@ namespace :committed do
|
|
112
135
|
github = ::Capistrano::Committed::GithubApi.new(fetch(:committed_github_config))
|
113
136
|
|
114
137
|
# Get the actual date of the commit referenced to by the revision
|
115
|
-
revisions = ::Capistrano::Committed.add_dates_to_revisions(revisions, github
|
138
|
+
revisions = ::Capistrano::Committed.add_dates_to_revisions(revisions, github)
|
116
139
|
|
117
140
|
# Get the earliest revision date
|
118
141
|
earliest_date = ::Capistrano::Committed.get_earliest_date_from_revisions(revisions)
|
@@ -126,7 +149,7 @@ namespace :committed do
|
|
126
149
|
end
|
127
150
|
|
128
151
|
# Go back an extra N days
|
129
|
-
earliest_date = ::Capistrano::Committed.add_buffer_to_time(earliest_date
|
152
|
+
earliest_date = ::Capistrano::Committed.add_buffer_to_time(earliest_date)
|
130
153
|
revisions[:previous][:date] = earliest_date
|
131
154
|
|
132
155
|
# Get all the commits on this branch
|
@@ -175,10 +198,17 @@ namespace :committed do
|
|
175
198
|
|
176
199
|
# Push pull request data in to the revision entries hash
|
177
200
|
key = revisions.keys[revision_index]
|
201
|
+
sub_commits = []
|
202
|
+
pull_request[:commits].each do |c|
|
203
|
+
sub_commits << {
|
204
|
+
type: :commit,
|
205
|
+
info: c
|
206
|
+
}
|
207
|
+
end
|
178
208
|
revisions[key][:entries][pull_request[:info][:merged_at]] = [{
|
179
209
|
type: :pull_request,
|
180
210
|
info: pull_request[:info],
|
181
|
-
commits:
|
211
|
+
commits: sub_commits
|
182
212
|
}]
|
183
213
|
|
184
214
|
# Delete commits which are in this pull request from the hash of commits
|
@@ -210,100 +240,38 @@ namespace :committed do
|
|
210
240
|
}
|
211
241
|
end
|
212
242
|
|
213
|
-
#
|
214
|
-
output = []
|
215
|
-
revisions.each do |release, revision|
|
216
|
-
# Build the revision header
|
217
|
-
output += ::Capistrano::Committed.format_revision_header(release,
|
218
|
-
revision)
|
219
|
-
|
220
|
-
# Loop through the entries in this revision
|
221
|
-
items = Hash[revision[:entries].sort_by { |date, _entries| date }.reverse]
|
222
|
-
items.each do |_date, entries|
|
223
|
-
entries.each do |entry|
|
224
|
-
case entry[:type]
|
225
|
-
when :pull_request
|
226
|
-
# These are pull requests that are included in this revision
|
227
|
-
|
228
|
-
# Print out the pull request number and title
|
229
|
-
output << format(' * %s',
|
230
|
-
t('committed.output.pull_request_number',
|
231
|
-
number: entry[:info][:number]))
|
232
|
-
output << format(' %s', entry[:info][:title])
|
233
|
-
output << ''
|
234
|
-
|
235
|
-
# Print out each line of the pull request description
|
236
|
-
lines = entry[:info][:body].chomp.split("\n")
|
237
|
-
unless lines.empty?
|
238
|
-
output << format(' %s', lines.join("\n "))
|
239
|
-
output << ''
|
240
|
-
end
|
241
|
-
|
242
|
-
# Get any issue numbers referred to in the commit info and print
|
243
|
-
# links to them
|
244
|
-
urls = ::Capistrano::Committed.get_issue_urls(fetch(:committed_issue_match),
|
245
|
-
fetch(:committed_issue_postprocess),
|
246
|
-
fetch(:committed_issue_url),
|
247
|
-
entry[:info][:title] + entry[:info][:body])
|
248
|
-
output += ::Capistrano::Committed.format_issue_urls(urls)
|
249
|
-
|
250
|
-
# Merger details
|
251
|
-
output << format(' %s',
|
252
|
-
t('committed.output.merged_on',
|
253
|
-
time: entry[:info][:merged_at]))
|
254
|
-
output << format(' %s',
|
255
|
-
t('committed.output.merged_by',
|
256
|
-
login: entry[:info][:merged_by][:login]))
|
257
|
-
output << ''
|
258
|
-
|
259
|
-
# Print a link to the pull request on GitHub
|
260
|
-
output << format(' %s', entry[:info][:html_url])
|
261
|
-
output << ''
|
262
|
-
|
263
|
-
# Loop through the commits in this pull request
|
264
|
-
unless entry[:commits].nil?
|
265
|
-
entry[:commits].each do |commit|
|
266
|
-
output << (' ' + ('-' * 90))
|
267
|
-
output << ' |'
|
268
|
-
output += ::Capistrano::Committed.format_commit(commit,
|
269
|
-
' |',
|
270
|
-
fetch(:committed_issue_match),
|
271
|
-
fetch(:committed_issue_postprocess),
|
272
|
-
fetch(:committed_issue_url))
|
273
|
-
end
|
274
|
-
output << (' ' + ('-' * 90))
|
275
|
-
output << ''
|
276
|
-
end
|
277
|
-
|
278
|
-
when :commit
|
279
|
-
# These are commits that are included in this revision, but are
|
280
|
-
# not in any pull requests
|
281
|
-
output += ::Capistrano::Committed.format_commit(entry[:info],
|
282
|
-
'',
|
283
|
-
fetch(:committed_issue_match),
|
284
|
-
fetch(:committed_issue_postprocess),
|
285
|
-
fetch(:committed_issue_url))
|
286
|
-
end
|
287
|
-
|
288
|
-
output << ('-' * 94)
|
289
|
-
output << ''
|
290
|
-
end
|
291
|
-
end
|
243
|
+
# Send the text output to screen, or to a file on the server
|
292
244
|
|
293
|
-
|
294
|
-
|
245
|
+
# Create the mustache instance and plug in the revisions
|
246
|
+
output = ::Capistrano::Committed::Output.new()
|
247
|
+
output[:revisions] = revisions.values
|
248
|
+
output[:page_title] = t('committed.output.page_title',
|
249
|
+
repo: format('%s/%s', fetch(:committed_user), fetch(:committed_repo)))
|
295
250
|
|
296
|
-
# Send the output to
|
297
|
-
if fetch(:
|
251
|
+
# Send the text output to a file on the server
|
252
|
+
if fetch(:committed_output_text_path).nil?
|
298
253
|
# Just print to STDOUT
|
299
|
-
puts output
|
254
|
+
puts output.render
|
300
255
|
else
|
301
256
|
# Determine the output path and upload the output there
|
302
|
-
|
303
|
-
upload! StringIO.new(output.
|
257
|
+
output_text_path = format(fetch(:committed_output_text_path), current_path)
|
258
|
+
upload! StringIO.new(output.render), output_text_path
|
259
|
+
|
260
|
+
# Make sure the report is world readable
|
261
|
+
execute(:chmod, 'a+r', output_text_path)
|
262
|
+
end
|
263
|
+
|
264
|
+
# Send the html output to a file on the server
|
265
|
+
unless fetch(:committed_output_html_path).nil?
|
266
|
+
# Switch to the HTML template
|
267
|
+
output.template_file = output.get_output_template_path('html')
|
268
|
+
|
269
|
+
# Determine the output path and upload the output there
|
270
|
+
output_html_path = format(fetch(:committed_output_html_path), current_path)
|
271
|
+
upload! StringIO.new(output.render), output_html_path
|
304
272
|
|
305
273
|
# Make sure the report is world readable
|
306
|
-
execute(:chmod, 'a+r',
|
274
|
+
execute(:chmod, 'a+r', output_html_path)
|
307
275
|
end
|
308
276
|
end
|
309
277
|
end
|
@@ -319,7 +287,8 @@ namespace :load do
|
|
319
287
|
set :committed_github_config, -> { {} }
|
320
288
|
set :committed_revision_limit, -> { 10 }
|
321
289
|
set :committed_commit_buffer, -> { 1 }
|
322
|
-
set :
|
290
|
+
set :committed_output_text_path, -> { '%s/public/committed.txt' }
|
291
|
+
set :committed_output_html_path, -> { '%s/public/committed.html' }
|
323
292
|
set :committed_issue_match, -> { '\[\s?([a-zA-Z0-9]+\-[0-9]+)\s?\]' }
|
324
293
|
set :committed_issue_postprocess, -> { [] }
|
325
294
|
set :committed_issue_url, -> { 'https://example.jira.com/browse/%s' }
|
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.8
|
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-05-
|
11
|
+
date: 2016-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.13.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mustache
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,6 +120,9 @@ files:
|
|
106
120
|
- lib/capistrano/committed.rb
|
107
121
|
- lib/capistrano/committed/github_api.rb
|
108
122
|
- lib/capistrano/committed/i18n.rb
|
123
|
+
- lib/capistrano/committed/output.rb
|
124
|
+
- lib/capistrano/committed/output/output_html.mustache
|
125
|
+
- lib/capistrano/committed/output/output_txt.mustache
|
109
126
|
- lib/capistrano/committed/version.rb
|
110
127
|
- lib/capistrano/tasks/committed.rake
|
111
128
|
homepage: https://github.com/sambauers/capistrano-committed
|