Refactor GitCommandExecutor (#1255)

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-12-20 05:52:30 -08:00 committed by GitHub
parent 0396bf92a9
commit c34d08b094
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 30 deletions

View file

@ -5,17 +5,12 @@
package dev.msfjarvis.aps.util.git package dev.msfjarvis.aps.util.git
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.runCatching
import com.google.android.material.snackbar.Snackbar
import dev.msfjarvis.aps.R
import dev.msfjarvis.aps.util.git.GitException.PullException import dev.msfjarvis.aps.util.git.GitException.PullException
import dev.msfjarvis.aps.util.git.GitException.PushException import dev.msfjarvis.aps.util.git.GitException.PushException
import dev.msfjarvis.aps.util.settings.GitSettings
import dev.msfjarvis.aps.util.git.operation.GitOperation import dev.msfjarvis.aps.util.git.operation.GitOperation
import dev.msfjarvis.aps.util.extensions.snackbar import dev.msfjarvis.aps.util.settings.GitSettings
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.runCatching
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.eclipse.jgit.api.CommitCommand import org.eclipse.jgit.api.CommitCommand
@ -27,15 +22,10 @@ import org.eclipse.jgit.lib.PersonIdent
import org.eclipse.jgit.transport.RemoteRefUpdate import org.eclipse.jgit.transport.RemoteRefUpdate
class GitCommandExecutor( class GitCommandExecutor(
private val activity: FragmentActivity,
private val operation: GitOperation, private val operation: GitOperation,
) { ) {
suspend fun execute(): Result<Unit, Throwable> { suspend fun execute(): Result<GitResult, Throwable> {
val snackbar = activity.snackbar(
message = activity.resources.getString(R.string.git_operation_running),
length = Snackbar.LENGTH_INDEFINITE,
)
// Count the number of uncommitted files // Count the number of uncommitted files
var nbChanges = 0 var nbChanges = 0
return runCatching { return runCatching {
@ -89,13 +79,7 @@ class GitCommandExecutor(
} }
} }
RemoteRefUpdate.Status.UP_TO_DATE -> { RemoteRefUpdate.Status.UP_TO_DATE -> {
withContext(Dispatchers.Main) { return@runCatching GitResult.AlreadyUpToDate
Toast.makeText(
activity.applicationContext,
activity.applicationContext.getString(R.string.git_push_up_to_date),
Toast.LENGTH_SHORT
).show()
}
} }
else -> { else -> {
} }
@ -110,8 +94,7 @@ class GitCommandExecutor(
} }
} }
} }
}.also { GitResult.OK
snackbar.dismiss()
} }
} }
} }

View file

@ -0,0 +1,22 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.util.git
/**
* Result of a Git operation executed by [GitCommandExecutor]
*/
sealed class GitResult {
/**
* All good!
*/
object OK : GitResult()
/**
* Push operation succeeded and HEAD is already in sync with remote.
*/
object AlreadyUpToDate : GitResult()
}

View file

@ -25,6 +25,10 @@ import dev.msfjarvis.aps.util.git.sshj.SshKey
import dev.msfjarvis.aps.util.git.sshj.SshjSessionFactory import dev.msfjarvis.aps.util.git.sshj.SshjSessionFactory
import dev.msfjarvis.aps.util.auth.BiometricAuthenticator import dev.msfjarvis.aps.util.auth.BiometricAuthenticator
import dev.msfjarvis.aps.data.repo.PasswordRepository import dev.msfjarvis.aps.data.repo.PasswordRepository
import dev.msfjarvis.aps.util.extensions.snackbar
import dev.msfjarvis.aps.util.git.GitResult
import com.github.michaelbull.result.get
import com.google.android.material.snackbar.Snackbar
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -119,12 +123,14 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) {
if (!preExecute()) { if (!preExecute()) {
return Ok(Unit) return Ok(Unit)
} }
val operationResult = GitCommandExecutor( val snackbar = callingActivity.snackbar(
callingActivity, message = callingActivity.resources.getString(R.string.git_operation_running),
this, length = Snackbar.LENGTH_INDEFINITE,
).execute() )
postExecute() val operationResult = GitCommandExecutor(this).execute()
return operationResult snackbar.dismiss()
postExecute(operationResult)
return Ok(Unit)
} }
private fun onMissingSshKeyFile() { private fun onMissingSshKeyFile() {
@ -200,7 +206,17 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) {
*/ */
open fun preExecute() = true open fun preExecute() = true
private suspend fun postExecute() { private suspend fun postExecute(result: Result<GitResult, Throwable>) {
when (result.get()) {
GitResult.OK -> {}
GitResult.AlreadyUpToDate -> {
Toast.makeText(
callingActivity,
callingActivity.getString(R.string.git_push_up_to_date),
Toast.LENGTH_SHORT
).show()
}
}
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
sshSessionFactory?.close() sshSessionFactory?.close()
} }