Skip to content

Commit 9aa9b98

Browse files
Merge pull request #53 from bitrise-io/follow-symlinks
feat: ACI-2805 Add flag to follow xcode symlinks
2 parents a5ed13e + c1dbce1 commit 9aa9b98

File tree

6 files changed

+237
-42
lines changed

6 files changed

+237
-42
lines changed

cmd/restoreXcodeDerivedDataFiles.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ func restoreXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.Ca
154154
return op, fmt.Errorf("restore DerivedData directories: %w", err)
155155
}
156156

157+
if len(metadata.ProjectFiles.Symlinks) > 0 {
158+
logger.TInfof("Restoring project symlinks")
159+
if _, err = xcode.RestoreSymlinks(metadata.ProjectFiles.Symlinks, logger); err != nil {
160+
return op, fmt.Errorf("restore project symlink: %w", err)
161+
}
162+
}
163+
164+
if len(metadata.DerivedData.Symlinks) > 0 {
165+
logger.TInfof("Restoring DerivedData symlinks")
166+
if _, err = xcode.RestoreSymlinks(metadata.DerivedData.Symlinks, logger); err != nil {
167+
return op, fmt.Errorf("restore DerivedData symlink: %w", err)
168+
}
169+
}
170+
157171
if len(metadata.XcodeCacheDir.Files) > 0 {
158172
logger.TInfof("Downloading Xcode cache files")
159173
if _, err := xcode.DownloadCacheFilesFromBuildCache(ctx, metadata.XcodeCacheDir, kvClient, logger, isDebugLogMode, forceOverwrite, maxLoggedDownloadErrors); err != nil {
@@ -166,6 +180,13 @@ func restoreXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.Ca
166180
}
167181
}
168182

183+
if len(metadata.XcodeCacheDir.Symlinks) > 0 {
184+
logger.TInfof("Restoring Xcode cache symlinks")
185+
if _, err = xcode.RestoreSymlinks(metadata.XcodeCacheDir.Symlinks, logger); err != nil {
186+
return op, fmt.Errorf("restore xcode symlink: %w", err)
187+
}
188+
}
189+
169190
return op, nil
170191
}
171192

@@ -234,8 +255,11 @@ func logCacheMetadata(md *xcode.Metadata, logger log.Logger, isDebugLogMode bool
234255
logger.Infof(" Git commit: %s", md.GitCommit)
235256
logger.Infof(" Git branch: %s", md.GitBranch)
236257
logger.Infof(" Project files: %d", len(md.ProjectFiles.Files))
258+
logger.Infof(" Project symlinks: %d", len(md.ProjectFiles.Symlinks))
237259
logger.Infof(" DerivedData files: %d", len(md.DerivedData.Files))
260+
logger.Infof(" DerivedData symlinks: %d", len(md.DerivedData.Symlinks))
238261
logger.Infof(" Xcode cache files: %d", len(md.XcodeCacheDir.Files))
262+
logger.Infof(" Xcode cache symlinks: %d", len(md.XcodeCacheDir.Symlinks))
239263
logger.Infof(" Build Cache CLI version: %s", md.BuildCacheCLIVersion)
240264
logger.Infof(" Metadata version: %d", md.MetadataVersion)
241265

cmd/saveXcodeDerivedDataFiles.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var saveXcodeDerivedDataFilesCmd = &cobra.Command{
3838
cacheKey, _ := cmd.Flags().GetString("key")
3939
ddPath, _ := cmd.Flags().GetString("deriveddata-path")
4040
xcodeCachePath, _ := cmd.Flags().GetString("xcodecache-path")
41+
followSymlinks, _ := cmd.Flags().GetBool("follow-symlinks")
4142

4243
tracker := xcode.NewDefaultStepTracker("save-xcode-build-cache", os.Getenv, logger)
4344
defer tracker.Wait()
@@ -49,7 +50,18 @@ var saveXcodeDerivedDataFilesCmd = &cobra.Command{
4950
return fmt.Errorf("read auth config from environments: %w", err)
5051
}
5152

52-
op, cmdError := saveXcodeDerivedDataFilesCmdFn(cmd.Context(), authConfig, CacheMetadataPath, projectRoot, cacheKey, ddPath, xcodeCachePath, logger, tracker, startT, os.Getenv)
53+
op, cmdError := saveXcodeDerivedDataFilesCmdFn(cmd.Context(),
54+
authConfig,
55+
CacheMetadataPath,
56+
projectRoot,
57+
cacheKey,
58+
ddPath,
59+
xcodeCachePath,
60+
followSymlinks,
61+
logger,
62+
tracker,
63+
startT,
64+
os.Getenv)
5365
if op != nil {
5466
if cmdError != nil {
5567
errStr := cmdError.Error()
@@ -86,10 +98,21 @@ func init() {
8698
panic(err)
8799
}
88100
saveXcodeDerivedDataFilesCmd.Flags().String("xcodecache-path", "", "Path to the Xcode cache directory folder to be saved. If not set, it will not be uploaded.")
101+
saveXcodeDerivedDataFilesCmd.Flags().Bool("follow-symlinks", false, "Follow symlinks when calculating metadata and save referenced files to the cache (default: false)")
89102
}
90103

91-
func saveXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.CacheAuthConfig, cacheMetadataPath, projectRoot, providedCacheKey, derivedDataPath, xcodeCachePath string,
92-
logger log.Logger, tracker xcode.StepAnalyticsTracker, startT time.Time, envProvider func(string) string) (*xa.CacheOperation, error) {
104+
func saveXcodeDerivedDataFilesCmdFn(ctx context.Context,
105+
authConfig common.CacheAuthConfig,
106+
cacheMetadataPath,
107+
projectRoot,
108+
providedCacheKey,
109+
derivedDataPath,
110+
xcodeCachePath string,
111+
followSymlinks bool,
112+
logger log.Logger,
113+
tracker xcode.StepAnalyticsTracker,
114+
startT time.Time,
115+
envProvider func(string) string) (*xa.CacheOperation, error) {
93116
var err error
94117
var cacheKey string
95118
if providedCacheKey == "" {
@@ -126,6 +149,7 @@ func saveXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.Cache
126149
DerivedDataPath: derivedDataPath,
127150
XcodeCacheDirPath: xcodeCachePath,
128151
CacheKey: cacheKey,
152+
FollowSymlinks: followSymlinks,
129153
}, envProvider, logger)
130154
if err != nil {
131155
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{}, "", "", "", "", "", mockLogger, mockTracker, time.Now(), envVars)
39+
_, err := saveXcodeDerivedDataFilesCmdFn(context.Background(), common.CacheAuthConfig{}, "", "", "", "", "", 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")

0 commit comments

Comments
 (0)