File: Action%2BMoveOutput.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (60 lines) | stat: -rw-r--r-- 2,849 bytes parent folder | download
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
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2024 Apple Inc. and the Swift project authors
 Licensed under Apache License v2.0 with Runtime Library Exception

 See https://swift.org/LICENSE.txt for license information
 See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/

import Foundation
import SwiftDocC

extension Action {
    
    /// Creates a new unique directory, with an optional template, inside of specified container.
    /// - Parameters:
    ///   - container: The container directory to create a new directory within.
    ///   - template: An optional template for the new directory.
    ///   - fileManager: The file manager to create the new directory.
    /// - Returns: The URL of the new unique directory.
    static func createUniqueDirectory(inside container: URL, template: URL?, fileManager: FileManagerProtocol) throws -> URL {
        let targetURL = container.appendingPathComponent(ProcessInfo.processInfo.globallyUniqueString)
        
        if let template {
            // If a template directory has been provided, create the temporary build folder with its contents
            // Ensure that the container exists
            try? fileManager.createDirectory(at: targetURL.deletingLastPathComponent(), withIntermediateDirectories: false, attributes: nil)
            try fileManager.copyItem(at: template, to: targetURL)
        } else {
            // Otherwise, create an empty directory
            try fileManager.createDirectory(at: targetURL, withIntermediateDirectories: true, attributes: nil)
        }
        return targetURL
    }
    
    /// Moves a file or directory from the specified location to a new location.
    /// - Parameters:
    ///   - source: The file or directory to move.
    ///   - destination: The new location for the file or directory.
    ///   - fileManager: The file manager to move the file or directory.
    static func moveOutput(from source: URL, to destination: URL, fileManager: FileManagerProtocol) throws {
        // We only need to move output if it exists
        guard fileManager.fileExists(atPath: source.path) else { return }
        
        if fileManager.fileExists(atPath: destination.path) {
            try fileManager.removeItem(at: destination)
        }
        
        try ensureThatParentFolderExist(for: destination, fileManager: fileManager)
        try fileManager.moveItem(at: source, to: destination)
    }
    
    private static func ensureThatParentFolderExist(for location: URL, fileManager: FileManagerProtocol) throws {
        let parentFolder = location.deletingLastPathComponent()
        if !fileManager.directoryExists(atPath: parentFolder.path) {
            try fileManager.createDirectory(at: parentFolder, withIntermediateDirectories: false, attributes: nil)
        }
    }
}