branch_io_cli 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f34a0beb6001798fa4ca54e4b69ead8baaa811b313ef7166e6a03ff6d00fb51
4
- data.tar.gz: de7f72a71a6f61a893a1b89025d21caf2efa475c100590fda5a48cb3bd9dc838
3
+ metadata.gz: '091b67267f6d542453cd8903adf229f0caeec5b763b33ab2474c308a2bfcb6cb'
4
+ data.tar.gz: 421065a8099c0d6e1087c641dea2d303b21aab989e53f9ae3825ab58ccaeb8f2
5
5
  SHA512:
6
- metadata.gz: 4b3cb56a99bdafeb2dbb47f012a692da84ad37c3e8a836d908d6a0a3286dd91ea1a7669a3d21d42798ab859c8e3f16938a1599c69745834240d07ab29cb33cfa
7
- data.tar.gz: 3a3bc8dec22dd6ee83d84fc136b24eadf5a99448cddf73ecf02127ca4f6f44928ac6a04fca6ca1b6c5c06ab2e9e37e806f8da0d806cc9eeca2745d29191e7d1e
6
+ metadata.gz: 24ff573c11e248b4d9501e1e8d464d37980b3dc998e2150796979714be12c9d1a415946387a4cc8c1df86f532b8297b1e11a908c464cc712c5d8b6016d680890
7
+ data.tar.gz: 991c8328c42eaf101c7fa780b4b7e18150fd25db9237e0a97b0218f0ba7ca4a5a73af89cc4b3672765940753d832cb0c0f412234c9aa185a9c0b5fc514ba41ba
@@ -0,0 +1,16 @@
1
+ <% if is_new_method %>
2
+
3
+ -(void)didBecomeActiveWithConversation:(MSConversation *)conversation {
4
+ <% end %>
5
+ <% if use_conditional_test_key? %>
6
+ #ifdef DEBUG
7
+ [Branch setUseTestBranchKey:YES];
8
+ #endif // DEBUG
9
+ <% end %>
10
+ [[Branch getInstance] initSessionWithLaunchOptions:@{}
11
+ andRegisterDeepLinkHandlerUsingBranchUniversalObject:^(BranchUniversalObject *universalObject, BranchLinkProperties *linkProperties, NSError *error){
12
+ // TODO: Route Branch links
13
+ }];
14
+ <% if is_new_method %>
15
+ }
16
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <% if is_new_method %>
2
+ override func didBecomeActive(with conversation: MSConversation) {
3
+ <% end %>
4
+ <% if use_conditional_test_key? %>
5
+ #if DEBUG
6
+ Branch.setUseTestBranchKey(true)
7
+ #endif
8
+ <% end %>
9
+ Branch.getInstance().initSession(launchOptions: [:]) {
10
+ universalObject, linkProperties, error in
11
+
12
+ // TODO: Route Branch links
13
+ }
14
+ <% if is_new_method %>
15
+ }
16
+ <% end %>
@@ -0,0 +1,3 @@
1
+ regexp: '/^@implementation.*?\n/m'
2
+ mode: append
3
+ text_file: MessagesDidBecomeActive.m
@@ -0,0 +1,3 @@
1
+ regexp: '/class.*:\s+MSMessagesAppViewController\s*{\n/m'
2
+ mode: append
3
+ text_file: MessagesDidBecomeActive.swift
@@ -0,0 +1,3 @@
1
+ regexp: '/didBecomeActiveWithConversation.*?\{[^\n]*\n/m'
2
+ mode: append
3
+ text_file: MessagesDidBecomeActive.m
@@ -0,0 +1,3 @@
1
+ regexp: '/didBecomeActive\(with.*?\{[^\n]*\n/m'
2
+ mode: append
3
+ text_file: MessagesDidBecomeActive.swift
@@ -1,11 +1,17 @@
1
1
  module BranchIOCLI
2
2
  module Command
3
3
  class Command
4
- attr_reader :options
4
+ attr_reader :options # command-specific options from CLI
5
5
  attr_reader :config # command-specific configuration object
6
6
 
7
7
  def initialize(options)
8
8
  @options = options
9
+ matches = /BranchIOCLI::Command::(\w+)Command/.match self.class.name
10
+ root = matches[1]
11
+
12
+ @config = Object.const_get("BranchIOCLI")
13
+ .const_get("Configuration")
14
+ .const_get("#{root}Configuration").new options
9
15
  end
10
16
 
11
17
  def run!
@@ -1,31 +1,22 @@
1
- require "cocoapods-core"
2
- require "branch_io_cli/helper/methods"
3
- require "open3"
4
- require "plist"
5
- require "xcodeproj"
1
+ require "shellwords"
6
2
 
7
3
  module BranchIOCLI
8
4
  module Command
9
5
  class ReportCommand < Command
10
- def initialize(options)
11
- super
12
- @config = Configuration::ReportConfiguration.new options
13
- end
14
-
15
6
  def run!
16
7
  say "\n"
17
8
 
18
- unless load_settings_from_xcode
9
+ unless xcode_settings.valid?
19
10
  say "Failed to load settings from Xcode. Some information may be missing.\n"
20
11
  end
21
12
 
22
13
  if config.header_only
23
- say report_header
14
+ say report_helper.report_header
24
15
  exit 0
25
16
  end
26
17
 
27
18
  # Only if a Podfile is detected/supplied at the command line.
28
- if pod_install_required?
19
+ if config.pod_install_required?
29
20
  say "pod install required in order to build."
30
21
  install = ask %{Run "pod install" now (Y/n)? }
31
22
  if install.downcase =~ /^n/
@@ -52,33 +43,28 @@ EOF
52
43
 
53
44
  File.open config.report_path, "w" do |report|
54
45
  report.write "Branch.io Xcode build report v #{VERSION} #{DateTime.now}\n\n"
55
- report.write "#{report_configuration}\n"
56
- report.write "#{report_header}\n"
46
+ report.write "#{config.report_configuration}\n"
47
+ report.write "#{report_helper.report_header}\n"
57
48
 
58
49
  # run xcodebuild -list
59
- report.log_command "#{base_xcodebuild_cmd} -list"
50
+ report.log_command "#{report_helper.base_xcodebuild_cmd} -list"
60
51
 
61
52
  # If using a workspace, -list all the projects as well
62
53
  if config.workspace_path
63
54
  config.workspace.file_references.map(&:path).each do |project_path|
64
55
  path = File.join File.dirname(config.workspace_path), project_path
65
- report.log_command "xcodebuild -list -project #{path}"
56
+ report.log_command "xcodebuild -list -project #{Shellwords.escape path}"
66
57
  end
67
58
  end
68
59
 
69
- base_cmd = base_xcodebuild_cmd
60
+ base_cmd = report_helper.base_xcodebuild_cmd
70
61
  # Add more options for the rest of the commands
71
- base_cmd = "#{base_cmd} -scheme #{config.scheme}"
72
- base_cmd = "#{base_cmd} -configuration #{config.configuration} -sdk #{config.sdk}"
62
+ base_cmd += " -scheme #{Shellwords.escape config.scheme}"
63
+ base_cmd += " -configuration #{Shellwords.escape config.configuration}"
64
+ base_cmd += " -sdk #{Shellwords.escape config.sdk}"
73
65
 
74
66
  # xcodebuild -showBuildSettings
75
- report.write "$ #{base_cmd} -showBuildSettings\n\n"
76
- report.write @xcodebuild_showbuildsettings_output
77
- if @xcodebuild_showbuildsettings_status.success?
78
- report.write "Success.\n\n"
79
- else
80
- report.write "#{@xcodebuild_showbuildsettings_status}.\n\n"
81
- end
67
+ xcode_settings.log_xcodebuild_showbuildsettings report
82
68
 
83
69
  if config.clean
84
70
  say "Cleaning"
@@ -98,308 +84,8 @@ EOF
98
84
  Helper::ReportHelper
99
85
  end
100
86
 
101
- def base_xcodebuild_cmd
102
- cmd = "xcodebuild"
103
- if config.workspace_path
104
- cmd = "#{cmd} -workspace #{config.workspace_path}"
105
- else
106
- cmd = "#{cmd} -project #{config.xcodeproj_path}"
107
- end
108
- cmd
109
- end
110
-
111
- def branch_version
112
- version_from_podfile_lock ||
113
- version_from_cartfile_resolved ||
114
- version_from_branch_framework ||
115
- version_from_bnc_config_m
116
- end
117
-
118
- def requirement_from_podfile
119
- return nil unless config.podfile_path
120
- podfile = File.read config.podfile_path
121
- matches = /\n?\s*pod\s+("Branch"|'Branch').*?\n/m.match podfile
122
- matches ? matches[0].strip : nil
123
- end
124
-
125
- def requirement_from_cartfile
126
- return nil unless config.cartfile_path
127
- cartfile = File.read config.cartfile_path
128
- matches = %r{^git(hub\s+"|\s+"https://github.com/)BranchMetrics/(ios-branch-deep-linking|iOS-Deferred-Deep-Linking-SDK.*?).*?\n}m.match cartfile
129
- matches ? matches[0].strip : nil
130
- end
131
-
132
- def version_from_podfile_lock
133
- return nil unless config.podfile_path && File.exist?("#{config.podfile_path}.lock")
134
- podfile_lock = Pod::Lockfile.from_file Pathname.new "#{config.podfile_path}.lock"
135
- version = podfile_lock.version("Branch") || podfile_lock.version("Branch-SDK")
136
-
137
- version ? "#{version} [Podfile.lock]" : nil
138
- end
139
-
140
- def version_from_cartfile_resolved
141
- return nil unless config.cartfile_path && File.exist?("#{config.cartfile_path}.resolved")
142
- cartfile_resolved = File.read "#{config.cartfile_path}.resolved"
143
-
144
- # Matches:
145
- # git "https://github.com/BranchMetrics/ios-branch-deep-linking"
146
- # git "https://github.com/BranchMetrics/ios-branch-deep-linking/"
147
- # git "https://github.com/BranchMetrics/iOS-Deferred-Deep-Linking-SDK"
148
- # git "https://github.com/BranchMetrics/iOS-Deferred-Deep-Linking-SDK/"
149
- # github "BranchMetrics/ios-branch-deep-linking"
150
- # github "BranchMetrics/ios-branch-deep-linking/"
151
- # github "BranchMetrics/iOS-Deferred-Deep-Linking-SDK"
152
- # github "BranchMetrics/iOS-Deferred-Deep-Linking-SDK/"
153
- matches = %r{(ios-branch-deep-linking|iOS-Deferred-Deep-Linking-SDK)/?" "(\d+\.\d+\.\d+)"}m.match cartfile_resolved
154
- return nil unless matches
155
- version = matches[2]
156
- "#{version} [Cartfile.resolved]"
157
- end
158
-
159
- def version_from_branch_framework
160
- framework = config.target.frameworks_build_phase.files.find { |f| f.file_ref.path =~ /Branch.framework$/ }
161
- return nil unless framework
162
-
163
- if framework.file_ref.isa == "PBXFileReference"
164
- project_path = config.relative_path(config.xcodeproj_path)
165
- framework_path = framework.file_ref.real_path
166
- elsif framework.file_ref.isa == "PBXReferenceProxy" && @xcode_settings
167
- project_path = config.relative_path framework.file_ref.remote_ref.proxied_object.project.path
168
- framework_path = File.expand_path framework.file_ref.path, @xcode_settings[framework.file_ref.source_tree]
169
- end
170
- info_plist_path = File.join framework_path.to_s, "Info.plist"
171
- return nil unless File.exist? info_plist_path
172
-
173
- require "cfpropertylist"
174
-
175
- raw_info_plist = CFPropertyList::List.new file: info_plist_path
176
- info_plist = CFPropertyList.native_types raw_info_plist.value
177
- version = info_plist["CFBundleVersion"]
178
- return nil unless version
179
- "#{version} [Branch.framework/Info.plist:#{project_path}]"
180
- end
181
-
182
- def version_from_bnc_config_m(project = @config.xcodeproj)
183
- # Look for BNCConfig.m in embedded source
184
- bnc_config_m_ref = project.files.find { |f| f.path =~ /BNCConfig\.m$/ }
185
- unless bnc_config_m_ref
186
- subprojects = project.files.select { |f| f.path =~ /\.xcodeproj$/ }
187
- subprojects.each do |subproject|
188
- p = Xcodeproj::Project.open subproject.real_path
189
- version = version_from_bnc_config_m p
190
- return version if version
191
- end
192
- end
193
-
194
- return nil unless bnc_config_m_ref
195
- bnc_config_m = File.read bnc_config_m_ref.real_path
196
- matches = /BNC_SDK_VERSION\s+=\s+@"(\d+\.\d+\.\d+)"/m.match bnc_config_m
197
- return nil unless matches
198
- version = matches[1]
199
- "#{version} [BNCConfig.m:#{config.relative_path project.path}]"
200
- end
201
-
202
- def report_configuration
203
- <<EOF
204
- Configuration:
205
-
206
- Xcode workspace: #{config.workspace_path || '(none)'}
207
- Xcode project: #{config.xcodeproj_path || '(none)'}
208
- Scheme: #{config.scheme || '(none)'}
209
- Target: #{config.target || '(none)'}
210
- Configuration: #{config.configuration || '(none)'}
211
- SDK: #{config.sdk}
212
- Podfile: #{config.relative_path(config.podfile_path) || '(none)'}
213
- Cartfile: #{config.relative_path(config.cartfile_path) || '(none)'}
214
- Pod repo update: #{config.pod_repo_update.inspect}
215
- Clean: #{config.clean.inspect}
216
- EOF
217
- end
218
-
219
- def pod_install_required?
220
- # If this is set, its existence has been verified.
221
- return false unless config.podfile_path
222
-
223
- lockfile_path = "#{config.podfile_path}.lock"
224
- manifest_path = File.expand_path "../Pods/Manifest.lock", config.podfile_path
225
-
226
- return true unless File.exist?(lockfile_path) && File.exist?(manifest_path)
227
-
228
- lockfile = Pod::Lockfile.from_file Pathname.new lockfile_path
229
- manifest = Pod::Lockfile.from_file Pathname.new manifest_path
230
-
231
- # diff the contents of Podfile.lock and Pods/Manifest.lock
232
- # This is just what is done in the "[CP] Check Pods Manifest.lock" script build phase
233
- # in a project using CocoaPods.
234
- return true unless lockfile == manifest
235
-
236
- # compare checksum of Podfile with checksum in Podfile.lock
237
- # This is a good sanity check, but perhaps unnecessary. It means pod install
238
- # has not been run since the Podfile was modified, which is probably an oversight.
239
- return true unless lockfile.to_hash["PODFILE CHECKSUM"] == config.podfile.checksum
240
-
241
- false
242
- end
243
-
244
- # rubocop: disable Metrics/PerceivedComplexity
245
- def report_header
246
- header = "cocoapods-core: #{Pod::CORE_VERSION}\n"
247
-
248
- header += `xcodebuild -version`
249
- header += "SDK: #{@xcode_settings['SDK_NAME']}\n" if @xcode_settings
250
-
251
- bundle_identifier = helper.expanded_build_setting config.target, "PRODUCT_BUNDLE_IDENTIFIER", config.configuration
252
- dev_team = helper.expanded_build_setting config.target, "DEVELOPMENT_TEAM", config.configuration
253
- infoplist_path = helper.expanded_build_setting config.target, "INFOPLIST_FILE", config.configuration
254
- entitlements_path = helper.expanded_build_setting config.target, "CODE_SIGN_ENTITLEMENTS", config.configuration
255
-
256
- header += "\nTarget #{config.target.name}:\n"
257
- header += " Bundle identifier: #{bundle_identifier || '(none)'}\n"
258
- header += " Development team: #{dev_team || '(none)'}\n"
259
- header += " Deployment target: #{config.target.deployment_target}\n"
260
- header += " Modules #{config.modules_enabled? ? '' : 'not '}enabled\n"
261
- header += " Swift #{config.swift_version}\n" if config.swift_version
262
- header += " Bridging header: #{config.relative_path(config.bridging_header_path)}\n" if config.bridging_header_path
263
- header += " Info.plist: #{config.relative_path(infoplist_path) || '(none)'}\n"
264
- header += " Entitlements file: #{config.relative_path(entitlements_path) || '(none)'}\n"
265
-
266
- if config.podfile_path
267
- begin
268
- cocoapods_version = `pod --version`.chomp
269
- rescue Errno::ENOENT
270
- header += "\n(pod command not found)\n"
271
- end
272
-
273
- if File.exist?("#{config.podfile_path}.lock")
274
- podfile_lock = Pod::Lockfile.from_file Pathname.new "#{config.podfile_path}.lock"
275
- end
276
-
277
- if cocoapods_version || podfile_lock
278
- header += "\nUsing CocoaPods v. "
279
- if cocoapods_version
280
- header += "#{cocoapods_version} (CLI) "
281
- end
282
- if podfile_lock
283
- header += "#{podfile_lock.cocoapods_version} (Podfile.lock)"
284
- end
285
- header += "\n"
286
- end
287
-
288
- target_definition = config.podfile.target_definitions[config.target.name]
289
- if target_definition
290
- branch_deps = target_definition.dependencies.select { |p| p.name =~ %r{^(Branch|Branch-SDK)(/.*)?$} }
291
- header += "Podfile target #{target_definition.name}:"
292
- header += "\n use_frameworks!" if target_definition.uses_frameworks?
293
- header += "\n platform: #{target_definition.platform}"
294
- header += "\n build configurations: #{target_definition.build_configurations}"
295
- header += "\n inheritance: #{target_definition.inheritance}"
296
- branch_deps.each do |dep|
297
- header += "\n pod '#{dep.name}', '#{dep.requirement}'"
298
- header += ", #{dep.external_source}" if dep.external_source
299
- header += "\n"
300
- end
301
- else
302
- header += "Target #{config.target.name.inspect} not found in Podfile.\n"
303
- end
304
-
305
- header += "\npod install #{pod_install_required? ? '' : 'not '}required.\n"
306
- end
307
-
308
- if config.cartfile_path
309
- begin
310
- carthage_version = `carthage version`.chomp
311
- header += "\nUsing Carthage v. #{carthage_version}\n"
312
- rescue Errno::ENOENT
313
- header += "\n(carthage command not found)\n"
314
- end
315
- end
316
-
317
- cartfile_requirement = requirement_from_cartfile
318
- header += "\nFrom Cartfile:\n#{cartfile_requirement}\n" if cartfile_requirement
319
-
320
- version = branch_version
321
- if version
322
- header += "\nBranch SDK v. #{version}\n"
323
- else
324
- header += "\nBranch SDK not found.\n"
325
- end
326
-
327
- header += "\n#{branch_report}"
328
-
329
- header
330
- end
331
- # rubocop: enable Metrics/PerceivedComplexity
332
-
333
- # String containing information relevant to Branch setup
334
- def branch_report
335
- infoplist_path = helper.expanded_build_setting config.target, "INFOPLIST_FILE", config.configuration
336
- infoplist_path = File.expand_path infoplist_path, File.dirname(config.xcodeproj_path)
337
-
338
- report = "Branch configuration:\n"
339
-
340
- begin
341
- info_plist = File.open(infoplist_path) { |f| Plist.parse_xml f }
342
- branch_key = info_plist["branch_key"]
343
- report += " Branch key(s) (Info.plist):\n"
344
- if branch_key.kind_of? Hash
345
- branch_key.each_key do |key|
346
- resolved_key = helper.expand_build_settings branch_key[key], config.target, config.configuration
347
- report += " #{key.capitalize}: #{resolved_key}\n"
348
- end
349
- elsif branch_key
350
- resolved_key = helper.expand_build_settings branch_key, config.target, config.configuration
351
- report += " #{resolved_key}\n"
352
- else
353
- report += " (none found)\n"
354
- end
355
-
356
- branch_universal_link_domains = info_plist["branch_universal_link_domains"]
357
- if branch_universal_link_domains
358
- if branch_universal_link_domains.kind_of? Array
359
- report += " branch_universal_link_domains (Info.plist):\n"
360
- branch_universal_link_domains.each do |domain|
361
- report += " #{domain}\n"
362
- end
363
- else
364
- report += " branch_universal_link_domains (Info.plist): #{branch_universal_link_domains}\n"
365
- end
366
- end
367
- rescue StandardError => e
368
- report += " (Failed to open Info.plist: #{e.message})\n"
369
- end
370
-
371
- unless config.target.extension_target_type?
372
- begin
373
- domains = helper.domains_from_project config.configuration
374
- report += " Universal Link domains (entitlements):\n"
375
- domains.each do |domain|
376
- report += " #{domain}\n"
377
- end
378
- rescue StandardError => e
379
- report += " (Failed to get Universal Link domains from entitlements file: #{e.message})\n"
380
- end
381
- end
382
-
383
- report += report_helper.report_imports
384
-
385
- report
386
- end
387
-
388
- def load_settings_from_xcode
389
- cmd = "#{base_xcodebuild_cmd} -scheme #{config.scheme}"
390
- cmd += " -configuration #{config.configuration} -sdk #{config.sdk} -showBuildSettings"
391
- @xcodebuild_showbuildsettings_output = ""
392
- @xcode_settings = {}
393
- Open3.popen2e(cmd) do |stdin, output, thread|
394
- while (line = output.gets)
395
- @xcodebuild_showbuildsettings_output += line
396
- line.strip!
397
- next unless (matches = /^(.+)\s+=\s+(.+)$/.match line)
398
- @xcode_settings[matches[1]] = matches[2]
399
- end
400
- @xcodebuild_showbuildsettings_status = thread.value
401
- return @xcodebuild_showbuildsettings_status.success?
402
- end
87
+ def xcode_settings
88
+ Configuration::XcodeSettings.settings
403
89
  end
404
90
  end
405
91
  end
@@ -8,7 +8,6 @@ module BranchIOCLI
8
8
 
9
9
  def initialize(options)
10
10
  super
11
- @config = Configuration::SetupConfiguration.new options
12
11
  @keys = config.keys
13
12
  @domains = config.all_domains
14
13
  end
@@ -3,11 +3,6 @@ module BranchIOCLI
3
3
  class ValidateCommand < Command
4
4
  attr_reader :config
5
5
 
6
- def initialize(options)
7
- super
8
- @config = Configuration::ValidateConfiguration.new options
9
- end
10
-
11
6
  def run!
12
7
  valid = true
13
8
 
@@ -2,3 +2,4 @@ require "branch_io_cli/configuration/configuration"
2
2
  require "branch_io_cli/configuration/report_configuration"
3
3
  require "branch_io_cli/configuration/setup_configuration"
4
4
  require "branch_io_cli/configuration/validate_configuration"
5
+ require "branch_io_cli/configuration/xcode_settings"
@@ -13,7 +13,7 @@ module BranchIOCLI
13
13
  attr_reader :xcodeproj
14
14
  attr_reader :xcodeproj_path
15
15
  attr_reader :target
16
- attr_accessor :podfile
16
+ attr_reader :podfile
17
17
  attr_reader :podfile_path
18
18
  attr_reader :cartfile_path
19
19
  attr_reader :sdk_integration_mode
@@ -184,6 +184,31 @@ EOF
184
184
  end
185
185
  end
186
186
 
187
+ def pod_install_required?
188
+ # If this is set, its existence has been verified.
189
+ return false unless podfile_path
190
+
191
+ lockfile_path = "#{podfile_path}.lock"
192
+ manifest_path = File.expand_path "../Pods/Manifest.lock", podfile_path
193
+
194
+ return true unless File.exist?(lockfile_path) && File.exist?(manifest_path)
195
+
196
+ lockfile = Pod::Lockfile.from_file Pathname.new lockfile_path
197
+ manifest = Pod::Lockfile.from_file Pathname.new manifest_path
198
+
199
+ # diff the contents of Podfile.lock and Pods/Manifest.lock
200
+ # This is just what is done in the "[CP] Check Pods Manifest.lock" script build phase
201
+ # in a project using CocoaPods.
202
+ return true unless lockfile == manifest
203
+
204
+ # compare checksum of Podfile with checksum in Podfile.lock
205
+ # This is a good sanity check, but perhaps unnecessary. It means pod install
206
+ # has not been run since the Podfile was modified, which is probably an oversight.
207
+ return true unless lockfile.to_hash["PODFILE CHECKSUM"] == podfile.checksum
208
+
209
+ false
210
+ end
211
+
187
212
  def uses_frameworks?
188
213
  return nil unless podfile
189
214
  target_definition = podfile.target_definition_list.find { |t| t.name == target.name }
@@ -214,6 +239,26 @@ EOF
214
239
  app_delegate.file_ref.real_path.to_s
215
240
  end
216
241
 
242
+ def messages_view_controller_path
243
+ return nil unless target.symbol_type == :messages_extension
244
+
245
+ all_paths = target.source_build_phase.files.map { |f| f.file_ref.real_path.to_s }
246
+ swift_paths = all_paths.grep(/\.swift$/)
247
+
248
+ # We're looking for the @interface declaration for a class that inherits from
249
+ # MSMessagesAppViewController. The target probably doesn't have a headers
250
+ # build phase. Include all .ms from the source build phase and any .h
251
+ # with the same root.
252
+ objc_paths = all_paths.grep(/\.m$/)
253
+ objc_paths += objc_paths.map { |p| p.sub(/\.m$/, '.h') }.select { |f| File.exist? f }
254
+
255
+ path = swift_paths.find { |f| /class.*:\s+MSMessagesAppViewController\s*{\n/m.match_file f } ||
256
+ objc_paths.find { |f| /@interface.*:\s+MSMessagesAppViewController/.match_file f }
257
+
258
+ # If we found a .h, patch the corresponding .m.
259
+ path && path.sub(/\.h$/, '.m')
260
+ end
261
+
217
262
  # TODO: How many of these can vary by configuration?
218
263
 
219
264
  def modules_enabled?
@@ -245,7 +290,8 @@ EOF
245
290
  def branch_imports
246
291
  return @branch_imports if @branch_imports
247
292
 
248
- source_files = [app_delegate_swift_path, app_delegate_objc_path, bridging_header_path]
293
+ source_files = target.source_build_phase.files.map { |f| f.file_ref.real_path.to_s }
294
+ source_files << bridging_header_path if bridging_header_path
249
295
  @branch_imports = source_files.compact.map { |f| { f => branch_imports_from_file(f) } }.inject({}, :merge)
250
296
  @branch_imports
251
297
  end
@@ -1,3 +1,44 @@
1
+ require "plist"
2
+ require "xcodeproj"
3
+
4
+ module Xcodeproj
5
+ class Project
6
+ # Local override to allow for user schemes.
7
+ #
8
+ # Get list of shared and user schemes in project
9
+ #
10
+ # @param [String] path
11
+ # project path
12
+ #
13
+ # @return [Array]
14
+ #
15
+ def self.schemes(project_path)
16
+ base_dirs = [File.join(project_path, 'xcshareddata', 'xcschemes'),
17
+ File.join(project_path, 'xcuserdata', "#{ENV['USER']}.xcuserdatad", 'xcschemes')]
18
+
19
+ # Take any .xcscheme file from base_dirs
20
+ schemes = base_dirs.inject([]) { |memo, dir| memo + Dir[File.join dir, '*.xcscheme'] }
21
+ .map { |f| File.basename(f, '.xcscheme') }
22
+
23
+ # Include any scheme defined in the xcschememanagement.plist, if it exists.
24
+ base_dirs.map { |d| File.join d, 'xcschememanagement.plist' }
25
+ .select { |f| File.exist? f }.each do |plist_path|
26
+ plist = File.open(plist_path) { |f| ::Plist.parse_xml f }
27
+ scheme_user_state = plist["SchemeUserState"]
28
+ schemes += scheme_user_state.keys.map { |k| File.basename k, '.xcscheme' }
29
+ end
30
+
31
+ schemes.uniq!
32
+ if schemes.empty?
33
+ # Open the project, get all targets. Add one scheme per target.
34
+ project = self.open project_path
35
+ schemes += project.targets.reject(&:test_target_type?).map(&:name)
36
+ end
37
+ schemes
38
+ end
39
+ end
40
+ end
41
+
1
42
  module BranchIOCLI
2
43
  module Configuration
3
44
  class ReportConfiguration < Configuration
@@ -8,6 +49,10 @@ module BranchIOCLI
8
49
  attr_reader :report_path
9
50
  attr_reader :sdk
10
51
 
52
+ def xcode_settings
53
+ XcodeSettings.settings
54
+ end
55
+
11
56
  def validate_options
12
57
  @clean = options.clean
13
58
  @header_only = options.header_only
@@ -33,6 +78,24 @@ module BranchIOCLI
33
78
  validate_buildfile_path(options.cartfile, "Cartfile") if sdk_integration_mode.nil?
34
79
  end
35
80
 
81
+ # TODO: Collapse the following methods with support for formatting.
82
+ def report_configuration
83
+ <<EOF
84
+ Configuration:
85
+
86
+ Xcode workspace: #{workspace_path || '(none)'}
87
+ Xcode project: #{xcodeproj_path || '(none)'}
88
+ Scheme: #{scheme || '(none)'}
89
+ Target: #{target || '(none)'}
90
+ Configuration: #{configuration || '(none)'}
91
+ SDK: #{sdk}
92
+ Podfile: #{relative_path(podfile_path) || '(none)'}
93
+ Cartfile: #{relative_path(cartfile_path) || '(none)'}
94
+ Pod repo update: #{pod_repo_update.inspect}
95
+ Clean: #{clean.inspect}
96
+ EOF
97
+ end
98
+
36
99
  def log
37
100
  super
38
101
  say <<EOF
@@ -189,8 +252,7 @@ EOF
189
252
 
190
253
  unless scheme_path
191
254
  # Look for a local scheme
192
- user = @xcode_settings["USER"] if @xcode_settings
193
- user ||= ENV["USER"] || ENV["LOGNAME"]
255
+ user = ENV["USER"]
194
256
  xcuserdata_path = File.join project_path, "xcuserdata", "#{user}.xcuserdatad", "xcschemes", "#{@scheme}.xcscheme"
195
257
  scheme_path = xcuserdata_path if File.exist?(xcuserdata_path)
196
258
  end
@@ -222,6 +284,97 @@ EOF
222
284
 
223
285
  @configuration = xcscheme.launch_action.build_configuration
224
286
  end
287
+
288
+ def branch_version
289
+ version_from_podfile_lock ||
290
+ version_from_cartfile_resolved ||
291
+ version_from_branch_framework ||
292
+ version_from_bnc_config_m
293
+ end
294
+
295
+ def requirement_from_podfile
296
+ return nil unless podfile_path
297
+ podfile = File.read podfile_path
298
+ matches = /\n?\s*pod\s+("Branch"|'Branch').*?\n/m.match podfile
299
+ matches ? matches[0].strip : nil
300
+ end
301
+
302
+ def requirement_from_cartfile
303
+ return nil unless cartfile_path
304
+ cartfile = File.read cartfile_path
305
+ matches = %r{^git(hub\s+"|\s+"https://github.com/)BranchMetrics/(ios-branch-deep-linking|iOS-Deferred-Deep-Linking-SDK.*?).*?\n}m.match cartfile
306
+ matches ? matches[0].strip : nil
307
+ end
308
+
309
+ def version_from_podfile_lock
310
+ return nil unless podfile_path && File.exist?("#{podfile_path}.lock")
311
+ podfile_lock = Pod::Lockfile.from_file Pathname.new "#{podfile_path}.lock"
312
+ version = podfile_lock.version("Branch") || podfile_lock.version("Branch-SDK")
313
+
314
+ version ? "#{version} [Podfile.lock]" : nil
315
+ end
316
+
317
+ def version_from_cartfile_resolved
318
+ return nil unless cartfile_path && File.exist?("#{cartfile_path}.resolved")
319
+ cartfile_resolved = File.read "#{cartfile_path}.resolved"
320
+
321
+ # Matches:
322
+ # git "https://github.com/BranchMetrics/ios-branch-deep-linking"
323
+ # git "https://github.com/BranchMetrics/ios-branch-deep-linking/"
324
+ # git "https://github.com/BranchMetrics/iOS-Deferred-Deep-Linking-SDK"
325
+ # git "https://github.com/BranchMetrics/iOS-Deferred-Deep-Linking-SDK/"
326
+ # github "BranchMetrics/ios-branch-deep-linking"
327
+ # github "BranchMetrics/ios-branch-deep-linking/"
328
+ # github "BranchMetrics/iOS-Deferred-Deep-Linking-SDK"
329
+ # github "BranchMetrics/iOS-Deferred-Deep-Linking-SDK/"
330
+ matches = %r{(ios-branch-deep-linking|iOS-Deferred-Deep-Linking-SDK)/?" "(\d+\.\d+\.\d+)"}m.match cartfile_resolved
331
+ return nil unless matches
332
+ version = matches[2]
333
+ "#{version} [Cartfile.resolved]"
334
+ end
335
+
336
+ def version_from_branch_framework
337
+ framework = target.frameworks_build_phase.files.find { |f| f.file_ref.path =~ /Branch.framework$/ }
338
+ return nil unless framework
339
+
340
+ if framework.file_ref.isa == "PBXFileReference"
341
+ project_path = relative_path(config.xcodeproj_path)
342
+ framework_path = framework.file_ref.real_path
343
+ elsif framework.file_ref.isa == "PBXReferenceProxy" && xcode_settings
344
+ project_path = relative_path framework.file_ref.remote_ref.proxied_object.project.path
345
+ framework_path = File.expand_path framework.file_ref.path, xcode_settings[framework.file_ref.source_tree]
346
+ end
347
+ info_plist_path = File.join framework_path.to_s, "Info.plist"
348
+ return nil unless File.exist? info_plist_path
349
+
350
+ require "cfpropertylist"
351
+
352
+ raw_info_plist = CFPropertyList::List.new file: info_plist_path
353
+ info_plist = CFPropertyList.native_types raw_info_plist.value
354
+ version = info_plist["CFBundleVersion"]
355
+ return nil unless version
356
+ "#{version} [Branch.framework/Info.plist:#{project_path}]"
357
+ end
358
+
359
+ def version_from_bnc_config_m(project = xcodeproj)
360
+ # Look for BNCConfig.m in embedded source
361
+ bnc_config_m_ref = project.files.find { |f| f.path =~ /BNCConfig\.m$/ }
362
+ unless bnc_config_m_ref
363
+ subprojects = project.files.select { |f| f.path =~ /\.xcodeproj$/ }
364
+ subprojects.each do |subproject|
365
+ p = Xcodeproj::Project.open subproject.real_path
366
+ version = version_from_bnc_config_m p
367
+ return version if version
368
+ end
369
+ end
370
+
371
+ return nil unless bnc_config_m_ref
372
+ bnc_config_m = File.read bnc_config_m_ref.real_path
373
+ matches = /BNC_SDK_VERSION\s+=\s+@"(\d+\.\d+\.\d+)"/m.match bnc_config_m
374
+ return nil unless matches
375
+ version = matches[1]
376
+ "#{version} [BNCConfig.m:#{relative_path project.path}]"
377
+ end
225
378
  end
226
379
  end
227
380
  end
@@ -0,0 +1,66 @@
1
+ require "open3"
2
+ require "shellwords"
3
+
4
+ module BranchIOCLI
5
+ module Configuration
6
+ class XcodeSettings
7
+ class << self
8
+ def settings
9
+ return @settings if @settings
10
+ @settings = self.new
11
+ @settings
12
+ end
13
+ end
14
+
15
+ def initialize
16
+ load_settings_from_xcode
17
+ end
18
+
19
+ def valid?
20
+ @xcodebuild_showbuildsettings_status.success?
21
+ end
22
+
23
+ def config
24
+ Configuration.current
25
+ end
26
+
27
+ def [](key)
28
+ @xcode_settings[key]
29
+ end
30
+
31
+ def xcodebuild_cmd
32
+ cmd = "xcodebuild"
33
+ cmd = "#{cmd} -project #{Shellwords.escape config.xcodeproj_path}"
34
+ cmd += " -target #{Shellwords.escape config.target.name}"
35
+ cmd += " -configuration #{Shellwords.escape config.configuration}"
36
+ cmd += " -sdk #{Shellwords.escape config.sdk}"
37
+ cmd += " -showBuildSettings"
38
+ cmd
39
+ end
40
+
41
+ def load_settings_from_xcode
42
+ @xcodebuild_showbuildsettings_output = ""
43
+ @xcode_settings = {}
44
+ Open3.popen2e(xcodebuild_cmd) do |stdin, output, thread|
45
+ while (line = output.gets)
46
+ @xcodebuild_showbuildsettings_output += line
47
+ line.strip!
48
+ next unless (matches = /^(.+)\s+=\s+(.+)$/.match line)
49
+ @xcode_settings[matches[1]] = matches[2]
50
+ end
51
+ @xcodebuild_showbuildsettings_status = thread.value
52
+ end
53
+ end
54
+
55
+ def log_xcodebuild_showbuildsettings(report = STDOUT)
56
+ report.write "$ #{xcodebuild_cmd}\n\n"
57
+ report.write @xcodebuild_showbuildsettings_output
58
+ if valid?
59
+ report.write "Success.\n\n"
60
+ else
61
+ report.write "#{@xcodebuild_showbuildsettings_status}.\n\n"
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,7 +1,6 @@
1
1
  require "branch_io_cli/helper/android_helper"
2
2
  require "branch_io_cli/helper/ios_helper"
3
3
  require "net/http"
4
- require "pattern_patch"
5
4
  require "set"
6
5
 
7
6
  module BranchIOCLI
@@ -345,11 +345,13 @@ module BranchIOCLI
345
345
  if target_name
346
346
  target = project.targets.find { |t| t.name == target_name }
347
347
  raise "Target #{target} not found" if target.nil?
348
+ elsif config.respond_to?(:scheme) && project.targets.map(&:name).include?(config.scheme)
349
+ # Return a target with the same name as the scheme, if there is one.
350
+ target = project.targets.find { |t| t.name == config.scheme }
348
351
  else
349
352
  # find the first application target
350
- targets = project.targets.select { |t| !t.extension_target_type? && !t.test_target_type? }
351
- target = targets.find { |t| t.name == File.basename(project.path).sub(/\.xcodeproj$/, "") } || targets.first
352
- raise "No application target found" if target.nil?
353
+ target = project.targets.find { |t| t.name == File.basename(project.path, '.xcodeproj') } ||
354
+ project.targets.select { |t| !t.extension_target_type? && !t.test_target_type? }.first
353
355
  end
354
356
  target
355
357
  end
@@ -1,6 +1,13 @@
1
1
  module BranchIOCLI
2
2
  module Helper
3
- class CommandError < RuntimeError; end
3
+ class CommandError < RuntimeError
4
+ attr_reader :status
5
+ def initialize(args)
6
+ message, status = *args
7
+ super message
8
+ @status = status
9
+ end
10
+ end
4
11
 
5
12
  module Methods
6
13
  # Execute a shell command with reporting.
@@ -16,7 +23,7 @@ module BranchIOCLI
16
23
  # :output: [IO] An optional IO object to receive stdout and stderr from the command
17
24
  def sh(command, output = STDOUT)
18
25
  status = output.log_command command
19
- raise CommandError, %{Error executing "#{command}": #{status}.} unless status.success?
26
+ raise CommandError, [%{Error executing "#{command}": #{status}.}, status] unless status.success?
20
27
  end
21
28
  end
22
29
  end
@@ -185,6 +185,39 @@ module BranchIOCLI
185
185
  patch.apply app_delegate_objc_path
186
186
  end
187
187
 
188
+ def patch_messages_view_controller
189
+ path = config.messages_view_controller_path
190
+
191
+ patch_name = "messages_did_become_active_"
192
+ case path
193
+ when nil
194
+ return false
195
+ when /\.swift$/
196
+ return false if /branch.*initSession/m.match_file path
197
+
198
+ unless config.bridging_header_required?
199
+ load_patch(:swift_import).apply path
200
+ end
201
+
202
+ is_new_method = !/didBecomeActive\(with.*?\{[^\n]*\n/m.match_file(path)
203
+ patch_name += "#{is_new_method ? 'new_' : ''}swift"
204
+ else
205
+ return false if %r{^\s+#import\s+<Branch/Branch.h>|^\s+@import\s+Branch\s*;}.match_file(path)
206
+
207
+ load_patch(:objc_import).apply path
208
+
209
+ is_new_method = !/didBecomeActiveWithConversation.*?\{[^\n]*\n/m.match_file(path)
210
+ patch_name += "#{is_new_method ? 'new_' : ''}objc"
211
+ end
212
+
213
+ say "Patching #{path}"
214
+
215
+ load_patch(patch_name).apply path, binding: binding
216
+
217
+ helper.add_change(path)
218
+ true
219
+ end
220
+
188
221
  def patch_podfile(podfile_path)
189
222
  target_definition = config.podfile.target_definitions[config.target.name]
190
223
  raise "Target #{config.target.name} not found in Podfile" unless target_definition
@@ -238,6 +271,7 @@ module BranchIOCLI
238
271
  # is in Swift or Objective-C.
239
272
  patch_bridging_header if config.bridging_header_required?
240
273
  patch_app_delegate_swift(xcodeproj) || patch_app_delegate_objc(xcodeproj)
274
+ patch_messages_view_controller
241
275
  end
242
276
  end
243
277
  end
@@ -1,3 +1,5 @@
1
+ require "plist"
2
+ require "shellwords"
1
3
  require "branch_io_cli/configuration/configuration"
2
4
 
3
5
  module BranchIOCLI
@@ -17,6 +19,168 @@ module BranchIOCLI
17
19
  def config
18
20
  Configuration::Configuration.current
19
21
  end
22
+
23
+ def helper
24
+ Helper::BranchHelper
25
+ end
26
+
27
+ def xcode_settings
28
+ Configuration::XcodeSettings.settings
29
+ end
30
+
31
+ def base_xcodebuild_cmd
32
+ cmd = "xcodebuild"
33
+ if config.workspace_path
34
+ cmd = "#{cmd} -workspace #{Shellwords.escape config.workspace_path}"
35
+ else
36
+ cmd = "#{cmd} -project #{Shellwords.escape config.xcodeproj_path}"
37
+ end
38
+ cmd
39
+ end
40
+
41
+ # rubocop: disable Metrics/PerceivedComplexity
42
+ def report_header
43
+ header = "cocoapods-core: #{Pod::CORE_VERSION}\n"
44
+
45
+ header += `xcodebuild -version`
46
+ header += "SDK: #{xcode_settings['SDK_NAME']}\n" if xcode_settings
47
+
48
+ bundle_identifier = helper.expanded_build_setting config.target, "PRODUCT_BUNDLE_IDENTIFIER", config.configuration
49
+ dev_team = helper.expanded_build_setting config.target, "DEVELOPMENT_TEAM", config.configuration
50
+ infoplist_path = helper.expanded_build_setting config.target, "INFOPLIST_FILE", config.configuration
51
+ entitlements_path = helper.expanded_build_setting config.target, "CODE_SIGN_ENTITLEMENTS", config.configuration
52
+
53
+ header += "\nTarget #{config.target.name}:\n"
54
+ header += " Bundle identifier: #{bundle_identifier || '(none)'}\n"
55
+ header += " Development team: #{dev_team || '(none)'}\n"
56
+ header += " Deployment target: #{config.target.deployment_target}\n"
57
+ header += " Modules #{config.modules_enabled? ? '' : 'not '}enabled\n"
58
+ header += " Swift #{config.swift_version}\n" if config.swift_version
59
+ header += " Bridging header: #{config.relative_path(config.bridging_header_path)}\n" if config.bridging_header_path
60
+ header += " Info.plist: #{config.relative_path(infoplist_path) || '(none)'}\n"
61
+ header += " Entitlements file: #{config.relative_path(entitlements_path) || '(none)'}\n"
62
+
63
+ if config.podfile_path
64
+ begin
65
+ cocoapods_version = `pod --version`.chomp
66
+ rescue Errno::ENOENT
67
+ header += "\n(pod command not found)\n"
68
+ end
69
+
70
+ if File.exist?("#{config.podfile_path}.lock")
71
+ podfile_lock = Pod::Lockfile.from_file Pathname.new "#{config.podfile_path}.lock"
72
+ end
73
+
74
+ if cocoapods_version || podfile_lock
75
+ header += "\nUsing CocoaPods v. "
76
+ if cocoapods_version
77
+ header += "#{cocoapods_version} (CLI) "
78
+ end
79
+ if podfile_lock
80
+ header += "#{podfile_lock.cocoapods_version} (Podfile.lock)"
81
+ end
82
+ header += "\n"
83
+ end
84
+
85
+ target_definition = config.podfile.target_definitions[config.target.name]
86
+ if target_definition
87
+ branch_deps = target_definition.dependencies.select { |p| p.name =~ %r{^(Branch|Branch-SDK)(/.*)?$} }
88
+ header += "Podfile target #{target_definition.name}:"
89
+ header += "\n use_frameworks!" if target_definition.uses_frameworks?
90
+ header += "\n platform: #{target_definition.platform}"
91
+ header += "\n build configurations: #{target_definition.build_configurations}"
92
+ header += "\n inheritance: #{target_definition.inheritance}"
93
+ branch_deps.each do |dep|
94
+ header += "\n pod '#{dep.name}', '#{dep.requirement}'"
95
+ header += ", #{dep.external_source}" if dep.external_source
96
+ header += "\n"
97
+ end
98
+ else
99
+ header += "Target #{config.target.name.inspect} not found in Podfile.\n"
100
+ end
101
+
102
+ header += "\npod install #{config.pod_install_required? ? '' : 'not '}required.\n"
103
+ end
104
+
105
+ if config.cartfile_path
106
+ begin
107
+ carthage_version = `carthage version`.chomp
108
+ header += "\nUsing Carthage v. #{carthage_version}\n"
109
+ rescue Errno::ENOENT
110
+ header += "\n(carthage command not found)\n"
111
+ end
112
+ end
113
+
114
+ cartfile_requirement = config.requirement_from_cartfile
115
+ header += "\nFrom Cartfile:\n#{cartfile_requirement}\n" if cartfile_requirement
116
+
117
+ version = config.branch_version
118
+ if version
119
+ header += "\nBranch SDK v. #{version}\n"
120
+ else
121
+ header += "\nBranch SDK not found.\n"
122
+ end
123
+
124
+ header += "\n#{branch_report}"
125
+
126
+ header
127
+ end
128
+ # rubocop: enable Metrics/PerceivedComplexity
129
+
130
+ # String containing information relevant to Branch setup
131
+ def branch_report
132
+ infoplist_path = helper.expanded_build_setting config.target, "INFOPLIST_FILE", config.configuration
133
+ infoplist_path = File.expand_path infoplist_path, File.dirname(config.xcodeproj_path)
134
+
135
+ report = "Branch configuration:\n"
136
+
137
+ begin
138
+ info_plist = File.open(infoplist_path) { |f| Plist.parse_xml f }
139
+ branch_key = info_plist["branch_key"]
140
+ report += " Branch key(s) (Info.plist):\n"
141
+ if branch_key.kind_of? Hash
142
+ branch_key.each_key do |key|
143
+ resolved_key = helper.expand_build_settings branch_key[key], config.target, config.configuration
144
+ report += " #{key.capitalize}: #{resolved_key}\n"
145
+ end
146
+ elsif branch_key
147
+ resolved_key = helper.expand_build_settings branch_key, config.target, config.configuration
148
+ report += " #{resolved_key}\n"
149
+ else
150
+ report += " (none found)\n"
151
+ end
152
+
153
+ branch_universal_link_domains = info_plist["branch_universal_link_domains"]
154
+ if branch_universal_link_domains
155
+ if branch_universal_link_domains.kind_of? Array
156
+ report += " branch_universal_link_domains (Info.plist):\n"
157
+ branch_universal_link_domains.each do |domain|
158
+ report += " #{domain}\n"
159
+ end
160
+ else
161
+ report += " branch_universal_link_domains (Info.plist): #{branch_universal_link_domains}\n"
162
+ end
163
+ end
164
+ rescue StandardError => e
165
+ report += " (Failed to open Info.plist: #{e.message})\n"
166
+ end
167
+
168
+ unless config.target.extension_target_type?
169
+ begin
170
+ domains = helper.domains_from_project config.configuration
171
+ report += " Universal Link domains (entitlements):\n"
172
+ domains.each do |domain|
173
+ report += " #{domain}\n"
174
+ end
175
+ rescue StandardError => e
176
+ report += " (Failed to get Universal Link domains from entitlements file: #{e.message})\n"
177
+ end
178
+ end
179
+
180
+ report += report_imports
181
+
182
+ report
183
+ end
20
184
  end
21
185
  end
22
186
  end
@@ -1,3 +1,3 @@
1
1
  module BranchIOCLI
2
- VERSION = "0.9.7"
2
+ VERSION = "0.9.8"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: branch_io_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 0.9.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Branch
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-11-13 00:00:00.000000000 Z
12
+ date: 2017-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: CFPropertyList
@@ -256,6 +256,8 @@ files:
256
256
  - lib/assets/patches/ContinueUserActivityNew.swift
257
257
  - lib/assets/patches/DidFinishLaunching.m
258
258
  - lib/assets/patches/DidFinishLaunching.swift
259
+ - lib/assets/patches/MessagesDidBecomeActive.m
260
+ - lib/assets/patches/MessagesDidBecomeActive.swift
259
261
  - lib/assets/patches/OpenUrl.m
260
262
  - lib/assets/patches/OpenUrl.swift
261
263
  - lib/assets/patches/OpenUrlNew.m
@@ -271,6 +273,10 @@ files:
271
273
  - lib/assets/patches/did_finish_launching_new_swift.yml
272
274
  - lib/assets/patches/did_finish_launching_objc.yml
273
275
  - lib/assets/patches/did_finish_launching_swift.yml
276
+ - lib/assets/patches/messages_did_become_active_new_objc.yml
277
+ - lib/assets/patches/messages_did_become_active_new_swift.yml
278
+ - lib/assets/patches/messages_did_become_active_objc.yml
279
+ - lib/assets/patches/messages_did_become_active_swift.yml
274
280
  - lib/assets/patches/objc_import.yml
275
281
  - lib/assets/patches/objc_import_at_end.yml
276
282
  - lib/assets/patches/objc_import_include_guard.yml
@@ -293,6 +299,7 @@ files:
293
299
  - lib/branch_io_cli/configuration/report_configuration.rb
294
300
  - lib/branch_io_cli/configuration/setup_configuration.rb
295
301
  - lib/branch_io_cli/configuration/validate_configuration.rb
302
+ - lib/branch_io_cli/configuration/xcode_settings.rb
296
303
  - lib/branch_io_cli/core_ext.rb
297
304
  - lib/branch_io_cli/core_ext/io.rb
298
305
  - lib/branch_io_cli/core_ext/regexp.rb