Skip to content

Commit 4327379

Browse files
authored
Add command to configure project for order files (#7)
1 parent fa41ddb commit 4327379

File tree

8 files changed

+512
-1
lines changed

8 files changed

+512
-1
lines changed

emerge_cli.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
3636
spec.add_dependency 'open3', '~> 0.2.1'
3737
spec.add_dependency 'tty-prompt', '~> 0.23.1'
3838
spec.add_dependency 'tty-table', '~> 0.12.0'
39+
spec.add_dependency 'xcodeproj', '~> 1.27.0'
3940

4041
spec.add_development_dependency 'minitest', '~> 5.25.1'
4142
spec.add_development_dependency 'minitest-reporters', '~> 1.7.1'
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
require 'xcodeproj'
2+
3+
module EmergeCLI
4+
module Commands
5+
module Config
6+
class OrderFilesIOS < EmergeCLI::Commands::GlobalOptions
7+
desc 'Configure order files for iOS'
8+
9+
# Optional options
10+
option :skip_download_script, type: :boolean, required: false, desc: 'Only enable linkmaps'
11+
option :project_path, type: :string, required: false,
12+
desc: 'Path to the xcode project (will use first found if not provided)'
13+
14+
# Constants
15+
LINK_MAPS_CONFIG = 'LD_GENERATE_MAP_FILE'.freeze
16+
LINK_MAPS_PATH = 'LD_MAP_FILE_PATH'.freeze
17+
PATH_TO_LINKMAP = '$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt'.freeze
18+
ORDER_FILE = 'ORDER_FILE'.freeze
19+
ORDER_FILE_PATH = '$(PROJECT_DIR)/orderfiles/orderfile.txt'.freeze
20+
21+
def initialize; end
22+
23+
def call(**options)
24+
@options = options
25+
before(options)
26+
27+
if @options[:project_path]
28+
project = Xcodeproj::Project.open(@options[:project_path])
29+
else
30+
project = Xcodeproj::Project.open(Dir.glob('*.xcodeproj').first)
31+
Logger.warn 'No project path provided, using first found xcodeproj in current directory'
32+
end
33+
34+
enable_linkmaps(project)
35+
36+
add_order_files_download_script(project) unless @options[:skip_download_script]
37+
38+
project.save
39+
end
40+
41+
private
42+
43+
def enable_linkmaps(project)
44+
Logger.info 'Enabling Linkmaps'
45+
project.targets.each do |target|
46+
# Only do it for app targets
47+
next unless target.product_type == 'com.apple.product-type.application'
48+
49+
Logger.info " Target: #{target.name}"
50+
target.build_configurations.each do |config|
51+
config.build_settings[LINK_MAPS_CONFIG] = 'YES'
52+
config.build_settings[LINK_MAPS_PATH] = PATH_TO_LINKMAP
53+
end
54+
end
55+
end
56+
57+
def add_order_files_download_script(project)
58+
Logger.info 'Adding order files download script'
59+
project.targets.each do |target|
60+
# Only do it for app targets
61+
next unless target.product_type == 'com.apple.product-type.application'
62+
63+
Logger.info " Target: #{target.name}"
64+
65+
# Create the script phase if it doesn't exist
66+
phase = target.shell_script_build_phases.find { |item| item.name == 'EmergeTools Download Order Files' }
67+
if phase.nil?
68+
Logger.info " Creating script 'EmergeTools Download Order Files'"
69+
phase = target.new_shell_script_build_phase('EmergeTools Download Order Files')
70+
phase.shell_script = <<~BASH
71+
if [ "$CONFIGURATION" != "Release" ]; then
72+
echo "Skipping script for non-Release build"
73+
exit 0
74+
fi
75+
76+
if curl --fail "https://order-files-prod.emergetools.com/$PRODUCT_BUNDLE_IDENTIFIER/$MARKETING_VERSION" \
77+
-H "X-API-Token: $EMERGE_API_TOKEN" -o ORDER_FILE.gz ; then
78+
mkdir -p "$PROJECT_DIR/orderfiles"
79+
gunzip -c ORDER_FILE.gz > $PROJECT_DIR/orderfiles/orderfile.txt
80+
else
81+
echo "cURL request failed. Creating an empty file."
82+
mkdir -p "$PROJECT_DIR/orderfiles"
83+
touch "$PROJECT_DIR/orderfiles/orderfile.txt"
84+
fi;
85+
BASH
86+
phase.output_paths = ['$(PROJECT_DIR)/orderfiles/orderfile.txt']
87+
else
88+
Logger.info " 'EmergeTools Download Order Files' already exists"
89+
end
90+
# Make sure it is the first build phase
91+
target.build_phases.move(phase, 0)
92+
93+
target.build_configurations.each do |config|
94+
config.build_settings[ORDER_FILE] = ORDER_FILE_PATH
95+
end
96+
end
97+
end
98+
end
99+
end
100+
end
101+
end

lib/emerge_cli.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require_relative './commands/upload/snapshots/client_libraries/default'
66
require_relative './commands/integrate/fastlane'
77
require_relative './commands/config/snapshots/snapshots_ios'
8+
require_relative './commands/config/orderfiles/orderfiles_ios'
89

910
require_relative './utils/git_info_provider'
1011
require_relative './utils/git_result'
@@ -29,7 +30,8 @@ module EmergeCLI
2930
end
3031

3132
register 'configure' do |prefix|
32-
prefix.register 'snapshots-ios', Commands::Config::SnapshotsIOS, aliases: ['c']
33+
prefix.register 'snapshots-ios', Commands::Config::SnapshotsIOS
34+
prefix.register 'order-files-ios', Commands::Config::OrderFilesIOS
3335
end
3436
end
3537

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
require 'test_helper'
2+
3+
module EmergeCLI
4+
module Commands
5+
module Config
6+
class OrderFilesIOSTest < Minitest::Test
7+
LINK_MAPS_CONFIG = 'LD_GENERATE_MAP_FILE'.freeze
8+
LINK_MAPS_PATH = 'LD_MAP_FILE_PATH'.freeze
9+
PATH_TO_LINKMAP = '$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt'.freeze
10+
ORDER_FILE = 'ORDER_FILE'.freeze
11+
ORDER_FILE_PATH = '$(PROJECT_DIR)/orderfiles/orderfile.txt'.freeze
12+
13+
def setup
14+
@command = EmergeCLI::Commands::Config::OrderFilesIOS.new
15+
16+
FileUtils.mkdir_p('tmp/test_orderfiles')
17+
FileUtils.cp_r('test/test_files/ExampleApp.xcodeproj', 'tmp/test_orderfiles/ExampleApp.xcodeproj')
18+
end
19+
20+
def teardown
21+
FileUtils.rm_rf('tmp/test_orderfiles')
22+
end
23+
24+
def test_linkmaps_are_enabled_and_orderfiles_are_downloaded
25+
options = {
26+
project_path: 'tmp/test_orderfiles/ExampleApp.xcodeproj'
27+
}
28+
29+
@command.call(**options)
30+
31+
project = Xcodeproj::Project.open('tmp/test_orderfiles/ExampleApp.xcodeproj')
32+
33+
project.targets[0].build_configurations.each do |config|
34+
assert_equal PATH_TO_LINKMAP, config.build_settings[LINK_MAPS_PATH]
35+
assert_equal 'YES', config.build_settings[LINK_MAPS_CONFIG]
36+
assert_equal ORDER_FILE_PATH, config.build_settings[ORDER_FILE]
37+
end
38+
39+
phase = project.targets[0].shell_script_build_phases.find do |item|
40+
item.name == 'EmergeTools Download Order Files'
41+
end
42+
assert_equal ORDER_FILE_PATH, phase.output_paths[0]
43+
end
44+
45+
def test_linkmaps_are_enabled_only
46+
options = {
47+
project_path: 'tmp/test_orderfiles/ExampleApp.xcodeproj',
48+
skip_download_script: true
49+
}
50+
51+
@command.call(**options)
52+
53+
project = Xcodeproj::Project.open('tmp/test_orderfiles/ExampleApp.xcodeproj')
54+
55+
project.targets[0].build_configurations.each do |config|
56+
assert_equal PATH_TO_LINKMAP, config.build_settings[LINK_MAPS_PATH]
57+
assert_equal 'YES', config.build_settings[LINK_MAPS_CONFIG]
58+
refute_equal ORDER_FILE_PATH, config.build_settings[ORDER_FILE]
59+
end
60+
61+
phase = project.targets[0].shell_script_build_phases.find do |item|
62+
item.name == 'EmergeTools Download Order Files'
63+
end
64+
assert_nil phase
65+
end
66+
end
67+
end
68+
end
69+
end

0 commit comments

Comments
 (0)