branch_io_cli 0.9.4 → 0.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/assets/completions/completion.bash +1 -1
- data/lib/branch_io_cli/cli.rb +2 -3
- data/lib/branch_io_cli/command/report_command.rb +50 -10
- data/lib/branch_io_cli/configuration/report_configuration.rb +72 -9
- data/lib/branch_io_cli/helper/ios_helper.rb +8 -4
- data/lib/branch_io_cli/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd6157b41fc586526be77da254770b5d85163ec3288927bc61c0c57a56c33bc8
|
4
|
+
data.tar.gz: 79f2102c3254a3eabd933d9cd5b36a9504a86ec1a348fed55c02fbbbf1463dfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5b48cdb7b011c4a21a54f80455f0f6780d857d21592d368429079d32921b638b347e38e5eb7bc91eabacae731b033acffb6cc527652789c1dfd6025506ffab5
|
7
|
+
data.tar.gz: a7014ab71338528a7c40f11636ea9c31db09fca6a29ae8f3d8235427cd88512d660d5b30c2d2aa7a920ce6f59a03315bf6d87ae93aebd4b4e2335029560e29a1
|
data/README.md
CHANGED
@@ -229,10 +229,10 @@ report with additional diagnostic information suitable for opening a support tic
|
|
229
229
|
|--xcodeproj MyProject.xcodeproj|Path to an Xcode project|
|
230
230
|
|--target MyAppTarget|Name of a target to modify in the Xcode project|
|
231
231
|
|--scheme MyAppScheme|Name of a scheme to build|
|
232
|
-
|--configuration Debug/Release/CustomConfig|Name of a build configuration (default:
|
232
|
+
|--configuration Debug/Release/CustomConfig|Name of a build configuration (default: Scheme-dependent)|
|
233
233
|
|--sdk iphonesimulator|Name of an SDK to use with xcodebuild (default: iphonesimulator)|
|
234
234
|
|--[no-]clean|Clean before building (default: yes)|
|
235
|
-
|
235
|
+
|-H, --[no-]header-only|Show a diagnostic header and exit without cleaning or building (default: no)|
|
236
236
|
|--[no-]pod-repo-update|Update the local podspec repo before installing (default: yes)|
|
237
237
|
|--podfile /path/to/Podfile|Path to the Podfile for the project|
|
238
238
|
|--cartfile /path/to/Cartfile|Path to the Cartfile for the project|
|
@@ -18,7 +18,7 @@ _branch_io_complete()
|
|
18
18
|
|
19
19
|
validate_opts="$global_opts -D --domains --xcodeproj --target"
|
20
20
|
|
21
|
-
report_opts="$global_opts --xcodeproj --workspace --header-only --no-clean --scheme --target --configuration --sdk --out"
|
21
|
+
report_opts="$global_opts --xcodeproj --workspace -H --header-only --no-clean --scheme --target --configuration --sdk --out"
|
22
22
|
report_opts="$report_opts --podfile --cartfile --no-pod-repo-update"
|
23
23
|
|
24
24
|
if [[ ${cur} == -* ]] ; then
|
data/lib/branch_io_cli/cli.rb
CHANGED
@@ -162,12 +162,12 @@ EOF
|
|
162
162
|
c.option "--workspace MyProject.xcworkspace", String, "Path to an Xcode workspace"
|
163
163
|
c.option "--scheme MyProjectScheme", String, "A scheme from the project or workspace to build"
|
164
164
|
c.option "--target MyProjectTarget", String, "A target to build"
|
165
|
-
c.option "--configuration Debug|Release|CustomConfigName", String, "The build configuration to use (default:
|
165
|
+
c.option "--configuration Debug|Release|CustomConfigName", String, "The build configuration to use (default: Scheme-dependent)"
|
166
166
|
c.option "--sdk iphonesimulator", String, "Passed as -sdk to xcodebuild (default: iphonesimulator)"
|
167
167
|
c.option "--podfile /path/to/Podfile", String, "Path to the Podfile for the project"
|
168
168
|
c.option "--cartfile /path/to/Cartfile", String, "Path to the Cartfile for the project"
|
169
169
|
c.option "--[no-]clean", "Clean before attempting to build (default: yes)"
|
170
|
-
c.option "--[no-]header-only", "Write a report header to standard output and exit"
|
170
|
+
c.option "-H", "--[no-]header-only", "Write a report header to standard output and exit"
|
171
171
|
c.option "--[no-]pod-repo-update", "Update the local podspec repo before installing (default: yes)"
|
172
172
|
c.option "--out ./report.txt", String, "Report output path (default: ./report.txt)"
|
173
173
|
|
@@ -175,7 +175,6 @@ EOF
|
|
175
175
|
options.default(
|
176
176
|
clean: true,
|
177
177
|
header_only: false,
|
178
|
-
configuration: "Release",
|
179
178
|
sdk: "iphonesimulator",
|
180
179
|
out: "./report.txt",
|
181
180
|
pod_repo_update: true
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require "cocoapods-core"
|
2
2
|
require "branch_io_cli/helper/methods"
|
3
|
+
require "open3"
|
3
4
|
require "plist"
|
5
|
+
require "xcodeproj"
|
4
6
|
|
5
7
|
module BranchIOCLI
|
6
8
|
module Command
|
@@ -13,6 +15,10 @@ module BranchIOCLI
|
|
13
15
|
def run!
|
14
16
|
say "\n"
|
15
17
|
|
18
|
+
unless load_settings_from_xcode
|
19
|
+
say "Failed to load settings from Xcode. Some information may be missing.\n"
|
20
|
+
end
|
21
|
+
|
16
22
|
if config.header_only
|
17
23
|
say report_header
|
18
24
|
exit 0
|
@@ -61,15 +67,18 @@ EOF
|
|
61
67
|
end
|
62
68
|
|
63
69
|
base_cmd = base_xcodebuild_cmd
|
64
|
-
# Add -scheme option for the rest of the commands if using a workspace
|
65
|
-
base_cmd = "#{base_cmd} -scheme #{config.scheme}" if config.workspace_path
|
66
|
-
|
67
|
-
# xcodebuild -showBuildSettings
|
68
|
-
report.log_command "#{base_cmd} -showBuildSettings"
|
69
|
-
|
70
70
|
# Add more options for the rest of the commands
|
71
|
+
base_cmd = "#{base_cmd} -scheme #{config.scheme}"
|
71
72
|
base_cmd = "#{base_cmd} -configuration #{config.configuration} -sdk #{config.sdk}"
|
72
|
-
|
73
|
+
|
74
|
+
# 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
|
73
82
|
|
74
83
|
if config.clean
|
75
84
|
say "Cleaning"
|
@@ -146,7 +155,11 @@ EOF
|
|
146
155
|
def version_from_branch_framework
|
147
156
|
framework = config.target.frameworks_build_phase.files.find { |f| f.file_ref.path =~ /Branch.framework$/ }
|
148
157
|
return nil unless framework
|
149
|
-
|
158
|
+
if framework.file_ref.isa == "PBXFileReference"
|
159
|
+
framework_path = framework.file_ref.real_path
|
160
|
+
elsif framework.file_ref.isa == "PBXReferenceProxy" && @xcode_settings
|
161
|
+
framework_path = File.expand_path framework.file_ref.path, @xcode_settings[framework.file_ref.source_tree]
|
162
|
+
end
|
150
163
|
info_plist_path = File.join framework_path.to_s, "Info.plist"
|
151
164
|
return nil unless File.exist? info_plist_path
|
152
165
|
|
@@ -158,9 +171,18 @@ EOF
|
|
158
171
|
version ? "#{version} [Branch.framework/Info.plist]" : nil
|
159
172
|
end
|
160
173
|
|
161
|
-
def version_from_bnc_config_m
|
174
|
+
def version_from_bnc_config_m(project = @config.xcodeproj)
|
162
175
|
# Look for BNCConfig.m in embedded source
|
163
|
-
bnc_config_m_ref =
|
176
|
+
bnc_config_m_ref = project.files.find { |f| f.path =~ /BNCConfig\.m$/ }
|
177
|
+
unless bnc_config_m_ref
|
178
|
+
subprojects = project.files.select { |f| f.path =~ /\.xcodeproj$/ }
|
179
|
+
subprojects.each do |subproject|
|
180
|
+
p = Xcodeproj::Project.open subproject.real_path
|
181
|
+
version = version_from_bnc_config_m p
|
182
|
+
return version if version
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
164
186
|
return nil unless bnc_config_m_ref
|
165
187
|
bnc_config_m = File.read bnc_config_m_ref.real_path
|
166
188
|
matches = /BNC_SDK_VERSION\s+=\s+@"(\d+\.\d+\.\d+)"/m.match bnc_config_m
|
@@ -216,6 +238,7 @@ EOF
|
|
216
238
|
header = "cocoapods-core: #{Pod::CORE_VERSION}\n"
|
217
239
|
|
218
240
|
header += `xcodebuild -version`
|
241
|
+
header += "SDK: #{@xcode_settings['SDK_NAME']}\n" if @xcode_settings
|
219
242
|
|
220
243
|
bundle_identifier = helper.expanded_build_setting config.target, "PRODUCT_BUNDLE_IDENTIFIER", config.configuration
|
221
244
|
dev_team = helper.expanded_build_setting config.target, "DEVELOPMENT_TEAM", config.configuration
|
@@ -348,6 +371,23 @@ EOF
|
|
348
371
|
|
349
372
|
report
|
350
373
|
end
|
374
|
+
|
375
|
+
def load_settings_from_xcode
|
376
|
+
cmd = "#{base_xcodebuild_cmd} -scheme #{config.scheme}"
|
377
|
+
cmd += " -configuration #{config.configuration} -sdk #{config.sdk} -showBuildSettings"
|
378
|
+
@xcodebuild_showbuildsettings_output = ""
|
379
|
+
@xcode_settings = {}
|
380
|
+
Open3.popen2e(cmd) do |stdin, output, thread|
|
381
|
+
while (line = output.gets)
|
382
|
+
@xcodebuild_showbuildsettings_output += line
|
383
|
+
line.strip!
|
384
|
+
next unless (matches = /^(.+)\s+=\s+(.+)$/.match line)
|
385
|
+
@xcode_settings[matches[1]] = matches[2]
|
386
|
+
end
|
387
|
+
@xcodebuild_showbuildsettings_status = thread.value
|
388
|
+
return @xcodebuild_showbuildsettings_status.success?
|
389
|
+
end
|
390
|
+
end
|
351
391
|
end
|
352
392
|
end
|
353
393
|
end
|
@@ -13,14 +13,14 @@ module BranchIOCLI
|
|
13
13
|
@header_only = options.header_only
|
14
14
|
@scheme = options.scheme
|
15
15
|
@target = options.target
|
16
|
-
@configuration = options.configuration
|
17
16
|
@report_path = options.out
|
18
17
|
@sdk = options.sdk
|
19
18
|
@pod_repo_update = options.pod_repo_update
|
20
19
|
|
21
20
|
validate_xcodeproj_and_workspace options
|
22
|
-
validate_target options
|
23
21
|
validate_scheme options
|
22
|
+
validate_target options
|
23
|
+
validate_configuration options
|
24
24
|
|
25
25
|
# If neither --podfile nor --cartfile is present, arbitrarily look for a Podfile
|
26
26
|
# first.
|
@@ -132,24 +132,32 @@ EOF
|
|
132
132
|
|
133
133
|
def validate_scheme(options)
|
134
134
|
schemes = all_schemes
|
135
|
-
|
135
|
+
|
136
136
|
if options.scheme && schemes.include?(options.scheme)
|
137
137
|
@scheme = options.scheme
|
138
138
|
elsif schemes.count == 1
|
139
139
|
@scheme = schemes.first
|
140
|
+
say "Scheme #{options.scheme} not found. Using #{@scheme}." if options.scheme
|
140
141
|
elsif !schemes.empty?
|
141
|
-
# By default, take a scheme with the same name as the
|
142
|
-
return if (@scheme = schemes.find { |s| s ==
|
142
|
+
# By default, take a scheme with the same name as the project name.
|
143
|
+
return if !options.scheme && (@scheme = schemes.find { |s| s == File.basename(xcodeproj_path, '.xcodeproj') })
|
143
144
|
|
144
|
-
|
145
|
-
|
146
|
-
|
145
|
+
@scheme = choose do |menu|
|
146
|
+
menu.header = "Schemes from project"
|
147
|
+
schemes.each { |s| menu.choice s }
|
148
|
+
menu.prompt = "Please choose one of the schemes above. "
|
147
149
|
end
|
148
|
-
exit 1
|
149
150
|
else
|
150
151
|
say "No scheme defined in project."
|
151
152
|
exit(-1)
|
152
153
|
end
|
154
|
+
|
155
|
+
return if options.target || xcscheme.nil?
|
156
|
+
|
157
|
+
# Find the target used when running the scheme if the user didn't specify one.
|
158
|
+
# This will be picked up in #validate_target
|
159
|
+
entry = xcscheme.build_action.entries.select(&:build_for_running?).first
|
160
|
+
options.target = entry.buildable_references.first.target_name
|
153
161
|
end
|
154
162
|
|
155
163
|
def all_schemes
|
@@ -159,6 +167,61 @@ EOF
|
|
159
167
|
Xcodeproj::Project.schemes xcodeproj_path
|
160
168
|
end
|
161
169
|
end
|
170
|
+
|
171
|
+
def xcscheme
|
172
|
+
return @xcscheme if @xcscheme_checked
|
173
|
+
# This may not exist. If it comes back nil once, don't keep checking.
|
174
|
+
@xcscheme_checked = true
|
175
|
+
@xcscheme = scheme_with_name @scheme
|
176
|
+
@xcscheme
|
177
|
+
end
|
178
|
+
|
179
|
+
def scheme_with_name(scheme_name)
|
180
|
+
if workspace_path
|
181
|
+
project_path = workspace.schemes[@scheme]
|
182
|
+
else
|
183
|
+
project_path = xcodeproj_path
|
184
|
+
end
|
185
|
+
|
186
|
+
# Look for a shared scheme.
|
187
|
+
xcshareddata_path = File.join project_path, "xcshareddata", "xcschemes", "#{@scheme}.xcscheme"
|
188
|
+
scheme_path = xcshareddata_path if File.exist?(xcshareddata_path)
|
189
|
+
|
190
|
+
unless scheme_path
|
191
|
+
# Look for a local scheme
|
192
|
+
user = @xcode_settings["USER"] if @xcode_settings
|
193
|
+
user ||= ENV["USER"] || ENV["LOGNAME"]
|
194
|
+
xcuserdata_path = File.join project_path, "xcuserdata", "#{user}.xcuserdatad", "xcschemes", "#{@scheme}.xcscheme"
|
195
|
+
scheme_path = xcuserdata_path if File.exist?(xcuserdata_path)
|
196
|
+
end
|
197
|
+
|
198
|
+
return nil unless scheme_path
|
199
|
+
|
200
|
+
Xcodeproj::XCScheme.new(scheme_path)
|
201
|
+
end
|
202
|
+
|
203
|
+
def validate_configuration(options)
|
204
|
+
all_configs = xcodeproj.build_configurations.map(&:name)
|
205
|
+
|
206
|
+
if options.configuration && all_configs.include?(options.configuration)
|
207
|
+
@configuration = options.configuration
|
208
|
+
elsif options.configuration
|
209
|
+
say "Configuration #{options.configuration} not found."
|
210
|
+
@configuration = choose do |menu|
|
211
|
+
menu.header = "Configurations from project"
|
212
|
+
all_configs.each { |c| menu.choice c }
|
213
|
+
menu.prompt = "Please choose one of the above. "
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
return if @configuration
|
218
|
+
|
219
|
+
@configuration = "Debug" # Usual default for the launch action
|
220
|
+
|
221
|
+
return unless xcscheme
|
222
|
+
|
223
|
+
@configuration = xcscheme.launch_action.build_configuration
|
224
|
+
end
|
162
225
|
end
|
163
226
|
end
|
164
227
|
end
|
@@ -375,18 +375,22 @@ module BranchIOCLI
|
|
375
375
|
setting_value = target.resolved_build_setting(setting_name)[configuration]
|
376
376
|
return if setting_value.nil?
|
377
377
|
|
378
|
+
expand_build_settings setting_value, target, configuration
|
379
|
+
end
|
380
|
+
|
381
|
+
def expand_build_settings(string, target, configuration)
|
378
382
|
search_position = 0
|
379
|
-
while (matches = /\$\(([^(){}]*)\)|\$\{([^(){}]*)\}/.match(
|
383
|
+
while (matches = /\$\(([^(){}]*)\)|\$\{([^(){}]*)\}/.match(string, search_position))
|
380
384
|
macro_name = matches[1] || matches[2]
|
381
|
-
search_position =
|
385
|
+
search_position = string.index(macro_name) - 2
|
382
386
|
|
383
387
|
expanded_macro = macro_name == "SRCROOT" ? "." : expanded_build_setting(target, macro_name, configuration)
|
384
388
|
search_position += macro_name.length + 3 and next if expanded_macro.nil?
|
385
389
|
|
386
|
-
|
390
|
+
string.gsub!(/\$\(#{macro_name}\)|\$\{#{macro_name}\}/, expanded_macro)
|
387
391
|
search_position += expanded_macro.length
|
388
392
|
end
|
389
|
-
|
393
|
+
string
|
390
394
|
end
|
391
395
|
|
392
396
|
def add_cocoapods(options)
|
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.
|
4
|
+
version: 0.9.5
|
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-
|
12
|
+
date: 2017-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: CFPropertyList
|