Files
swift-mirror/utils/swift_snapshot_tool/README.md
Michael Gottesman f7251e5fbc [swift-snapshot-tool] Add to the README a helper blurb about how to run tests against Swift Testing
Swift Testing is in the downloadable toolchains but is not in the normal library
lookup path, so one needs to specify it explicitly with a -I command so it is
found by the test command.
2025-07-25 10:50:55 -07:00

4.2 KiB

Swift Snapshot Tool

Used to list and bisect nightly snapshots off of swift.org.

Examples

List snapshots

# xcrun swift run swift_snapshot_tool list
[INFO] Starting to download snapshot information from github.
[INFO] Finished downloading snapshot information from github.
0 swift-DEVELOPMENT-SNAPSHOT-2024-09-06-a
1 swift-DEVELOPMENT-SNAPSHOT-2024-09-05-a
2 swift-DEVELOPMENT-SNAPSHOT-2024-09-04-a
3 swift-DEVELOPMENT-SNAPSHOT-2024-08-29-a
...

The number to the left is just the number back through historical time that the value is at. This allows for one to get a sense of the range of time in between two bisect numbers since one can look at the range in between them and how time varies.

One can specify a branch of snapshots to list. By default uses --development. Also supports the options --release_5_0, --release_6_0, --release_6_2.

Run

xcrun swift run swift_snapshot_tool run --script $SCRIPT_NAME \
  --date YYYY-MM-DD [--invert] [--workspace $DIR_TO_DOWNLOAD_TOOLCHAINS]

run success is defined by $SCRIPT_NAME returning 0 as an exit code. All other exit codes are considered a failure.

This command is meant to help one figure out where to start bisecting.

Options:

  • workspace: This is the place where we will download toolchains to. Defaults to /tmp/swift_snapshot_tool_workspace_v1. We suggest that you use an external hard drive or a specified place so that one does not have to redownload toolchains in between system restarts.

  • script: This is the script that should be run. We pass in the environment variables SWIFT_EXEC, SWIFT_FRONTEND, and SWIFT_LIBRARY_PATH to the script. If the script returns a zero exit code then the run is considered a succeess. If the script returns a non-zero exit code, then the run is considered a failure.

  • date: A date in the form YYYY-MM-DD. If a snapshot at date does not exist, we choose the first snapshot before that date.

  • invert: This causes test.sh's result to be inverted. This allows one to bisect backwards from a good state to a bad state. This is useful to determine when an error was fixed.

  • branch: This controls the specific branch of snapshots that are downloaded. By default uses --development. Also supports the options --release_5_0, --release_6_0, --release_6_2.

Bisect

xcrun swift run swift_snapshot_tool bisect --script $SCRIPT_NAME --old-date YYYY_MM_DD \
   [--new-date YYYY_MM_DD] [--workspace $DIR_TO_DOWNLOAD_TOOLCHAINS]

bisect success is defined by $SCRIPT_NAME returning 0 as an exit code. All other exit codes are considered a failure.

Options:

  • workspace: This is the place where we will download toolchains to. Defaults to /tmp/swift_snapshot_tool_workspace_v1. We suggest that you use an external hard drive or a specified place so that one does not have to redownload toolchains in between system restarts.

  • script: This is the script that should be run. We pass in the environment variables SWIFT_EXEC, SWIFT_FRONTEND, SWIFT_LIBRARY_PATH to the script. If the script returns a zero exit code then the run is considered a succeess. If the script returns a non-zero exit code, then the run is considered a failure.

  • old-date: Date in the form of YYYY-MM-DD. This is assumed to succeed by returning a zero exit code. If a snapshot does not exist at this date, the tool will choose the first snapshot before the date.

  • new-date: Date in the form of YYYY-MM-DD. This is assumed to fail by returning a non-zero exit code. If a snapshot does not exist at this date, the tool will choose the first snapshot before the date.

  • invert: This causes test.sh's result to be inverted. This allows one to bisect backwards from a good state to a bad state. This is useful to determine when an error was fixed.

  • branch: This controls the specific branch of snapshots that are downloaded. By default uses --development. Also supports the options --release_5_0, --release_6_0, --release_6_2.

FAQ and Helpful Tips

Bisecting against examples using Swift Testing

Swift Testing is not stored in the normal place in a toolchain. To test against such an example that uses swift testing pass into ones script the following -I command:

xcrun ${SWIFTC}  "${@:1}" -o binary -parse-as-library -I ${SWIFT_LIBRARY_PATH}/testing