| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /*
- * Copyright 2019 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- import Foundation
- import Utils
- /// Convenience
- struct Zip {
- /// Compresses the contents of the directory into a Zip file that resides beside the directory
- /// being compressed and has the same name as the directory with a `.zip` suffix.
- ///
- /// - Parameter directory: The directory to compress.
- /// - Parameter name: The name of the Zip file.
- /// - Returns: A URL to the Zip file created.
- static func zipContents(ofDir directory: URL, name: String) -> URL {
- // Ensure the directory being compressed exists.
- guard FileManager.default.directoryExists(at: directory) else {
- fatalError("Attempted to compress contents of \(directory) but the directory does not exist.")
- }
- // This `zip` command needs to be run in the parent directory.
- let parentDir = directory.deletingLastPathComponent()
- let zip = parentDir.appendingPathComponent(name)
- // If it exists already, try to remove it.
- if FileManager.default.fileExists(atPath: zip.path) {
- try? FileManager.default.removeItem(at: zip)
- }
- // Run the `zip` command. This could be replaced with a proper Zip library in the future.
- let command = "zip --symlinks -q -r -dg \(zip.lastPathComponent) \(directory.lastPathComponent)"
- let result = Shell.executeCommandFromScript(command, workingDir: parentDir)
- switch result {
- case .success:
- print("Successfully built Zip file.")
- return zip
- case let .error(code, output):
- fatalError("Error \(code) building zip file: \(output)")
- }
- }
- // Mark initialization as unavailable.
- @available(*, unavailable)
- init() { fatalError() }
- }
|