diff --git a/emerge_cli.gemspec b/emerge_cli.gemspec index 9319e4d..f2c97b3 100644 --- a/emerge_cli.gemspec +++ b/emerge_cli.gemspec @@ -36,6 +36,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'open3', '~> 0.2.1' spec.add_dependency 'tty-prompt', '~> 0.23.1' spec.add_dependency 'tty-table', '~> 0.12.0' + spec.add_dependency 'xcodeproj', '~> 1.27.0' spec.add_development_dependency 'minitest', '~> 5.25.1' spec.add_development_dependency 'minitest-reporters', '~> 1.7.1' diff --git a/lib/commands/config/orderfiles/orderfiles_ios.rb b/lib/commands/config/orderfiles/orderfiles_ios.rb new file mode 100644 index 0000000..8401833 --- /dev/null +++ b/lib/commands/config/orderfiles/orderfiles_ios.rb @@ -0,0 +1,101 @@ +require 'xcodeproj' + +module EmergeCLI + module Commands + module Config + class OrderFilesIOS < EmergeCLI::Commands::GlobalOptions + desc 'Configure order files for iOS' + + # Optional options + option :skip_download_script, type: :boolean, required: false, desc: 'Only enable linkmaps' + option :project_path, type: :string, required: false, + desc: 'Path to the xcode project (will use first found if not provided)' + + # Constants + LINK_MAPS_CONFIG = 'LD_GENERATE_MAP_FILE'.freeze + LINK_MAPS_PATH = 'LD_MAP_FILE_PATH'.freeze + PATH_TO_LINKMAP = '$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt'.freeze + ORDER_FILE = 'ORDER_FILE'.freeze + ORDER_FILE_PATH = '$(PROJECT_DIR)/orderfiles/orderfile.txt'.freeze + + def initialize; end + + def call(**options) + @options = options + before(options) + + if @options[:project_path] + project = Xcodeproj::Project.open(@options[:project_path]) + else + project = Xcodeproj::Project.open(Dir.glob('*.xcodeproj').first) + Logger.warn 'No project path provided, using first found xcodeproj in current directory' + end + + enable_linkmaps(project) + + add_order_files_download_script(project) unless @options[:skip_download_script] + + project.save + end + + private + + def enable_linkmaps(project) + Logger.info 'Enabling Linkmaps' + project.targets.each do |target| + # Only do it for app targets + next unless target.product_type == 'com.apple.product-type.application' + + Logger.info " Target: #{target.name}" + target.build_configurations.each do |config| + config.build_settings[LINK_MAPS_CONFIG] = 'YES' + config.build_settings[LINK_MAPS_PATH] = PATH_TO_LINKMAP + end + end + end + + def add_order_files_download_script(project) + Logger.info 'Adding order files download script' + project.targets.each do |target| + # Only do it for app targets + next unless target.product_type == 'com.apple.product-type.application' + + Logger.info " Target: #{target.name}" + + # Create the script phase if it doesn't exist + phase = target.shell_script_build_phases.find { |item| item.name == 'EmergeTools Download Order Files' } + if phase.nil? + Logger.info " Creating script 'EmergeTools Download Order Files'" + phase = target.new_shell_script_build_phase('EmergeTools Download Order Files') + phase.shell_script = <<~BASH + if [ "$CONFIGURATION" != "Release" ]; then + echo "Skipping script for non-Release build" + exit 0 + fi + + if curl --fail "https://order-files-prod.emergetools.com/$PRODUCT_BUNDLE_IDENTIFIER/$MARKETING_VERSION" \ + -H "X-API-Token: $EMERGE_API_TOKEN" -o ORDER_FILE.gz ; then + mkdir -p "$PROJECT_DIR/orderfiles" + gunzip -c ORDER_FILE.gz > $PROJECT_DIR/orderfiles/orderfile.txt + else + echo "cURL request failed. Creating an empty file." + mkdir -p "$PROJECT_DIR/orderfiles" + touch "$PROJECT_DIR/orderfiles/orderfile.txt" + fi; + BASH + phase.output_paths = ['$(PROJECT_DIR)/orderfiles/orderfile.txt'] + else + Logger.info " 'EmergeTools Download Order Files' already exists" + end + # Make sure it is the first build phase + target.build_phases.move(phase, 0) + + target.build_configurations.each do |config| + config.build_settings[ORDER_FILE] = ORDER_FILE_PATH + end + end + end + end + end + end +end diff --git a/lib/emerge_cli.rb b/lib/emerge_cli.rb index 436f09a..d1b3270 100644 --- a/lib/emerge_cli.rb +++ b/lib/emerge_cli.rb @@ -5,6 +5,7 @@ require_relative './commands/upload/snapshots/client_libraries/default' require_relative './commands/integrate/fastlane' require_relative './commands/config/snapshots/snapshots_ios' +require_relative './commands/config/orderfiles/orderfiles_ios' require_relative './utils/git_info_provider' require_relative './utils/git_result' @@ -29,7 +30,8 @@ module EmergeCLI end register 'configure' do |prefix| - prefix.register 'snapshots-ios', Commands::Config::SnapshotsIOS, aliases: ['c'] + prefix.register 'snapshots-ios', Commands::Config::SnapshotsIOS + prefix.register 'order-files-ios', Commands::Config::OrderFilesIOS end end diff --git a/test/commands/config/orderfiles/orderfiles_ios_test.rb b/test/commands/config/orderfiles/orderfiles_ios_test.rb new file mode 100644 index 0000000..34e238f --- /dev/null +++ b/test/commands/config/orderfiles/orderfiles_ios_test.rb @@ -0,0 +1,69 @@ +require 'test_helper' + +module EmergeCLI + module Commands + module Config + class OrderFilesIOSTest < Minitest::Test + LINK_MAPS_CONFIG = 'LD_GENERATE_MAP_FILE'.freeze + LINK_MAPS_PATH = 'LD_MAP_FILE_PATH'.freeze + PATH_TO_LINKMAP = '$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt'.freeze + ORDER_FILE = 'ORDER_FILE'.freeze + ORDER_FILE_PATH = '$(PROJECT_DIR)/orderfiles/orderfile.txt'.freeze + + def setup + @command = EmergeCLI::Commands::Config::OrderFilesIOS.new + + FileUtils.mkdir_p('tmp/test_orderfiles') + FileUtils.cp_r('test/test_files/ExampleApp.xcodeproj', 'tmp/test_orderfiles/ExampleApp.xcodeproj') + end + + def teardown + FileUtils.rm_rf('tmp/test_orderfiles') + end + + def test_linkmaps_are_enabled_and_orderfiles_are_downloaded + options = { + project_path: 'tmp/test_orderfiles/ExampleApp.xcodeproj' + } + + @command.call(**options) + + project = Xcodeproj::Project.open('tmp/test_orderfiles/ExampleApp.xcodeproj') + + project.targets[0].build_configurations.each do |config| + assert_equal PATH_TO_LINKMAP, config.build_settings[LINK_MAPS_PATH] + assert_equal 'YES', config.build_settings[LINK_MAPS_CONFIG] + assert_equal ORDER_FILE_PATH, config.build_settings[ORDER_FILE] + end + + phase = project.targets[0].shell_script_build_phases.find do |item| + item.name == 'EmergeTools Download Order Files' + end + assert_equal ORDER_FILE_PATH, phase.output_paths[0] + end + + def test_linkmaps_are_enabled_only + options = { + project_path: 'tmp/test_orderfiles/ExampleApp.xcodeproj', + skip_download_script: true + } + + @command.call(**options) + + project = Xcodeproj::Project.open('tmp/test_orderfiles/ExampleApp.xcodeproj') + + project.targets[0].build_configurations.each do |config| + assert_equal PATH_TO_LINKMAP, config.build_settings[LINK_MAPS_PATH] + assert_equal 'YES', config.build_settings[LINK_MAPS_CONFIG] + refute_equal ORDER_FILE_PATH, config.build_settings[ORDER_FILE] + end + + phase = project.targets[0].shell_script_build_phases.find do |item| + item.name == 'EmergeTools Download Order Files' + end + assert_nil phase + end + end + end + end +end diff --git a/test/test_files/ExampleApp.xcodeproj/project.pbxproj b/test/test_files/ExampleApp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a0b877c --- /dev/null +++ b/test/test_files/ExampleApp.xcodeproj/project.pbxproj @@ -0,0 +1,317 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + F4F00C3D2CED926F00DDDF0B /* ExampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F4F00C3A2CED926F00DDDF0B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F4F00C342CED926F00DDDF0B = { + isa = PBXGroup; + children = ( + F4F00C3E2CED926F00DDDF0B /* Products */, + ); + sourceTree = ""; + }; + F4F00C3E2CED926F00DDDF0B /* Products */ = { + isa = PBXGroup; + children = ( + F4F00C3D2CED926F00DDDF0B /* ExampleApp.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F4F00C3C2CED926F00DDDF0B /* ExampleApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = F4F00C4B2CED927000DDDF0B /* Build configuration list for PBXNativeTarget "ExampleApp" */; + buildPhases = ( + F4F00C392CED926F00DDDF0B /* Sources */, + F4F00C3A2CED926F00DDDF0B /* Frameworks */, + F4F00C3B2CED926F00DDDF0B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ExampleApp; + packageProductDependencies = ( + ); + productName = ExampleApp; + productReference = F4F00C3D2CED926F00DDDF0B /* ExampleApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F4F00C352CED926F00DDDF0B /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 1600; + TargetAttributes = { + F4F00C3C2CED926F00DDDF0B = { + CreatedOnToolsVersion = 16.0; + }; + }; + }; + buildConfigurationList = F4F00C382CED926F00DDDF0B /* Build configuration list for PBXProject "ExampleApp" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = F4F00C342CED926F00DDDF0B; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = F4F00C3E2CED926F00DDDF0B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F4F00C3C2CED926F00DDDF0B /* ExampleApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F4F00C3B2CED926F00DDDF0B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F4F00C392CED926F00DDDF0B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + F4F00C492CED927000DDDF0B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + F4F00C4A2CED927000DDDF0B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F4F00C4C2CED927000DDDF0B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"ExampleApp/Preview Content\""; + DEVELOPMENT_TEAM = ANY; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.emerge.ExampleApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + F4F00C4D2CED927000DDDF0B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"ExampleApp/Preview Content\""; + DEVELOPMENT_TEAM = ANY; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.emerge.ExampleApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F4F00C382CED926F00DDDF0B /* Build configuration list for PBXProject "ExampleApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F4F00C492CED927000DDDF0B /* Debug */, + F4F00C4A2CED927000DDDF0B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F4F00C4B2CED927000DDDF0B /* Build configuration list for PBXNativeTarget "ExampleApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F4F00C4C2CED927000DDDF0B /* Debug */, + F4F00C4D2CED927000DDDF0B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = F4F00C352CED926F00DDDF0B /* Project object */; +} diff --git a/test/test_files/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/test/test_files/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/test/test_files/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/test/test_files/ExampleApp.xcodeproj/project.xcworkspace/xcuserdata/itaybrenner.xcuserdatad/UserInterfaceState.xcuserstate b/test/test_files/ExampleApp.xcodeproj/project.xcworkspace/xcuserdata/itaybrenner.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..f567fd7 Binary files /dev/null and b/test/test_files/ExampleApp.xcodeproj/project.xcworkspace/xcuserdata/itaybrenner.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/test/test_files/ExampleApp.xcodeproj/xcuserdata/itaybrenner.xcuserdatad/xcschemes/xcschememanagement.plist b/test/test_files/ExampleApp.xcodeproj/xcuserdata/itaybrenner.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..7d8ef2a --- /dev/null +++ b/test/test_files/ExampleApp.xcodeproj/xcuserdata/itaybrenner.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + ExampleApp.xcscheme_^#shared#^_ + + orderHint + 0 + + + +