From 1e9e5686afc2a6515f871c5f2ad4dc2ddc4731c4 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Tue, 12 Jan 2021 21:42:53 +0530 Subject: Allow configuring pull behaviour (#1276) --- .../aps/util/git/operation/BreakOutOfDetached.kt | 28 ++++++++++++++++++---- .../aps/util/git/operation/PullOperation.kt | 7 ++++-- .../aps/util/git/operation/SyncOperation.kt | 7 ++++-- 3 files changed, 34 insertions(+), 8 deletions(-) (limited to 'app/src/main/java/dev/msfjarvis/aps/util/git/operation') diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/BreakOutOfDetached.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/BreakOutOfDetached.kt index 1aff34de..635813e7 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/BreakOutOfDetached.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/BreakOutOfDetached.kt @@ -8,12 +8,13 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import dev.msfjarvis.aps.R import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.RebaseCommand +import org.eclipse.jgit.api.ResetCommand +import org.eclipse.jgit.lib.RepositoryState class BreakOutOfDetached(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { - override val commands = arrayOf( - // abort the rebase - git.rebase().setOperation(RebaseCommand.Operation.ABORT), + private val merging = repository.repositoryState == RepositoryState.MERGING + private val resetCommands = arrayOf( // git checkout -b conflict-branch git.checkout().setCreateBranch(true).setName("conflicting-$remoteBranch-${System.currentTimeMillis()}"), // push the changes @@ -22,7 +23,26 @@ class BreakOutOfDetached(callingActivity: ContinuationContainerActivity) : GitOp git.checkout().setName(remoteBranch), ) - override fun preExecute() = if (!git.repository.repositoryState.isRebasing) { + override val commands by lazy(LazyThreadSafetyMode.NONE) { + if (merging) { + // We need to run some non-command operations first + repository.writeMergeCommitMsg(null) + repository.writeMergeHeads(null) + arrayOf( + // reset hard back to our local HEAD + git.reset().setMode(ResetCommand.ResetType.HARD), + *resetCommands, + ) + } else { + arrayOf( + // abort the rebase + git.rebase().setOperation(RebaseCommand.Operation.ABORT), + *resetCommands, + ) + } + } + + override fun preExecute() = if (!git.repository.repositoryState.isRebasing && !merging) { MaterialAlertDialogBuilder(callingActivity) .setTitle(callingActivity.resources.getString(R.string.git_abort_and_push_title)) .setMessage(callingActivity.resources.getString(R.string.git_break_out_of_detached_unneeded)) diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/PullOperation.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/PullOperation.kt index 7bee775a..938bc146 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/PullOperation.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/PullOperation.kt @@ -7,7 +7,10 @@ package dev.msfjarvis.aps.util.git.operation import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.GitCommand -class PullOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { +class PullOperation( + callingActivity: ContinuationContainerActivity, + rebase: Boolean, +) : GitOperation(callingActivity) { /** * The story of why the pull operation is committing files goes like this: Once upon a time when @@ -26,6 +29,6 @@ class PullOperation(callingActivity: ContinuationContainerActivity) : GitOperati // Commit everything! If needed, obviously. git.commit().setAll(true).setMessage("[Android Password Store] Sync"), // Pull and rebase on top of the remote branch - git.pull().setRebase(true).setRemote("origin"), + git.pull().setRebase(rebase).setRemote("origin"), ) } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/SyncOperation.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/SyncOperation.kt index 512d6b48..e6a61f60 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/SyncOperation.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/SyncOperation.kt @@ -6,7 +6,10 @@ package dev.msfjarvis.aps.util.git.operation import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity -class SyncOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { +class SyncOperation( + callingActivity: ContinuationContainerActivity, + rebase: Boolean, +) : GitOperation(callingActivity) { override val commands = arrayOf( // Stage all files @@ -16,7 +19,7 @@ class SyncOperation(callingActivity: ContinuationContainerActivity) : GitOperati // Commit everything! If needed, obviously. git.commit().setAll(true).setMessage("[Android Password Store] Sync"), // Pull and rebase on top of the remote branch - git.pull().setRebase(true).setRemote("origin"), + git.pull().setRebase(rebase).setRemote("origin"), // Push it all back git.push().setPushAll().setRemote("origin"), ) -- cgit v1.2.3