fastlane 2.70.1 → 2.70.2

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/fastlane/lib/.DS_Store +0 -0
  3. data/fastlane/lib/fastlane/.DS_Store +0 -0
  4. data/fastlane/lib/fastlane/actions/.DS_Store +0 -0
  5. data/fastlane/lib/fastlane/actions/build_ios_app.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/danger.rb +7 -0
  7. data/fastlane/lib/fastlane/actions/docs/produce.md +5 -1
  8. data/fastlane/lib/fastlane/actions/get_build_number.rb +4 -0
  9. data/fastlane/lib/fastlane/actions/get_info_plist_value.rb +4 -0
  10. data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +4 -0
  11. data/fastlane/lib/fastlane/actions/git_branch.rb +4 -0
  12. data/fastlane/lib/fastlane/actions/modify_services.rb +5 -1
  13. data/fastlane/lib/fastlane/actions/slack.rb +24 -9
  14. data/fastlane/lib/{assets → fastlane/helper}/.DS_Store +0 -0
  15. data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +12 -6
  16. data/fastlane/lib/fastlane/version.rb +1 -1
  17. data/fastlane/swift/Deliverfile.swift +1 -1
  18. data/fastlane/swift/Fastlane.swift +18 -14
  19. data/fastlane/swift/Gymfile.swift +1 -1
  20. data/fastlane/swift/Matchfile.swift +1 -1
  21. data/fastlane/swift/Precheckfile.swift +1 -1
  22. data/fastlane/swift/Scanfile.swift +1 -1
  23. data/fastlane/swift/Screengrabfile.swift +1 -1
  24. data/fastlane/swift/Snapshotfile.swift +1 -1
  25. data/{fastlane/lib/fastlane/actions/docs → fastlane_core/lib}/.DS_Store +0 -0
  26. data/fastlane_core/lib/fastlane_core/.DS_Store +0 -0
  27. data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +1 -1
  28. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +12 -7
  29. data/fastlane_core/lib/fastlane_core/helper.rb +1 -1
  30. data/fastlane_core/lib/fastlane_core/ios_app_identifier_guesser.rb +44 -3
  31. data/produce/lib/produce/developer_center.rb +5 -1
  32. data/produce/lib/produce/service.rb +42 -1
  33. data/snapshot/lib/assets/SnapshotHelper.swift +2 -1
  34. data/supply/lib/supply/setup.rb +1 -1
  35. data/supply/lib/supply/uploader.rb +14 -13
  36. metadata +6 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 994d82ec3bb032862ba43e114e4a91a1d54b74f4
4
- data.tar.gz: fd3b1c0a375136a680bc8d4f4efa48c04d9366f1
3
+ metadata.gz: 83ac3d5b30435c890c6c68faeb4a41bfe3acb424
4
+ data.tar.gz: 39c65833f75f48ef0131faf206683adcacd9127c
5
5
  SHA512:
6
- metadata.gz: f35c74e9fb0e7c53f9c5d3b4d75db102fa11546f013d8641c7ca93772fa7db95e0d2d76e559b6e1aaeb7d009a85bd6b0c44a7731be41d152efe9e72cd265cfee
7
- data.tar.gz: d9ff540336c00b17d9ae8c9ba9e9513cad60165a3840c67f8b9ffcb9f29a9e69ea9c5df6993ed05c29955fc3533a89735aaced7e32ff75521c52debfa7bfa6c5
6
+ metadata.gz: 12b67636cf96d5debabd98bf4b2d53fce327af50830c504b80fda8aeb798c88fd6f69c242eabc200db9176eddeeb67cc789bcf062a65a0e95f74fd92b330753a
7
+ data.tar.gz: aadae44146f183fd6913c07b3b65f748768fee1e11756df9727c0681eb8f9e3e089261e23c58b20ed0a0e6f743fd5fab446b678fc51e0d3ebc071b84c2fb4f98
Binary file
@@ -121,7 +121,7 @@ module Fastlane
121
121
  clean: true,
122
122
  output_directory: "path/to/dir", # Destination directory. Defaults to current directory.
123
123
  output_name: "my-app.ipa", # specify the name of the .ipa file to generate (including file extension)
124
- sdk: "10.0" # use SDK as the name or path of the base SDK when building the project.
124
+ sdk: "iOS 11.1" # use SDK as the name or path of the base SDK when building the project.
125
125
  )',
126
126
  'gym # alias for "build_ios_app"',
127
127
  'build_app # alias for "build_ios_app"'
@@ -13,12 +13,14 @@ module Fastlane
13
13
  dangerfile = params[:dangerfile]
14
14
  base = params[:base]
15
15
  head = params[:head]
16
+ pr = params[:pr]
16
17
  cmd << "--danger_id=#{danger_id}" if danger_id
17
18
  cmd << "--dangerfile=#{dangerfile}" if dangerfile
18
19
  cmd << "--fail-on-errors=true" if params[:fail_on_errors]
19
20
  cmd << "--new-comment" if params[:new_comment]
20
21
  cmd << "--base=#{base}" if base
21
22
  cmd << "--head=#{head}" if head
23
+ cmd << "pr #{pr}" if pr
22
24
 
23
25
  ENV['DANGER_GITHUB_API_TOKEN'] = params[:github_api_token] if params[:github_api_token]
24
26
 
@@ -85,6 +87,11 @@ module Fastlane
85
87
  env_name: "FL_DANGER_HEAD",
86
88
  description: "A branch/tag/commit to use as the head. [master|dev|stable]",
87
89
  is_string: true,
90
+ optional: true),
91
+ FastlaneCore::ConfigItem.new(key: :pr,
92
+ env_name: "FL_DANGER_PR",
93
+ description: "Run danger on a specific pull request. e.g. \"https://github.com/danger/danger/pull/518\"",
94
+ is_string: true,
88
95
  optional: true)
89
96
  ]
90
97
  end
@@ -204,7 +204,11 @@ lane :release do
204
204
  passbook: "on", # Valid values: "on", "off"
205
205
  push_notification: "on", # Valid values: "on", "off"
206
206
  siri_kit: "on", # Valid values: "on", "off"
207
- vpn_configuration: "on" # Valid values: "on", "off"
207
+ vpn_configuration: "on", # Valid values: "on", "off"
208
+ network_extension: "on", # Valid values: "on", "off"
209
+ hotspot: "on", # Valid values: "on", "off"
210
+ multipath: "on", # Valid values: "on", "off"
211
+ nfc_tag_reading: "on", # Valid values: "on", "off"
208
212
  }
209
213
  )
210
214
 
@@ -85,6 +85,10 @@ module Fastlane
85
85
  ]
86
86
  end
87
87
 
88
+ def self.return_type
89
+ :string
90
+ end
91
+
88
92
  def self.category
89
93
  :project
90
94
  end
@@ -66,6 +66,10 @@ module Fastlane
66
66
  ]
67
67
  end
68
68
 
69
+ def self.return_type
70
+ :string
71
+ end
72
+
69
73
  def self.category
70
74
  :project
71
75
  end
@@ -69,6 +69,10 @@ module Fastlane
69
69
  ]
70
70
  end
71
71
 
72
+ def self.return_type
73
+ :string
74
+ end
75
+
72
76
  def self.category
73
77
  :project
74
78
  end
@@ -44,6 +44,10 @@ module Fastlane
44
44
  ]
45
45
  end
46
46
 
47
+ def self.return_type
48
+ :string
49
+ end
50
+
47
51
  def self.category
48
52
  :source_control
49
53
  end
@@ -58,7 +58,11 @@ module Fastlane
58
58
  passbook: 'passbook',
59
59
  push_notification: 'push_notification',
60
60
  siri_kit: 'sirikit',
61
- vpn_configuration: 'vpn_conf'
61
+ vpn_configuration: 'vpn_conf',
62
+ network_extension: 'network_extension',
63
+ hotspot: 'hotspot',
64
+ multipath: 'multipath',
65
+ nfc_tag_reading: 'nfc_tag_reading'
62
66
  }
63
67
  end
64
68
 
@@ -38,15 +38,24 @@ module Fastlane
38
38
 
39
39
  return [notifier, slack_attachment] if Helper.is_test? # tests will verify the slack attachments and other properties
40
40
 
41
- result = notifier.ping '',
42
- icon_url: icon_url,
43
- attachments: [slack_attachment]
44
-
45
- if result.code.to_i == 200
46
- UI.success('Successfully sent Slack notification')
47
- else
48
- UI.verbose(result)
49
- UI.user_error!("Error pushing Slack message, maybe the integration has no permission to post on this channel? Try removing the channel parameter in your Fastfile, this is usually caused by a misspelled or changed group/channel name or an expired SLACK_URL")
41
+ begin
42
+ result = notifier.ping '',
43
+ icon_url: icon_url,
44
+ attachments: [slack_attachment]
45
+ rescue => exception
46
+ UI.error("Exception: #{exception}")
47
+ ensure
48
+ if !result.nil? && result.code.to_i == 200
49
+ UI.success('Successfully sent Slack notification')
50
+ else
51
+ UI.verbose(result) unless result.nil?
52
+ message = "Error pushing Slack message, maybe the integration has no permission to post on this channel? Try removing the channel parameter in your Fastfile, this is usually caused by a misspelled or changed group/channel name or an expired SLACK_URL"
53
+ if options[:fail_on_error]
54
+ UI.user_error!(message)
55
+ else
56
+ UI.error(message)
57
+ end
58
+ end
50
59
  end
51
60
  end
52
61
 
@@ -109,6 +118,12 @@ module Fastlane
109
118
  description: "Was this build successful? (true/false)",
110
119
  optional: true,
111
120
  default_value: true,
121
+ is_string: false),
122
+ FastlaneCore::ConfigItem.new(key: :fail_on_error,
123
+ env_name: "FL_SLACK_FAIL_ON_ERROR",
124
+ description: "Should an error sending the slack notification cause a failure? (true/false)",
125
+ optional: true,
126
+ default_value: true,
112
127
  is_string: false)
113
128
  ]
114
129
  end
@@ -79,11 +79,13 @@ module Fastlane
79
79
  file_content += autogen_version_warning_text_array
80
80
 
81
81
  file_content = file_content.join("\n")
82
- target_path = File.join(@target_output_path, "Fastlane.swift")
83
- File.write(target_path, file_content)
84
- UI.success(target_path)
82
+ fastlane_swift_api_path = File.join(@target_output_path, "Fastlane.swift")
83
+ File.write(fastlane_swift_api_path, file_content)
84
+ UI.success(fastlane_swift_api_path)
85
85
 
86
- generate_default_implementation_opening(tool_details: tool_details)
86
+ files_generated = [fastlane_swift_api_path]
87
+ files_generated += generate_default_implementations(tool_details: tool_details)
88
+ return files_generated
87
89
  end
88
90
 
89
91
  def write_lanefile(lanefile_implementation_opening: nil, class_name: nil, tool_name: nil)
@@ -102,23 +104,27 @@ module Fastlane
102
104
  disclaimer << ""
103
105
  disclaimer << ""
104
106
  disclaimer << "// Generated with fastlane #{Fastlane::VERSION}"
107
+ disclaimer << ""
105
108
 
106
109
  file_content = disclaimer.join("\n")
107
110
 
108
111
  target_path = File.join(@target_output_path, "#{class_name}.swift")
109
112
  File.write(target_path, file_content)
110
113
  UI.success(target_path)
114
+ return target_path
111
115
  end
112
116
 
113
- def generate_default_implementation_opening(tool_details: nil)
117
+ def generate_default_implementations(tool_details: nil)
118
+ files_generated = []
114
119
  tool_details.each do |tool_detail|
115
120
  lanefile_implementation_opening = "class #{tool_detail.swift_class}: #{tool_detail.swift_protocol} {"
116
- write_lanefile(
121
+ files_generated << write_lanefile(
117
122
  lanefile_implementation_opening: lanefile_implementation_opening,
118
123
  class_name: tool_detail.swift_class,
119
124
  tool_name: tool_detail.command_line_tool_name
120
125
  )
121
126
  end
127
+ return files_generated
122
128
  end
123
129
 
124
130
  def generate_lanefile_parsing_functions
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.70.1'.freeze
2
+ VERSION = '2.70.2'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -11,4 +11,4 @@ class Deliverfile: DeliverfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -1123,7 +1123,8 @@ func danger(useBundleExec: Bool = true,
1123
1123
  failOnErrors: Bool = false,
1124
1124
  newComment: Bool = false,
1125
1125
  base: String? = nil,
1126
- head: String? = nil) {
1126
+ head: String? = nil,
1127
+ pr: String? = nil) {
1127
1128
  let command = RubyCommand(commandID: "", methodName: "danger", className: nil, args: [RubyCommand.Argument(name: "use_bundle_exec", value: useBundleExec),
1128
1129
  RubyCommand.Argument(name: "verbose", value: verbose),
1129
1130
  RubyCommand.Argument(name: "danger_id", value: dangerId),
@@ -1132,7 +1133,8 @@ func danger(useBundleExec: Bool = true,
1132
1133
  RubyCommand.Argument(name: "fail_on_errors", value: failOnErrors),
1133
1134
  RubyCommand.Argument(name: "new_comment", value: newComment),
1134
1135
  RubyCommand.Argument(name: "base", value: base),
1135
- RubyCommand.Argument(name: "head", value: head)])
1136
+ RubyCommand.Argument(name: "head", value: head),
1137
+ RubyCommand.Argument(name: "pr", value: pr)])
1136
1138
  _ = runner.executeCommand(command)
1137
1139
  }
1138
1140
  func deleteKeychain(name: String? = nil,
@@ -1393,9 +1395,9 @@ func gcovr() {
1393
1395
  let command = RubyCommand(commandID: "", methodName: "gcovr", className: nil, args: [])
1394
1396
  _ = runner.executeCommand(command)
1395
1397
  }
1396
- func getBuildNumber(xcodeproj: String? = nil) {
1398
+ @discardableResult func getBuildNumber(xcodeproj: String? = nil) -> String {
1397
1399
  let command = RubyCommand(commandID: "", methodName: "get_build_number", className: nil, args: [RubyCommand.Argument(name: "xcodeproj", value: xcodeproj)])
1398
- _ = runner.executeCommand(command)
1400
+ return runner.executeCommand(command)
1399
1401
  }
1400
1402
  func getBuildNumberRepository(useHgRevisionNumber: Bool = false) {
1401
1403
  let command = RubyCommand(commandID: "", methodName: "get_build_number_repository", className: nil, args: [RubyCommand.Argument(name: "use_hg_revision_number", value: useHgRevisionNumber)])
@@ -1431,17 +1433,17 @@ func getGithubRelease(url: String,
1431
1433
  RubyCommand.Argument(name: "api_token", value: apiToken)])
1432
1434
  _ = runner.executeCommand(command)
1433
1435
  }
1434
- func getInfoPlistValue(key: String,
1435
- path: String) {
1436
+ @discardableResult func getInfoPlistValue(key: String,
1437
+ path: String) -> String {
1436
1438
  let command = RubyCommand(commandID: "", methodName: "get_info_plist_value", className: nil, args: [RubyCommand.Argument(name: "key", value: key),
1437
1439
  RubyCommand.Argument(name: "path", value: path)])
1438
- _ = runner.executeCommand(command)
1440
+ return runner.executeCommand(command)
1439
1441
  }
1440
- func getIpaInfoPlistValue(key: String,
1441
- ipa: String) {
1442
+ @discardableResult func getIpaInfoPlistValue(key: String,
1443
+ ipa: String) -> String {
1442
1444
  let command = RubyCommand(commandID: "", methodName: "get_ipa_info_plist_value", className: nil, args: [RubyCommand.Argument(name: "key", value: key),
1443
1445
  RubyCommand.Argument(name: "ipa", value: ipa)])
1444
- _ = runner.executeCommand(command)
1446
+ return runner.executeCommand(command)
1445
1447
  }
1446
1448
  func getProvisioningProfile(adhoc: Bool = false,
1447
1449
  development: Bool = false,
@@ -1525,9 +1527,9 @@ func gitAdd(path: String? = nil,
1525
1527
  RubyCommand.Argument(name: "pathspec", value: pathspec)])
1526
1528
  _ = runner.executeCommand(command)
1527
1529
  }
1528
- func gitBranch() {
1530
+ @discardableResult func gitBranch() -> String {
1529
1531
  let command = RubyCommand(commandID: "", methodName: "git_branch", className: nil, args: [])
1530
- _ = runner.executeCommand(command)
1532
+ return runner.executeCommand(command)
1531
1533
  }
1532
1534
  func gitCommit(path: String,
1533
1535
  message: String) {
@@ -2856,7 +2858,8 @@ func slack(message: String? = nil,
2856
2858
  payload: String = "{}",
2857
2859
  defaultPayloads: [String]? = nil,
2858
2860
  attachmentProperties: String = "{}",
2859
- success: Bool = true) {
2861
+ success: Bool = true,
2862
+ failOnError: Bool = true) {
2860
2863
  let command = RubyCommand(commandID: "", methodName: "slack", className: nil, args: [RubyCommand.Argument(name: "message", value: message),
2861
2864
  RubyCommand.Argument(name: "channel", value: channel),
2862
2865
  RubyCommand.Argument(name: "use_webhook_configured_username_and_icon", value: useWebhookConfiguredUsernameAndIcon),
@@ -2866,7 +2869,8 @@ func slack(message: String? = nil,
2866
2869
  RubyCommand.Argument(name: "payload", value: payload),
2867
2870
  RubyCommand.Argument(name: "default_payloads", value: defaultPayloads),
2868
2871
  RubyCommand.Argument(name: "attachment_properties", value: attachmentProperties),
2869
- RubyCommand.Argument(name: "success", value: success)])
2872
+ RubyCommand.Argument(name: "success", value: success),
2873
+ RubyCommand.Argument(name: "fail_on_error", value: failOnError)])
2870
2874
  _ = runner.executeCommand(command)
2871
2875
  }
2872
2876
  func slackTrain() {
@@ -11,4 +11,4 @@ class Gymfile: GymfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -11,4 +11,4 @@ class Matchfile: MatchfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -11,4 +11,4 @@ class Precheckfile: PrecheckfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -11,4 +11,4 @@ class Scanfile: ScanfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -11,4 +11,4 @@ class Screengrabfile: ScreengrabfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -11,4 +11,4 @@ class Snapshotfile: SnapshotfileProtocol {
11
11
 
12
12
 
13
13
 
14
- // Generated with fastlane 2.70.0
14
+ // Generated with fastlane 2.70.1
@@ -20,7 +20,7 @@ module FastlaneCore
20
20
  app_id_guesser = FastlaneCore::AppIdentifierGuesser.new(args: args)
21
21
  return self.new(
22
22
  action_name: action_name,
23
- p_hash: app_id_guesser.p_hash,
23
+ p_hash: app_id_guesser.p_hash || UNKNOWN_P_HASH,
24
24
  platform: app_id_guesser.platform,
25
25
  configuration_language: configuration_language
26
26
  )
@@ -163,14 +163,9 @@ module FastlaneCore
163
163
 
164
164
  self.config_file_name = config_file_name
165
165
 
166
- paths = []
167
- paths += Dir["./fastlane/#{self.config_file_name}"]
168
- paths += Dir["./.fastlane/#{self.config_file_name}"]
169
- paths += Dir["./#{self.config_file_name}"]
170
- paths += Dir["./fastlane_core/spec/fixtures/#{self.config_file_name}"] if Helper.is_test?
171
- return if paths.count == 0
166
+ path = FastlaneCore::Configuration.find_configuration_file_path(config_file_name: config_file_name)
167
+ return if path.nil?
172
168
 
173
- path = paths.first
174
169
  begin
175
170
  configuration_file = ConfigurationFile.new(self, path, block_for_missing, skip_printing_values)
176
171
  options = configuration_file.options
@@ -196,6 +191,16 @@ module FastlaneCore
196
191
  configuration_file
197
192
  end
198
193
 
194
+ def self.find_configuration_file_path(config_file_name: nil)
195
+ paths = []
196
+ paths += Dir["./fastlane/#{config_file_name}"]
197
+ paths += Dir["./.fastlane/#{config_file_name}"]
198
+ paths += Dir["./#{config_file_name}"]
199
+ paths += Dir["./fastlane_core/spec/fixtures/#{config_file_name}"] if Helper.is_test?
200
+ return nil if paths.count == 0
201
+ return paths.first
202
+ end
203
+
199
204
  #####################################################
200
205
  # @!group Actually using the class
201
206
  #####################################################
@@ -141,7 +141,7 @@ module FastlaneCore
141
141
  # @return the full path to the Xcode developer tools of the currently
142
142
  # running system
143
143
  def self.xcode_path
144
- return "" if self.is_test? and !self.is_mac?
144
+ return "" unless self.is_mac?
145
145
  `xcode-select -p`.delete("\n") + "/"
146
146
  end
147
147
 
@@ -1,5 +1,6 @@
1
1
  module FastlaneCore
2
2
  class IOSAppIdentifierGuesser
3
+ APP_ID_REGEX = /var\s*appIdentifier:\s*String\?{0,1}\s*\[?\]?\s*{\s*return\s*\[?\s*"(\s*[a-zA-Z.-]+\s*)"\s*\]?\s*}/
3
4
  class << self
4
5
  def guess_app_identifier_from_args(args)
5
6
  # args example: ["-a", "com.krausefx.app", "--team_id", "5AA97AAHK2"]
@@ -24,7 +25,7 @@ module FastlaneCore
24
25
  CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
25
26
  end
26
27
 
27
- def fetch_app_identifier_from_file(file_name)
28
+ def fetch_app_identifier_from_ruby_file(file_name)
28
29
  # we only care about the app_identifier item in the configuration file, so
29
30
  # build an options array & Configuration with just that one key and it will
30
31
  # be fetched if it is present in the config file
@@ -41,12 +42,52 @@ module FastlaneCore
41
42
  nil
42
43
  end
43
44
 
45
+ def fetch_app_identifier_from_swift_file(file_name)
46
+ swift_config_file_path = FastlaneCore::Configuration.find_configuration_file_path(config_file_name: file_name)
47
+ return nil if swift_config_file_path.nil?
48
+
49
+ # Deliverfile.swift, Snapfile.swift, Appfile.swift all look like:
50
+ # var appIdentifier: String? { return nil }
51
+ # var appIdentifier: String { return "" }
52
+
53
+ # Matchfile.swift is the odd one out
54
+ # var appIdentifier: [String] { return [] }
55
+ #
56
+
57
+ swift_config_file_path = File.expand_path(swift_config_file_path)
58
+ swift_config_content = File.read(swift_config_file_path)
59
+
60
+ swift_config_content.split("\n").reject(&:empty?).each do |line|
61
+ application_id = match_swift_application_id(text_line: line)
62
+ return application_id if application_id
63
+ end
64
+ return nil
65
+ rescue
66
+ # any option/file error here should just be treated as identifier not found
67
+ return nil
68
+ end
69
+
70
+ def match_swift_application_id(text_line: nil)
71
+ text_line.strip!
72
+ application_id_match = APP_ID_REGEX.match(text_line)
73
+ return application_id_match[1].strip if application_id_match
74
+
75
+ return nil
76
+ end
77
+
44
78
  def guess_app_identifier_from_config_files
45
79
  ["Deliverfile", "Gymfile", "Snapfile", "Matchfile"].each do |current|
46
- app_identifier = self.fetch_app_identifier_from_file(current)
80
+ app_identifier = self.fetch_app_identifier_from_ruby_file(current)
47
81
  return app_identifier if app_identifier
48
82
  end
49
- nil
83
+
84
+ # if we're swifty, let's look there
85
+ # this isn't the same list as above
86
+ ["Deliverfile.swift", "Snapfile.swift", "Appfile.swift", "Matchfile.swift"].each do |current|
87
+ app_identifier = self.fetch_app_identifier_from_swift_file(current)
88
+ return app_identifier if app_identifier
89
+ end
90
+ return nil
50
91
  end
51
92
 
52
93
  # make a best-guess for the app_identifier for this project, using most-reliable signals
@@ -29,7 +29,11 @@ module Produce
29
29
  passbook: [SERVICE_ON, SERVICE_OFF],
30
30
  push_notification: [SERVICE_ON, SERVICE_OFF],
31
31
  siri_kit: [SERVICE_ON, SERVICE_OFF],
32
- vpn_configuration: [SERVICE_ON, SERVICE_OFF]
32
+ vpn_configuration: [SERVICE_ON, SERVICE_OFF],
33
+ network_extension: [SERVICE_ON, SERVICE_OFF],
34
+ hotspot: [SERVICE_ON, SERVICE_OFF],
35
+ multipath: [SERVICE_ON, SERVICE_OFF],
36
+ nfc_tag_reading: [SERVICE_ON, SERVICE_OFF]
33
37
  }
34
38
 
35
39
  def run
@@ -34,7 +34,8 @@ module Produce
34
34
 
35
35
  def valid_services_for(options)
36
36
  allowed_keys = [:app_group, :apple_pay, :associated_domains, :data_protection, :game_center, :healthkit, :homekit,
37
- :wireless_conf, :icloud, :in_app_purchase, :inter_app_audio, :passbook, :push_notification, :sirikit, :vpn_conf]
37
+ :wireless_conf, :icloud, :in_app_purchase, :inter_app_audio, :passbook, :push_notification, :sirikit,
38
+ :vpn_conf, :network_extension, :hotspot, :multipath, :nfc_tag_reading]
38
39
  options.__hash__.select { |key, value| allowed_keys.include? key }
39
40
  end
40
41
 
@@ -210,6 +211,46 @@ module Produce
210
211
  end
211
212
  end
212
213
 
214
+ if options.network_extension
215
+ UI.message("\tNetwork Extension")
216
+
217
+ if on
218
+ app.update_service(Spaceship.app_service.network_extension.on)
219
+ else
220
+ app.update_service(Spaceship.app_service.network_extension.off)
221
+ end
222
+ end
223
+
224
+ if options.hotspot
225
+ UI.message("\tHotspot")
226
+
227
+ if on
228
+ app.update_service(Spaceship.app_service.hotspot.on)
229
+ else
230
+ app.update_service(Spaceship.app_service.hotspot.off)
231
+ end
232
+ end
233
+
234
+ if options.multipath
235
+ UI.message("\tMultipath")
236
+
237
+ if on
238
+ app.update_service(Spaceship.app_service.multipath.on)
239
+ else
240
+ app.update_service(Spaceship.app_service.multipath.off)
241
+ end
242
+ end
243
+
244
+ if options.nfc_tag_reading
245
+ UI.message("\tNFC Tag Reading")
246
+
247
+ if on
248
+ app.update_service(Spaceship.app_service.nfc_tag_reading.on)
249
+ else
250
+ app.update_service(Spaceship.app_service.nfc_tag_reading.off)
251
+ end
252
+ end
253
+
213
254
  updated
214
255
  end
215
256
 
@@ -58,6 +58,7 @@ enum SnapshotError: Error, CustomDebugStringConvertible {
58
58
  }
59
59
  }
60
60
 
61
+ @objcMembers
61
62
  open class Snapshot: NSObject {
62
63
  static var app: XCUIApplication!
63
64
  static var cacheDirectory: URL!
@@ -242,4 +243,4 @@ private extension CGFloat {
242
243
 
243
244
  // Please don't remove the lines below
244
245
  // They are used to detect outdated configuration files
245
- // SnapshotHelperVersion [1.7]
246
+ // SnapshotHelperVersion [1.8]
@@ -44,7 +44,7 @@ module Supply
44
44
  IMAGES_TYPES.each do |image_type|
45
45
  if ['featureGraphic'].include?(image_type)
46
46
  # we don't get all files in full resolution :(
47
- UI.message("Due to a limitation of the Google Play API, there is no way for `supply` to download your existing feature graphics. Please copy your feature graphics into `metadata/android/en-US/images/`")
47
+ UI.message("Due to a limitation of the Google Play API, there is no way for `supply` to download your existing feature graphic. Please copy your feature graphic to `metadata/android/en-US/images/featureGraphic.png`")
48
48
  next
49
49
  end
50
50
 
@@ -168,7 +168,7 @@ module Supply
168
168
  # - Lesser than the greatest of any later (i.e. production) track
169
169
  # - Or lesser than the currently being uploaded if it's in an earlier (i.e. alpha) track
170
170
  def check_superseded_tracks(apk_version_codes)
171
- UI.message("Checking superseded tracks...")
171
+ UI.message("Checking superseded tracks, uploading '#{apk_version_codes}' to '#{Supply.config[:track]}'...")
172
172
  max_apk_version_code = apk_version_codes.max
173
173
  max_tracks_version_code = nil
174
174
 
@@ -176,26 +176,27 @@ module Supply
176
176
  config_track_index = tracks.index(Supply.config[:track])
177
177
 
178
178
  tracks.each_index do |track_index|
179
- next if track_index.eql? config_track_index
180
179
  track = tracks[track_index]
181
-
182
180
  track_version_codes = client.track_version_codes(track).sort
181
+ UI.verbose("Found '#{track_version_codes}' on track '#{track}'")
182
+
183
+ next if track_index.eql? config_track_index
183
184
  next if track_version_codes.empty?
184
185
 
185
186
  if max_tracks_version_code.nil?
186
187
  max_tracks_version_code = track_version_codes.max
187
- else
188
- removed_version_codes = track_version_codes.take_while do |v|
189
- v < max_tracks_version_code || (v < max_apk_version_code && track_index > config_track_index)
190
- end
188
+ end
191
189
 
192
- unless removed_version_codes.empty?
193
- keep_version_codes = track_version_codes - removed_version_codes
194
- max_tracks_version_code = keep_version_codes[0] unless keep_version_codes.empty?
195
- client.update_track(track, 1.0, keep_version_codes)
196
- UI.message("Superseded track '#{track}', removed '#{removed_version_codes}'")
197
- end
190
+ removed_version_codes = track_version_codes.take_while do |v|
191
+ v < max_tracks_version_code || (v < max_apk_version_code && track_index > config_track_index)
198
192
  end
193
+
194
+ next if removed_version_codes.empty?
195
+
196
+ keep_version_codes = track_version_codes - removed_version_codes
197
+ max_tracks_version_code = keep_version_codes[0] unless keep_version_codes.empty?
198
+ client.update_track(track, 1.0, keep_version_codes)
199
+ UI.message("Superseded track '#{track}', removed '#{removed_version_codes}'")
199
200
  end
200
201
  end
201
202
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.70.1
4
+ version: 2.70.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2017-12-18 00:00:00.000000000 Z
18
+ date: 2017-12-20 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: slack-notifier
@@ -830,7 +830,6 @@ files:
830
830
  - deliver/lib/deliver/upload_screenshots.rb
831
831
  - fastlane/README.md
832
832
  - fastlane/lib/.DS_Store
833
- - fastlane/lib/assets/.DS_Store
834
833
  - fastlane/lib/assets/ActionDetails.md.erb
835
834
  - fastlane/lib/assets/Actions.md.erb
836
835
  - fastlane/lib/assets/AppfileTemplate
@@ -906,7 +905,6 @@ files:
906
905
  - fastlane/lib/fastlane/actions/deliver.rb
907
906
  - fastlane/lib/fastlane/actions/deploygate.rb
908
907
  - fastlane/lib/fastlane/actions/device_grid/README.md
909
- - fastlane/lib/fastlane/actions/docs/.DS_Store
910
908
  - fastlane/lib/fastlane/actions/docs/cert.md
911
909
  - fastlane/lib/fastlane/actions/docs/deliver.md
912
910
  - fastlane/lib/fastlane/actions/docs/frameit.md
@@ -1090,6 +1088,7 @@ files:
1090
1088
  - fastlane/lib/fastlane/fast_file.rb
1091
1089
  - fastlane/lib/fastlane/fastlane_require.rb
1092
1090
  - fastlane/lib/fastlane/features.rb
1091
+ - fastlane/lib/fastlane/helper/.DS_Store
1093
1092
  - fastlane/lib/fastlane/helper/README.md
1094
1093
  - fastlane/lib/fastlane/helper/adb_helper.rb
1095
1094
  - fastlane/lib/fastlane/helper/cocoapod_helper.rb
@@ -1188,8 +1187,10 @@ files:
1188
1187
  - fastlane/swift/SocketResponse.swift
1189
1188
  - fastlane/swift/main.swift
1190
1189
  - fastlane_core/README.md
1190
+ - fastlane_core/lib/.DS_Store
1191
1191
  - fastlane_core/lib/assets/XMLTemplate.xml.erb
1192
1192
  - fastlane_core/lib/fastlane_core.rb
1193
+ - fastlane_core/lib/fastlane_core/.DS_Store
1193
1194
  - fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb
1194
1195
  - fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb
1195
1196
  - fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb
@@ -1561,7 +1562,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1561
1562
  version: '0'
1562
1563
  requirements: []
1563
1564
  rubyforge_project:
1564
- rubygems_version: 2.6.10
1565
+ rubygems_version: 2.6.8
1565
1566
  signing_key:
1566
1567
  specification_version: 4
1567
1568
  summary: The easiest way to automate beta deployments and releases for your iOS and