4
public final class DeployableBundle: DeployableItem {
6
public init(name: String, bundlePath: AbsolutePath) throws {
9
files: try DeployableBundle.filesForBundle(bundlePath: bundlePath)
13
public static func filesForBundle(bundlePath: AbsolutePath) throws -> Set<DeployableFile> {
14
let bundleName = bundlePath.lastComponent
15
var files: Set<DeployableFile> = [DeployableFile(source: bundlePath, destination: RelativePath(bundleName))]
17
guard let enumerator = FileManager.default.enumerator(at: bundlePath.fileUrl.resolvingSymlinksInPath(), includingPropertiesForKeys: nil) else {
18
throw DeploymentError.failedToEnumerateContentsOfDirectory(bundlePath)
21
while let url = enumerator.nextObject() as? URL {
22
let localPath: AbsolutePath
23
let relativePath: RelativePath
24
if let computedRelativePath = url.path.stringWithPathRelativeTo(anchorPath: bundlePath.pathString, allowUpwardRelation: false) {
25
localPath = AbsolutePath(url.path)
26
relativePath = RelativePath(computedRelativePath)
27
} else if let computedRelativePath = url.resolvingSymlinksInPath().path.stringWithPathRelativeTo(anchorPath: bundlePath.pathString, allowUpwardRelation: false) {
28
localPath = AbsolutePath(url.resolvingSymlinksInPath().path)
29
relativePath = RelativePath(computedRelativePath)
31
throw DeploymentError.failedToRelativizePath(AbsolutePath(url.path), anchorPath: bundlePath)
33
let destinationRelativePath = RelativePath(bundleName).appending(relativePath: relativePath)
34
files.insert(DeployableFile(source: localPath, destination: destinationRelativePath))