From a4b26b3bd348d3f4bab45dd65efedb765d44f5cc Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Mon, 23 Jan 2017 17:36:10 +0800 Subject: [PATCH] show transfer progress --- pass/PasswordStore.swift | 12 ++++++++---- pass/PasswordsTableViewController.swift | 12 +++++++++++- pass/SettingsTableViewController.swift | 24 +++++++++++++++++------- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pass/PasswordStore.swift b/pass/PasswordStore.swift index 606a2c4..2ed3c8c 100644 --- a/pass/PasswordStore.swift +++ b/pass/PasswordStore.swift @@ -54,7 +54,9 @@ class PasswordStore { } - func cloneRepository(remoteRepoURL: URL) -> Bool { + func cloneRepository(remoteRepoURL: URL, + transferProgressBlock: @escaping (UnsafePointer, UnsafeMutablePointer) -> Void, + checkoutProgressBlock: @escaping (String?, UInt, UInt) -> Void) -> Bool { print("start cloning remote repo") let fm = FileManager.default if (storeRepository != nil) { @@ -66,19 +68,21 @@ class PasswordStore { } } do { - storeRepository = try GTRepository.clone(from: remoteRepoURL, toWorkingDirectory: storeURL, options: nil, transferProgressBlock: nil, checkoutProgressBlock: nil) + print("start cloning...") + storeRepository = try GTRepository.clone(from: remoteRepoURL, toWorkingDirectory: storeURL, options: nil, transferProgressBlock:transferProgressBlock, checkoutProgressBlock: checkoutProgressBlock) updatePasswordEntityCoreData() return true } catch { + storeRepository = nil print(error) return false } } - func pullRepository() -> Bool { + func pullRepository(transferProgressBlock: @escaping (UnsafePointer, UnsafeMutablePointer) -> Void) -> Bool { print("pullRepoisitory") do { let remote = try GTRemote(name: "origin", in: storeRepository!) - try storeRepository?.pull((storeRepository?.currentBranch())!, from: remote, withOptions: nil, progress: nil) + try storeRepository?.pull((storeRepository?.currentBranch())!, from: remote, withOptions: nil, progress: transferProgressBlock) updatePasswordEntityCoreData() return true } catch { diff --git a/pass/PasswordsTableViewController.swift b/pass/PasswordsTableViewController.swift index 4876a10..b01e7e5 100644 --- a/pass/PasswordsTableViewController.swift +++ b/pass/PasswordsTableViewController.swift @@ -17,8 +17,18 @@ class PasswordsTableViewController: UITableViewController { let searchController = UISearchController(searchResultsController: nil) @IBAction func refreshPasswords(_ sender: UIBarButtonItem) { + SVProgressHUD.setDefaultMaskType(.black) + SVProgressHUD.show(withStatus: "Pull Remote Repository") DispatchQueue.global(qos: .userInitiated).async { - if PasswordStore.shared.pullRepository() { + if PasswordStore.shared.pullRepository(transferProgressBlock: {(git_transfer_progress, stop) in + DispatchQueue.main.async { + SVProgressHUD.showProgress(Float(git_transfer_progress.pointee.received_objects)/Float(git_transfer_progress.pointee.total_objects), status: "Pull Remote Repository") + } + }) { + DispatchQueue.main.async { + SVProgressHUD.showSuccess(withStatus: "Done") + SVProgressHUD.dismiss(withDelay: 1) + } print("pull success") self.passwordEntities = PasswordStore.shared.fetchPasswordEntityCoreData() self.tableView.reloadData() diff --git a/pass/SettingsTableViewController.swift b/pass/SettingsTableViewController.swift index e8e7eea..f1340ac 100644 --- a/pass/SettingsTableViewController.swift +++ b/pass/SettingsTableViewController.swift @@ -24,19 +24,29 @@ class SettingsTableViewController: UITableViewController { Defaults[.gitRepositoryURL] = URL(string: controller.gitRepositoryURLTextField.text!) SVProgressHUD.setDefaultMaskType(.black) - SVProgressHUD.show(withStatus: "Cloning Remote Repository") + SVProgressHUD.show(withStatus: "Prepare Repository") + //SVProgressHUD.showProgress(0.0, status: "Clone Remote Repository") DispatchQueue.global(qos: .userInitiated).async { - let ret = PasswordStore.shared.cloneRepository(remoteRepoURL: Defaults[.gitRepositoryURL]!) + let ret = PasswordStore.shared.cloneRepository(remoteRepoURL: Defaults[.gitRepositoryURL]!, + transferProgressBlock:{ (git_transfer_progress, stop) in + DispatchQueue.main.async { + SVProgressHUD.showProgress(Float(git_transfer_progress.pointee.received_objects)/Float(git_transfer_progress.pointee.total_objects), status: "Clone Remote Repository") + } + }, + checkoutProgressBlock: { (path, completedSteps, totalSteps) in + DispatchQueue.main.async { + SVProgressHUD.showProgress(Float(completedSteps)/Float(totalSteps), status: "Checkout Master Branch") + } + }) DispatchQueue.main.async { if ret { - SVProgressHUD.dismiss() - SVProgressHUD.setMaximumDismissTimeInterval(1) - SVProgressHUD.showSuccess(withStatus: "Success") - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) + SVProgressHUD.showSuccess(withStatus: "Done") + SVProgressHUD.dismiss(withDelay: 1) + NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) } else { - SVProgressHUD.showError(withStatus: "Error") + SVProgressHUD.showError(withStatus: "Error") } } }