From 39b854d056307751cda0fbdff4d514086c634c52 Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 11:54:10 -0400 Subject: [PATCH 1/7] Factor out the commit hash from the library version. This PR captures the current commit hash in a different variable from the library version. There is no user-facing impact. --- Package.swift | 12 +++------ Sources/Testing/Support/Versions.swift | 25 ++++++++++++++--- Sources/_TestingInternals/CMakeLists.txt | 1 + Sources/_TestingInternals/Versions.cpp | 13 +++++++++ Sources/_TestingInternals/include/Versions.h | 9 +++++++ cmake/modules/LibraryVersion.cmake | 28 -------------------- 6 files changed, 49 insertions(+), 39 deletions(-) diff --git a/Package.swift b/Package.swift index 5206b268e..0f7b0c814 100644 --- a/Package.swift +++ b/Package.swift @@ -468,16 +468,12 @@ extension Array where Element == PackageDescription.CXXSetting { .define("SWT_NO_LIBDISPATCH", .whenEmbedded()), ] - // Capture the testing library's version as a C++ string constant. + // Capture the testing library's commit info as C++ constants. if let git { - let testingLibraryVersion = if let tag = git.currentTag { - tag - } else if git.hasUncommittedChanges { - "\(git.currentCommit) (modified)" - } else { - git.currentCommit + result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(git.currentCommit)""#)) + if git.hasUncommittedChanges { + result.append(.define("SWT_TESTING_LIBRARY_COMMIT_MODIFIED", to: "1")) } - result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: #""\#(testingLibraryVersion)""#)) } return result diff --git a/Sources/Testing/Support/Versions.swift b/Sources/Testing/Support/Versions.swift index 62193d6c4..82dd92181 100644 --- a/Sources/Testing/Support/Versions.swift +++ b/Sources/Testing/Support/Versions.swift @@ -129,9 +129,28 @@ let simulatorVersion: String = { /// an event writer. /// /// This value is not part of the public interface of the testing library. -var testingLibraryVersion: String { - swt_getTestingLibraryVersion().flatMap(String.init(validatingCString:)) ?? "unknown" -} +let testingLibraryVersion: String = { + guard var result = swt_getTestingLibraryVersion().flatMap(String.init(validatingCString:)) else { + return "unknown" + } + + // Get details of the git commit used when compiling the testing library. + var commitHash: UnsafePointer? + var commitModified = CBool(false) + swt_getTestingLibraryCommit(&commitHash, &commitModified) + + if let commitHash = commitHash.flatMap(String.init(validatingCString:)) { + // Truncate to 15 characters of the hash to match `swift --version`. + let commitHash = commitHash.prefix(15) + if commitModified { + result = "\(result) (\(commitHash) - modified)" + } else { + result = "\(result) (\(commitHash))" + } + } + + return result +}() /// Get the LLVM target triple used to build the testing library, if available. /// diff --git a/Sources/_TestingInternals/CMakeLists.txt b/Sources/_TestingInternals/CMakeLists.txt index 16713ab27..2b385cb1b 100644 --- a/Sources/_TestingInternals/CMakeLists.txt +++ b/Sources/_TestingInternals/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_CXX_SCAN_FOR_MODULES 0) +include(GitCommit) include(LibraryVersion) include(TargetTriple) add_library(_TestingInternals STATIC diff --git a/Sources/_TestingInternals/Versions.cpp b/Sources/_TestingInternals/Versions.cpp index 97eace99e..8e85f3d06 100644 --- a/Sources/_TestingInternals/Versions.cpp +++ b/Sources/_TestingInternals/Versions.cpp @@ -19,6 +19,19 @@ const char *swt_getTestingLibraryVersion(void) { #endif } +void swt_getTestingLibraryCommit(const char *_Nullable *_Nonnull outHash, bool *outModified) { +#if defined(SWT_TESTING_LIBRARY_COMMIT_HASH) + *outHash = SWT_TESTING_LIBRARY_COMMIT_HASH; +#else + *outHash = nullptr; +#endif +#if defined(SWT_TESTING_LIBRARY_COMMIT_MODIFIED) + *outModified = (SWT_TESTING_LIBRARY_COMMIT_MODIFIED != 0); +#else + *outModified = false; +#endif +} + const char *swt_getTargetTriple(void) { #if defined(SWT_TARGET_TRIPLE) return SWT_TARGET_TRIPLE; diff --git a/Sources/_TestingInternals/include/Versions.h b/Sources/_TestingInternals/include/Versions.h index ed523b86f..b188a4d66 100644 --- a/Sources/_TestingInternals/include/Versions.h +++ b/Sources/_TestingInternals/include/Versions.h @@ -38,6 +38,15 @@ static inline uint64_t swt_getSwiftCompilerVersion(void) { /// other conditions. Do not attempt to parse it. SWT_EXTERN const char *_Nullable swt_getTestingLibraryVersion(void); +/// Get details of the source control (git) commit from which the testing +/// library was built. +/// +/// - Parameters: +/// - outHash: On return, set to a pointer to a string containing the commit +/// hash from which the testing library was built. +/// - outModified: On return, whether or not there were uncommitted changes. +SWT_EXTERN void swt_getTestingLibraryCommit(const char *_Nullable *_Nonnull outHash, bool *outModified); + /// Get the LLVM target triple used to build the testing library. /// /// - Returns: A string containing the LLVM target triple used to build the diff --git a/cmake/modules/LibraryVersion.cmake b/cmake/modules/LibraryVersion.cmake index 259ead608..32901365a 100644 --- a/cmake/modules/LibraryVersion.cmake +++ b/cmake/modules/LibraryVersion.cmake @@ -10,34 +10,6 @@ # remember to remove -dev. set(SWT_TESTING_LIBRARY_VERSION "6.3-dev") -find_package(Git QUIET) -if(Git_FOUND) - # Get the commit hash corresponding to the current build. Limit length to 15 - # to match `swift --version` output format. - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse --short=15 --verify HEAD - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GIT_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET) - - # Check if there are local changes. - execute_process( - COMMAND ${GIT_EXECUTABLE} status -s - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GIT_STATUS - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(GIT_STATUS) - set(GIT_VERSION "${GIT_VERSION} - modified") - endif() -endif() - -# Combine the hard-coded Swift version with available Git information. -if(GIT_VERSION) -set(SWT_TESTING_LIBRARY_VERSION "${SWT_TESTING_LIBRARY_VERSION} (${GIT_VERSION})") -endif() - -# All done! message(STATUS "Swift Testing version: ${SWT_TESTING_LIBRARY_VERSION}") add_compile_definitions( "$<$:SWT_TESTING_LIBRARY_VERSION=\"${SWT_TESTING_LIBRARY_VERSION}\">") From 4f44d44ed81796dfb5612c95175ea47f31bc2408 Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 12:26:19 -0400 Subject: [PATCH 2/7] Still need SWT_TESTING_LIBRARY_VERSION --- Package.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Package.swift b/Package.swift index 0f7b0c814..410c50147 100644 --- a/Package.swift +++ b/Package.swift @@ -470,6 +470,12 @@ extension Array where Element == PackageDescription.CXXSetting { // Capture the testing library's commit info as C++ constants. if let git { + let testingLibraryVersion = if let tag = git.currentTag { + result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: #""\#(testingLibraryVersion)""#)) + } else { + result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: "0")) + } + result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(git.currentCommit)""#)) if git.hasUncommittedChanges { result.append(.define("SWT_TESTING_LIBRARY_COMMIT_MODIFIED", to: "1")) From 22a6b844257399578279e99d8e48557489027239 Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 12:27:26 -0400 Subject: [PATCH 3/7] Typo --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 410c50147..07e68f155 100644 --- a/Package.swift +++ b/Package.swift @@ -470,8 +470,8 @@ extension Array where Element == PackageDescription.CXXSetting { // Capture the testing library's commit info as C++ constants. if let git { - let testingLibraryVersion = if let tag = git.currentTag { - result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: #""\#(testingLibraryVersion)""#)) + if let tag = git.currentTag { + result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: #""\#(tag)""#)) } else { result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: "0")) } From b4abd32a149cd0ef11d94176e7e70d949eef4284 Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 12:30:48 -0400 Subject: [PATCH 4/7] git forgot a file --- cmake/modules/GitCommit.cmake | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 cmake/modules/GitCommit.cmake diff --git a/cmake/modules/GitCommit.cmake b/cmake/modules/GitCommit.cmake new file mode 100644 index 000000000..86b0b4733 --- /dev/null +++ b/cmake/modules/GitCommit.cmake @@ -0,0 +1,35 @@ +# This source file is part of the Swift.org open source project +# +# Copyright (c) 2024–2025 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See http://swift.org/LICENSE.txt for license information +# See http://swift.org/CONTRIBUTORS.txt for Swift project authors + +find_package(Git QUIET) +if(Git_FOUND) + # Get the commit hash corresponding to the current build. + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --verify HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE SWT_TESTING_LIBRARY_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET) + + # Check if there are local changes. + execute_process( + COMMAND ${GIT_EXECUTABLE} status -s + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE SWT_TESTING_LIBRARY_COMMIT_MODIFIED + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +if(SWT_TESTING_LIBRARY_COMMIT_HASH) + message(STATUS "Swift Testing commit hash: ${SWT_TESTING_LIBRARY_COMMIT_HASH}") + add_compile_definitions( + "$<$:SWT_TESTING_LIBRARY_COMMIT_HASH=\"${SWT_TESTING_LIBRARY_COMMIT_HASH}\">") + if(SWT_TESTING_LIBRARY_COMMIT_MODIFIED) + add_compile_definitions( + "$<$:SWT_TESTING_LIBRARY_COMMIT_MODIFIED=1>") + endif() +endif() From 684c7b7ae60fbba60550ba9a7d71078f54084dc7 Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 13:47:35 -0400 Subject: [PATCH 5/7] Fall back to GitHub-provided environment variable when running in GHA --- Package.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Package.swift b/Package.swift index 07e68f155..6be8c15d8 100644 --- a/Package.swift +++ b/Package.swift @@ -479,6 +479,10 @@ extension Array where Element == PackageDescription.CXXSetting { result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(git.currentCommit)""#)) if git.hasUncommittedChanges { result.append(.define("SWT_TESTING_LIBRARY_COMMIT_MODIFIED", to: "1")) + } else if let gitHubSHA = Context.environment["GITHUB_SHA"] { + // When building in GitHub Actions, the git command may fail to get us the + // commit hash, so check if GitHub shared it with us instead. + result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(gitHubSHA)""#)) } } From 5a1fc129c05354750c031992eff191f5b920ea33 Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 13:50:36 -0400 Subject: [PATCH 6/7] Put it in the wrong place, oops --- Package.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index 6be8c15d8..840541887 100644 --- a/Package.swift +++ b/Package.swift @@ -479,11 +479,12 @@ extension Array where Element == PackageDescription.CXXSetting { result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(git.currentCommit)""#)) if git.hasUncommittedChanges { result.append(.define("SWT_TESTING_LIBRARY_COMMIT_MODIFIED", to: "1")) - } else if let gitHubSHA = Context.environment["GITHUB_SHA"] { - // When building in GitHub Actions, the git command may fail to get us the - // commit hash, so check if GitHub shared it with us instead. - result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(gitHubSHA)""#)) } + } else if let gitHubSHA = Context.environment["GITHUB_SHA"] { + // When building in GitHub Actions, the git command may fail to get us the + // commit hash, so check if GitHub shared it with us instead. + result.append(.define("SWT_TESTING_LIBRARY_VERSION", to: "0")) + result.append(.define("SWT_TESTING_LIBRARY_COMMIT_HASH", to: #""\#(gitHubSHA)""#)) } return result From f25c9d706718f80650db6fc169c55468ca781f7e Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 11 Sep 2025 14:00:44 -0400 Subject: [PATCH 7/7] Still show the commit hash even if the library version isn't known --- Sources/Testing/Support/Versions.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/Testing/Support/Versions.swift b/Sources/Testing/Support/Versions.swift index 82dd92181..76c5aeaf6 100644 --- a/Sources/Testing/Support/Versions.swift +++ b/Sources/Testing/Support/Versions.swift @@ -130,9 +130,7 @@ let simulatorVersion: String = { /// /// This value is not part of the public interface of the testing library. let testingLibraryVersion: String = { - guard var result = swt_getTestingLibraryVersion().flatMap(String.init(validatingCString:)) else { - return "unknown" - } + var result = swt_getTestingLibraryVersion().flatMap(String.init(validatingCString:)) ?? "unknown" // Get details of the git commit used when compiling the testing library. var commitHash: UnsafePointer?