diff --git a/step/step.go b/step/step.go index c0a9adb1..eb59c346 100644 --- a/step/step.go +++ b/step/step.go @@ -4,7 +4,6 @@ import ( "fmt" "os" "path/filepath" - "slices" "strings" "time" @@ -297,12 +296,9 @@ func (s XcodebuildArchiveConfigParser) ProcessInputs() (Config, error) { } } - var spmAdditionalOptions = []string{"-skipPackagePluginValidation", "-skipMacroValidation", "-skipPackageUpdates", "-disableAutomaticPackageResolution", "-onlyUsePackageVersionsFromResolvedFile"} - var filteredShowbuildsettingsOptions []string - for _, option := range config.XcodebuildAdditionalOptions { - if slices.Contains(spmAdditionalOptions, option) { - filteredShowbuildsettingsOptions = append(filteredShowbuildsettingsOptions, option) - } + showbuildSettingsAdditionalOptions := filterSPMAdditionalOptions(config.XcodebuildAdditionalOptions) + if len(showbuildSettingsAdditionalOptions) != len(config.XcodebuildAdditionalOptions) { + s.logger.Printf("Some xcodebuild additional options are filtered out when reading build settings. Options used: %s", strings.Join(showbuildSettingsAdditionalOptions, " ")) } // Open Xcode project @@ -311,7 +307,7 @@ func (s XcodebuildArchiveConfigParser) ProcessInputs() (Config, error) { ProjectOrWorkspacePath: config.ProjectPath, SchemeName: config.Scheme, ConfigurationName: config.Configuration, - AdditionalXcodebuildShowbuildsettingsOptions: filteredShowbuildsettingsOptions, + AdditionalXcodebuildShowbuildsettingsOptions: showbuildSettingsAdditionalOptions, }) if err != nil { return Config{}, fmt.Errorf("failed to open Project or Workspace: %w", err) diff --git a/step/utils.go b/step/utils.go index 1cce2a76..b857914c 100644 --- a/step/utils.go +++ b/step/utils.go @@ -4,6 +4,7 @@ import ( "bufio" "fmt" "regexp" + "slices" "strings" "github.com/bitrise-io/go-utils/colorstring" @@ -31,6 +32,24 @@ func generateAdditionalOptions(platform string, customOptions []string) []string return options } +func filterSPMAdditionalOptions(xcodebuildAdditionalOptions []string) []string { + var knownSPMFlags = []string{"-skipPackagePluginValidation", "-skipMacroValidation", "-skipPackageUpdates", "-disableAutomaticPackageResolution", "-onlyUsePackageVersionsFromResolvedFile"} + var knownSPMParams = []string{"-clonedSourcePackagesDirPath"} + + filteredShowbuildsettingsOptions := []string{} + for i, option := range xcodebuildAdditionalOptions { + if slices.Contains(knownSPMFlags, option) { + filteredShowbuildsettingsOptions = append(filteredShowbuildsettingsOptions, option) + continue + } + if slices.Contains(knownSPMParams, option) && i+1 < len(xcodebuildAdditionalOptions) { + filteredShowbuildsettingsOptions = append(filteredShowbuildsettingsOptions, option, xcodebuildAdditionalOptions[i+1]) + } + } + + return filteredShowbuildsettingsOptions +} + func determineExportMethod(desiredExportMethod string, archiveExportMethod exportoptions.Method, logger log.Logger) (exportoptions.Method, error) { if desiredExportMethod == "auto-detect" { logger.Printf("auto-detect export method specified: using the archive profile's export method: %s", archiveExportMethod) diff --git a/step/utils_test.go b/step/utils_test.go index 95a049e8..dda28f6a 100644 --- a/step/utils_test.go +++ b/step/utils_test.go @@ -74,3 +74,28 @@ func Test_findIDEDistrubutionLogsPath(t *testing.T) { }) } } + +func Test_filterSPMAdditionalOptions(t *testing.T) { + tests := []struct { + name string + xcodebuildAdditionalOptions []string + want []string + }{ + { + name: "no SPM options", + xcodebuildAdditionalOptions: []string{"-scheme", "MyScheme", "-configuration", "Release"}, + want: []string{}, + }, + { + name: "with SPM flags", + xcodebuildAdditionalOptions: []string{"-scheme", "MyScheme", "-skipPackagePluginValidation", "-skipMacroValidation", "-clonedSourcePackagesDirPath", "/path/to/packages"}, + want: []string{"-skipPackagePluginValidation", "-skipMacroValidation", "-clonedSourcePackagesDirPath", "/path/to/packages"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := filterSPMAdditionalOptions(tt.xcodebuildAdditionalOptions) + require.Equal(t, tt.want, got) + }) + } +}