Skip to content

Commit 56336d9

Browse files
authored
Fix experimental-api-diff command and add a test (#3359)
* Fix experimental-api-diff command * [APIDiff] Load the current version of the package directly instead of dumping JSON first
1 parent fc36e07 commit 56336d9

File tree

5 files changed

+48
-30
lines changed

5 files changed

+48
-30
lines changed

Sources/Build/BuildPlan.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1893,11 +1893,22 @@ public class BuildPlan {
18931893
}
18941894
}
18951895

1896-
public func createAPIDigesterArgs() -> [String] {
1896+
public func createAPIToolCommonArgs(includeLibrarySearchPaths: Bool) -> [String] {
18971897
let buildPath = buildParameters.buildPath.pathString
18981898
var arguments = ["-I", buildPath]
18991899

1900-
arguments += buildParameters.toolchain.extraSwiftCFlags
1900+
var extraSwiftCFlags = buildParameters.toolchain.extraSwiftCFlags
1901+
if !includeLibrarySearchPaths {
1902+
for index in extraSwiftCFlags.indices.dropLast().reversed() {
1903+
if extraSwiftCFlags[index] == "-L" {
1904+
// Remove the flag
1905+
extraSwiftCFlags.remove(at: index)
1906+
// Remove the argument
1907+
extraSwiftCFlags.remove(at: index)
1908+
}
1909+
}
1910+
}
1911+
arguments += extraSwiftCFlags
19011912

19021913
// Add the search path to the directory containing the modulemap file.
19031914
for target in targets {

Sources/Commands/APIDigester.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ struct APIDigesterBaselineDumper {
124124
try apiDigesterTool.dumpSDKJSON(
125125
at: sdkJSON,
126126
modules: graph.apiDigesterModules,
127-
additionalArgs: buildOp.buildPlan!.createAPIDigesterArgs()
127+
additionalArgs: buildOp.buildPlan!.createAPIToolCommonArgs(includeLibrarySearchPaths: false)
128128
)
129129

130130
return sdkJSON
@@ -159,16 +159,18 @@ public struct SwiftAPIDigester {
159159
}
160160

161161
public func diagnoseSDK(
162-
currentSDKJSON: AbsolutePath,
163-
baselineSDKJSON: AbsolutePath
162+
baselineSDKJSON: AbsolutePath,
163+
apiToolArgs: [String],
164+
modules: [String]
164165
) throws {
165-
let args = [
166+
var args = [
166167
"-diagnose-sdk",
167-
"--input-paths",
168-
baselineSDKJSON.pathString,
169-
"-input-paths",
170-
currentSDKJSON.pathString,
168+
"-baseline-path", baselineSDKJSON.pathString,
171169
]
170+
args.append(contentsOf: apiToolArgs)
171+
for module in modules {
172+
args.append(contentsOf: ["-module", module])
173+
}
172174

173175
try runTool(args)
174176
}

Sources/Commands/SwiftPackageTool.swift

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,8 @@ extension SwiftPackageTool {
294294
@OptionGroup()
295295
var swiftOptions: SwiftToolOptions
296296

297-
@Argument(help: "The baseline treeish")
297+
@Argument(help: "The baseline treeish to compare to (e.g. a commit hash, branch name, tag, etc.)")
298298
var treeish: String
299-
300-
@Flag(help: "Invert the baseline which is helpful for determining API additions")
301-
var invertBaseline: Bool = false
302299

303300
func run(_ swiftTool: SwiftTool) throws {
304301
let apiDigesterPath = try swiftTool.getToolchain().getSwiftAPIDigester()
@@ -310,23 +307,12 @@ extension SwiftPackageTool {
310307
let buildOp = try swiftTool.createBuildOperation(cacheBuildManifest: false)
311308
try buildOp.build()
312309

313-
// Dump JSON for the current package.
314-
let buildParameters = buildOp.buildParameters
315-
let currentSDKJSON = buildParameters.apiDiff.appending(component: "current.json")
316-
let packageGraph = try buildOp.getPackageGraph()
317-
318-
try apiDigesterTool.dumpSDKJSON(
319-
at: currentSDKJSON,
320-
modules: packageGraph.apiDigesterModules,
321-
additionalArgs: buildOp.buildPlan!.createAPIDigesterArgs()
322-
)
323-
324310
// Dump JSON for the baseline package.
325311
let workspace = try swiftTool.getActiveWorkspace()
326312
let baselineDumper = try APIDigesterBaselineDumper(
327313
baselineTreeish: treeish,
328314
packageRoot: swiftTool.getPackageRoot(),
329-
buildParameters: buildParameters,
315+
buildParameters: buildOp.buildParameters,
330316
manifestLoader: workspace.manifestLoader,
331317
repositoryManager: workspace.repositoryManager,
332318
apiDigesterTool: apiDigesterTool,
@@ -336,8 +322,9 @@ extension SwiftPackageTool {
336322

337323
// Run the diagnose tool which will print the diff.
338324
try apiDigesterTool.diagnoseSDK(
339-
currentSDKJSON: invertBaseline ? baselineSDKJSON : currentSDKJSON,
340-
baselineSDKJSON: invertBaseline ? currentSDKJSON : baselineSDKJSON
325+
baselineSDKJSON: baselineSDKJSON,
326+
apiToolArgs: buildOp.buildPlan!.createAPIToolCommonArgs(includeLibrarySearchPaths: false),
327+
modules: try buildOp.getPackageGraph().apiDigesterModules
341328
)
342329
}
343330
}

Sources/Commands/SymbolGraphExtract.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ public struct SymbolGraphExtract {
4242
args += ["-module-name", target.c99name]
4343
args += buildParameters.targetTripleArgs(for: target)
4444

45-
// FIXME: We should rename this to common Swift tools args or something.
46-
args += buildPlan.createAPIDigesterArgs()
45+
args += buildPlan.createAPIToolCommonArgs(includeLibrarySearchPaths: true)
4746
args += ["-module-cache-path", buildParameters.moduleCache.pathString]
4847

4948
args += ["-output-dir", symbolGraphDirectory.pathString]

Tests/CommandsTests/PackageToolTests.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,25 @@ final class PackageToolTests: XCTestCase {
982982
#endif
983983
}
984984

985+
func testAPIDiff() throws {
986+
#if os(macOS)
987+
guard (try? Resources.default.toolchain.getSwiftAPIDigester()) != nil else {
988+
throw XCTSkip("swift-api-digester not available")
989+
}
990+
fixture(name: "DependencyResolution/External/Simple") { prefix in
991+
let packageRoot = prefix.appending(component: "Foo")
992+
// Overwrite the existing decl.
993+
try localFileSystem.writeFileContents(packageRoot.appending(component: "Foo.swift")) {
994+
$0 <<< "public let foo = 42"
995+
}
996+
let (_, stderr) = try execute(["experimental-api-diff", "1.2.3"], packagePath: packageRoot)
997+
XCTAssertTrue(stderr.contains("Func foo() has been removed"))
998+
}
999+
#else
1000+
throw XCTSkip("Test unsupported on current platform")
1001+
#endif
1002+
}
1003+
9851004
func testArchiveSource() throws {
9861005
fixture(name: "DependencyResolution/External/Simple") { prefix in
9871006
let packageRoot = prefix.appending(component: "Bar")

0 commit comments

Comments
 (0)