summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt39
2 files changed, 27 insertions, 13 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 659e0522..9070160b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
### Added
- Invalid `.gpg-id` files can now be fixed automatically by deleting them and then trying to create a new password.
+- Suggest users to re-clone repository when it is deemed to be broken
### Fixed
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt b/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt
index 5248d259..0e8a2523 100644
--- a/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt
@@ -70,19 +70,7 @@ abstract class BaseGitActivity : ContinuationContainerActivity() {
GitOp.BREAK_OUT_OF_DETACHED -> BreakOutOfDetached(this)
GitOp.RESET -> ResetToRemoteOperation(this)
}
- return op.executeAfterAuthentication(GitSettings.authMode).mapError { throwable ->
- val err = rootCauseException(throwable)
- if (err.message?.contains("cannot open additional channels") == true) {
- GitSettings.useMultiplexing = false
- SSHException(DisconnectReason.TOO_MANY_CONNECTIONS, "The server does not support multiple Git operations per SSH session. Please try again, a slower fallback mode will be used.")
- } else if (err is TransportException && err.disconnectReason == DisconnectReason.HOST_KEY_NOT_VERIFIABLE) {
- SSHException(DisconnectReason.HOST_KEY_NOT_VERIFIABLE,
- "WARNING: The remote host key has changed. If this is expected, please go to Git server settings and clear the saved host key."
- )
- } else {
- err
- }
- }
+ return op.executeAfterAuthentication(GitSettings.authMode).mapError(::transformGitError)
}
fun finishOnSuccessHandler(@Suppress("UNUSED_PARAMETER") nothing: Unit) {
@@ -114,6 +102,31 @@ abstract class BaseGitActivity : ContinuationContainerActivity() {
}
/**
+ * Takes the result of [launchGitOperation] and applies any necessary transformations
+ * on the [throwable] returned from it
+ */
+ private fun transformGitError(throwable: Throwable): Throwable {
+ val err = rootCauseException(throwable)
+ return when {
+ err.message?.contains("cannot open additional channels") == true -> {
+ GitSettings.useMultiplexing = false
+ SSHException(DisconnectReason.TOO_MANY_CONNECTIONS, "The server does not support multiple Git operations per SSH session. Please try again, a slower fallback mode will be used.")
+ }
+ err.message?.contains("int org.eclipse.jgit.lib.AnyObjectId.w1") == true -> {
+ IllegalStateException("Your local repository appears to be an incomplete Git clone, please delete and re-clone from settings")
+ }
+ err is TransportException && err.disconnectReason == DisconnectReason.HOST_KEY_NOT_VERIFIABLE -> {
+ SSHException(DisconnectReason.HOST_KEY_NOT_VERIFIABLE,
+ "WARNING: The remote host key has changed. If this is expected, please go to Git server settings and clear the saved host key."
+ )
+ }
+ else -> {
+ err
+ }
+ }
+ }
+
+ /**
* Check if a given [Throwable] is the result of an error caused by the user cancelling the
* operation.
*/