fastlane-plugin-semantic_versioning 2.0.0 → 2.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8564caab2d111a1099b9c876d794673d124b89fea24c4d6ef3b7886f096e9c5
4
- data.tar.gz: cf726334226530356e0180b112080ffb30bce81aa6709c9b072ac9d152070234
3
+ metadata.gz: 0d962764d77e655baf9b60aae168bcf8ad44bbaa72f086459a289fec254ccdf7
4
+ data.tar.gz: 3880d7197a78a347153559ace10fc8ac2d9a70964327c01a698da27928482f0f
5
5
  SHA512:
6
- metadata.gz: 7119102889ba20b58d153f92cbd9ae6d7b118c3e01c963773bfd0a1320976f5a55e336e9356822f2f64e2bc5be6e08fb6b61151ac005fc6c73fbdc1867ee5b90
7
- data.tar.gz: bf0e95b1a39df59564cf3b47e6418fb8cc754d7a6f53b0ccce793f1e93557336e5ce988a17d711f7b26a9acaf8672ee0183226013867af3e39cdd0f48abe038c
6
+ metadata.gz: 3c3b6f1b6adec4767c6a713cd73cca76f11e4953fcb65045773f7743abf631241b4c734b5418a0fcd483d2a8f44e88a0bec90c7e57ddbe70e181936b9774dbce
7
+ data.tar.gz: beef78408a0e60a49d8519304e58a07381afff3239f6ee3b8df65d64669d24f2872793864e34640911dc4d359488cc0bdceddf967552fcfe7f4185c5399b3616
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "fastlane/action"
2
4
  require "fastlane_core/configuration/config_item"
3
5
  require_relative "../helper/semantic_versioning_helper"
@@ -13,6 +15,7 @@ module Fastlane
13
15
  SEMVER_BUMPABLE = :SEMVER_BUMPABLE
14
16
  end
15
17
 
18
+ # Action to retrieve semantic versioning information from commit history.
16
19
  class GetVersioningInfoAction < Action
17
20
  def self.run(params)
18
21
  params[:allowed_types].map!(&:to_sym)
@@ -32,8 +35,10 @@ module Fastlane
32
35
  )
33
36
 
34
37
  bump_type = Helper::SemanticVersioningHelper.bump_type(commits: commits, force_type: params[:force_type])
35
- new_version = Helper::SemanticVersioningHelper.increase_version(current_version: current_version, bump_type: bump_type)
36
- new_changelog = Helper::SemanticVersioningHelper.build_changelog(version: new_version, commits: commits, type_map: params[:type_map])
38
+ new_version = Helper::SemanticVersioningHelper.increase_version(current_version: current_version,
39
+ bump_type: bump_type)
40
+ new_changelog = Helper::SemanticVersioningHelper.build_changelog(version: new_version, commits: commits,
41
+ type_map: params[:type_map])
37
42
  bumpable = current_version != new_version
38
43
 
39
44
  Actions.lane_context[SharedValues::SEMVER_CURRENT_VERSION] = current_version
@@ -43,9 +48,10 @@ module Fastlane
43
48
  Actions.lane_context[SharedValues::SEMVER_NEW_CHANGELOG] = new_changelog
44
49
  Actions.lane_context[SharedValues::SEMVER_BUMPABLE] = bumpable
45
50
 
46
- return bumpable
51
+ bumpable
47
52
  end
48
53
 
54
+ # :nocov:
49
55
  def self.description
50
56
  "Retrieve semantic versioning information from commit history."
51
57
  end
@@ -75,6 +81,7 @@ module Fastlane
75
81
  # Optional:
76
82
  "Reads commits from last version and determines next version and changelog."
77
83
  end
84
+ # :nocov:
78
85
 
79
86
  def self.available_options
80
87
  [
@@ -82,7 +89,8 @@ module Fastlane
82
89
  env_name: "SEMANTIC_VERSIONING_ALLOWED_TYPES",
83
90
  description: "List of allowed commit types",
84
91
  optional: true,
85
- default_value: %w[build ci docs feat fix perf refactor style test chore revert bump init],
92
+ default_value: %w[build ci docs feat fix perf refactor style test chore revert
93
+ bump init],
86
94
  type: Array),
87
95
  FastlaneCore::ConfigItem.new(key: :bump_map,
88
96
  description: "Map of commit types to their bump level (major, minor, patch)",
@@ -107,29 +115,30 @@ module Fastlane
107
115
  description: "Map of types to section titles for the changelog." \
108
116
  "Only the specified types will be used for the changelog",
109
117
  optional: true,
110
- default_value: { breaking: "BREAKING CHANGES", feat: "Features", fix: "Bug Fixes" },
118
+ default_value: { breaking: "BREAKING CHANGES", feat: "Features",
119
+ fix: "Bug Fixes" },
111
120
  is_string: false,
112
121
  verify_block: ->(value) { verify_type_map(value) })
113
122
  ]
114
123
  end
115
124
 
116
125
  def self.verify_type_map(value)
117
- UI.user_error!("Parameter 'type_map' must be a Hash.") unless value.kind_of?(Hash)
118
- # It could be helpful to also test for valid keys, which must all be part of ConfigItem :allowed_types plus breaking.
119
- # How to check this?
126
+ UI.user_error!("Parameter 'type_map' must be a Hash.") unless value.is_a?(Hash)
120
127
  end
121
128
 
122
129
  def self.verify_bump_map(value)
123
- UI.user_error!("Parameter 'bump_map' must be a Hash.") unless value.kind_of?(Hash)
130
+ UI.user_error!("Parameter 'bump_map' must be a Hash.") unless value.is_a?(Hash)
124
131
  end
125
132
 
126
- def self.is_supported?(platform)
133
+ # :nocov:
134
+ def self.is_supported?(_platform)
127
135
  # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
128
136
  # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
129
137
  #
130
138
  # [:ios, :mac, :android].include?(platform)
131
139
  true
132
140
  end
141
+ # :nocov:
133
142
  end
134
143
  end
135
144
  end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fastlane/action"
4
+ require_relative "../helper/semantic_versioning_helper"
5
+
6
+ module Fastlane
7
+ module Actions
8
+ # Action to prepare the Xcode project for automatic versioning
9
+ class PrepareVersioningAction < Action
10
+ def self.run(params)
11
+ xcodeproj_path = params[:xcodeproj] || Dir.glob("*.xcodeproj").first
12
+
13
+ Fastlane::UI.user_error!("Unable to determine *.xcodeproj and no :xcodeproj specified") if xcodeproj_path.nil?
14
+
15
+ project = Helper::SemanticVersioningHelper.project(xcodeproj_path)
16
+ target = Helper::SemanticVersioningHelper.main_target
17
+ main_group = Helper::SemanticVersioningHelper.main_group
18
+
19
+ info_plist_file = File.join(main_group.path, "Info.plist")
20
+ info_plist_path = File.join(project.path.dirname, info_plist_file)
21
+
22
+ current_version = Fastlane::Actions::GetVersionNumberAction.run(xcodeproj: xcodeproj_path)
23
+ Helper::SemanticVersioningHelper.ensure_info_plist(info_plist_path)
24
+ %w[CFBundleVersion CFBundleShortVersionString].each do |key|
25
+ unless Fastlane::Actions::GetInfoPlistValueAction.run(path: info_plist_path, key: key)
26
+ Fastlane::Actions::SetInfoPlistValueAction.run(path: info_plist_path, key: key, value: current_version)
27
+ end
28
+ end
29
+
30
+ target.build_configurations.each do |config|
31
+ config.build_settings["VERSIONING_SYSTEM"] = "apple-generic"
32
+ config.build_settings.delete("MARKETING_VERSION")
33
+ config.build_settings.delete("GENERATE_INFOPLIST_FILE")
34
+ end
35
+
36
+ project.save
37
+ true
38
+ end
39
+
40
+ # :nocov:
41
+ def self.description
42
+ "Prepares the Xcodeproject to be used with automatic versioning by tools."
43
+ end
44
+
45
+ def self.authors
46
+ ["kassi"]
47
+ end
48
+
49
+ def self.output
50
+ # Define the shared values you are going to provide
51
+ end
52
+
53
+ def self.return_value
54
+ # If your method provides a return value, you can describe here what it does
55
+ "Truthy value when everything worked out well."
56
+ end
57
+
58
+ def self.details
59
+ # Optional:
60
+ "Changes the versioning style and makes sure that version information is extracted into Info.plist " \
61
+ "to be used with agvtool"
62
+ end
63
+ # :nocov:
64
+
65
+ def self.available_options
66
+ [
67
+ FastlaneCore::ConfigItem.new(key: :main_group,
68
+ env_name: "SEMANTIC_VERSIONING_MAIN_GROUP",
69
+ description: "The name of the main group of the xcode project",
70
+ optional: true,
71
+ default_value: nil,
72
+ type: String),
73
+ FastlaneCore::ConfigItem.new(key: :xcodeproj,
74
+ env_name: "SEMANTIC_VERSIONING_PROJECT",
75
+ description: "The path to your project file (Not the workspace). Optional if you have only one",
76
+ optional: true,
77
+ default_value: nil,
78
+ verify_block: proc do |value|
79
+ if value.end_with?(".xcworkspace")
80
+ UI.user_error!("Please pass the path to the project, not the workspace")
81
+ end
82
+ UI.user_error!("Could not find Xcode project") unless File.exist?(value)
83
+ end)
84
+ ]
85
+ end
86
+
87
+ # :nocov:
88
+ def self.is_supported?(platform)
89
+ # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
90
+ # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
91
+ #
92
+ %i[ios mac].include?(platform)
93
+ end
94
+ # :nocov:
95
+ end
96
+ end
97
+ end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "fastlane/action"
2
4
  require_relative "../helper/semantic_versioning_helper"
3
5
 
4
6
  module Fastlane
5
7
  module Actions
8
+ # Action to bumps the version according to semantic versioning and writes a changelog.
6
9
  class SemanticBumpAction < Action
7
10
  def self.run(params)
8
11
  unless Actions.lane_context.key?(SharedValues::SEMVER_BUMPABLE)
@@ -32,9 +35,10 @@ module Fastlane
32
35
  include: [params[:changelog_file]].compact
33
36
  )
34
37
 
35
- return true
38
+ true
36
39
  end
37
40
 
41
+ # :nocov:
38
42
  def self.description
39
43
  "Bumps the version according to semantic versioning and writes a changelog."
40
44
  end
@@ -56,6 +60,7 @@ module Fastlane
56
60
  # Optional:
57
61
  "Reads commits from last version and determines next version and changelog."
58
62
  end
63
+ # :nocov:
59
64
 
60
65
  def self.available_options
61
66
  [
@@ -74,13 +79,15 @@ module Fastlane
74
79
  ]
75
80
  end
76
81
 
77
- def self.is_supported?(platform)
82
+ # :nocov:
83
+ def self.is_supported?(_platform)
78
84
  # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
79
85
  # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
80
86
  #
81
87
  # [:ios, :mac, :android].include?(platform)
82
88
  true
83
89
  end
90
+ # :nocov:
84
91
  end
85
92
  end
86
93
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "fastlane_core/ui/ui"
2
4
  require "fastlane/actions/get_version_number"
3
5
  require "git"
6
+ require "xcodeproj"
4
7
 
5
8
  module Fastlane
6
9
  UI = FastlaneCore::UI unless Fastlane.const_defined?(:UI)
@@ -22,16 +25,12 @@ module Fastlane
22
25
  format.sub("$version", tag)
23
26
  end
24
27
 
25
- def self.git_tag_exists?(tag)
26
- git.tags.include?(tag)
27
- end
28
-
29
28
  # Retrieves git commits and returns them grouped by type
30
29
  def self.git_commits(from:, allowed_types:, bump_map:)
31
30
  logs = from ? git.log(-1).between(from) : git.log(-1)
32
- logs.reverse_each.map do |commit|
31
+ logs.reverse_each.filter_map { |commit|
33
32
  parse_conventional_commit(commit: commit, allowed_types: allowed_types, bump_map: bump_map)
34
- end.compact
33
+ }
35
34
  end
36
35
 
37
36
  def self.parse_conventional_commit(commit:, allowed_types:, bump_map:)
@@ -39,7 +38,7 @@ module Fastlane
39
38
  commit.message.match(/^(?<type>#{types})(\((?<scope>\S+)\))?(?<major>!)?:\s+(?<subject>[^\n\r]+)(\z|\n\n(?<body>.*\z))/m) do |match|
40
39
  cc = {
41
40
  type: match[:type].to_sym,
42
- major: !!match[:major],
41
+ major: !match[:major].nil?,
43
42
  scope: match[:scope],
44
43
  subject: match[:subject],
45
44
  body: match[:body],
@@ -62,7 +61,7 @@ module Fastlane
62
61
 
63
62
  return bump_map[:breaking] if commit[:breaking]
64
63
 
65
- return bump_map[commit[:type]]
64
+ bump_map[commit[:type]]
66
65
  end
67
66
 
68
67
  def self.bump_type(commits:, force_type: nil)
@@ -83,7 +82,7 @@ module Fastlane
83
82
  end
84
83
  end
85
84
 
86
- return result
85
+ result
87
86
  end
88
87
 
89
88
  def self.group_commits(commits:, allowed_types:)
@@ -91,9 +90,7 @@ module Fastlane
91
90
  result[:none] = []
92
91
 
93
92
  commits.each do |commit|
94
- if commit[:breaking] && allowed_types.include?(:breaking)
95
- result[:breaking] << commit
96
- end
93
+ result[:breaking] << commit if commit[:breaking] && allowed_types.include?(:breaking)
97
94
 
98
95
  if commit[:major] && !allowed_types.include?(commit[:type])
99
96
  result[:none] << commit
@@ -105,7 +102,7 @@ module Fastlane
105
102
  result[commit[:type]] << commit
106
103
  end
107
104
 
108
- return result
105
+ result
109
106
  end
110
107
 
111
108
  def self.increase_version(current_version:, bump_type:)
@@ -122,7 +119,7 @@ module Fastlane
122
119
  version_array[2] += 1
123
120
  end
124
121
 
125
- return version_array.join(".")
122
+ version_array.join(".")
126
123
  end
127
124
 
128
125
  # Builds and returns th changelog for the upcoming release.
@@ -147,7 +144,7 @@ module Fastlane
147
144
  lines << ""
148
145
  end
149
146
 
150
- return "#{lines.join("\n")}\n"
147
+ "#{lines.join("\n")}\n"
151
148
  end
152
149
 
153
150
  def self.write_changelog(path:, changelog:)
@@ -168,15 +165,53 @@ module Fastlane
168
165
  .sub("$new_version", Actions.lane_context[Actions::SharedValues::SEMVER_NEW_VERSION]))
169
166
  end
170
167
 
171
- def self.git_command(args)
172
- Actions.sh("git #{args.join(' ')}").chomp
173
- end
174
-
175
168
  def self.git
176
169
  # rubocop:disable Style/ClassVars
177
170
  @@git ||= Git.open(".")
178
171
  # rubocop:enable Style/ClassVars
179
172
  end
173
+
174
+ def self.git_tag_exists?(tag)
175
+ git.tags.include?(tag)
176
+ end
177
+
178
+ def self.project(path = nil)
179
+ # rubocop:disable Style/ClassVars
180
+ @@project ||= Xcodeproj::Project.open(path)
181
+ # rubocop:enable Style/ClassVars
182
+ end
183
+
184
+ def self.main_target
185
+ project.targets.first
186
+ end
187
+
188
+ def self.current_version
189
+ @current_version ||= main_target.build_configurations.first.build_settings["MARKETING_VERSION"] || "1.0"
190
+ end
191
+
192
+ def self.main_group(name = nil)
193
+ project.main_group[name || main_target.name]
194
+ end
195
+
196
+ def self.ensure_info_plist(path)
197
+ return if File.exist?(path)
198
+
199
+ File.write(path, <<-PLIST)
200
+ <?xml version="1.0" encoding="UTF-8"?>
201
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
202
+ <plist version="1.0">
203
+ <dict>
204
+ </dict>
205
+ </plist>
206
+ PLIST
207
+
208
+ info_plist = main_group.new_file("Info.plist")
209
+ info_plist.include_in_index = nil
210
+ info_plist.set_last_known_file_type("text.plist")
211
+ main_target.build_configurations.each do |config|
212
+ config.build_settings["INFOPLIST_FILE"] = info_plist.full_path.to_s
213
+ end
214
+ end
180
215
  end
181
216
  end
182
217
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fastlane
2
4
  module SemanticVersioning
3
- VERSION = "2.0.0"
5
+ VERSION = "2.1.1"
4
6
  end
5
7
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "fastlane/plugin/semantic_versioning/version"
2
4
 
3
5
  module Fastlane
6
+ # Provides actions for dealing with semantic versions and conventional commits
4
7
  module SemanticVersioning
5
8
  # Return all .rb files inside the "actions" and "helper" directory
6
9
  def self.all_classes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-semantic_versioning
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karsten Silkenbäumer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-17 00:00:00.000000000 Z
11
+ date: 2024-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: xcodeproj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.24'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.24'
27
41
  description:
28
42
  email: 993392+kassi@users.noreply.github.com
29
43
  executables: []
@@ -34,6 +48,7 @@ files:
34
48
  - README.md
35
49
  - lib/fastlane/plugin/semantic_versioning.rb
36
50
  - lib/fastlane/plugin/semantic_versioning/actions/get_versioning_info_action.rb
51
+ - lib/fastlane/plugin/semantic_versioning/actions/prepare_versioning_action.rb
37
52
  - lib/fastlane/plugin/semantic_versioning/actions/semantic_bump_action.rb
38
53
  - lib/fastlane/plugin/semantic_versioning/helper/semantic_versioning_helper.rb
39
54
  - lib/fastlane/plugin/semantic_versioning/version.rb