Skip to content

Commit 3a194aa

Browse files
Merge pull request #54 from bitrise-io/skip-source-packages
feat: ACI-2805 Add flag to skip SPM
2 parents 9aa9b98 + b916394 commit 3a194aa

File tree

4 files changed

+44
-8
lines changed

4 files changed

+44
-8
lines changed

cmd/saveXcodeDerivedDataFiles.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ var saveXcodeDerivedDataFilesCmd = &cobra.Command{
3939
ddPath, _ := cmd.Flags().GetString("deriveddata-path")
4040
xcodeCachePath, _ := cmd.Flags().GetString("xcodecache-path")
4141
followSymlinks, _ := cmd.Flags().GetBool("follow-symlinks")
42+
skipSPM, _ := cmd.Flags().GetBool("skip-spm")
4243

4344
tracker := xcode.NewDefaultStepTracker("save-xcode-build-cache", os.Getenv, logger)
4445
defer tracker.Wait()
@@ -58,6 +59,7 @@ var saveXcodeDerivedDataFilesCmd = &cobra.Command{
5859
ddPath,
5960
xcodeCachePath,
6061
followSymlinks,
62+
skipSPM,
6163
logger,
6264
tracker,
6365
startT,
@@ -99,6 +101,7 @@ func init() {
99101
}
100102
saveXcodeDerivedDataFilesCmd.Flags().String("xcodecache-path", "", "Path to the Xcode cache directory folder to be saved. If not set, it will not be uploaded.")
101103
saveXcodeDerivedDataFilesCmd.Flags().Bool("follow-symlinks", false, "Follow symlinks when calculating metadata and save referenced files to the cache (default: false)")
104+
saveXcodeDerivedDataFilesCmd.Flags().Bool("skip-spm", false, "Skip saving files under \"DerivedData/*/SourcePackages\", i.e. skip SPM dependencies. Consider enabling this flag if using SPM cache steps. Default: false")
102105
}
103106

104107
func saveXcodeDerivedDataFilesCmdFn(ctx context.Context,
@@ -109,6 +112,7 @@ func saveXcodeDerivedDataFilesCmdFn(ctx context.Context,
109112
derivedDataPath,
110113
xcodeCachePath string,
111114
followSymlinks bool,
115+
skipSPM bool,
112116
logger log.Logger,
113117
tracker xcode.StepAnalyticsTracker,
114118
startT time.Time,
@@ -150,6 +154,7 @@ func saveXcodeDerivedDataFilesCmdFn(ctx context.Context,
150154
XcodeCacheDirPath: xcodeCachePath,
151155
CacheKey: cacheKey,
152156
FollowSymlinks: followSymlinks,
157+
SkipSPM: skipSPM,
153158
}, envProvider, logger)
154159
if err != nil {
155160
return op, fmt.Errorf("create metadata: %w", err)

cmd/saveXcodeDerivedDataFiles_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func Test_saveXcodeDerivedDataFilesCmdFn(t *testing.T) {
3636
envVars := createEnvProvider(map[string]string{
3737
"BITRISEIO_BITRISE_SERVICES_ACCESS_TOKEN": "ServiceAccessTokenValue",
3838
})
39-
_, err := saveXcodeDerivedDataFilesCmdFn(context.Background(), common.CacheAuthConfig{}, "", "", "", "", "", false, mockLogger, mockTracker, time.Now(), envVars)
39+
_, err := saveXcodeDerivedDataFilesCmdFn(context.Background(), common.CacheAuthConfig{}, "", "", "", "", "", false, false, mockLogger, mockTracker, time.Now(), envVars)
4040

4141
// then
4242
require.EqualError(t, err, "get cache key: cache key is required if BITRISE_GIT_BRANCH env var is not set")

internal/xcode/file_group_info.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"io"
1717
"syscall"
1818

19+
"strings"
20+
1921
"github.com/bitrise-io/go-utils/v2/log"
2022
)
2123

@@ -86,7 +88,11 @@ func (mc *fileGroupInfoCollector) isSeen(path string) bool {
8688
return mc.seen[path]
8789
}
8890

89-
func collectFileGroupInfo(cacheDirPath string, collectAttributes, followSymlinks bool, logger log.Logger) (FileGroupInfo, error) {
91+
func collectFileGroupInfo(cacheDirPath string,
92+
collectAttributes,
93+
followSymlinks bool,
94+
skipSPM bool,
95+
logger log.Logger) (FileGroupInfo, error) {
9096
var dd FileGroupInfo
9197

9298
fgi := fileGroupInfoCollector{
@@ -120,7 +126,7 @@ func collectFileGroupInfo(cacheDirPath string, collectAttributes, followSymlinks
120126
if !filepath.IsAbs(path) {
121127
path = filepath.Join(cacheDirPath, path)
122128
}
123-
if err := collectFileMetadata(path, inf, inf.IsDir(), &fgi, collectAttributes, followSymlinks, logger); err != nil {
129+
if err := collectFileMetadata(cacheDirPath, path, inf, inf.IsDir(), &fgi, collectAttributes, followSymlinks, skipSPM, logger); err != nil {
124130
logger.Errorf("Failed to collect metadata: %s", err)
125131
}
126132
}(d)
@@ -145,7 +151,11 @@ func collectFileGroupInfo(cacheDirPath string, collectAttributes, followSymlinks
145151
}
146152

147153
// nolint:wrapcheck
148-
func followSymlink(path string, target string, fgi *fileGroupInfoCollector, followSymlinks bool, logger log.Logger) error {
154+
func followSymlink(rootPath, path, target string,
155+
fgi *fileGroupInfoCollector,
156+
followSymlinks,
157+
skipSPM bool,
158+
logger log.Logger) error {
149159
if !followSymlinks {
150160
logger.Debugf("Skipping symbolic link: %s", path)
151161

@@ -172,7 +182,7 @@ func followSymlink(path string, target string, fgi *fileGroupInfoCollector, foll
172182
})
173183

174184
if !stat.IsDir() {
175-
return collectFileMetadata(target, stat, false, fgi, false, followSymlinks, logger)
185+
return collectFileMetadata(rootPath, target, stat, false, fgi, false, followSymlinks, skipSPM, logger)
176186
}
177187

178188
logger.Debugf("Symlink target is a directory, walking it: %s", target)
@@ -191,11 +201,17 @@ func followSymlink(path string, target string, fgi *fileGroupInfoCollector, foll
191201
path = filepath.Join(target, path)
192202
}
193203

194-
return collectFileMetadata(path, inf, inf.IsDir(), fgi, false, followSymlinks, logger)
204+
return collectFileMetadata(target, path, inf, inf.IsDir(), fgi, false, followSymlinks, skipSPM, logger)
195205
})
196206
}
197207

198-
func collectFileMetadata(path string, fileInfo fs.FileInfo, isDirectory bool, fgi *fileGroupInfoCollector, collectAttributes, followSymlinks bool, logger log.Logger) error {
208+
func collectFileMetadata(
209+
rootPath, path string,
210+
fileInfo fs.FileInfo,
211+
isDirectory bool,
212+
fgi *fileGroupInfoCollector,
213+
collectAttributes, followSymlinks, skipSPM bool,
214+
logger log.Logger) error {
199215
if fgi.isSeen(path) {
200216
logger.Debugf("Skipping path %s, already seen", path)
201217

@@ -211,6 +227,17 @@ func collectFileMetadata(path string, fileInfo fs.FileInfo, isDirectory bool, fg
211227
return nil
212228
}
213229

230+
if skipSPM {
231+
relPath, _ := filepath.Rel(rootPath, path)
232+
parts := strings.Split(filepath.ToSlash(relPath), "/")
233+
234+
// Checking for SourcePackages/* or */SourcePackages/* under the directory
235+
if len(parts) >= 1 && parts[0] == "SourcePackages" ||
236+
len(parts) >= 2 && parts[1] == "SourcePackages" {
237+
return nil
238+
}
239+
}
240+
214241
isSymlink := fileInfo.Mode()&os.ModeSymlink != 0
215242

216243
if isSymlink {
@@ -223,7 +250,7 @@ func collectFileMetadata(path string, fileInfo fs.FileInfo, isDirectory bool, fg
223250
target = filepath.Join(filepath.Dir(path), target)
224251
}
225252

226-
return followSymlink(path, target, fgi, followSymlinks, logger)
253+
return followSymlink(rootPath, path, target, fgi, followSymlinks, skipSPM, logger)
227254
}
228255

229256
file, err := os.Open(path)

internal/xcode/metadata.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type CreateMetadataParams struct {
3333
XcodeCacheDirPath string
3434
CacheKey string
3535
FollowSymlinks bool
36+
SkipSPM bool
3637
}
3738

3839
func CreateMetadata(params CreateMetadataParams, envProvider func(string) string, logger log.Logger) (*Metadata, error) {
@@ -43,6 +44,7 @@ func CreateMetadata(params CreateMetadataParams, envProvider func(string) string
4344
projectFiles, err := collectFileGroupInfo(params.ProjectRootDirPath,
4445
true,
4546
params.FollowSymlinks,
47+
false,
4648
logger)
4749
if err != nil {
4850
return nil, fmt.Errorf("calculate project files info: %w", err)
@@ -53,6 +55,7 @@ func CreateMetadata(params CreateMetadataParams, envProvider func(string) string
5355
derivedData, err = collectFileGroupInfo(params.DerivedDataPath,
5456
false,
5557
params.FollowSymlinks,
58+
params.SkipSPM,
5659
logger)
5760
if err != nil {
5861
return nil, fmt.Errorf("calculate derived data info: %w", err)
@@ -64,6 +67,7 @@ func CreateMetadata(params CreateMetadataParams, envProvider func(string) string
6467
xcodeCacheDir, err = collectFileGroupInfo(params.XcodeCacheDirPath,
6568
false,
6669
params.FollowSymlinks,
70+
params.SkipSPM,
6771
logger)
6872
if err != nil {
6973
return nil, fmt.Errorf("calculate xcode cache dir info: %w", err)

0 commit comments

Comments
 (0)