From 89cdaa4b79e060f57c258a98535e05473166fbd5 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Fri, 19 Jan 2024 10:11:16 +0900 Subject: [PATCH 1/5] fix: Delegate value assigments to Gym's autodetection as much as possible --- lib/deploygate/commands/add_devices.rb | 18 +- lib/deploygate/commands/deploy/build.rb | 56 ++---- lib/deploygate/xcode/analyze.rb | 226 +++++++++++++----------- lib/deploygate/xcode/ios.rb | 45 +---- spec/deploygate/xcode/ios_spec.rb | 2 +- 5 files changed, 154 insertions(+), 193 deletions(-) diff --git a/lib/deploygate/commands/add_devices.rb b/lib/deploygate/commands/add_devices.rb index b7444ea..16c0352 100644 --- a/lib/deploygate/commands/add_devices.rb +++ b/lib/deploygate/commands/add_devices.rb @@ -9,6 +9,10 @@ def run(args, options) work_dir = args.empty? ? Dir.pwd : args.first ios_only_command unless DeployGate::Project.ios?(work_dir) + # Change the current working directory for fastlane else. + root_path = DeployGate::Xcode::Ios.project_root_path(work_dir) + Dir.chdir(root_path) + session = DeployGate::Session.new unless session.login? Login.start_login() @@ -24,12 +28,14 @@ def run(args, options) build_configuration = options.configuration xcodeproj_path = options.xcodeproj - root_path = DeployGate::Xcode::Ios.project_root_path(work_dir) - workspaces = DeployGate::Xcode::Ios.find_workspaces(root_path) - analyze = DeployGate::Xcode::Analyze.new(workspaces, build_configuration, nil, xcodeproj_path) - bundle_id = analyze.target_bundle_identifier - developer_team = analyze.developer_team - member_center = DeployGate::Xcode::MemberCenter.new(developer_team) + analyze = DeployGate::Xcode::Analyze.new( + build_configuration: build_configuration, + xcodeproj_path: xcodeproj_path + ) + + bundle_id = analyze.bundle_identifier + export_team_id = analyze.export_team_id + member_center = DeployGate::Xcode::MemberCenter.new(export_team_id) if server run_server(session, owner, bundle_id, distribution_key, member_center, args, options) diff --git a/lib/deploygate/commands/deploy/build.rb b/lib/deploygate/commands/deploy/build.rb index d6db473..da9a8ed 100644 --- a/lib/deploygate/commands/deploy/build.rb +++ b/lib/deploygate/commands/deploy/build.rb @@ -17,9 +17,7 @@ def run(args, options) options.command = options.command || COMMAND if DeployGate::Project.ios?(work_dir) - root_path = DeployGate::Xcode::Ios.project_root_path(work_dir) - workspaces = DeployGate::Xcode::Ios.find_workspaces(root_path) - ios(workspaces, options) + ios(work_dir, options) elsif DeployGate::Project.android?(work_dir) DeployGate::Android::GradleDeploy.new(work_dir, options).deploy else @@ -27,37 +25,23 @@ def run(args, options) end end - # @param [Array] workspaces + # @param [String] work_dir # @param [Hash] options # @return [void] - def ios(workspaces, options) + def ios(work_dir, options) DeployGate::Xcode::Export.check_local_certificates - build_configuration = options.configuration - target_scheme = options.scheme - xcodeproj_path = options.xcodeproj - analyze = DeployGate::Xcode::Analyze.new(workspaces, build_configuration, target_scheme, xcodeproj_path) - target_scheme = analyze.scheme + # Change the current working directory for fastlane else. + root_path = DeployGate::Xcode::Ios.project_root_path(work_dir) + Dir.chdir(root_path) - code_sign_identity = nil - project_profile_info = nil - allow_provisioning_updates = true - if analyze.code_sign_style == Xcode::Analyze::PROVISIONING_STYLE_MANUAL - code_sign_identity = analyze.code_sign_identity - project_profile_info = analyze.project_profile_info - end - - method = Xcode::Export.method(analyze.target_provisioning_profile) || select_method - - ipa_path = DeployGate::Xcode::Ios.build( - analyze, - target_scheme, - code_sign_identity, - project_profile_info, - build_configuration, - method, - allow_provisioning_updates + analyze = DeployGate::Xcode::Analyze.new( + build_configuration: options.configuration, + target_scheme: options.scheme, + xcodeproj_path: options.xcodeproj ) + + ipa_path = DeployGate::Xcode::Ios.build(ios_analyze: analyze) Push.upload([ipa_path], options) end @@ -82,22 +66,6 @@ def print_no_install_xcode puts HighLine.color(I18n.t('commands.deploy.build.print_no_install_xcode'), HighLine::YELLOW) puts '' end - - def select_method - result = nil - cli = HighLine.new - cli.choose do |menu| - menu.prompt = I18n.t('commands.deploy.build.select_method.title') - menu.choice(DeployGate::Xcode::Export::AD_HOC) { - result = DeployGate::Xcode::Export::AD_HOC - } - menu.choice(DeployGate::Xcode::Export::ENTERPRISE) { - result = DeployGate::Xcode::Export::ENTERPRISE - } - end - - result - end end end end diff --git a/lib/deploygate/xcode/analyze.rb b/lib/deploygate/xcode/analyze.rb index 01d9e1d..b52a81e 100644 --- a/lib/deploygate/xcode/analyze.rb +++ b/lib/deploygate/xcode/analyze.rb @@ -1,150 +1,166 @@ module DeployGate module Xcode - class Analyze - attr_reader :workspaces, :build_workspace, :scheme, :xcodeproj + # - xcworkspace can have multiple projects (.xcodeproj) + # - xcodeproj can have multiple subprojects (.xcodeproj) + # + # This means we have to satisfy the following constraints. + # + # 1. Choose one xcworkspace if multiple workspaces are found. Some of + # 2. Choose a proper xcodeproj (root. not subproject) + class Analyze BASE_WORK_DIR_NAME = 'project.xcworkspace' DEFAULT_BUILD_CONFIGURATION = 'Release' PROVISIONING_STYLE_AUTOMATIC = 'Automatic' PROVISIONING_STYLE_MANUAL = 'Manual' + CODE_SIGN_STYLE_KEY = "CODE_SIGN_STYLE" + CODE_SIGN_IDENTITY_KEY = "CODE_SIGN_IDENTITY" + PRODUCT_BUNDLE_IDENTIFIER_KEY = "PRODUCT_BUNDLE_IDENTIFIER" + DEVELOPMENT_TEAM_KEY = "DEVELOPMENT_TEAM" + class BundleIdentifierDifferentError < DeployGate::RavenIgnoreException end - - # @param [Array] workspaces - # @param [String] build_configuration - # @param [String] target_scheme - # @return [DeployGate::Xcode::Analyze] - def initialize(workspaces, build_configuration = nil, target_scheme = nil, xcodeproj_path = nil) - @workspaces = workspaces - @build_configuration = build_configuration || DEFAULT_BUILD_CONFIGURATION - @build_workspace = find_build_workspace(workspaces) - @xcodeproj = xcodeproj_path.presence || find_xcodeproj(workspaces) - - config = FastlaneCore::Configuration.create(Gym::Options.available_options, { project: @xcodeproj }) - Gym.config = config - @project = FastlaneCore::Project.new(config) - - if @project.schemes.length > 1 && target_scheme && @project.schemes.include?(target_scheme) - @project.options[:scheme] = target_scheme - else - @project.select_scheme - end - @scheme = @project.options[:scheme] + class NotSupportExportMethodError < DeployGate::RavenIgnoreException end - def code_sign_style - style = nil - resolve_build_configuration do |build_configuration, target| - style = build_configuration.resolve_build_setting("CODE_SIGN_STYLE", target) + attr_reader :target_provisioning_profile + + # @param [String, nil] build_configuration + # @param [String, nil] target_scheme + # @param [String, nil] xcodeproj_path + # @return [DeployGate::Xcode::Analyze] + def initialize( + xcodeproj_path: nil, + workspace_path: nil, + build_configuration: nil, + target_scheme: nil, + export_method: nil, + export_team_id: nil + ) + # Don't duplicate this options. This would be modified through fastlane's methods. + options = FastlaneCore::Configuration.create( + Gym::Options.available_options, + { + project: xcodeproj_path.presence, + workspace: workspace_path.presence, + configuration: build_configuration, + scheme: target_scheme, + export_team_id: export_team_id, + export_method: export_method + } + ) + + # This will detect projects, scheme, configuration and so on. This also throws an error if invalid. + # scheme, project/workspace, configuration, export_team_id would be resolved + Gym.config = options + + options[:export_team_id] ||= Gym.project.build_settings[DEVELOPMENT_TEAM_KEY] + + # TODO: Need to support UDID additions for watchOS and App Extension + + if options[:export_method].nil? + if (profiles = Gym.config.dig(:export_options, :provisioningProfiles)).present? + @target_provisioning_profile = Xcode::Export.provisioning_profile( + bundle_identifier, + uuid = nil, + options[:export_team_id], + profiles[bundle_identifier.to_sym] + ) + + options[:export_method] = Xcode::Export.method(@target_provisioning_profile) || select_export_method + end end - style + Gym.config[:codesigning_identity] = Gym.project.build_settings[CODE_SIGN_IDENTITY_KEY] if code_sign_style == PROVISIONING_STYLE_MANUAL + ensure + # Run value substitutions again after filling all values + Gym.config = Gym.config end - def code_sign_identity - identity = nil - resolve_build_configuration do |build_configuration, target| - identity = build_configuration.resolve_build_setting("CODE_SIGN_IDENTITY", target) - end - - identity + # @return [String] + def scheme + fastlane_project.options[:scheme] end - # TODO: Need to support UDID additions for watchOS and App Extension # @return [String] - def target_bundle_identifier - bundle_identifier = nil - resolve_build_configuration do |build_configuration, target| - bundle_identifier = build_configuration.resolve_build_setting("PRODUCT_BUNDLE_IDENTIFIER", target) + def xcodeproj_path + if fastlane_project.workspace? + available_schemes = fastlane_project.workspace.schemes.reject { |_, v| v.include?("Pods/Pods.xcodeproj") } + available_schemes[self.scheme] + else + fastlane_project.path end - - bundle_identifier end - def developer_team - team = nil - resolve_build_configuration do |build_configuration, target| - team = build_configuration.resolve_build_setting("DEVELOPMENT_TEAM", target) + # @return [String, nil] nil if it's a workspace + def workspace_path + if fastlane_project.workspace? + fastlane_project.options[:workspace] + else + nil end + end - team + def build_configuration + Gym.detect_configuration_for_archive end - def project_profile_info - gym = Gym::CodeSigningMapping.new(project: @project) + def export_team_id + fastlane_project.options[:export_team_id] + end - { - provisioningProfiles: gym.detect_project_profile_mapping - } + def export_method + fastlane_project.options[:export_method] end - def target_provisioning_profile - gym = Gym::CodeSigningMapping.new(project: @project) - bundle_id = target_bundle_identifier + def bundle_identifier + Gym.project.build_settings[PRODUCT_BUNDLE_IDENTIFIER_KEY] + end - Xcode::Export.provisioning_profile(bundle_id, nil, developer_team, gym.merge_profile_mapping[bundle_id.to_sym]) + def code_sign_style + Gym.project.build_settings[CODE_SIGN_STYLE_KEY] + end + + # @return [Hash, FastlaneCore::Configuration] + def fastlane_config + Gym.config end private - def resolve_build_configuration(&block) - gym = Gym::CodeSigningMapping.new(project: @project) - specified_configuration = @build_configuration.presence || - gym.detect_configuration_for_archive - - Xcodeproj::Project.open(@xcodeproj).targets.each do |target| - target.build_configuration_list.build_configurations.each do |build_configuration| - # Used the following code as an example - # https://github.com/fastlane/fastlane/blob/2.148.1/gym/lib/gym/code_signing_mapping.rb#L138 - current = build_configuration.build_settings - next if gym.test_target?(current) - sdk_root = build_configuration.resolve_build_setting("SDKROOT", target) - next unless gym.same_platform?(sdk_root) - next unless specified_configuration == build_configuration.name - - # If SKIP_INSTALL is true, it is an app extension or watch app - next if current["SKIP_INSTALL"] - - block.call(build_configuration, target) - end + def select_export_method + result = nil + cli = HighLine.new + cli.choose do |menu| + menu.prompt = I18n.t('commands.deploy.build.select_method.title') + menu.choice(::DeployGate::Xcode::Export::AD_HOC) { + result = ::DeployGate::Xcode::Export::AD_HOC + } + menu.choice(DeployGate::Xcode::Export::ENTERPRISE) { + result = ::DeployGate::Xcode::Export::ENTERPRISE + } end - end - # @param [Array] workspaces - # @return [String] - def find_xcodeproj(workspaces) - return nil if workspaces.empty? + raise NotSupportExportMethodError, "#{result} is not supported" unless ::DeployGate::Xcode::Export::SUPPORT_EXPORT_METHOD.include?(result) - if workspaces.count == 1 - scheme_workspace = workspaces.first - else - scheme_workspace = nil - workspaces.each do |workspace| - if BASE_WORK_DIR_NAME == File.basename(workspace) - scheme_workspace = workspace - end - end - end + result + end - scheme_workspace != nil ? File.dirname(scheme_workspace) : nil + # @return [FastlaneCore::Project] + def fastlane_project + Gym.project end - # @param [Array] workspaces - # @return [String] - def find_build_workspace(workspaces) - return nil if workspaces.empty? - return workspaces.first if workspaces.count == 1 - - select = nil - workspaces.each do |workspace| - if BASE_WORK_DIR_NAME != File.basename(workspace) - select = workspace - end + # @return [Xcodeproj::Project] + def xcode_project + #noinspection RubyMismatchedReturnType + if fastlane_project.workspace? + Xcodeproj::Project.open(self.xcodeproj_path) + else + fastlane_project.project end - - select end end end diff --git a/lib/deploygate/xcode/ios.rb b/lib/deploygate/xcode/ios.rb index 988437e..cbf6ee3 100644 --- a/lib/deploygate/xcode/ios.rb +++ b/lib/deploygate/xcode/ios.rb @@ -5,50 +5,21 @@ module Ios PROJECT_DIR_EXTNAME = '.xcodeproj' IGNORE_DIRS = [ '.git', 'Carthage' ] - class NotSupportExportMethodError < DeployGate::RavenIgnoreException - end - class << self - # @param [Analyze] ios_analyze - # @param [String] target_scheme - # @param [String] codesigning_identity - # @param [String] provisioning_profile_info - # @param [String] build_configuration - # @param [String] export_method + # @param [DeployGate::Xcode::Analyze] ios_analyze # @param [Boolean] allow_provisioning_updates # @return [String] - def build(ios_analyze, - target_scheme, - codesigning_identity, - provisioning_profile_info = nil, - build_configuration = nil, - export_method = DeployGate::Xcode::Export::AD_HOC, - allow_provisioning_updates = false) - raise NotSupportExportMethodError, 'Not support export' unless DeployGate::Xcode::Export::SUPPORT_EXPORT_METHOD.include?(export_method) - - values = { - export_method: export_method, - configuration: build_configuration || DeployGate::Xcode::Analyze::DEFAULT_BUILD_CONFIGURATION, - scheme: target_scheme - } - - if ios_analyze.build_workspace - values[:workspace] = ios_analyze.build_workspace - else - values[:project] = ios_analyze.xcodeproj - end - - values[:codesigning_identity] = codesigning_identity if codesigning_identity + def build( + ios_analyze:, + allow_provisioning_updates: true + ) if allow_provisioning_updates - values[:xcargs] = '-allowProvisioningUpdates' - values[:export_xcargs] = '-allowProvisioningUpdates' + Gym.config[:xcargs] = '-allowProvisioningUpdates' + Gym.config[:export_xcargs] = '-allowProvisioningUpdates' end - values[:export_options] = provisioning_profile_info if provisioning_profile_info - - v = FastlaneCore::Configuration.create(Gym::Options.available_options, values) begin - absolute_ipa_path = File.expand_path(Gym::Manager.new.work(v)) + absolute_ipa_path = File.expand_path(Gym::Manager.new.work(ios_analyze.fastlane_config)) rescue => e # TODO: build error handling use_xcode_path = `xcode-select -p` diff --git a/spec/deploygate/xcode/ios_spec.rb b/spec/deploygate/xcode/ios_spec.rb index 89b1f3e..97ff6e9 100644 --- a/spec/deploygate/xcode/ios_spec.rb +++ b/spec/deploygate/xcode/ios_spec.rb @@ -37,7 +37,7 @@ def xcodeproj expect { DeployGate::Xcode::Ios.build(AnalyzeMock.new, '', '', nil, '', 'not support export method') - }.to raise_error DeployGate::Xcode::Ios::NotSupportExportMethodError + }.to raise_error DeployGate::Xcode::Analyze::NotSupportExportMethodError end end From dbce957ee9e6534d82210074608739055286f0ba Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Fri, 19 Jan 2024 10:23:47 +0900 Subject: [PATCH 2/5] feat: Add options for workspace selection --- config/locales/en.yml | 3 +- lib/deploygate/command_builder.rb | 2 ++ lib/deploygate/commands/add_devices.rb | 8 ++--- lib/deploygate/commands/deploy/build.rb | 8 +++-- lib/deploygate/xcode/analyze.rb | 41 +++++++++---------------- 5 files changed, 27 insertions(+), 35 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index e0ddb72..1aded9c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -18,7 +18,8 @@ en: scheme: 'Set Xcode build scheme (iOS app only)' open: 'Open a browser after the build uploaded (OS X only)' disable_notify: 'Disable email notification (iOS app only)' - xcodeproj: 'The path to the target Xcode project file (iOS app only)' + xcodeproj: 'The path to the target .xcodeproj file (iOS app only)' + workspace: 'The path to the target .xcworkspace file (iOS app only)' add_devices: description: 'Register devices to your Apple Developer account and refresh your provisioning profile. (iOS only) By default, it automatically finds new devices added to your application on DeployGate and ask you which device to register. You can also specify which device to register via command line options.' udid: 'UDID to be registered' diff --git a/lib/deploygate/command_builder.rb b/lib/deploygate/command_builder.rb index 0b452f9..ae18a2b 100644 --- a/lib/deploygate/command_builder.rb +++ b/lib/deploygate/command_builder.rb @@ -71,6 +71,7 @@ def run c.option '--open', I18n.t('command_builder.deploy.open') c.option '--disable_notify', I18n.t('command_builder.deploy.disable_notify') c.option '--xcodeproj STRING', I18n.t('command_builder.deploy.xcodeproj') + c.option '--workspace STRING', I18n.t('command_builder.deploy.workspace') c.action do |args, options| options.default :message => '', :user => nil, :open => false, 'disable_notify' => false, :command => nil begin @@ -95,6 +96,7 @@ def run c.option '--server', I18n.t('command_builder.add_devices.server.description') c.option '--disable_notify', I18n.t('command_builder.deploy.disable_notify') c.option '--xcodeproj STRING', I18n.t('command_builder.deploy.xcodeproj') + c.option '--workspace STRING', I18n.t('command_builder.deploy.workspace') c.action do |args, options| options.default :user => nil, :server => false, :command => 'add_devices' begin diff --git a/lib/deploygate/commands/add_devices.rb b/lib/deploygate/commands/add_devices.rb index 16c0352..08354d3 100644 --- a/lib/deploygate/commands/add_devices.rb +++ b/lib/deploygate/commands/add_devices.rb @@ -25,12 +25,10 @@ def run(args, options) distribution_key = options.distribution_key server = options.server - build_configuration = options.configuration - xcodeproj_path = options.xcodeproj - analyze = DeployGate::Xcode::Analyze.new( - build_configuration: build_configuration, - xcodeproj_path: xcodeproj_path + build_configuration: options.configuration, + xcodeproj_path: options.xcodeproj, + workspace_path: options.workspace ) bundle_id = analyze.bundle_identifier diff --git a/lib/deploygate/commands/deploy/build.rb b/lib/deploygate/commands/deploy/build.rb index da9a8ed..78af158 100644 --- a/lib/deploygate/commands/deploy/build.rb +++ b/lib/deploygate/commands/deploy/build.rb @@ -38,10 +38,14 @@ def ios(work_dir, options) analyze = DeployGate::Xcode::Analyze.new( build_configuration: options.configuration, target_scheme: options.scheme, - xcodeproj_path: options.xcodeproj + xcodeproj_path: options.xcodeproj, + workspace_path: options.workspace ) - ipa_path = DeployGate::Xcode::Ios.build(ios_analyze: analyze) + ipa_path = DeployGate::Xcode::Ios.build( + ios_analyze: analyze, + allow_provisioning_updates: true + ) Push.upload([ipa_path], options) end diff --git a/lib/deploygate/xcode/analyze.rb b/lib/deploygate/xcode/analyze.rb index b52a81e..b03add8 100644 --- a/lib/deploygate/xcode/analyze.rb +++ b/lib/deploygate/xcode/analyze.rb @@ -25,8 +25,6 @@ class BundleIdentifierDifferentError < DeployGate::RavenIgnoreException class NotSupportExportMethodError < DeployGate::RavenIgnoreException end - attr_reader :target_provisioning_profile - # @param [String, nil] build_configuration # @param [String, nil] target_scheme # @param [String, nil] xcodeproj_path @@ -35,9 +33,7 @@ def initialize( xcodeproj_path: nil, workspace_path: nil, build_configuration: nil, - target_scheme: nil, - export_method: nil, - export_team_id: nil + target_scheme: nil ) # Don't duplicate this options. This would be modified through fastlane's methods. options = FastlaneCore::Configuration.create( @@ -46,9 +42,7 @@ def initialize( project: xcodeproj_path.presence, workspace: workspace_path.presence, configuration: build_configuration, - scheme: target_scheme, - export_team_id: export_team_id, - export_method: export_method + scheme: target_scheme } ) @@ -56,26 +50,23 @@ def initialize( # scheme, project/workspace, configuration, export_team_id would be resolved Gym.config = options - options[:export_team_id] ||= Gym.project.build_settings[DEVELOPMENT_TEAM_KEY] + options[:export_team_id] = Gym.project.build_settings[DEVELOPMENT_TEAM_KEY] + options[:codesigning_identity] = Gym.project.build_settings[CODE_SIGN_IDENTITY_KEY] if Gym.project.build_settings[CODE_SIGN_STYLE_KEY] == PROVISIONING_STYLE_MANUAL # TODO: Need to support UDID additions for watchOS and App Extension - if options[:export_method].nil? - if (profiles = Gym.config.dig(:export_options, :provisioningProfiles)).present? - @target_provisioning_profile = Xcode::Export.provisioning_profile( - bundle_identifier, - uuid = nil, - options[:export_team_id], - profiles[bundle_identifier.to_sym] - ) - - options[:export_method] = Xcode::Export.method(@target_provisioning_profile) || select_export_method - end - end + if (profiles = Gym.config.dig(:export_options, :provisioningProfiles)).present? + target_provisioning_profile = ::DeployGate::Xcode::Export.provisioning_profile( + bundle_identifier, + uuid = nil, + options[:export_team_id], + profiles[bundle_identifier.to_sym] + ) - Gym.config[:codesigning_identity] = Gym.project.build_settings[CODE_SIGN_IDENTITY_KEY] if code_sign_style == PROVISIONING_STYLE_MANUAL + options[:export_method] = ::DeployGate::Xcode::Export.method(target_provisioning_profile) || select_export_method + end ensure - # Run value substitutions again after filling all values + # Run value auto detection again after filling values Gym.config = Gym.config end @@ -119,10 +110,6 @@ def bundle_identifier Gym.project.build_settings[PRODUCT_BUNDLE_IDENTIFIER_KEY] end - def code_sign_style - Gym.project.build_settings[CODE_SIGN_STYLE_KEY] - end - # @return [Hash, FastlaneCore::Configuration] def fastlane_config Gym.config From f36c8d747e9cda7fc6e661092abcf0c57ebc4ad8 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Fri, 19 Jan 2024 10:52:28 +0900 Subject: [PATCH 3/5] chore: Remove updating system gems for now --- .github/workflows/pull_request.yml | 1 - .github/workflows/release.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 95bc30c..5fdc8f6 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -18,5 +18,4 @@ jobs: with: ruby-version: ${{ matrix.ruby_version }} bundler-cache: true - - run: gem update --system - run: bundle exec rake diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b1ca407..9d067be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,6 @@ jobs: - uses: ruby/setup-ruby@v1 with: bundler-cache: true - - run: gem update --system - run: bundle exec rake build - id: gem run: echo "result=$(find pkg -name 'deploygate-*.gem' -type f | head -1)" >> $GITHUB_OUTPUT From c7475b50f4b3dd93235ca7a20ff6dcc49400d092 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Fri, 19 Jan 2024 14:52:30 +0900 Subject: [PATCH 4/5] test: Prepared sample xcode projects and use them in specs --- deploygate.gemspec | 1 + lib/deploygate/xcode/analyze.rb | 19 +- spec/deploygate/xcode/analyze_spec.rb | 108 +++-- spec/spec_helper.rb | 6 +- .../MultiProject.xcodeproj/project.pbxproj | 424 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 19914 bytes .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 63 +++ .../Assets.xcassets/Contents.json | 6 + .../MultiProject/ContentView.swift | 24 + .../MultiProject/MultiProject.entitlements | 10 + .../MultiProject/MultiProjectApp.swift | 17 + .../Preview Assets.xcassets/Contents.json | 6 + .../SubProject1.xcodeproj/project.pbxproj | 360 +++++++++++++++ .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 63 +++ .../SubProject1/Assets.xcassets/Contents.json | 6 + .../SubProject1/SubProject1/ContentView.swift | 24 + .../Preview Assets.xcassets/Contents.json | 6 + .../SubProject1/SubProject1.entitlements | 10 + .../SubProject1/SubProject1App.swift | 17 + .../SubProject2.xcodeproj/project.pbxproj | 356 +++++++++++++++ .../xcschemes/xcschememanagement.plist | 14 + .../SubProject2/SubProject2/SubProject2.h | 18 + .../xcodeProjects/Projects/SingleProject | 1 + .../Workspaces/Single/SingleWorkspace | 1 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 12432 bytes 33 files changed, 1578 insertions(+), 62 deletions(-) create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.pbxproj create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcuserdata/jmatsu.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/ContentView.swift create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProject.entitlements create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProjectApp.swift create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/project.pbxproj create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/ContentView.swift create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1.entitlements create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1App.swift create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/project.pbxproj create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2/SubProject2.h create mode 160000 spec/test_files/xcodeProjects/Projects/SingleProject create mode 160000 spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace create mode 100644 spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/contents.xcworkspacedata create mode 100644 spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcuserdata/jmatsu.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/deploygate.gemspec b/deploygate.gemspec index 6a06abd..aebea82 100644 --- a/deploygate.gemspec +++ b/deploygate.gemspec @@ -45,6 +45,7 @@ POST_INSTALL_MESSAGE spec.add_development_dependency 'rspec', '~> 3.5' spec.add_development_dependency 'webmock', '~> 2.3' spec.add_development_dependency 'i18n-tasks', '~> 0.9' + spec.add_development_dependency 'debug', '>= 1.0.0' spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } diff --git a/lib/deploygate/xcode/analyze.rb b/lib/deploygate/xcode/analyze.rb index b03add8..d212504 100644 --- a/lib/deploygate/xcode/analyze.rb +++ b/lib/deploygate/xcode/analyze.rb @@ -50,12 +50,12 @@ def initialize( # scheme, project/workspace, configuration, export_team_id would be resolved Gym.config = options - options[:export_team_id] = Gym.project.build_settings[DEVELOPMENT_TEAM_KEY] - options[:codesigning_identity] = Gym.project.build_settings[CODE_SIGN_IDENTITY_KEY] if Gym.project.build_settings[CODE_SIGN_STYLE_KEY] == PROVISIONING_STYLE_MANUAL + options[:export_team_id] = Gym.project.build_settings(key: DEVELOPMENT_TEAM_KEY, optional: false) + options[:codesigning_identity] = Gym.project.build_settings(key: CODE_SIGN_IDENTITY_KEY, optional: false) if Gym.project.build_settings(key: CODE_SIGN_STYLE_KEY) == PROVISIONING_STYLE_MANUAL # TODO: Need to support UDID additions for watchOS and App Extension - if (profiles = Gym.config.dig(:export_options, :provisioningProfiles)).present? + if (profiles = Gym.config.values.dig(:export_options, :provisioningProfiles)).present? target_provisioning_profile = ::DeployGate::Xcode::Export.provisioning_profile( bundle_identifier, uuid = nil, @@ -81,16 +81,7 @@ def xcodeproj_path available_schemes = fastlane_project.workspace.schemes.reject { |_, v| v.include?("Pods/Pods.xcodeproj") } available_schemes[self.scheme] else - fastlane_project.path - end - end - - # @return [String, nil] nil if it's a workspace - def workspace_path - if fastlane_project.workspace? - fastlane_project.options[:workspace] - else - nil + fastlane_project.project.path&.to_s end end @@ -107,7 +98,7 @@ def export_method end def bundle_identifier - Gym.project.build_settings[PRODUCT_BUNDLE_IDENTIFIER_KEY] + Gym.project.build_settings(key: PRODUCT_BUNDLE_IDENTIFIER_KEY, optional: false) end # @return [Hash, FastlaneCore::Configuration] diff --git a/spec/deploygate/xcode/analyze_spec.rb b/spec/deploygate/xcode/analyze_spec.rb index 8981b26..a7376af 100644 --- a/spec/deploygate/xcode/analyze_spec.rb +++ b/spec/deploygate/xcode/analyze_spec.rb @@ -1,67 +1,83 @@ +require 'spec_helper' + describe DeployGate::Xcode::Analyze do describe '#new' do - subject { described_class.new(workspaces, build_configuration, target_scheme, xcodeproj) } + subject(:analyze) do + described_class.new( + xcodeproj_path: xcodeproj_path, + workspace_path: workspace_path, + build_configuration: build_configuration, + target_scheme: target_scheme + ) + end + let(:xcodeproj_path) { nil } + let(:workspace_path) { nil } let(:build_configuration) { nil } let(:target_scheme) { nil } - let(:xcodeproj) { nil } - describe 'detect scheme workspace and build workspace' do - before do - allow(FastlaneCore::Configuration).to receive(:create) - project = instance_double(FastlaneCore::Project) - allow(project).to receive(:select_scheme) - allow(project).to receive(:schemes).and_return([]) - allow(project).to receive(:options).and_return({}) - allow(FastlaneCore::Project).to receive(:new).and_return(project) - allow(Gym).to receive(:config=) - end + describe '#initialize' do + context 'if the project is the single xcodeproject' do + let(:expected_xcodeproj_path) { test_file_path("xcodeProjects", "Projects", "SingleProject", "SingleProject.xcodeproj") } - context 'exists single xcodeproj files' do - let(:workspaces) do - %w[ - /base_dir/Test/Test/Test.xcodeproj/project.xcworkspace - ] + around(:each) do |example| + Dir.chdir(test_file_path("xcodeProjects", "Projects", "SingleProject")) do + example.run + end end - context 'without scheme workspace arg' do - it 'build_workspace and xcodeproj is same' do - is_expected.to have_attributes( - build_workspace: '/base_dir/Test/Test/Test.xcodeproj/project.xcworkspace', - xcodeproj: '/base_dir/Test/Test/Test.xcodeproj' - ) - end + it 'can find a project and get attributes' do + analyze + + expect(Gym.project.project).not_to be_nil + expect(Gym.config[:workspace]).to be_nil + expect(analyze.xcodeproj_path).to eq(expected_xcodeproj_path) + expect(analyze.scheme).to eq("SingleProject") + expect(analyze.bundle_identifier).to eq("com.deploygate.example.SingleProject") end end - context 'exists multiple xcodeproj files' do - let(:workspaces) do - %w[ - /base_dir/Test/ALib/ALib.xcodeproj/project.xcworkspace - /base_dir/Test/Hoge/Hoge.xcodeproj/project.xcworkspace - /base_dir/Test/Test/Test.xcodeproj/project.xcworkspace - /base_dir/Test/Test.xcworkspace - /base_dir/Test/ZLib/ZLib.xcodeproj/project.xcworkspace - ] + context 'if the project is the single xcworkspace' do + let(:expected_xcodeproj_path) { test_file_path("xcodeProjects", "Workspaces", "Single", "SingleWorkspace", "SingleWorkspace.xcodeproj") } + + around(:each) do |example| + Dir.chdir(test_file_path("xcodeProjects", "Workspaces", "Single")) do + example.run + end end - context 'without scheme workspace arg' do - it 'scheme workspace is last workspace has project.xcworkspace' do - is_expected.to have_attributes( - build_workspace: '/base_dir/Test/Test.xcworkspace', - xcodeproj: '/base_dir/Test/ZLib/ZLib.xcodeproj' - ) + it 'can find a project and get attributes' do + analyze + + expect(Gym.project.project).to be_nil + expect(Gym.project.workspace).not_to be_nil + expect(Gym.config[:workspace]).to eq("./SingleWorkspace.xcworkspace") + expect(analyze.xcodeproj_path).to eq(expected_xcodeproj_path) + expect(analyze.scheme).to eq("SingleWorkspace") + expect(analyze.bundle_identifier).to eq("com.deploygate.example.SingleWorkspace") + end + end + + context 'if detection is nondeterministic' do + around(:each) do |example| + Dir.chdir(test_file_path("xcodeProjects")) do + example.run end end - context 'with scheme workspace arg' do - let(:xcodeproj) { './ZLib.xcodeproj' } + it 'cannot choose any project' do + expect { analyze }.to raise_error(FastlaneCore::Interface::FastlaneCrash) + end + + context 'if the project is in multi-xcodeproject' do + around(:each) do |example| + Dir.chdir(test_file_path("xcodeProjects", "Projects", "Multi")) do + example.run + end + end - it 'scheme workspace is last workspace has project.xcworkspace' do - is_expected.to have_attributes( - build_workspace: '/base_dir/Test/Test.xcworkspace', - xcodeproj: './ZLib.xcodeproj' - ) + it 'cannot choose any project' do + expect { analyze }.to raise_error(FastlaneCore::Interface::FastlaneCrash) end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index df44c90..c2712fe 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,6 +3,8 @@ require "deploygate" +ENV["CI"] = "true" + RSpec.configure do |config| config.before :each do # config file mock @@ -13,6 +15,6 @@ API_ENDPOINT = "https://deploygate.com/api" SPEC_FILE_PATH = File.dirname(__FILE__) -def test_file_path - File.join(SPEC_FILE_PATH, 'test_files/DeployGateSample.apk') +def test_file_path(*paths) + File.join(SPEC_FILE_PATH, 'test_files', *paths) end diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.pbxproj b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.pbxproj new file mode 100644 index 0000000..31c3fd6 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.pbxproj @@ -0,0 +1,424 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 08F9D5272B5A4332004E5C92 /* MultiProjectApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F9D5262B5A4332004E5C92 /* MultiProjectApp.swift */; }; + 08F9D5292B5A4332004E5C92 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F9D5282B5A4332004E5C92 /* ContentView.swift */; }; + 08F9D52B2B5A4333004E5C92 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 08F9D52A2B5A4333004E5C92 /* Assets.xcassets */; }; + 08F9D52F2B5A4333004E5C92 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 08F9D52E2B5A4333004E5C92 /* Preview Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 08F9D5542B5A439A004E5C92 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08F9D5502B5A439A004E5C92 /* SubProject1.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 08F9D53E2B5A4399004E5C92; + remoteInfo = SubProject1; + }; + 08F9D56E2B5A43B8004E5C92 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08F9D56A2B5A43B8004E5C92 /* SubProject2.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 08F9D5602B5A43B8004E5C92; + remoteInfo = SubProject2; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 08F9D5232B5A4332004E5C92 /* MultiProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MultiProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 08F9D5262B5A4332004E5C92 /* MultiProjectApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProjectApp.swift; sourceTree = ""; }; + 08F9D5282B5A4332004E5C92 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 08F9D52A2B5A4333004E5C92 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 08F9D52C2B5A4333004E5C92 /* MultiProject.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MultiProject.entitlements; sourceTree = ""; }; + 08F9D52E2B5A4333004E5C92 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 08F9D5502B5A439A004E5C92 /* SubProject1.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SubProject1.xcodeproj; path = ../SubProject1/SubProject1.xcodeproj; sourceTree = ""; }; + 08F9D56A2B5A43B8004E5C92 /* SubProject2.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SubProject2.xcodeproj; path = ../SubProject2/SubProject2.xcodeproj; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08F9D5202B5A4332004E5C92 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08F9D51A2B5A4332004E5C92 = { + isa = PBXGroup; + children = ( + 08F9D56A2B5A43B8004E5C92 /* SubProject2.xcodeproj */, + 08F9D5502B5A439A004E5C92 /* SubProject1.xcodeproj */, + 08F9D5252B5A4332004E5C92 /* MultiProject */, + 08F9D5242B5A4332004E5C92 /* Products */, + ); + sourceTree = ""; + }; + 08F9D5242B5A4332004E5C92 /* Products */ = { + isa = PBXGroup; + children = ( + 08F9D5232B5A4332004E5C92 /* MultiProject.app */, + ); + name = Products; + sourceTree = ""; + }; + 08F9D5252B5A4332004E5C92 /* MultiProject */ = { + isa = PBXGroup; + children = ( + 08F9D5262B5A4332004E5C92 /* MultiProjectApp.swift */, + 08F9D5282B5A4332004E5C92 /* ContentView.swift */, + 08F9D52A2B5A4333004E5C92 /* Assets.xcassets */, + 08F9D52C2B5A4333004E5C92 /* MultiProject.entitlements */, + 08F9D52D2B5A4333004E5C92 /* Preview Content */, + ); + path = MultiProject; + sourceTree = ""; + }; + 08F9D52D2B5A4333004E5C92 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 08F9D52E2B5A4333004E5C92 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 08F9D5512B5A439A004E5C92 /* Products */ = { + isa = PBXGroup; + children = ( + 08F9D5552B5A439A004E5C92 /* SubProject1.app */, + ); + name = Products; + sourceTree = ""; + }; + 08F9D56B2B5A43B8004E5C92 /* Products */ = { + isa = PBXGroup; + children = ( + 08F9D56F2B5A43B8004E5C92 /* SubProject2.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 08F9D5222B5A4332004E5C92 /* MultiProject */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08F9D5322B5A4333004E5C92 /* Build configuration list for PBXNativeTarget "MultiProject" */; + buildPhases = ( + 08F9D51F2B5A4332004E5C92 /* Sources */, + 08F9D5202B5A4332004E5C92 /* Frameworks */, + 08F9D5212B5A4332004E5C92 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MultiProject; + productName = MultiProject; + productReference = 08F9D5232B5A4332004E5C92 /* MultiProject.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08F9D51B2B5A4332004E5C92 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1520; + LastUpgradeCheck = 1520; + TargetAttributes = { + 08F9D5222B5A4332004E5C92 = { + CreatedOnToolsVersion = 15.2; + }; + }; + }; + buildConfigurationList = 08F9D51E2B5A4332004E5C92 /* Build configuration list for PBXProject "MultiProject" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 08F9D51A2B5A4332004E5C92; + productRefGroup = 08F9D5242B5A4332004E5C92 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 08F9D5512B5A439A004E5C92 /* Products */; + ProjectRef = 08F9D5502B5A439A004E5C92 /* SubProject1.xcodeproj */; + }, + { + ProductGroup = 08F9D56B2B5A43B8004E5C92 /* Products */; + ProjectRef = 08F9D56A2B5A43B8004E5C92 /* SubProject2.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 08F9D5222B5A4332004E5C92 /* MultiProject */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 08F9D5552B5A439A004E5C92 /* SubProject1.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = SubProject1.app; + remoteRef = 08F9D5542B5A439A004E5C92 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 08F9D56F2B5A43B8004E5C92 /* SubProject2.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SubProject2.framework; + remoteRef = 08F9D56E2B5A43B8004E5C92 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 08F9D5212B5A4332004E5C92 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 08F9D52F2B5A4333004E5C92 /* Preview Assets.xcassets in Resources */, + 08F9D52B2B5A4333004E5C92 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 08F9D51F2B5A4332004E5C92 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 08F9D5292B5A4332004E5C92 /* ContentView.swift in Sources */, + 08F9D5272B5A4332004E5C92 /* MultiProjectApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 08F9D5302B5A4333004E5C92 /* 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 08F9D5312B5A4333004E5C92 /* 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 08F9D5332B5A4333004E5C92 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = MultiProject/MultiProject.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"MultiProject/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.deploygate.example.MultiProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 08F9D5342B5A4333004E5C92 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = MultiProject/MultiProject.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"MultiProject/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.deploygate.example.MultiProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 08F9D51E2B5A4332004E5C92 /* Build configuration list for PBXProject "MultiProject" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08F9D5302B5A4333004E5C92 /* Debug */, + 08F9D5312B5A4333004E5C92 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 08F9D5322B5A4333004E5C92 /* Build configuration list for PBXNativeTarget "MultiProject" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08F9D5332B5A4333004E5C92 /* Debug */, + 08F9D5342B5A4333004E5C92 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08F9D51B2B5A4332004E5C92 /* Project object */; +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcuserdata/jmatsu.xcuserdatad/UserInterfaceState.xcuserstate b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/project.xcworkspace/xcuserdata/jmatsu.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..40bda6f043b94aad24ca84475dfec2500cfca472 GIT binary patch literal 19914 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 literal 0 HcmV?d00001 diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..34d77c4 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + MultiProject.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AccentColor.colorset/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AppIcon.appiconset/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..532cd72 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/ContentView.swift b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/ContentView.swift new file mode 100644 index 0000000..98338d7 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/ContentView.swift @@ -0,0 +1,24 @@ +// +// ContentView.swift +// MultiProject +// +// Created by Jumpei Matsuda on 2024/01/19. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProject.entitlements b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProject.entitlements new file mode 100644 index 0000000..f2ef3ae --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProject.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProjectApp.swift b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProjectApp.swift new file mode 100644 index 0000000..1749c1d --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/MultiProjectApp.swift @@ -0,0 +1,17 @@ +// +// MultiProjectApp.swift +// MultiProject +// +// Created by Jumpei Matsuda on 2024/01/19. +// + +import SwiftUI + +@main +struct MultiProjectApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Preview Content/Preview Assets.xcassets/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/MultiProject/MultiProject/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/project.pbxproj b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f3110c6 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/project.pbxproj @@ -0,0 +1,360 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 08F9D5422B5A4399004E5C92 /* SubProject1App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F9D5412B5A4399004E5C92 /* SubProject1App.swift */; }; + 08F9D5442B5A4399004E5C92 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F9D5432B5A4399004E5C92 /* ContentView.swift */; }; + 08F9D5462B5A439A004E5C92 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 08F9D5452B5A439A004E5C92 /* Assets.xcassets */; }; + 08F9D54A2B5A439A004E5C92 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 08F9D5492B5A439A004E5C92 /* Preview Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 08F9D53E2B5A4399004E5C92 /* SubProject1.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SubProject1.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 08F9D5412B5A4399004E5C92 /* SubProject1App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubProject1App.swift; sourceTree = ""; }; + 08F9D5432B5A4399004E5C92 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 08F9D5452B5A439A004E5C92 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 08F9D5472B5A439A004E5C92 /* SubProject1.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SubProject1.entitlements; sourceTree = ""; }; + 08F9D5492B5A439A004E5C92 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08F9D53B2B5A4399004E5C92 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08F9D5352B5A4399004E5C92 = { + isa = PBXGroup; + children = ( + 08F9D5402B5A4399004E5C92 /* SubProject1 */, + 08F9D53F2B5A4399004E5C92 /* Products */, + ); + sourceTree = ""; + }; + 08F9D53F2B5A4399004E5C92 /* Products */ = { + isa = PBXGroup; + children = ( + 08F9D53E2B5A4399004E5C92 /* SubProject1.app */, + ); + name = Products; + sourceTree = ""; + }; + 08F9D5402B5A4399004E5C92 /* SubProject1 */ = { + isa = PBXGroup; + children = ( + 08F9D5412B5A4399004E5C92 /* SubProject1App.swift */, + 08F9D5432B5A4399004E5C92 /* ContentView.swift */, + 08F9D5452B5A439A004E5C92 /* Assets.xcassets */, + 08F9D5472B5A439A004E5C92 /* SubProject1.entitlements */, + 08F9D5482B5A439A004E5C92 /* Preview Content */, + ); + path = SubProject1; + sourceTree = ""; + }; + 08F9D5482B5A439A004E5C92 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 08F9D5492B5A439A004E5C92 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 08F9D53D2B5A4399004E5C92 /* SubProject1 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08F9D54D2B5A439A004E5C92 /* Build configuration list for PBXNativeTarget "SubProject1" */; + buildPhases = ( + 08F9D53A2B5A4399004E5C92 /* Sources */, + 08F9D53B2B5A4399004E5C92 /* Frameworks */, + 08F9D53C2B5A4399004E5C92 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SubProject1; + productName = SubProject1; + productReference = 08F9D53E2B5A4399004E5C92 /* SubProject1.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08F9D5362B5A4399004E5C92 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1520; + LastUpgradeCheck = 1520; + TargetAttributes = { + 08F9D53D2B5A4399004E5C92 = { + CreatedOnToolsVersion = 15.2; + }; + }; + }; + buildConfigurationList = 08F9D5392B5A4399004E5C92 /* Build configuration list for PBXProject "SubProject1" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 08F9D5352B5A4399004E5C92; + productRefGroup = 08F9D53F2B5A4399004E5C92 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 08F9D53D2B5A4399004E5C92 /* SubProject1 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 08F9D53C2B5A4399004E5C92 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 08F9D54A2B5A439A004E5C92 /* Preview Assets.xcassets in Resources */, + 08F9D5462B5A439A004E5C92 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 08F9D53A2B5A4399004E5C92 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 08F9D5442B5A4399004E5C92 /* ContentView.swift in Sources */, + 08F9D5422B5A4399004E5C92 /* SubProject1App.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 08F9D54B2B5A439A004E5C92 /* 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 08F9D54C2B5A439A004E5C92 /* 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 08F9D54E2B5A439A004E5C92 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = SubProject1/SubProject1.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"SubProject1/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.deploygate.example.SubProject1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 08F9D54F2B5A439A004E5C92 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = SubProject1/SubProject1.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"SubProject1/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.deploygate.example.SubProject1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 08F9D5392B5A4399004E5C92 /* Build configuration list for PBXProject "SubProject1" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08F9D54B2B5A439A004E5C92 /* Debug */, + 08F9D54C2B5A439A004E5C92 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 08F9D54D2B5A439A004E5C92 /* Build configuration list for PBXNativeTarget "SubProject1" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08F9D54E2B5A439A004E5C92 /* Debug */, + 08F9D54F2B5A439A004E5C92 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08F9D5362B5A4399004E5C92 /* Project object */; +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..92a5dec --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + SubProject1.xcscheme_^#shared#^_ + + orderHint + 1 + + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AccentColor.colorset/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AppIcon.appiconset/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..532cd72 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/ContentView.swift b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/ContentView.swift new file mode 100644 index 0000000..1c7d944 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/ContentView.swift @@ -0,0 +1,24 @@ +// +// ContentView.swift +// SubProject1 +// +// Created by Jumpei Matsuda on 2024/01/19. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Preview Content/Preview Assets.xcassets/Contents.json b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1.entitlements b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1.entitlements new file mode 100644 index 0000000..f2ef3ae --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1App.swift b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1App.swift new file mode 100644 index 0000000..88cb9ee --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject1/SubProject1/SubProject1App.swift @@ -0,0 +1,17 @@ +// +// SubProject1App.swift +// SubProject1 +// +// Created by Jumpei Matsuda on 2024/01/19. +// + +import SwiftUI + +@main +struct SubProject1App: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/project.pbxproj b/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/project.pbxproj new file mode 100644 index 0000000..054bb7e --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/project.pbxproj @@ -0,0 +1,356 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 08F9D5642B5A43B8004E5C92 /* SubProject2.h in Headers */ = {isa = PBXBuildFile; fileRef = 08F9D5632B5A43B8004E5C92 /* SubProject2.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 08F9D5602B5A43B8004E5C92 /* SubProject2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SubProject2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 08F9D5632B5A43B8004E5C92 /* SubProject2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubProject2.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08F9D55D2B5A43B8004E5C92 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08F9D5562B5A43B8004E5C92 = { + isa = PBXGroup; + children = ( + 08F9D5622B5A43B8004E5C92 /* SubProject2 */, + 08F9D5612B5A43B8004E5C92 /* Products */, + ); + sourceTree = ""; + }; + 08F9D5612B5A43B8004E5C92 /* Products */ = { + isa = PBXGroup; + children = ( + 08F9D5602B5A43B8004E5C92 /* SubProject2.framework */, + ); + name = Products; + sourceTree = ""; + }; + 08F9D5622B5A43B8004E5C92 /* SubProject2 */ = { + isa = PBXGroup; + children = ( + 08F9D5632B5A43B8004E5C92 /* SubProject2.h */, + ); + path = SubProject2; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 08F9D55B2B5A43B8004E5C92 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 08F9D5642B5A43B8004E5C92 /* SubProject2.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 08F9D55F2B5A43B8004E5C92 /* SubProject2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08F9D5672B5A43B8004E5C92 /* Build configuration list for PBXNativeTarget "SubProject2" */; + buildPhases = ( + 08F9D55B2B5A43B8004E5C92 /* Headers */, + 08F9D55C2B5A43B8004E5C92 /* Sources */, + 08F9D55D2B5A43B8004E5C92 /* Frameworks */, + 08F9D55E2B5A43B8004E5C92 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SubProject2; + productName = SubProject2; + productReference = 08F9D5602B5A43B8004E5C92 /* SubProject2.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08F9D5572B5A43B8004E5C92 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1520; + TargetAttributes = { + 08F9D55F2B5A43B8004E5C92 = { + CreatedOnToolsVersion = 15.2; + }; + }; + }; + buildConfigurationList = 08F9D55A2B5A43B8004E5C92 /* Build configuration list for PBXProject "SubProject2" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 08F9D5562B5A43B8004E5C92; + productRefGroup = 08F9D5612B5A43B8004E5C92 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 08F9D55F2B5A43B8004E5C92 /* SubProject2 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 08F9D55E2B5A43B8004E5C92 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 08F9D55C2B5A43B8004E5C92 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 08F9D5652B5A43B8004E5C92 /* 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; + CURRENT_PROJECT_VERSION = 1; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 08F9D5662B5A43B8004E5C92 /* 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; + CURRENT_PROJECT_VERSION = 1; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 08F9D5682B5A43B8004E5C92 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.deploygate.example.SubProject2; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = auto; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 08F9D5692B5A43B8004E5C92 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.deploygate.example.SubProject2; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = auto; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 08F9D55A2B5A43B8004E5C92 /* Build configuration list for PBXProject "SubProject2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08F9D5652B5A43B8004E5C92 /* Debug */, + 08F9D5662B5A43B8004E5C92 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 08F9D5672B5A43B8004E5C92 /* Build configuration list for PBXNativeTarget "SubProject2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08F9D5682B5A43B8004E5C92 /* Debug */, + 08F9D5692B5A43B8004E5C92 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08F9D5572B5A43B8004E5C92 /* Project object */; +} diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist b/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..132df7e --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2.xcodeproj/xcuserdata/jmatsu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + SubProject2.xcscheme_^#shared#^_ + + orderHint + 2 + + + + diff --git a/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2/SubProject2.h b/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2/SubProject2.h new file mode 100644 index 0000000..5f6d72c --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/Multi/SubProject2/SubProject2/SubProject2.h @@ -0,0 +1,18 @@ +// +// SubProject2.h +// SubProject2 +// +// Created by Jumpei Matsuda on 2024/01/19. +// + +#import + +//! Project version number for SubProject2. +FOUNDATION_EXPORT double SubProject2VersionNumber; + +//! Project version string for SubProject2. +FOUNDATION_EXPORT const unsigned char SubProject2VersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/spec/test_files/xcodeProjects/Projects/SingleProject b/spec/test_files/xcodeProjects/Projects/SingleProject new file mode 160000 index 0000000..f81ca14 --- /dev/null +++ b/spec/test_files/xcodeProjects/Projects/SingleProject @@ -0,0 +1 @@ +Subproject commit f81ca1451abd3215d9e38650ff46809a6aaf04bc diff --git a/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace new file mode 160000 index 0000000..5992482 --- /dev/null +++ b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace @@ -0,0 +1 @@ +Subproject commit 59924827416ce732fa2c9bd1c5dc45b41e7ea028 diff --git a/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/contents.xcworkspacedata b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cbe54cd --- /dev/null +++ b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcuserdata/jmatsu.xcuserdatad/UserInterfaceState.xcuserstate b/spec/test_files/xcodeProjects/Workspaces/Single/SingleWorkspace.xcworkspace/xcuserdata/jmatsu.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..6df6612afb483db827ed06bdc479c6268201d099 GIT binary patch literal 12432 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 H^U41K0piR& literal 0 HcmV?d00001 From f53fb31cabaaed26d8211d957c967e533903a655 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Fri, 19 Jan 2024 15:41:26 +0900 Subject: [PATCH 5/5] test: Use real file system and more shallow fake for ios build spec --- lib/deploygate/xcode/ios.rb | 18 ---- spec/deploygate/xcode/analyze_spec.rb | 2 - spec/deploygate/xcode/ios_spec.rb | 113 +++++++++++++------------- 3 files changed, 55 insertions(+), 78 deletions(-) diff --git a/lib/deploygate/xcode/ios.rb b/lib/deploygate/xcode/ios.rb index cbf6ee3..dafe5b8 100644 --- a/lib/deploygate/xcode/ios.rb +++ b/lib/deploygate/xcode/ios.rb @@ -3,7 +3,6 @@ module Xcode module Ios WORK_DIR_EXTNAME = '.xcworkspace' PROJECT_DIR_EXTNAME = '.xcodeproj' - IGNORE_DIRS = [ '.git', 'Carthage' ] class << self # @param [DeployGate::Xcode::Analyze] ios_analyze @@ -52,23 +51,6 @@ def ios_root?(base_path) false end - # @param [String] base_path - # @param [Boolean] current_only - # @return [Array] - def find_workspaces(base_path) - projects = [] - Find.find(base_path) do |path| - next if path == base_path - if File.extname(path) == WORK_DIR_EXTNAME - projects.push(path) - end - - Find.prune if FileTest.directory?(path) && IGNORE_DIRS.include?(File.basename(path)) - end - - projects - end - # @param [String] path # @return [String] def project_root_path(path) diff --git a/spec/deploygate/xcode/analyze_spec.rb b/spec/deploygate/xcode/analyze_spec.rb index a7376af..5526230 100644 --- a/spec/deploygate/xcode/analyze_spec.rb +++ b/spec/deploygate/xcode/analyze_spec.rb @@ -1,5 +1,3 @@ -require 'spec_helper' - describe DeployGate::Xcode::Analyze do describe '#new' do subject(:analyze) do diff --git a/spec/deploygate/xcode/ios_spec.rb b/spec/deploygate/xcode/ios_spec.rb index 97ff6e9..4a1fc16 100644 --- a/spec/deploygate/xcode/ios_spec.rb +++ b/spec/deploygate/xcode/ios_spec.rb @@ -1,82 +1,79 @@ -describe DeployGate::Xcode::Ios do - before do - class ProjectMock - def schemes - [] - end - end - class AnalyzeMock - def build_workspace - '' - end - def xcodeproj - '' - end - end +class FakeGemManager + def initialize(ipa_path:) + @ipa_path = ipa_path + end + + def work(*) + @work = true + @ipa_path end + def has_called_work? + @work + end +end + +describe DeployGate::Xcode::Ios do + let(:xcodeproj_path) { test_file_path("xcodeProjects", "Projects", "SingleProject", "SingleProject.xcodeproj") } + let(:workspace_path) { test_file_path("xcodeProjects", "Workspaces", "Single", "SingleWorkspace.xcworkspace") } + describe "#build" do - it "should call Gym Manager" do - call_gym_manager = false - allow(FastlaneCore::Configuration).to receive(:create) {} - allow_any_instance_of(Gym::Manager).to receive(:work) { call_gym_manager = true } - allow(File).to receive(:exist?).and_return(true) - allow(File).to receive(:expand_path).and_return('path') - allow(FastlaneCore::Project).to receive(:new).and_return(ProjectMock.new) - - DeployGate::Xcode::Ios.build(AnalyzeMock.new, '', '') - expect(call_gym_manager).to be_truthy + let(:gem_manager) { FakeGemManager.new(ipa_path: test_file_path("xcodeProjects", "fake.ipa")) } + + before do + allow(Gym::Manager).to receive(:new).and_return(gem_manager) end - it "raise not support export" do - allow(FastlaneCore::Configuration).to receive(:create) {} - allow_any_instance_of(Gym::Manager).to receive(:work) {} - allow(File).to receive(:exist?).and_return(true) - allow(File).to receive(:expand_path).and_return('path') - allow(FastlaneCore::Project).to receive(:new).and_return(ProjectMock.new) + it "should call Gym Manager and allow provisioning updates without an option" do + DeployGate::Xcode::Ios.build( + ios_analyze: DeployGate::Xcode::Analyze.new( + xcodeproj_path: xcodeproj_path + ) + ) + + expect(gem_manager).to be_has_called_work + expect(Gym.config.values).to include( + xcargs: '-allowProvisioningUpdates', + export_xcargs: '-allowProvisioningUpdates' + ) + end - expect { - DeployGate::Xcode::Ios.build(AnalyzeMock.new, '', '', nil, '', 'not support export method') - }.to raise_error DeployGate::Xcode::Analyze::NotSupportExportMethodError + it "should call Gym Manager and disallow provisioning updates if an option is provided" do + DeployGate::Xcode::Ios.build( + ios_analyze: DeployGate::Xcode::Analyze.new( + xcodeproj_path: xcodeproj_path + ), + allow_provisioning_updates: false + ) + + expect(gem_manager).to be_has_called_work + expect(Gym.config.values).not_to include( + xcargs: include('-allowProvisioningUpdates'), + export_xcargs: include('-allowProvisioningUpdates') + ) end end describe "#workspace?" do - it "pod workspace" do - allow(File).to receive(:extname).and_return('.xcworkspace') - - result = DeployGate::Xcode::Ios.workspace?('path') - expect(result).to be_truthy + it "returns true if it's a workspace file" do + expect(DeployGate::Xcode::Ios.workspace?(workspace_path)).to be_truthy end - it "xcode project" do - allow(File).to receive(:extname).and_return('.xcodeproj') - - result = DeployGate::Xcode::Ios.workspace?('path') - expect(result).to be_falsey + it "returns false if it's a xcode project file" do + expect(DeployGate::Xcode::Ios.workspace?(xcodeproj_path)).to be_falsey end end describe "#project?" do - it "pod workspace" do - allow(File).to receive(:extname).and_return('.xcworkspace') - - result = DeployGate::Xcode::Ios.project?('path') - expect(result).to be_falsey + it "returns false if it's a workspace file" do + expect(DeployGate::Xcode::Ios.project?(workspace_path)).to be_falsey end - it "xcode project" do - allow(File).to receive(:extname).and_return('.xcodeproj') - - result = DeployGate::Xcode::Ios.project?('path') - expect(result).to be_truthy + it "returns true if it's a xcode project file" do + expect(DeployGate::Xcode::Ios.project?(xcodeproj_path)).to be_truthy end end - describe "#find_workspaces" do - # TODO: add test - end - describe "#project_root_path" do let(:root_path) {'test'} it "when test/test.xcodeproj/project.xcworkspace" do