mirror of
https://github.com/tsolomko/SWCompression.git
synced 2026-06-23 14:56:41 +00:00
59 lines
2.0 KiB
Swift
59 lines
2.0 KiB
Swift
// Copyright (c) 2018 Timofey Solomko
|
|
// Licensed under MIT License
|
|
//
|
|
// See LICENSE for license information
|
|
|
|
import Foundation
|
|
import SWCompression
|
|
import SwiftCLI
|
|
|
|
class TarCommand: Command {
|
|
|
|
let name = "tar"
|
|
let shortDescription = "Extracts TAR container"
|
|
|
|
let gz = Flag("-z", "--gz", description: "Decompress with GZip first")
|
|
let bz2 = Flag("-j", "--bz2", description: "Decompress with BZip2 first")
|
|
let xz = Flag("-x", "--xz", description: "Decompress with XZ first")
|
|
|
|
let info = Flag("-i", "--info", description: "Print list of entries in container and their attributes")
|
|
let extract = Key<String>("-e", "--extract", description: "Extract container into specified directory")
|
|
|
|
let verbose = Flag("--verbose", description: "Print the list of extracted files and directories.")
|
|
|
|
var optionGroups: [OptionGroup] {
|
|
let compressions = OptionGroup(options: [gz, bz2, xz], restriction: .atMostOne)
|
|
let actions = OptionGroup(options: [info, extract], restriction: .exactlyOne)
|
|
return [compressions, actions]
|
|
}
|
|
|
|
let archive = Parameter()
|
|
|
|
func execute() throws {
|
|
var fileData = try Data(contentsOf: URL(fileURLWithPath: self.archive.value),
|
|
options: .mappedIfSafe)
|
|
|
|
if gz.value {
|
|
fileData = try GzipArchive.unarchive(archive: fileData)
|
|
} else if bz2.value {
|
|
fileData = try BZip2.decompress(data: fileData)
|
|
} else if xz.value {
|
|
fileData = try XZArchive.unarchive(archive: fileData)
|
|
}
|
|
|
|
if info.value {
|
|
let entries = try TarContainer.info(container: fileData)
|
|
swcomp.printInfo(entries)
|
|
} else if let outputPath = self.extract.value {
|
|
if try !isValidOutputDirectory(outputPath, create: true) {
|
|
print("ERROR: Specified path already exists and is not a directory.")
|
|
exit(1)
|
|
}
|
|
|
|
let entries = try TarContainer.open(container: fileData)
|
|
try swcomp.write(entries, outputPath, verbose.value)
|
|
}
|
|
}
|
|
|
|
}
|