Sync Ios Config Task
Explicit legacy migration for a source Info.plist, project.pbxproj, Podfile, and Swift imports. It is deliberately non-cacheable and always computes the complete enabled text plan before writing. All targets are contained, symlink-free, staged, locked, and committed as one recoverable batch; write-once backups are created when the backup input is enabled. Swift discovery does not follow links and is bounded by depth and visited-entry count; all input snapshots and rendered outputs share a cumulative pre-commit budget.
pbxproj changes are allowed only for targetNames, or for the sole application target when that list is empty. Parser uncertainty, missing settings, and target ambiguity abort the whole plan. When propagateLogo is enabled, every selected configuration must declare ASSETCATALOG_COMPILER_APPICON_NAME; it is aligned to the configured appiconsetDir catalog rather than leaving installed assets disconnected from the application. Shared-module migration requires both iosPreviousSharedModuleName and iosSharedModuleName; it never guesses from a Podfile.
When splashEnabled is on, the same plist transaction also writes the UILaunchScreen dictionary, and the splash color/image sets are installed in the asset catalog that holds the configured appiconsetDir.
Safety rails on every source-writing task
| Rail | Behaviour |
|---|---|
| Explicit only | never runs as part of an ordinary build; you invoke it by name |
| Authorized | the matching DSL block must be configured, or the task is skipped |
-Pkiteconfig.dryRun=true | reports what it would write and remove, changes nothing |
-Pkiteconfig.backups=true | keeps a recovery copy before replacing anything (default) |
| Ownership | refuses to overwrite or delete a file it does not own |
| Atomic | staged then swapped, so an interrupted run leaves the tree intact |
Both -P switches accept exactly true or false; anything else fails the build rather than being read as false.
Properties
Off by default, so a project without splash { rewrite { } } stays byte-identical.
Validated at execution like the other source paths, so a missing file gets an actionable message.