-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathInstallSwiftSDK.swift
72 lines (63 loc) · 2.47 KB
/
InstallSwiftSDK.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2023 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 the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import ArgumentParser
@_spi(SwiftPMInternal)
import Basics
import CoreCommands
import Foundation
import PackageModel
import class Workspace.Workspace
import var TSCBasic.stdoutStream
struct InstallSwiftSDK: SwiftSDKSubcommand {
static let configuration = CommandConfiguration(
commandName: "install",
abstract: """
Installs a given Swift SDK bundle to a location discoverable by SwiftPM. If the artifact bundle \
is at a remote location, it's downloaded to local filesystem first.
"""
)
@OptionGroup(visibility: .hidden)
var locations: LocationOptions
@Argument(help: "A local filesystem path or a URL of a Swift SDK bundle to install.")
var bundlePathOrURL: String
@Option(help: "The checksum of the bundle generated with `swift package compute-checksum`.")
var checksum: String? = nil
func run(
hostTriple: Triple,
_ swiftSDKsDirectory: AbsolutePath,
_ observabilityScope: ObservabilityScope
) async throws {
let cancellator = Cancellator(observabilityScope: observabilityScope)
cancellator.installSignalHandlers()
let store = SwiftSDKBundleStore(
swiftSDKsDirectory: swiftSDKsDirectory,
fileSystem: self.fileSystem,
observabilityScope: observabilityScope,
outputHandler: { print($0.description) },
downloadProgressAnimation: ProgressAnimation
.percent(stream: stdoutStream, verbose: false, header: "Downloading")
.throttled(interval: .milliseconds(300))
)
try await store.install(
bundlePathOrURL: bundlePathOrURL,
checksum: self.checksum,
UniversalArchiver(self.fileSystem, cancellator),
HTTPClient(),
hasher: {
try Workspace.BinaryArtifactsManager.checksum(
forBinaryArtifactAt: $0,
fileSystem: self.fileSystem
)
}
)
}
}