swift - 如何使用进度条显示 cocoa 中 NSTask 的 `git clone` 进度

标签 swift git macos

我想用进度条显示克隆进度。使用我的代码我什么也得不到。希望有人能帮助我

let pro = Process()
pro.launchPath = "/bin/bash"
pro.arguments = ["-c", "cd  /Users/admin/Documents; git clone https://gitee.com/gjesse/laravel.git"]

pro.terminationHandler = { pro in
    print("clone finish")
}

let pip = Pipe()
pro.standardOutput = pip

let file = pip.fileHandleForReading
file.readInBackgroundAndNotify()

NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable, object: file, queue: nil) { notification in
    let output = file.readDataToEndOfFile()
    print("log\(String(describing: String(data: output, encoding: String.Encoding.utf8)))log")
}
pro.launch()
pro.waitUntilExit()

最佳答案

我将这个函数用于任何任务:

@discardableResult
private func process(launchPath: String? = nil, arguments: [String]) throws -> String? {
    let process = Process()
    if let launchPath = launchPath {
        process.currentDirectoryPath = launchPath
    }
    process.launchPath = "/usr/bin/env"
    process.arguments = arguments

    var errorData = Data()

    let outputPipe = Pipe()
    process.standardOutput = outputPipe

    let errorPipe = Pipe()
    process.standardError = errorPipe

    errorPipe.fileHandleForReading.readabilityHandler = { handler in
        let data = handler.availableData
        errorData.append(data)
    }

    process.launch()

    let outdata = outputPipe.fileHandleForReading.readDataToEndOfFile()

    process.waitUntilExit()

    if process.terminationStatus != 0 {
        throw Error.processFailed(status: process.terminationStatus, message: errorData.shellString)
    }

    return String(data: outdata, encoding: .utf8)
}

对于 git clone 操作,我使用这个函数:

func clone(fromPath path: String, toLocalPath localPath: String, branch: String? = nil) throws {
    var arguments = ["git", "clone", path, localPath, "--quiet"]
    if let branch = branch {
        arguments.append(contentsOf: ["-b", branch])
    }
    try process(arguments: arguments)
}

例如,只需调用:

clone(fromPath: "https://gitee.com/gjesse/laravel.git", toLocalPath: "/Users/admin/Documents")

关于swift - 如何使用进度条显示 cocoa 中 NSTask 的 `git clone` 进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47910395/

相关文章:

ios - 接受函数的回调作为参数

swift - 不确定在 swift 中使用什么数据类型

cocoa - 以编程方式向菜单项添加字形(删除键、退格键、空格等)

objective-c - subview 中的 NSView TouchesMovedWithEvent 正在暂停带有内置触控板的 SKScene,但不是魔术触控板?

URL 中的 SwiftUI 图像未显示

Swift 将 Int16 和 Int32 变量连接成一个多字节实体

git pull --rebase : passing --rebase-merges

git - 为什么 git rm --cached my_dir/* 删除本地文件?

javascript - Mac的angular.js教程

macos - Nginx 未运行。没有这样的文件或目录消息 -Mac