Skip to content

Commit a2b580b

Browse files
authored
Use project-relative path for workspace build settings (#300)
* Removed buildSettings type, as we always use project-relative base path for build settings
1 parent 35706e8 commit a2b580b

File tree

2 files changed

+44
-45
lines changed

2 files changed

+44
-45
lines changed

autocodesign/projectmanager/projecthelper.go

Lines changed: 42 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ type buildSettingsCacheKey struct {
3737
configuration string
3838
}
3939

40-
type buildSettings struct {
41-
settings serialized.Object
42-
basePath string
43-
}
44-
4540
// ProjectHelper ...
4641
type ProjectHelper struct {
4742
logger log.Logger
@@ -55,7 +50,7 @@ type ProjectHelper struct {
5550
isCompatMode bool
5651

5752
// Buildsettings is an array as it can contain both workspace and project build settings in that order
58-
buildSettingsCache map[buildSettingsCacheKey][]buildSettings
53+
buildSettingsCache map[buildSettingsCacheKey][]serialized.Object
5954
}
6055

6156
// NewProjectHelper checks the provided project or workspace and generate a ProjectHelper with the provided scheme and configuration
@@ -240,14 +235,16 @@ func (p *ProjectHelper) targetTeamID(targetName, config string) (string, error)
240235
return devTeam, err
241236
}
242237

243-
func (p *ProjectHelper) fetchBuildSettings(targetName, conf string) ([]buildSettings, error) {
244-
var settingsList []buildSettings
238+
func (p *ProjectHelper) fetchBuildSettings(targetName, conf string) ([]serialized.Object, error) {
239+
var settingsList []serialized.Object
245240
var wsErr error
246241
if p.XcWorkspace != nil { // workspace available
247242
var settings serialized.Object
248243
settings, wsErr = p.XcWorkspace.SchemeBuildSettings(targetName, conf, p.additionalXcodebuildOptions...)
249244
if wsErr == nil {
250-
settingsList = append(settingsList, buildSettings{settings: settings, basePath: p.XcWorkspace.Path})
245+
// Settings like INFOPLIST_FILE and CODE_SIGN_ENTITLEMENTS are project-relative
246+
// https://developer.apple.com/documentation/xcode/build-settings-reference#Infoplist-File
247+
settingsList = append(settingsList, settings)
251248
if !p.isCompatMode { // Fall back to project if workspace failed or compatibility mode is on
252249
return settingsList, nil
253250
}
@@ -261,7 +258,7 @@ func (p *ProjectHelper) fetchBuildSettings(targetName, conf string) ([]buildSett
261258

262259
projectSettings, projectErr := p.XcProj.TargetBuildSettings(targetName, conf, p.additionalXcodebuildOptions...)
263260
if projectErr == nil {
264-
settingsList = append(settingsList, buildSettings{settings: projectSettings, basePath: p.XcProj.Path})
261+
settingsList = append(settingsList, projectSettings)
265262
return settingsList, nil
266263
}
267264

@@ -275,7 +272,7 @@ func (p *ProjectHelper) fetchBuildSettings(targetName, conf string) ([]buildSett
275272
return settingsList, projectErr
276273
}
277274

278-
func (p *ProjectHelper) cachedBuildSettings(targetName, conf string) ([]buildSettings, error) {
275+
func (p *ProjectHelper) cachedBuildSettings(targetName, conf string) ([]serialized.Object, error) {
279276
key := buildSettingsCacheKey{targetName: targetName, configuration: conf}
280277
settings, ok := p.buildSettingsCache[key]
281278
if ok {
@@ -289,7 +286,7 @@ func (p *ProjectHelper) cachedBuildSettings(targetName, conf string) ([]buildSet
289286
}
290287

291288
if p.buildSettingsCache == nil {
292-
p.buildSettingsCache = map[buildSettingsCacheKey][]buildSettings{}
289+
p.buildSettingsCache = map[buildSettingsCacheKey][]serialized.Object{}
293290
}
294291
p.buildSettingsCache[key] = settingsList
295292

@@ -303,13 +300,13 @@ func (p *ProjectHelper) targetBuildSettings(targetName, conf string) (serialized
303300
}
304301

305302
if len(settingsList) == 1 {
306-
return settingsList[0].settings, nil
303+
return settingsList[0], nil
307304
}
308305

309306
p.logger.Debugf("buildSettings: Workspace target build settings: %+v", settingsList[0])
310307
p.logger.Debugf("buildSettings: Project target build settings: %+v", settingsList[1])
311308
p.logger.Debugf("buildSettings: Multiple build settings found for target (%s), returning the project one", targetName)
312-
return settingsList[1].settings, nil
309+
return settingsList[1], nil
313310
}
314311

315312
func (p *ProjectHelper) buildSettingForKey(targetName, conf string, key string) (string, error) {
@@ -318,33 +315,33 @@ func (p *ProjectHelper) buildSettingForKey(targetName, conf string, key string)
318315
return "", err
319316
}
320317

321-
wsSettings := settingsList[0].settings
322-
wsValue, err := wsSettings.String(key)
318+
settings := settingsList[0] // workspace setting if available, project otherwise
319+
settingValue, err := settings.String(key)
323320
if err != nil {
324-
return wsValue, err
321+
return settingValue, err
325322
}
326323

327324
if len(settingsList) == 1 {
328-
return wsValue, nil
325+
return settingValue, nil
329326
}
330327

331-
projectSettings := settingsList[1].settings
332-
projectValue, err := projectSettings.String(key)
328+
projectSettings := settingsList[1]
329+
projectSettingValue, err := projectSettings.String(key)
333330
if err != nil {
334331
p.logger.Errorf("buildSettings: Failed to fetch project build setting for key (%s): %s", key, err)
335-
p.logger.Printf("buildSettings: Returning workspace value for key (%s): %s", key, wsValue)
336-
return wsValue, nil
332+
p.logger.Printf("buildSettings: Returning workspace value for key (%s): %s", key, settingValue)
333+
return settingValue, nil
337334
}
338335

339-
if projectValue != wsValue {
340-
p.logger.Errorf("buildSettings: Conflicting values for build setting %s: '%s' (workspace) vs '%s' (project)", key, wsValue, projectValue)
336+
if projectSettingValue != settingValue {
337+
p.logger.Errorf("buildSettings: Conflicting values for build setting %s: '%s' (workspace) vs '%s' (project)", key, settingValue, projectSettingValue)
341338
// Return alternate value to be consistent with old project based target build setting fetch
342-
p.logger.Printf("buildSettings: Returning project value for key (%s): %s", key, projectValue)
343-
return projectValue, nil
339+
p.logger.Printf("buildSettings: Returning project value for key (%s): %s", key, projectSettingValue)
340+
return projectSettingValue, nil
344341
}
345-
p.logger.Debugf("buildSettings: Matching values for workspace and project build setting %s: '%s'", key, wsValue)
342+
p.logger.Debugf("buildSettings: Matching values for workspace and project build setting %s: '%s'", key, settingValue)
346343

347-
return wsValue, err
344+
return settingValue, err
348345
}
349346

350347
func (p *ProjectHelper) buildSettingPathForKey(targetName, conf string, key string) (string, error) {
@@ -353,38 +350,39 @@ func (p *ProjectHelper) buildSettingPathForKey(targetName, conf string, key stri
353350
return "", err
354351
}
355352

356-
wsSettings := settingsList[0]
357-
wsValue, err := wsSettings.settings.String(key)
353+
settings := settingsList[0]
354+
settingValue, err := settings.String(key)
358355
if err != nil {
359-
return wsValue, err
356+
return settingValue, err
360357
}
361358

362-
if pathutil.IsRelativePath(wsValue) {
363-
wsValue = filepath.Join(filepath.Dir(wsSettings.basePath), wsValue)
359+
projectBasePath := p.XcProj.Path
360+
if pathutil.IsRelativePath(settingValue) {
361+
settingValue = filepath.Join(filepath.Dir(projectBasePath), settingValue)
364362
}
365363

366364
if len(settingsList) == 1 {
367-
return wsValue, nil
365+
return settingValue, nil
368366
}
369367

370368
projectSettings := settingsList[1]
371-
projectValue, err := projectSettings.settings.String(key)
369+
projectSettingValue, err := projectSettings.String(key)
372370
if err != nil {
373-
return projectValue, err
371+
return projectSettingValue, err
374372
}
375373

376-
if pathutil.IsRelativePath(projectValue) {
377-
projectValue = filepath.Join(filepath.Dir(projectSettings.basePath), projectValue)
374+
if pathutil.IsRelativePath(projectSettingValue) {
375+
projectSettingValue = filepath.Join(filepath.Dir(projectBasePath), projectSettingValue)
378376
}
379377

380-
if projectValue != wsValue {
381-
p.logger.Errorf("buildSettings: Conflicting paths for build setting %s: '%s' (workspace) vs '%s' (project)", key, wsValue, projectValue)
382-
p.logger.Printf("buildSettings: Returning project path for key (%s): %s", key, projectValue)
383-
return projectValue, nil
378+
if projectSettingValue != settingValue {
379+
p.logger.Errorf("buildSettings: Conflicting paths for build setting %s: '%s' (workspace) vs '%s' (project)", key, settingValue, projectSettingValue)
380+
p.logger.Printf("buildSettings: Returning project path for key (%s): %s", key, projectSettingValue)
381+
return projectSettingValue, nil
384382
}
385383

386-
p.logger.Debugf("buildSettings: Matching paths for workspace and project build setting %s: '%s'", key, wsValue)
387-
return wsValue, nil
384+
p.logger.Debugf("buildSettings: Matching paths for workspace and project build setting %s: '%s'", key, settingValue)
385+
return settingValue, nil
388386
}
389387

390388
// TargetBundleID returns the target bundle ID

autocodesign/projectmanager/projecthelper_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/bitrise-io/go-utils/pathutil"
1010
"github.com/bitrise-io/go-utils/v2/log"
1111
"github.com/bitrise-io/go-xcode/v2/autocodesign"
12+
"github.com/bitrise-io/go-xcode/xcodeproject/serialized"
1213
"github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj"
1314
"github.com/stretchr/testify/require"
1415
)
@@ -117,7 +118,7 @@ func TestProjectHelper_ProjectTeamID_withouthTargetAttributes(t *testing.T) {
117118
logger: logger,
118119
MainTarget: xcodeproj.Target{Name: "AppTarget"},
119120
// bypass calling xcodebuild -showBuildSettings
120-
buildSettingsCache: map[buildSettingsCacheKey][]buildSettings{{targetName: "AppTarget", configuration: "Debug"}: {}},
121+
buildSettingsCache: map[buildSettingsCacheKey][]serialized.Object{{targetName: "AppTarget", configuration: "Debug"}: {}},
121122
// project withouth TargetAttributes
122123
XcProj: xcodeproj.XcodeProj{Proj: xcodeproj.Proj{Attributes: xcodeproj.ProjectAtributes{TargetAttributes: nil}}},
123124
}

0 commit comments

Comments
 (0)