fastlane-plugin-wpmreleasetoolkit 9.0.1 → 9.1.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.
Files changed (25) hide show
  1. checksums.yaml +4 -4
  2. data/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/copy_branch_protection_action.rb +80 -0
  3. data/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/{removebranchprotection_action.rb → remove_branch_protection_action.rb} +24 -17
  4. data/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/set_branch_protection_action.rb +153 -0
  5. data/lib/fastlane/plugin/wpmreleasetoolkit/helper/github_helper.rb +49 -4
  6. data/lib/fastlane/plugin/wpmreleasetoolkit/models/app_version.rb +36 -0
  7. data/lib/fastlane/plugin/wpmreleasetoolkit/models/build_code.rb +27 -0
  8. data/lib/fastlane/plugin/wpmreleasetoolkit/version.rb +1 -1
  9. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/abstract_version_calculator.rb +85 -0
  10. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/date_build_code_calculator.rb +32 -0
  11. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/date_version_calculator.rb +37 -0
  12. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/marketing_version_calculator.rb +26 -0
  13. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/semantic_version_calculator.rb +21 -0
  14. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/simple_build_code_calculator.rb +22 -0
  15. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/files/android_version_file.rb +76 -0
  16. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/files/ios_version_file.rb +64 -0
  17. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/abstract_version_formatter.rb +27 -0
  18. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/derived_build_code_formatter.rb +33 -0
  19. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/four_part_build_code_formatter.rb +22 -0
  20. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/four_part_version_formatter.rb +35 -0
  21. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/rc_notation_version_formatter.rb +65 -0
  22. data/lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/simple_build_code_formatter.rb +20 -0
  23. data/lib/fastlane/plugin/wpmreleasetoolkit.rb +1 -1
  24. metadata +35 -4
  25. data/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/setbranchprotection_action.rb +0 -63
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 982e123d25f4bc8ee55dfc605e8e6873c0365d4d75f4eabce7884a4de01649e4
4
- data.tar.gz: 462ba969f7790d6aabf6201e5bae1e4df4ac0512c8ef42955247a3319e891827
3
+ metadata.gz: e26f9a48b802c79f4ac19eafc0f3da18b717202ab42d01ca2b2735df4b4abd5d
4
+ data.tar.gz: ee567a664e7831629f4a0886fc574eec192ef214c47468211a99aa679e98685b
5
5
  SHA512:
6
- metadata.gz: 10433f33f1af9890023113464a26c5ff5ed29df4388f11248d6afb5cd85bc83622d4511c4f8e4279cde75fbcaa0605f6487aee6267042fcdd897c3a0036404f6
7
- data.tar.gz: ce0e3fc971589f2f5a750c23e2acf78ae4bba2637d133717d361ee3bc5778e6f37b5d3f1f2455c9a9024454e7f443d3ce27b5c034eea41de61aed72e422532ab
6
+ metadata.gz: 993ef98974907a12d687e1558f9134038bf9e746a24c98e35dec4d230c87971e3342cd485d398b80076a20d03626ae4bf3b4c8b09f8f4fed316fc4ec7dcd0f8c
7
+ data.tar.gz: 3c6bebdb6b77966315088ea774e9a9275035b35abf87fcbf53b3ddfdadcdbd604c59a3ea2fe0d63082a6e572ead59e96cef851c0ec3c8d6187ed6f36326fb6e4
@@ -0,0 +1,80 @@
1
+ require 'fastlane/action'
2
+ require_relative '../../helper/github_helper'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class CopyBranchProtectionAction < Action
7
+ def self.run(params)
8
+ repository = params[:repository]
9
+ from_branch = params[:from_branch]
10
+ to_branch = params[:to_branch]
11
+
12
+ github_helper = Fastlane::Helper::GithubHelper.new(github_token: params[:github_token])
13
+
14
+ response = begin
15
+ github_helper.get_branch_protection(
16
+ repository: repository,
17
+ branch: from_branch
18
+ )
19
+ rescue Octokit::NotFound
20
+ UI.user_error!("Branch `#{from_branch}` of repository `#{repository}` was not found.")
21
+ end
22
+ UI.user_error!("Branch `#{from_branch}` does not have any branch protection set up.") if response.nil?
23
+ settings = Fastlane::Helper::GithubHelper.branch_protection_api_response_to_normalized_hash(response)
24
+
25
+ response = begin
26
+ github_helper.set_branch_protection(
27
+ repository: repository,
28
+ branch: to_branch,
29
+ **settings
30
+ )
31
+ rescue Octokit::NotFound
32
+ UI.user_error!("Branch `#{to_branch}` of repository `#{repository}` was not found.")
33
+ end
34
+
35
+ Fastlane::Helper::GithubHelper.branch_protection_api_response_to_normalized_hash(response)
36
+ end
37
+
38
+ def self.description
39
+ 'Copies the branch protection settings of one branch onto another branch'
40
+ end
41
+
42
+ def self.details
43
+ description
44
+ end
45
+
46
+ def self.return_value
47
+ 'The hash corresponding to the response returned by the API request, and containing the applied protection settings'
48
+ end
49
+
50
+ def self.available_options
51
+ [
52
+ FastlaneCore::ConfigItem.new(key: :repository,
53
+ env_name: 'GHHELPER_REPOSITORY',
54
+ description: 'The remote path of the GH repository on which we work',
55
+ optional: false,
56
+ type: String),
57
+ FastlaneCore::ConfigItem.new(key: :from_branch,
58
+ env_name: 'GHHELPER_FROM_BRANCH',
59
+ description: 'The branch to copy the protection settings from',
60
+ optional: false,
61
+ type: String),
62
+ FastlaneCore::ConfigItem.new(key: :to_branch,
63
+ env_name: 'GHHELPER_TO_BRANCH',
64
+ description: 'The branch to copy the protection settings to',
65
+ optional: false,
66
+ type: String),
67
+ Fastlane::Helper::GithubHelper.github_token_config_item,
68
+ ]
69
+ end
70
+
71
+ def self.authors
72
+ ['Automattic']
73
+ end
74
+
75
+ def self.is_supported?(platform)
76
+ true
77
+ end
78
+ end
79
+ end
80
+ end
@@ -3,42 +3,34 @@ require_relative '../../helper/github_helper'
3
3
 
4
4
  module Fastlane
5
5
  module Actions
6
- class RemovebranchprotectionAction < Action
6
+ class RemoveBranchProtectionAction < Action
7
7
  def self.run(params)
8
8
  repository = params[:repository]
9
9
  branch_name = params[:branch]
10
10
 
11
- branch_url = "https://api.github.com/repos/#{repository}/branches/#{branch_name}"
12
- restrictions = { url: "#{branch_url}/protection/restrictions", users_url: "#{branch_url}/protection/restrictions/users", teams_url: "#{branch_url}/protection/restrictions/teams", users: [], teams: [] }
13
- required_pull_request_reviews = { url: "#{branch_url}/protection/required_pull_request_reviews", dismiss_stale_reviews: false, require_code_owner_reviews: false }
14
-
15
11
  github_helper = Fastlane::Helper::GithubHelper.new(github_token: params[:github_token])
16
12
  github_helper.remove_branch_protection(
17
13
  repository: repository,
18
- branch: branch_name,
19
- restrictions: restrictions,
20
- enforce_admins: nil,
21
- required_pull_request_reviews: required_pull_request_reviews
14
+ branch: branch_name
22
15
  )
16
+ rescue Octokit::NotFound
17
+ UI.user_error!("Branch `#{branch_name}` of repository `#{repository}` was not found.")
18
+ rescue Octokit::BranchNotProtected
19
+ UI.message("Note: Branch `#{branch_name}` was not protected in the first place.")
23
20
  end
24
21
 
25
22
  def self.description
26
- "Removes the 'release branch' protection state for the specified branch"
23
+ 'Removes the protection settings for the specified branch'
27
24
  end
28
25
 
29
- def self.authors
30
- ['Automattic']
26
+ def self.details
27
+ description
31
28
  end
32
29
 
33
30
  def self.return_value
34
31
  # If your method provides a return value, you can describe here what it does
35
32
  end
36
33
 
37
- def self.details
38
- # Optional:
39
- "Sets the 'release branch' protection state for the specified branch"
40
- end
41
-
42
34
  def self.available_options
43
35
  [
44
36
  FastlaneCore::ConfigItem.new(key: :repository,
@@ -55,9 +47,24 @@ module Fastlane
55
47
  ]
56
48
  end
57
49
 
50
+ def self.authors
51
+ ['Automattic']
52
+ end
53
+
58
54
  def self.is_supported?(platform)
59
55
  true
60
56
  end
61
57
  end
58
+
59
+ # For backwards compatibility
60
+ class RemovebranchprotectionAction < RemoveBranchProtectionAction
61
+ def self.category
62
+ :deprecated
63
+ end
64
+
65
+ def self.deprecated_notes
66
+ "This action has been renamed `#{superclass.action_name}`"
67
+ end
68
+ end
62
69
  end
63
70
  end
@@ -0,0 +1,153 @@
1
+ require 'fastlane/action'
2
+ require_relative '../../helper/github_helper'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class SetBranchProtectionAction < Action
7
+ def self.run(params)
8
+ repository = params[:repository]
9
+ branch_name = params[:branch]
10
+ github_helper = Fastlane::Helper::GithubHelper.new(github_token: params[:github_token])
11
+
12
+ settings = if params[:keep_existing_settings_unchanged]
13
+ Fastlane::Helper::GithubHelper.branch_protection_api_response_to_normalized_hash(
14
+ github_helper.get_branch_protection(repository: repository, branch: branch_name)
15
+ )
16
+ else
17
+ {}
18
+ end
19
+
20
+ # `required_status_checks` field — only override existing `checks` subfield if param provided
21
+ unless params[:required_ci_checks].nil?
22
+ if params[:required_ci_checks].empty?
23
+ settings[:required_status_checks] = nil # explicitly completely delete existing check requirement
24
+ else
25
+ settings[:required_status_checks] ||= { strict: false }
26
+ settings[:required_status_checks][:checks] = params[:required_ci_checks].map { |ctx| { context: ctx } }
27
+ end
28
+ end
29
+
30
+ # `enforce_admins` field — only override existing value if param provided
31
+ if params[:enforce_admins].nil?
32
+ settings[:enforce_admins] ||= nil # parameter is required to be provided, even if nil (aka false) value
33
+ else
34
+ settings[:enforce_admins] = params[:enforce_admins]
35
+ end
36
+
37
+ # `required_pull_request_reviews` field — only override `required_approving_review_count` subfield if param provided
38
+ settings[:required_pull_request_reviews] ||= {
39
+ dismiss_stale_reviews: false,
40
+ require_code_owner_reviews: false
41
+ }
42
+ unless params[:required_approving_review_count].nil?
43
+ settings[:required_pull_request_reviews][:required_approving_review_count] = params[:required_approving_review_count]
44
+ end
45
+
46
+ # `restrictions` field
47
+ settings[:restrictions] ||= { users: [], teams: [] }
48
+
49
+ # `allow_force_pushes` field — only override existing value if param provided
50
+ unless params[:allow_force_pushes].nil?
51
+ settings[:allow_force_pushes] = params[:allow_force_pushes]
52
+ end
53
+
54
+ # `lock_branch` field — only override existing value if param provided
55
+ unless params[:lock_branch].nil?
56
+ settings[:lock_branch] = params[:lock_branch]
57
+ end
58
+
59
+ # API Call - See https://docs.github.com/en/rest/branches/branch-protection#update-branch-protection
60
+ response = github_helper.set_branch_protection(
61
+ repository: repository,
62
+ branch: branch_name,
63
+ **settings
64
+ )
65
+
66
+ Fastlane::Helper::GithubHelper.branch_protection_api_response_to_normalized_hash(response)
67
+ rescue Octokit::NotFound => e
68
+ UI.user_error!("Branch `#{branch_name}` of repository `#{repository}` was not found.\n#{e.message}")
69
+ end
70
+
71
+ def self.description
72
+ 'Sets the protection state for the specified branch'
73
+ end
74
+
75
+ def self.details
76
+ description
77
+ end
78
+
79
+ def self.return_value
80
+ 'The hash corresponding to the response returned by the API request, and containing the applied protection settings'
81
+ end
82
+
83
+ def self.available_options
84
+ [
85
+ FastlaneCore::ConfigItem.new(key: :repository,
86
+ env_name: 'GHHELPER_REPOSITORY',
87
+ description: 'The slug of the GH repository on which we work',
88
+ optional: false,
89
+ type: String),
90
+ # NOTE: GitHub branch protection API doesn't allow wildcard characters for the branch parameter
91
+ FastlaneCore::ConfigItem.new(key: :branch,
92
+ env_name: 'GHHELPER_BRANCH',
93
+ description: 'The branch to protect',
94
+ optional: false,
95
+ type: String),
96
+ FastlaneCore::ConfigItem.new(key: :keep_existing_settings_unchanged,
97
+ description: 'If set to true, will only change the settings that are explicitly provided to the action, ' \
98
+ + 'while keeping the values of other existing protection settings (if any) unchanged. If false, it will ' \
99
+ + 'discard any existing branch protection setting if any before setting just the ones provided ' \
100
+ + '(and leaving the rest with default GitHub values)',
101
+ default_value: true,
102
+ type: Boolean),
103
+ FastlaneCore::ConfigItem.new(key: :required_ci_checks,
104
+ description: 'If provided, specifies the list of CI status checks to mark as required. If not provided (nil), will keep existing ones',
105
+ optional: true,
106
+ default_value: nil,
107
+ type: Array),
108
+ FastlaneCore::ConfigItem.new(key: :required_approving_review_count,
109
+ description: 'If not nil, change the number of approving reviews required to merge the PR. ' \
110
+ + 'Acceptable values are `nil` (do not change), 0 (disable) or a number between 1–6',
111
+ optional: true,
112
+ default_value: nil,
113
+ type: Integer),
114
+ FastlaneCore::ConfigItem.new(key: :enforce_admins,
115
+ description: 'If provided, will update the setting of whether admins can bypass restrictions (false) or not (true)',
116
+ optional: true,
117
+ default_value: nil,
118
+ type: Boolean),
119
+ FastlaneCore::ConfigItem.new(key: :allow_force_pushes,
120
+ description: 'If provided, will update the setting of whether to allow force pushes on the branch',
121
+ optional: true,
122
+ default_value: nil,
123
+ type: Boolean),
124
+ FastlaneCore::ConfigItem.new(key: :lock_branch,
125
+ description: 'If provided, will update the locked (aka readonly) state of the branch',
126
+ optional: true,
127
+ default_value: nil,
128
+ type: Boolean),
129
+ Fastlane::Helper::GithubHelper.github_token_config_item,
130
+ ]
131
+ end
132
+
133
+ def self.authors
134
+ ['Automattic']
135
+ end
136
+
137
+ def self.is_supported?(platform)
138
+ true
139
+ end
140
+ end
141
+
142
+ # For backwards compatibility
143
+ class SetbranchprotectionAction < SetBranchProtectionAction
144
+ def self.category
145
+ :deprecated
146
+ end
147
+
148
+ def self.deprecated_notes
149
+ "This action has been renamed `#{superclass.action_name}`"
150
+ end
151
+ end
152
+ end
153
+ end
@@ -244,11 +244,20 @@ module Fastlane
244
244
  #
245
245
  # @param [String] repository The repository name (including the organization)
246
246
  # @param [String] branch The branch name
247
- # @param [Hash] options A customizable set of options.
248
- # @see https://docs.github.com/en/rest/branches/branch-protection#update-branch-protection
247
+ # @see https://docs.github.com/en/rest/branches/branch-protection#delete-branch-protection
248
+ #
249
+ def remove_branch_protection(repository:, branch:)
250
+ client.unprotect_branch(repository, branch)
251
+ end
252
+
253
+ # Get the list of branch protection settings for a given branch of a repository
249
254
  #
250
- def remove_branch_protection(repository:, branch:, **options)
251
- client.unprotect_branch(repository, branch, options)
255
+ # @param [String] repository The repository name (including the organization)
256
+ # @param [String] branch The branch name
257
+ # @see https://docs.github.com/en/rest/branches/branch-protection#get-branch-protection
258
+ #
259
+ def get_branch_protection(repository:, branch:, **options)
260
+ client.branch_protection(repository, branch)
252
261
  end
253
262
 
254
263
  # Protects a single branch from a repository
@@ -262,6 +271,42 @@ module Fastlane
262
271
  client.protect_branch(repository, branch, options)
263
272
  end
264
273
 
274
+ # Convert a response from the `/branch-protection` API endpoint into a Hash
275
+ # suitable to be returned and/or reused to pass to a subsequent `/branch-protection` API request
276
+ # @param [Sawyer::Resource] response The API response returned by `#get_branch_protection` or `#set_branch_protection`
277
+ # @return [Hash] A hash representation of the API response—or an empty Hash if `response` was `nil`—
278
+ # with Boolean values normalized to true/false, and any extra values that would be refused
279
+ # if used in a subsequent API request (like legacy vs new key) removed.
280
+ # @see https://docs.github.com/en/rest/branches/branch-protection
281
+ #
282
+ def self.branch_protection_api_response_to_normalized_hash(response)
283
+ return {} if response.nil?
284
+
285
+ normalize_values = lambda do |hash|
286
+ hash.each do |k, v|
287
+ # Boolean values appear as { "enabled" => true/false } in the Response, while they must appear as true/false in Request
288
+ hash[k] = v[:enabled] if v.is_a?(Hash) && v.key?(:enabled)
289
+ # References to :users, :teams and :apps are expanded as Objects in the Response, while they must just be the login or slug in Request
290
+ hash[k] = v.map { |item| item[:login] } if k == :users && v.is_a?(Array)
291
+ hash[k] = v.map { |item| item[:slug] } if %i[teams apps].include?(k) && v.is_a?(Array)
292
+ # Response contains lots of `*url` keys that are useless in practice and makes the returned hash harder to parse visually
293
+ hash.delete(k) if k.to_s == 'url' || k.to_s.end_with?('_url')
294
+
295
+ # Recurse into Hashes and Array of Hashes
296
+ normalize_values.call(v) if v.is_a?(Hash)
297
+ v.each { |item| normalize_values.call(item) if item.is_a?(Hash) } if v.is_a?(Array)
298
+ end
299
+ end
300
+
301
+ hash = response.to_hash
302
+ normalize_values.call(hash)
303
+
304
+ # Response contains both (legacy) `:contexts` key and new `:checks` key, but only one of the two should be passed in Request
305
+ hash[:required_status_checks].delete(:contexts) unless hash.dig(:required_status_checks, :checks).nil?
306
+
307
+ hash
308
+ end
309
+
265
310
  # Creates a GithubToken Fastlane ConfigItem
266
311
  #
267
312
  # @return [FastlaneCore::ConfigItem] The Fastlane ConfigItem for GitHub OAuth access token
@@ -0,0 +1,36 @@
1
+ module Fastlane
2
+ module Models
3
+ # The AppVersion model represents a version of an app with major, minor, patch, and build number components.
4
+ class AppVersion
5
+ attr_accessor :major, :minor, :patch, :build_number
6
+
7
+ # Initializes a new AppVersion instance.
8
+ #
9
+ # @param [Integer] major The major version number.
10
+ # @param [Integer] minor The minor version number.
11
+ # @param [Integer] patch The patch version number.
12
+ # @param [Integer] build_number The build number.
13
+ #
14
+ def initialize(major, minor, patch = 0, build_number = 0)
15
+ # Validate that the major and minor version numbers are not nil
16
+ UI.user_error!('Major version cannot be nil') if major.nil?
17
+ UI.user_error!('Minor version cannot be nil') if minor.nil?
18
+
19
+ @major = major
20
+ @minor = minor
21
+ @patch = patch
22
+ @build_number = build_number
23
+ end
24
+
25
+ # Converts the AppVersion object to a string representation.
26
+ # This should only be used for internal debugging/testing purposes, not to write versions in version files
27
+ # In order to format an `AppVersion` into a `String`, you should use the appropriate `VersionFormatter` for your project instead.
28
+ #
29
+ # @return [String] a string in the format "major.minor.patch.build_number".
30
+ #
31
+ def to_s
32
+ "#{@major}.#{@minor}.#{@patch}.#{@build_number}"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ module Fastlane
2
+ module Models
3
+ # The `BuildCode` model represents a build code for an app. This could be the Version Code for an Android app or
4
+ # the VERSION_LONG/BUILD_NUMBER for an iOS/Mac app.
5
+ class BuildCode
6
+ attr_accessor :build_code
7
+
8
+ # Initializes a new BuildCode instance with the provided build code value.
9
+ #
10
+ # @param build_code [String] The build code value.
11
+ #
12
+ def initialize(build_code)
13
+ UI.user_error!('Build code cannot be nil') if build_code.nil?
14
+
15
+ @build_code = build_code
16
+ end
17
+
18
+ # Returns the build code as a string.
19
+ #
20
+ # @return [String] The build code represented as a string.
21
+ #
22
+ def to_s
23
+ @build_code.to_s
24
+ end
25
+ end
26
+ end
27
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Fastlane
4
4
  module Wpmreleasetoolkit
5
- VERSION = '9.0.1'
5
+ VERSION = '9.1.0'
6
6
  end
7
7
  end
@@ -0,0 +1,85 @@
1
+ module Fastlane
2
+ module Wpmreleasetoolkit
3
+ module Versioning
4
+ # The `AbstractVersionCalculator` class is responsible for performing version calculations and transformations. It can be used
5
+ # as a base class for version calculations that use different versioning schemes. It contains calculation and
6
+ # transformation methods that are shared by all platforms. It has the abstract suffix because it should not be
7
+ # instantiated directly.
8
+ class AbstractVersionCalculator
9
+ # This method increments the major version component and resets minor, patch, and build number
10
+ # components to zero.
11
+ #
12
+ # @param version [AppVersion] The version to calculate the next major version for.
13
+ #
14
+ # @return [AppVersion] The next major version.
15
+ #
16
+ def next_major_version(version:)
17
+ new_version = version.dup
18
+ new_version.major += 1
19
+ new_version.minor = 0
20
+ new_version.patch = 0
21
+ new_version.build_number = 0
22
+
23
+ new_version
24
+ end
25
+
26
+ # This method increments the minor version component and resets patch and build number components
27
+ # to zero.
28
+ #
29
+ # @param version [AppVersion] The version to calculate the next minor version for.
30
+ #
31
+ # @return [AppVersion] The next minor version.
32
+ #
33
+ def next_minor_version(version:)
34
+ new_version = version.dup
35
+ new_version.minor += 1
36
+ new_version.patch = 0
37
+ new_version.build_number = 0
38
+
39
+ new_version
40
+ end
41
+
42
+ # This method increments the patch version component and resets the build number component to zero.
43
+ #
44
+ # @param version [AppVersion] The version to calculate the next patch version for.
45
+ #
46
+ # @return [AppVersion] The next patch version.
47
+ #
48
+ def next_patch_version(version:)
49
+ new_version = version.dup
50
+ new_version.patch += 1
51
+ new_version.build_number = 0
52
+
53
+ new_version
54
+ end
55
+
56
+ # This method increments the build number component.
57
+ #
58
+ # @param version [AppVersion] The version to calculate the next build number for.
59
+ #
60
+ # @return [AppVersion] The next version with an incremented build number.
61
+ #
62
+ def next_build_number(version:)
63
+ new_version = version.dup
64
+ new_version.build_number += 1
65
+
66
+ new_version
67
+ end
68
+
69
+ # Calculate the previous patch version by decrementing the patch version if it's not zero.
70
+ #
71
+ # @param [AppVersion] version The version to calculate the previous patch version for.
72
+ #
73
+ # @return [AppVersion] The previous patch version.
74
+ #
75
+ def previous_patch_version(version:)
76
+ new_version = version.dup
77
+ new_version.patch -= 1 unless version.patch.zero?
78
+ new_version.build_number = 0
79
+
80
+ new_version
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,32 @@
1
+ module Fastlane
2
+ module Wpmreleasetoolkit
3
+ module Versioning
4
+ # The `DateBuildCodeCalculator` class is a build code calculator for apps that use date-based
5
+ # build codes.
6
+ class DateBuildCodeCalculator
7
+ # Calculate the next internal build code by setting the build number to the current date.
8
+ #
9
+ # @param [AppVersion] version The version to calculate the next internal version for.
10
+ #
11
+ # @return [AppVersion] The next version with the build number set to the current date.
12
+ #
13
+ def next_build_code(version:)
14
+ new_version = version.dup
15
+ new_version.build_number = today_date
16
+
17
+ new_version
18
+ end
19
+
20
+ private
21
+
22
+ # Get the current date in the format 'YYYYMMDD'.
23
+ #
24
+ # @return [String] The current date in 'YYYYMMDD' format.
25
+ #
26
+ def today_date
27
+ DateTime.now.strftime('%Y%m%d')
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'abstract_version_calculator'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `DateVersionCalculator` class is a specialized version calculator for date-based versions
7
+ # of an app, extending the `AbstractVersionCalculator` class.
8
+ class DateVersionCalculator < AbstractVersionCalculator
9
+ # Calculate the next date-based release version.
10
+ #
11
+ # If the current month is December, the method prompts the user to determine if the next
12
+ # release will be the first release of the next year. If so, it increments the major version
13
+ # and sets the minor version to 1, resetting the patch and build number components to zero.
14
+ # Otherwise, it calculates the next minor version.
15
+ #
16
+ # @param [AppVersion] version The version to calculate the next date-based release version for.
17
+ #
18
+ # @return [AppVersion] The next date-based release version.
19
+ #
20
+ def next_release_version(version:)
21
+ new_version = version.dup
22
+ first_release_of_year = FastlaneCore::UI.confirm('Is this release the first release of next year?') if Time.now.month == 12
23
+ if first_release_of_year
24
+ new_version.major += 1
25
+ new_version.minor = 1
26
+ new_version.patch = 0
27
+ new_version.build_number = 0
28
+
29
+ new_version
30
+ else
31
+ next_minor_version(version: version)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'abstract_version_calculator'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `MarketingVersionCalculator` class is a specialized version calculator for marketing versions
7
+ # of an app, extending the `AbstractVersionCalculator` class.
8
+ class MarketingVersionCalculator < AbstractVersionCalculator
9
+ # Calculate the next marketing release version.
10
+ #
11
+ # This method checks if the minor version is 9. If it is, it calculates the next major version.
12
+ # Otherwise, it calculates the next minor version. The patch and build number components are reset to zero.
13
+ #
14
+ # @param [AppVersion] version The version to calculate the next marketing release version for.
15
+ #
16
+ # @return [AppVersion] The next marketing release version.
17
+ #
18
+ def next_release_version(version:)
19
+ UI.user_error!('Marketing Versioning: The minor version cannot be greater than 9') if version.minor > 9
20
+
21
+ version.minor == 9 ? next_major_version(version: version) : next_minor_version(version: version)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'abstract_version_calculator'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `SemanticVersionCalculator` class is a specialized version calculator for semantic versions
7
+ # of an app, extending the `AbstractVersionCalculator` class.
8
+ class SemanticVersionCalculator < AbstractVersionCalculator
9
+ # Calculate the next semantic release version.
10
+ #
11
+ # @param [AppVersion] version The version to calculate the next semantic release version from.
12
+ #
13
+ # @return [AppVersion] The next semantic release version.
14
+ #
15
+ def next_release_version(version:)
16
+ next_minor_version(version: version)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module Fastlane
2
+ module Wpmreleasetoolkit
3
+ module Versioning
4
+ # The `SimpleBuildCodeCalculator` class is a build code calculator for apps that use simple integer
5
+ # build codes.
6
+ class SimpleBuildCodeCalculator
7
+ # Calculate the next build code.
8
+ #
9
+ # This method increments the build code value by 1.
10
+ #
11
+ # @param [BuildCode] version The build code to increment.
12
+ #
13
+ # @return [BuildCode] The next build code.
14
+ #
15
+ def next_build_code(build_code:)
16
+ new_build_code = build_code.dup
17
+ new_build_code.build_code += 1
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,76 @@
1
+ require 'java-properties'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `AndroidVersionFile` class takes in a version.properties file path and reads/writes values to/from the file.
7
+ class AndroidVersionFile
8
+ attr_reader :version_properties_path
9
+
10
+ # Initializes a new instance of AndroidVersionFile with the specified version.properties file path.
11
+ #
12
+ # @param [String] version_properties_path The path to the version.properties file.
13
+ #
14
+ def initialize(version_properties_path: 'version.properties')
15
+ UI.user_error!("version.properties not found at this path: #{version_properties_path}") unless File.exist?(version_properties_path)
16
+
17
+ @version_properties_path = version_properties_path
18
+ end
19
+
20
+ # Reads the version name from a version.properties file.
21
+ #
22
+ # @return [String] The version name read from the file.
23
+ #
24
+ # @raise [UI::Error] If the file_path is nil or the version name is not found.
25
+ #
26
+ def read_version_name
27
+ # Read the version name from the version.properties file
28
+ file_content = JavaProperties.load(version_properties_path)
29
+ version_name = file_content[:versionName]
30
+ UI.user_error!('Version name not found in version.properties') if version_name.nil?
31
+
32
+ version_name
33
+ end
34
+
35
+ # Reads the version code from a version.properties file.
36
+ #
37
+ # @param [String] file_path The path to the version.properties file.
38
+ #
39
+ # @return [BuildCode] An instance of `BuildCode` representing the version code read from the file.
40
+ #
41
+ # @raise [UI::Error] If the file_path is nil or the version code is not found.
42
+ #
43
+ def read_version_code
44
+ # Read the version code from the version.properties file
45
+ file_content = JavaProperties.load(version_properties_path)
46
+ version_code = file_content[:versionCode]
47
+ UI.user_error!('Version code not found in version.properties') if version_code.nil?
48
+
49
+ # Create a BuildCode object
50
+ Fastlane::Models::BuildCode.new(version_code.to_i)
51
+ end
52
+
53
+ # Writes the provided version name and version code to the version.properties file.
54
+ #
55
+ # @param [String] version_name The version name to write to the file.
56
+ # @param [String] version_code The version code to write to the file.
57
+ #
58
+ # @raise [UI::Error] If the version name or version code is nil.
59
+ #
60
+ def write_version(version_name:, version_code:)
61
+ # Create the version name and version code hash
62
+ version = {
63
+ versionName: version_name,
64
+ versionCode: version_code
65
+ }
66
+
67
+ # Write the version name and version code hash to the version.properties file
68
+ JavaProperties.write(
69
+ version,
70
+ version_properties_path
71
+ )
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,64 @@
1
+ require 'xcodeproj'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `IOSVersionFile` class takes in an .xcconfig file path and reads/writes values to/from the file.
7
+ class IOSVersionFile
8
+ attr_reader :xcconfig_path
9
+
10
+ # Initializes a new instance of IOSVersionFile with the specified .xcconfig file path.
11
+ #
12
+ # @param [String] xcconfig_path The path to the .xcconfig file.
13
+ #
14
+ def initialize(xcconfig_path:)
15
+ UI.user_error!(".xcconfig file not found at this path: #{xcconfig_path}") unless File.exist?(xcconfig_path)
16
+
17
+ @xcconfig_path = xcconfig_path
18
+ end
19
+
20
+ # Reads the release version from the .xcconfig file and returns it as a String.
21
+ #
22
+ # @return [String] The release version.
23
+ #
24
+ def read_release_version
25
+ config = Xcodeproj::Config.new(xcconfig_path)
26
+ config.attributes['VERSION_SHORT']
27
+ end
28
+
29
+ # Reads the build code from the .xcconfig file and returns it String.
30
+ #
31
+ # Some apps store the build code in the VERSION_LONG attribute, while others store it in the BUILD_NUMBER attribute.
32
+ #
33
+ # @param [String] attribute_name The name of the attribute to read.
34
+ #
35
+ # @return [String] The build code.
36
+ #
37
+ def read_build_code(attribute_name:)
38
+ UI.user_error!('attribute_name must be `VERSION_LONG` or `BUILD_NUMBER`') unless attribute_name.eql?('VERSION_LONG') || attribute_name.eql?('BUILD_NUMBER')
39
+
40
+ config = Xcodeproj::Config.new(xcconfig_path)
41
+ config.attributes[attribute_name]
42
+ end
43
+
44
+ # Writes the provided version numbers to the .xcconfig file.
45
+ #
46
+ # @param [String, nil] version_short The short version string (optional).
47
+ # @param [String, nil] version_long The long version string (optional).
48
+ # @param [String, nil] build_number The build number (optional).
49
+ #
50
+ # version_long is optional because there are times when it won't be updated, such as a new beta build.
51
+ # version_short is optional because some apps (such as Day One iOS/Mac or Simplenote Mac) don't use it.
52
+ # build_number is optional because some apps (such as WP/JP iOS or WCiOS) don't use it.
53
+ #
54
+ def write(version_short: nil, version_long: nil, build_number: nil)
55
+ config = Xcodeproj::Config.new(xcconfig_path)
56
+ config.attributes['VERSION_SHORT'] = version_short.to_s unless version_short.nil?
57
+ config.attributes['VERSION_LONG'] = version_long.to_s unless version_long.nil?
58
+ config.attributes['BUILD_NUMBER'] = build_number.to_s unless build_number.nil?
59
+ config.save_as(Pathname.new(xcconfig_path))
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../calculators/abstract_version_calculator'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `VersionFormatter` class is a generic version formatter that can be used as a base class
7
+ # for formatting version objects used by for different platforms. It contains formatting methods that
8
+ # are shared by all platforms. It has the abstract suffix because it should not be instantiated directly.
9
+ class AbstractVersionFormatter
10
+ # Get the release version string for the app.
11
+ #
12
+ # This method constructs the release version string based on the major, minor, and
13
+ # patch components of the provided `@version`. If the patch component is zero, it returns
14
+ # a version string in the format "major.minor" (e.g., '1.2'). Otherwise, it returns a
15
+ # version string in the format "major.minor.patch" (e.g., '1.2.3').
16
+ #
17
+ # @param [AppVersion] version The version object to format
18
+ #
19
+ # @return [String] The formatted release version string.
20
+ #
21
+ def release_version(version)
22
+ version.patch.zero? ? "#{version.major}.#{version.minor}" : "#{version.major}.#{version.minor}.#{version.patch}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ module Fastlane
2
+ module Wpmreleasetoolkit
3
+ module Versioning
4
+ # The `DerivedBuildCodeFormatter` class is a specialized build code formatter for derived build codes.
5
+ # It takes in an AppVersion object and derives a build code from it.
6
+ class DerivedBuildCodeFormatter
7
+ # Calculate the next derived build code.
8
+ #
9
+ # This method derives a new build code from the given AppVersion object by concatenating the digit 1,
10
+ # the major version, the minor version, the patch version, and the build number.
11
+ #
12
+ # @param [AppVersion] version The AppVersion object to derive the next build code from.
13
+ #
14
+ # @param [BuildCode] build_code A BuildCode object. This parameter is ignored but is included
15
+ # to have a consistent signature with other build code formatters.
16
+ #
17
+ # @return [String] The formatted build code string.
18
+ #
19
+ def build_code(build_code = nil, version:)
20
+ format(
21
+ # 1 is appended to the beginning of the string in case there needs to be additional platforms or
22
+ # extensions that could then use a different digit prefix such as 2, etc.
23
+ '1%<major>.2i%<minor>.2i%<patch>.2i%<build_number>.2i',
24
+ major: version.major,
25
+ minor: version.minor,
26
+ patch: version.patch,
27
+ build_number: version.build_number
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../formatters/four_part_version_formatter'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `FourPartBuildCodeFormatter` is a specialized build code formatter for apps that use
7
+ # build codes in the format of `major.minor.patch.build_number`.
8
+ class FourPartBuildCodeFormatter
9
+ # @param [AppVersion] version The AppVersion object to format
10
+ #
11
+ # @param [BuildCode] build_code A BuildCode object. This parameter is ignored but is included
12
+ # to have a consistent signature with other build code formatters.
13
+ #
14
+ # @return [String] The formatted build code string.
15
+ #
16
+ def build_code(build_code = nil, version:)
17
+ FourPartVersionFormatter.new.to_s(version)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'abstract_version_formatter'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `FourPartVersionFormatter` class extends the `VersionFormatter` class. It is a specialized version formatter for
7
+ # apps that use versions in the format of `1.2.3.4`.
8
+ class FourPartVersionFormatter < AbstractVersionFormatter
9
+ # Parse the version string into an AppVersion instance
10
+ #
11
+ # @param [String] version The version string to parse
12
+ #
13
+ # @return [AppVersion] The parsed version
14
+ #
15
+ def parse(version)
16
+ # Split the version string into its components
17
+ components = version.split('.').map(&:to_i)
18
+
19
+ # Create a new AppVersion instance from the version string components
20
+ Fastlane::Models::AppVersion.new(*components)
21
+ end
22
+
23
+ # Return the formatted version string
24
+ #
25
+ # @param [AppVersion] version The version object to format
26
+ #
27
+ # @return [String] The formatted version string
28
+ #
29
+ def to_s(version)
30
+ "#{version.major}.#{version.minor}.#{version.patch}.#{version.build_number}"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,65 @@
1
+ require_relative 'abstract_version_formatter'
2
+
3
+ module Fastlane
4
+ module Wpmreleasetoolkit
5
+ module Versioning
6
+ # The `RCNotationVersionFormatter` class extends the `VersionFormatter` class. It is a specialized version
7
+ # formatter for apps that may use versions in the format of `1.2.3-rc-4`.
8
+ class RCNotationVersionFormatter < AbstractVersionFormatter
9
+ # The string identifier used for beta versions in Android.
10
+ RC_SUFFIX = 'rc'.freeze
11
+
12
+ # Parse the version string into an AppVersion instance
13
+ #
14
+ # @param [String] version_name The version string to parse
15
+ #
16
+ # @return [AppVersion] The parsed version
17
+ #
18
+ def parse(version_name)
19
+ # Set the build number to 0 by default so that it will be set correctly for non-beta version numbers
20
+ build_number = 0
21
+
22
+ if version_name.include?(RC_SUFFIX)
23
+ # Extract the build number from the version name
24
+ build_number = version_name.split('-')[2].to_i
25
+ # Extract the version name without the build number and drop the RC suffix
26
+ version_name = version_name.split(RC_SUFFIX)[0]
27
+ end
28
+
29
+ # Split the version name into its components
30
+ version_number_parts = version_name.split('.').map(&:to_i)
31
+ # Fill the array with 0 if needed to ensure array has at least 3 components
32
+ version_number_parts.fill(0, version_number_parts.length...3)
33
+
34
+ # Map version_number_parts to AppVersion model
35
+ major = version_number_parts[0]
36
+ minor = version_number_parts[1]
37
+ patch = version_number_parts[2]
38
+
39
+ # Create an AppVersion object
40
+ Fastlane::Models::AppVersion.new(major, minor, patch, build_number)
41
+ end
42
+
43
+ # Get the formatted beta version of the Android app
44
+ #
45
+ # This method constructs a beta version string by combining the release version
46
+ # with the beta identifier and the build number. It ensures that the build number is
47
+ # 1 or higher, as beta versions must have a build number greater than or equal to 1.
48
+ #
49
+ # @param [AppVersion] version The version object to format
50
+ #
51
+ # @return [String] The formatted beta version of the Android app
52
+ #
53
+ # @raise [UI::Error] If the build number of the beta version is not 1 or higher
54
+ #
55
+ def beta_version(version)
56
+ # Ensure that the build number is 1 or higher for a beta version
57
+ UI.user_error!('The build number of a beta version must be 1 or higher') unless version.build_number.positive?
58
+
59
+ # Construct and return the formatted beta version string.
60
+ "#{release_version(version)}-#{RC_SUFFIX}-#{version.build_number}"
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,20 @@
1
+ module Fastlane
2
+ module Wpmreleasetoolkit
3
+ module Versioning
4
+ # The `IntegerBuildCodeFormatter` is a specialized build code formatter for apps that use simple
5
+ # integer build codes in the format of `build_number`.
6
+ class SimpleBuildCodeFormatter
7
+ # @param version [AppVersion] An AppVersion object. This parameter is ignored but is included
8
+ # to have a consistent signature with other build code formatters.
9
+ #
10
+ # @param [BuildCode] build_code The BuildCode object to format
11
+ #
12
+ # @return [String] The formatted build code string.
13
+ #
14
+ def build_code(version = nil, build_code:)
15
+ build_code.to_s
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -4,7 +4,7 @@ module Fastlane
4
4
  module Wpmreleasetoolkit
5
5
  # Return all .rb files inside the "actions", "helper" and "models" directories
6
6
  def self.all_classes
7
- Dir[File.expand_path('**/{actions,helper,models}/**/*.rb', File.dirname(__FILE__))]
7
+ Dir[File.expand_path('**/{actions,helper,models,versioning}/**/*.rb', File.dirname(__FILE__))]
8
8
  end
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-wpmreleasetoolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.0.1
4
+ version: 9.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Automattic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-05 00:00:00.000000000 Z
11
+ date: 2023-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: java-properties
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.3.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.3.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: nokogiri
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -426,6 +440,7 @@ files:
426
440
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/circleci_trigger_job_action.rb
427
441
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/close_milestone_action.rb
428
442
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/comment_on_pr.rb
443
+ - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/copy_branch_protection_action.rb
429
444
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/create_new_milestone_action.rb
430
445
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/create_release_action.rb
431
446
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/extract_release_notes_for_version_action.rb
@@ -436,8 +451,8 @@ files:
436
451
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/gp_update_metadata_source.rb
437
452
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/promo_screenshots_action.rb
438
453
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/prototype_build_details_comment_action.rb
439
- - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/removebranchprotection_action.rb
440
- - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/setbranchprotection_action.rb
454
+ - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/remove_branch_protection_action.rb
455
+ - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/set_branch_protection_action.rb
441
456
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/setfrozentag_action.rb
442
457
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/common/upload_to_s3.rb
443
458
  - lib/fastlane/plugin/wpmreleasetoolkit/actions/configure/configure_add_files_to_copy_action.rb
@@ -506,6 +521,8 @@ files:
506
521
  - lib/fastlane/plugin/wpmreleasetoolkit/helper/promo_screenshots_helper.rb
507
522
  - lib/fastlane/plugin/wpmreleasetoolkit/helper/release_notes_helper.rb
508
523
  - lib/fastlane/plugin/wpmreleasetoolkit/helper/user_agent.rb
524
+ - lib/fastlane/plugin/wpmreleasetoolkit/models/app_version.rb
525
+ - lib/fastlane/plugin/wpmreleasetoolkit/models/build_code.rb
509
526
  - lib/fastlane/plugin/wpmreleasetoolkit/models/configuration.rb
510
527
  - lib/fastlane/plugin/wpmreleasetoolkit/models/file_reference.rb
511
528
  - lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_account.rb
@@ -513,6 +530,20 @@ files:
513
530
  - lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_lab_result.rb
514
531
  - lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb
515
532
  - lib/fastlane/plugin/wpmreleasetoolkit/version.rb
533
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/abstract_version_calculator.rb
534
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/date_build_code_calculator.rb
535
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/date_version_calculator.rb
536
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/marketing_version_calculator.rb
537
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/semantic_version_calculator.rb
538
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/calculators/simple_build_code_calculator.rb
539
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/files/android_version_file.rb
540
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/files/ios_version_file.rb
541
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/abstract_version_formatter.rb
542
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/derived_build_code_formatter.rb
543
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/four_part_build_code_formatter.rb
544
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/four_part_version_formatter.rb
545
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/rc_notation_version_formatter.rb
546
+ - lib/fastlane/plugin/wpmreleasetoolkit/versioning/formatters/simple_build_code_formatter.rb
516
547
  homepage: https://github.com/wordpress-mobile/release-toolkit
517
548
  licenses:
518
549
  - MIT
@@ -1,63 +0,0 @@
1
- require 'fastlane/action'
2
- require_relative '../../helper/github_helper'
3
-
4
- module Fastlane
5
- module Actions
6
- class SetbranchprotectionAction < Action
7
- def self.run(params)
8
- repository = params[:repository]
9
- branch_name = params[:branch]
10
-
11
- branch_url = "https://api.github.com/repos/#{repository}/branches/#{branch_name}"
12
- restrictions = { url: "#{branch_url}/protection/restrictions", users_url: "#{branch_url}/protection/restrictions/users", teams_url: "#{branch_url}/protection/restrictions/teams", users: [], teams: [] }
13
- required_pull_request_reviews = { url: "#{branch_url}/protection/required_pull_request_reviews", dismiss_stale_reviews: false, require_code_owner_reviews: false }
14
-
15
- github_helper = Fastlane::Helper::GithubHelper.new(github_token: params[:github_token])
16
- github_helper.set_branch_protection(
17
- repository: repository,
18
- branch: branch_name,
19
- restrictions: restrictions,
20
- enforce_admins: nil,
21
- required_pull_request_reviews: required_pull_request_reviews
22
- )
23
- end
24
-
25
- def self.description
26
- "Sets the 'release branch' protection state for the specified branch"
27
- end
28
-
29
- def self.authors
30
- ['Automattic']
31
- end
32
-
33
- def self.return_value
34
- # If your method provides a return value, you can describe here what it does
35
- end
36
-
37
- def self.details
38
- # Optional:
39
- "Sets the 'release branch' protection state for the specified branch"
40
- end
41
-
42
- def self.available_options
43
- [
44
- FastlaneCore::ConfigItem.new(key: :repository,
45
- env_name: 'GHHELPER_REPOSITORY',
46
- description: 'The remote path of the GH repository on which we work',
47
- optional: false,
48
- type: String),
49
- FastlaneCore::ConfigItem.new(key: :branch,
50
- env_name: 'GHHELPER_BRANCH',
51
- description: 'The branch to protect',
52
- optional: false,
53
- type: String),
54
- Fastlane::Helper::GithubHelper.github_token_config_item,
55
- ]
56
- end
57
-
58
- def self.is_supported?(platform)
59
- true
60
- end
61
- end
62
- end
63
- end