Skip to content

Commit 92c9600

Browse files
committed
added clean-cache subcommand
1 parent 8e5ee07 commit 92c9600

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

Sources/Commands/SwiftPackageTool.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ public class SwiftPackageTool: SwiftTool<PackageToolOptions> {
153153
case .reset:
154154
try getActiveWorkspace().reset(with: diagnostics)
155155

156+
case .cleanCache:
157+
try getActiveWorkspace().cleanCache(with: diagnostics)
158+
156159
case .apidiff:
157160
let apiDigesterPath = try getToolchain().getSwiftAPIDigester()
158161
let apiDigesterTool = SwiftAPIDigester(tool: apiDigesterPath)
@@ -468,9 +471,10 @@ public class SwiftPackageTool: SwiftTool<PackageToolOptions> {
468471
to: { $0.editOptions.path = $1.path })
469472

470473
parser.add(subparser: PackageMode.clean.rawValue, overview: "Delete build artifacts")
474+
parser.add(subparser: PackageMode.cleanCache.rawValue, overview: "Clean the repository cache")
471475
parser.add(subparser: PackageMode.fetch.rawValue, overview: "")
472-
parser.add(subparser: PackageMode.reset.rawValue, overview: "Reset the complete cache/build directory")
473-
476+
parser.add(subparser: PackageMode.reset.rawValue, overview: "Reset the complete build directory")
477+
474478
let updateParser = parser.add(subparser: PackageMode.update.rawValue, overview: "Update package dependencies")
475479
binder.bind(
476480
positional: updateParser.add(
@@ -830,6 +834,7 @@ public class PackageToolOptions: ToolOptions {
830834

831835
public enum PackageMode: String, StringEnumArgument {
832836
case clean
837+
case cleanCache = "clean-cache"
833838
case config
834839
case format = "_format"
835840
case describe

Sources/Workspace/Workspace.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,32 @@ extension Workspace {
618618
}
619619
}
620620

621+
/// Cleans the repository cache.
622+
///
623+
/// - Parameters:
624+
/// - diagnostics: The diagnostics engine that reports errors, warnings
625+
/// and notes.
626+
public func cleanCache(with diagnostics: DiagnosticsEngine) {
627+
// If we have no data yet, we're done.
628+
guard fileSystem.exists(repositoryManager.path) else {
629+
return
630+
}
631+
632+
guard let repositories = diagnostics.wrap({ try fileSystem.getDirectoryContents(repositoryManager.path) }) else {
633+
return
634+
}
635+
636+
for repository in repositories {
637+
let filePath = dataPath.appending(RelativePath(repository))
638+
let lock = FileLock(name: filePath.basename, cachePath: filePath)
639+
diagnostics.wrap {
640+
try lock.withLock {
641+
try fileSystem.removeFileTree(filePath)
642+
}
643+
}
644+
}
645+
}
646+
621647
/// Resets the entire workspace by removing the data directory.
622648
///
623649
/// - Parameters:

0 commit comments

Comments
 (0)