fastlane-plugin-semantic_release 1.8.0 → 1.12.0
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.
- checksums.yaml +4 -4
- data/lib/fastlane/plugin/semantic_release/actions/analyze_commits.rb +83 -15
- data/lib/fastlane/plugin/semantic_release/actions/conventional_changelog.rb +19 -3
- data/lib/fastlane/plugin/semantic_release/helper/semantic_release_helper.rb +14 -7
- data/lib/fastlane/plugin/semantic_release/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 801ae7e90c09769c435f3aa1640323338ff7b343d3005427208f371f2cd06711
|
4
|
+
data.tar.gz: '0790c9a548fd4d4bd59409bf659b488af3db65cfb098683dac62658b36b866c4'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8527660760ffa383de7ff51baa708323da17ed33a7d601becc88375f4ad789ee6d4b99970995b42ae010a6a8f976b661fd53c22dd522bef8d0df30d3fc091bd
|
7
|
+
data.tar.gz: 6935fab5c02ffa2cb63d6d5fde4a7012e4abd800263059265c75c2f29155d179af8a960e11ebb146a329cc6c7af44ae52dc8718da04ba1b7309a566fc80767c8
|
@@ -13,13 +13,14 @@ module Fastlane
|
|
13
13
|
RELEASE_NEXT_PATCH_VERSION = :RELEASE_NEXT_PATCH_VERSION
|
14
14
|
RELEASE_NEXT_VERSION = :RELEASE_NEXT_VERSION
|
15
15
|
RELEASE_LAST_INCOMPATIBLE_CODEPUSH_VERSION = :RELEASE_LAST_INCOMPATIBLE_CODEPUSH_VERSION
|
16
|
+
CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN = :CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN
|
16
17
|
end
|
17
18
|
|
18
19
|
class AnalyzeCommitsAction < Action
|
19
20
|
def self.get_last_tag(params)
|
20
21
|
# Try to find the tag
|
21
22
|
command = "git describe --tags --match=#{params[:match]}"
|
22
|
-
Actions.sh(command, log:
|
23
|
+
Actions.sh(command, log: params[:debug])
|
23
24
|
rescue
|
24
25
|
UI.message("Tag was not found for match pattern - #{params[:match]}")
|
25
26
|
''
|
@@ -27,11 +28,15 @@ module Fastlane
|
|
27
28
|
|
28
29
|
def self.get_last_tag_hash(params)
|
29
30
|
command = "git rev-list -n 1 refs/tags/#{params[:tag_name]}"
|
30
|
-
Actions.sh(command, log:
|
31
|
+
Actions.sh(command, log: params[:debug]).chomp
|
31
32
|
end
|
32
33
|
|
33
34
|
def self.get_commits_from_hash(params)
|
34
|
-
commits = Helper::SemanticReleaseHelper.git_log(
|
35
|
+
commits = Helper::SemanticReleaseHelper.git_log(
|
36
|
+
pretty: '%s|%b|>',
|
37
|
+
start: params[:hash],
|
38
|
+
debug: params[:debug]
|
39
|
+
)
|
35
40
|
commits.split("|>")
|
36
41
|
end
|
37
42
|
|
@@ -42,16 +47,19 @@ module Fastlane
|
|
42
47
|
# Default last version
|
43
48
|
version = '0.0.0'
|
44
49
|
|
45
|
-
tag = get_last_tag(
|
50
|
+
tag = get_last_tag(
|
51
|
+
match: params[:match],
|
52
|
+
debug: params[:debug]
|
53
|
+
)
|
46
54
|
|
47
55
|
if tag.empty?
|
48
56
|
UI.message("First commit of the branch is taken as a begining of next release")
|
49
57
|
# If there is no tag found we taking the first commit of current branch
|
50
|
-
hash = Actions.sh('git rev-list --max-parents=0 HEAD', log:
|
58
|
+
hash = Actions.sh('git rev-list --max-parents=0 HEAD', log: params[:debug]).chomp
|
51
59
|
else
|
52
60
|
# Tag's format is v2.3.4-5-g7685948
|
53
61
|
# See git describe man page for more info
|
54
|
-
tag_name = tag.split('-')[0].strip
|
62
|
+
tag_name = tag.split('-')[0...-2].join('-').strip
|
55
63
|
parsed_version = tag_name.match(params[:tag_version_match])
|
56
64
|
|
57
65
|
if parsed_version.nil?
|
@@ -60,7 +68,10 @@ module Fastlane
|
|
60
68
|
|
61
69
|
version = parsed_version[0]
|
62
70
|
# Get a hash of last version tag
|
63
|
-
hash = get_last_tag_hash(
|
71
|
+
hash = get_last_tag_hash(
|
72
|
+
tag_name: tag_name,
|
73
|
+
debug: params[:debug]
|
74
|
+
)
|
64
75
|
|
65
76
|
UI.message("Found a tag #{tag_name} associated with version #{version}")
|
66
77
|
end
|
@@ -71,18 +82,25 @@ module Fastlane
|
|
71
82
|
next_patch = (version.split('.')[2] || 0).to_i
|
72
83
|
|
73
84
|
# Get commits log between last version and head
|
74
|
-
splitted = get_commits_from_hash(
|
85
|
+
splitted = get_commits_from_hash(
|
86
|
+
hash: hash,
|
87
|
+
debug: params[:debug]
|
88
|
+
)
|
75
89
|
|
76
90
|
UI.message("Found #{splitted.length} commits since last release")
|
77
91
|
releases = params[:releases]
|
78
92
|
|
93
|
+
format_pattern = lane_context[SharedValues::CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN]
|
79
94
|
splitted.each do |line|
|
95
|
+
parts = line.split("|")
|
96
|
+
subject = parts[0].strip
|
80
97
|
# conventional commits are in format
|
81
98
|
# type: subject (fix: app crash - for example)
|
82
99
|
commit = Helper::SemanticReleaseHelper.parse_commit(
|
83
|
-
commit_subject:
|
84
|
-
commit_body:
|
85
|
-
releases: releases
|
100
|
+
commit_subject: subject,
|
101
|
+
commit_body: parts[1],
|
102
|
+
releases: releases,
|
103
|
+
pattern: format_pattern
|
86
104
|
)
|
87
105
|
|
88
106
|
unless commit[:scope].nil?
|
@@ -105,7 +123,7 @@ module Fastlane
|
|
105
123
|
end
|
106
124
|
|
107
125
|
next_version = "#{next_major}.#{next_minor}.#{next_patch}"
|
108
|
-
UI.message("#{next_version}: #{
|
126
|
+
UI.message("#{next_version}: #{subject}") if params[:show_version_path]
|
109
127
|
end
|
110
128
|
|
111
129
|
next_version = "#{next_major}.#{next_minor}.#{next_patch}"
|
@@ -130,18 +148,31 @@ module Fastlane
|
|
130
148
|
end
|
131
149
|
|
132
150
|
def self.is_codepush_friendly(params)
|
151
|
+
git_command = 'git rev-list --max-parents=0 HEAD'
|
133
152
|
# Begining of the branch is taken for codepush analysis
|
134
|
-
|
153
|
+
hash_lines = Actions.sh("#{git_command} | wc -l", log: params[:debug]).chomp
|
154
|
+
hash = Actions.sh(git_command, log: params[:debug]).chomp
|
135
155
|
next_major = 0
|
136
156
|
next_minor = 0
|
137
157
|
next_patch = 0
|
138
158
|
last_incompatible_codepush_version = '0.0.0'
|
139
159
|
|
160
|
+
if hash_lines.to_i > 1
|
161
|
+
UI.error("#{git_command} resulted to more than 1 hash")
|
162
|
+
UI.error('This usualy happens when you pull only part of a git history. Check out how you pull the repo! "git fetch" should be enough.')
|
163
|
+
Actions.sh(git_command, log: true).chomp
|
164
|
+
return false
|
165
|
+
end
|
166
|
+
|
140
167
|
# Get commits log between last version and head
|
141
|
-
splitted = get_commits_from_hash(
|
168
|
+
splitted = get_commits_from_hash(
|
169
|
+
hash: hash,
|
170
|
+
debug: params[:debug]
|
171
|
+
)
|
142
172
|
releases = params[:releases]
|
143
173
|
codepush_friendly = params[:codepush_friendly]
|
144
174
|
|
175
|
+
format_pattern = lane_context[SharedValues::CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN]
|
145
176
|
splitted.each do |line|
|
146
177
|
# conventional commits are in format
|
147
178
|
# type: subject (fix: app crash - for example)
|
@@ -149,6 +180,7 @@ module Fastlane
|
|
149
180
|
commit_subject: line.split("|")[0],
|
150
181
|
commit_body: line.split("|")[1],
|
151
182
|
releases: releases,
|
183
|
+
pattern: format_pattern,
|
152
184
|
codepush_friendly: codepush_friendly
|
153
185
|
)
|
154
186
|
|
@@ -202,6 +234,27 @@ module Fastlane
|
|
202
234
|
UI.user_error!("No match for analyze_commits action given, pass using `match: 'expr'`") unless value && !value.empty?
|
203
235
|
end
|
204
236
|
),
|
237
|
+
FastlaneCore::ConfigItem.new(
|
238
|
+
key: :commit_format,
|
239
|
+
description: "The commit format to apply. Presets are 'default' or 'angular', or you can provide your own Regexp. Note: the supplied regex _must_ have 4 capture groups, in order: type, scope, has_exclamation_mark, and subject",
|
240
|
+
default_value: "default",
|
241
|
+
is_string: false,
|
242
|
+
verify_block: proc do |value|
|
243
|
+
case value
|
244
|
+
when String
|
245
|
+
unless Helper::SemanticReleaseHelper.format_patterns.key?(value)
|
246
|
+
UI.user_error!("Invalid format preset: #{value}")
|
247
|
+
end
|
248
|
+
|
249
|
+
pattern = Helper::SemanticReleaseHelper.format_patterns[value]
|
250
|
+
when Regexp
|
251
|
+
pattern = value
|
252
|
+
else
|
253
|
+
UI.user_error!("Invalid option type: #{value.inspect}")
|
254
|
+
end
|
255
|
+
Actions.lane_context[SharedValues::CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN] = pattern
|
256
|
+
end
|
257
|
+
),
|
205
258
|
FastlaneCore::ConfigItem.new(
|
206
259
|
key: :releases,
|
207
260
|
description: "Map types of commit to release (major, minor, patch)",
|
@@ -226,6 +279,20 @@ module Fastlane
|
|
226
279
|
default_value: [],
|
227
280
|
type: Array,
|
228
281
|
optional: true
|
282
|
+
),
|
283
|
+
FastlaneCore::ConfigItem.new(
|
284
|
+
key: :show_version_path,
|
285
|
+
description: "True if you want to print out the version calculated for each commit",
|
286
|
+
default_value: true,
|
287
|
+
type: Boolean,
|
288
|
+
optional: true
|
289
|
+
),
|
290
|
+
FastlaneCore::ConfigItem.new(
|
291
|
+
key: :debug,
|
292
|
+
description: "True if you want to log out a debug info",
|
293
|
+
default_value: false,
|
294
|
+
type: Boolean,
|
295
|
+
optional: true
|
229
296
|
)
|
230
297
|
]
|
231
298
|
end
|
@@ -242,7 +309,8 @@ module Fastlane
|
|
242
309
|
['RELEASE_NEXT_MINOR_VERSION', 'Minor number of the next version'],
|
243
310
|
['RELEASE_NEXT_PATCH_VERSION', 'Patch number of the next version'],
|
244
311
|
['RELEASE_NEXT_VERSION', 'Next version string in format (major.minor.patch)'],
|
245
|
-
['RELEASE_LAST_INCOMPATIBLE_CODEPUSH_VERSION', 'Last commit without codepush']
|
312
|
+
['RELEASE_LAST_INCOMPATIBLE_CODEPUSH_VERSION', 'Last commit without codepush'],
|
313
|
+
['CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN', 'The format pattern Regexp used to match commits (mainly for internal use)']
|
246
314
|
]
|
247
315
|
end
|
248
316
|
|
@@ -8,7 +8,11 @@ module Fastlane
|
|
8
8
|
|
9
9
|
class ConventionalChangelogAction < Action
|
10
10
|
def self.get_commits_from_hash(params)
|
11
|
-
commits = Helper::SemanticReleaseHelper.git_log(
|
11
|
+
commits = Helper::SemanticReleaseHelper.git_log(
|
12
|
+
pretty: '%s|%b|%H|%h|%an|%at|>',
|
13
|
+
start: params[:hash],
|
14
|
+
debug: params[:debug]
|
15
|
+
)
|
12
16
|
commits.split("|>")
|
13
17
|
end
|
14
18
|
|
@@ -27,7 +31,10 @@ module Fastlane
|
|
27
31
|
version = lane_context[SharedValues::RELEASE_NEXT_VERSION]
|
28
32
|
|
29
33
|
# Get commits log between last version and head
|
30
|
-
commits = get_commits_from_hash(
|
34
|
+
commits = get_commits_from_hash(
|
35
|
+
hash: last_tag_hash,
|
36
|
+
debug: params[:debug]
|
37
|
+
)
|
31
38
|
parsed = parse_commits(commits)
|
32
39
|
|
33
40
|
commit_url = params[:commit_url]
|
@@ -168,12 +175,14 @@ module Fastlane
|
|
168
175
|
def self.parse_commits(commits)
|
169
176
|
parsed = []
|
170
177
|
# %s|%b|%H|%h|%an|%at
|
178
|
+
format_pattern = lane_context[SharedValues::CONVENTIONAL_CHANGELOG_ACTION_FORMAT_PATTERN]
|
171
179
|
commits.each do |line|
|
172
180
|
splitted = line.split("|")
|
173
181
|
|
174
182
|
commit = Helper::SemanticReleaseHelper.parse_commit(
|
175
183
|
commit_subject: splitted[0],
|
176
|
-
commit_body: splitted[1]
|
184
|
+
commit_body: splitted[1],
|
185
|
+
pattern: format_pattern
|
177
186
|
)
|
178
187
|
|
179
188
|
commit[:hash] = splitted[2]
|
@@ -263,6 +272,13 @@ module Fastlane
|
|
263
272
|
default_value: true,
|
264
273
|
type: Boolean,
|
265
274
|
optional: true
|
275
|
+
),
|
276
|
+
FastlaneCore::ConfigItem.new(
|
277
|
+
key: :debug,
|
278
|
+
description: "True if you want to log out a debug info",
|
279
|
+
default_value: false,
|
280
|
+
type: Boolean,
|
281
|
+
optional: true
|
266
282
|
)
|
267
283
|
]
|
268
284
|
end
|
@@ -5,12 +5,19 @@ module Fastlane
|
|
5
5
|
|
6
6
|
module Helper
|
7
7
|
class SemanticReleaseHelper
|
8
|
+
def self.format_patterns
|
9
|
+
return {
|
10
|
+
"default" => /^(docs|fix|feat|chore|style|refactor|perf|test)(?:\((.*)\))?(!?)\: (.*)/,
|
11
|
+
"angular" => /^(\w*)(?:\((.*)\))?(): (.*)/
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
8
15
|
# class methods that you define here become available in your action
|
9
16
|
# as `Helper::SemanticReleaseHelper.your_method`
|
10
17
|
#
|
11
|
-
def self.git_log(
|
12
|
-
command = "git log --pretty='#{pretty}' --reverse #{start}..HEAD"
|
13
|
-
Actions.sh(command, log:
|
18
|
+
def self.git_log(params)
|
19
|
+
command = "git log --pretty='#{params[:pretty]}' --reverse #{params[:start]}..HEAD"
|
20
|
+
Actions.sh(command, log: params[:debug]).chomp
|
14
21
|
end
|
15
22
|
|
16
23
|
def self.parse_commit(params)
|
@@ -18,7 +25,7 @@ module Fastlane
|
|
18
25
|
commit_body = params[:commit_body]
|
19
26
|
releases = params[:releases]
|
20
27
|
codepush_friendly = params[:codepush_friendly]
|
21
|
-
pattern =
|
28
|
+
pattern = params[:pattern]
|
22
29
|
breaking_change_pattern = /BREAKING CHANGES?: (.*)/
|
23
30
|
codepush_pattern = /codepush?: (.*)/
|
24
31
|
|
@@ -32,13 +39,13 @@ module Fastlane
|
|
32
39
|
|
33
40
|
unless matched.nil?
|
34
41
|
type = matched[1]
|
35
|
-
scope = matched[
|
42
|
+
scope = matched[2]
|
36
43
|
|
37
44
|
result[:is_valid] = true
|
38
45
|
result[:type] = type
|
39
46
|
result[:scope] = scope
|
40
|
-
result[:has_exclamation_mark] = matched[
|
41
|
-
result[:subject] = matched[
|
47
|
+
result[:has_exclamation_mark] = matched[3] == '!'
|
48
|
+
result[:subject] = matched[4]
|
42
49
|
|
43
50
|
unless releases.nil?
|
44
51
|
result[:release] = releases[type.to_sym]
|
@@ -1 +1 @@
|
|
1
|
-
module Fastlane module SemanticRelease VERSION = "1.
|
1
|
+
module Fastlane module SemanticRelease VERSION = "1.12.0" end end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-semantic_release
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jiří Otáhal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|