From a86d1f7c1b7eb2f9cea357c05569ff0254c8a9cd Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Thu, 23 Jun 2022 09:46:26 +0200 Subject: [PATCH] Added option to abort cherry-pick. Uncommited changes line will be shown now even when the status is empty if the repo is rebasing, merging or cherry-picking. This will allow the user to abort the operation if required. --- .../extensions/RepositoryStateExtensions.kt | 5 ++- src/main/kotlin/app/git/MergeManager.kt | 2 +- src/main/kotlin/app/ui/UncommitedChanges.kt | 39 ++++++++++++++++++- src/main/kotlin/app/ui/log/Log.kt | 26 +++++++++---- .../kotlin/app/viewmodels/StatusViewModel.kt | 4 +- .../kotlin/app/viewmodels/TabViewModel.kt | 1 + 6 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt b/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt index 77039b9..bfd74b7 100644 --- a/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt +++ b/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt @@ -3,4 +3,7 @@ package app.extensions import org.eclipse.jgit.lib.RepositoryState val RepositoryState.isMerging - get() = this == RepositoryState.MERGING || this == RepositoryState.MERGING_RESOLVED \ No newline at end of file + get() = this == RepositoryState.MERGING || this == RepositoryState.MERGING_RESOLVED + +val RepositoryState.isCherryPicking + get() = this == RepositoryState.CHERRY_PICKING || this == RepositoryState.CHERRY_PICKING_RESOLVED \ No newline at end of file diff --git a/src/main/kotlin/app/git/MergeManager.kt b/src/main/kotlin/app/git/MergeManager.kt index dac4e55..e343277 100644 --- a/src/main/kotlin/app/git/MergeManager.kt +++ b/src/main/kotlin/app/git/MergeManager.kt @@ -29,7 +29,7 @@ class MergeManager @Inject constructor() { } } - suspend fun abortMerge(git: Git) = withContext(Dispatchers.IO) { + suspend fun resetRepoState(git: Git) = withContext(Dispatchers.IO) { git.repository.writeMergeCommitMsg(null) git.repository.writeMergeHeads(null) diff --git a/src/main/kotlin/app/ui/UncommitedChanges.kt b/src/main/kotlin/app/ui/UncommitedChanges.kt index c73c10c..6fa288b 100644 --- a/src/main/kotlin/app/ui/UncommitedChanges.kt +++ b/src/main/kotlin/app/ui/UncommitedChanges.kt @@ -194,7 +194,7 @@ fun UncommitedChanges( repositoryState.isMerging -> MergeButtons( haveConflictsBeenSolved = unstaged.isEmpty(), onAbort = { - statusViewModel.abortMerge() + statusViewModel.resetRepoState() statusViewModel.updateCommitMessage("") }, onMerge = { doCommit(false) } @@ -209,6 +209,16 @@ fun UncommitedChanges( onContinue = { statusViewModel.continueRebase() }, onSkip = { statusViewModel.skipRebase() }, ) + repositoryState.isCherryPicking -> CherryPickingButtons( + haveConflictsBeenSolved = unstaged.isEmpty(), + onAbort = { + statusViewModel.resetRepoState() + statusViewModel.updateCommitMessage("") + }, + onCommit = { + doCommit(false) + } + ) else -> UncommitedChangesButtons( canCommit = canCommit, canAmend = canAmend, @@ -310,6 +320,33 @@ fun MergeButtons( } } +@Composable +fun CherryPickingButtons( + haveConflictsBeenSolved: Boolean, + onAbort: () -> Unit, + onCommit: () -> Unit, +) { + Row( + modifier = Modifier.fillMaxWidth() + ) { + AbortButton( + modifier = Modifier + .weight(1f) + .padding(end = 4.dp), + onClick = onAbort + ) + + ConfirmationButton( + text = "Commit", + modifier = Modifier + .weight(1f) + .padding(start = 4.dp), + enabled = haveConflictsBeenSolved, + onClick = onCommit, + ) + } +} + @Composable fun RebasingButtons( canContinue: Boolean, diff --git a/src/main/kotlin/app/ui/log/Log.kt b/src/main/kotlin/app/ui/log/Log.kt index 192af9b..82185f1 100644 --- a/src/main/kotlin/app/ui/log/Log.kt +++ b/src/main/kotlin/app/ui/log/Log.kt @@ -333,14 +333,23 @@ fun MessagesList( state = scrollState, modifier = Modifier.fillMaxSize(), ) { - if (hasUncommitedChanges) item { - UncommitedChangesLine(graphWidth = graphWidth, - isSelected = selectedItem == SelectedItem.UncommitedChanges, - statusSummary = logStatus.statusSummary, - repositoryState = repositoryState, - onUncommitedChangesSelected = { - logViewModel.selectUncommitedChanges() - }) + if ( + hasUncommitedChanges || + repositoryState.isMerging || + repositoryState.isRebasing || + repositoryState.isCherryPicking + ) { + item { + UncommitedChangesLine( + graphWidth = graphWidth, + isSelected = selectedItem == SelectedItem.UncommitedChanges, + statusSummary = logStatus.statusSummary, + repositoryState = repositoryState, + onUncommitedChangesSelected = { + logViewModel.selectUncommitedChanges() + } + ) + } } items(items = commitList) { graphNode -> CommitLine( @@ -600,6 +609,7 @@ fun UncommitedChangesLine( val text = when { repositoryState.isRebasing -> "Pending changes to rebase" repositoryState.isMerging -> "Pending changes to merge" + repositoryState.isCherryPicking -> "Pending changes to cherry-pick" else -> "Uncommited changes" } diff --git a/src/main/kotlin/app/viewmodels/StatusViewModel.kt b/src/main/kotlin/app/viewmodels/StatusViewModel.kt index 84c3a9b..d5dbb92 100644 --- a/src/main/kotlin/app/viewmodels/StatusViewModel.kt +++ b/src/main/kotlin/app/viewmodels/StatusViewModel.kt @@ -201,10 +201,10 @@ class StatusViewModel @Inject constructor( rebaseManager.skipRebase(git) } - fun abortMerge() = tabState.safeProcessing( + fun resetRepoState() = tabState.safeProcessing( refreshType = RefreshType.ALL_DATA, ) { git -> - mergeManager.abortMerge(git) + mergeManager.resetRepoState(git) } fun deleteFile(statusEntry: StatusEntry) = tabState.runOperation( diff --git a/src/main/kotlin/app/viewmodels/TabViewModel.kt b/src/main/kotlin/app/viewmodels/TabViewModel.kt index 2f61322..85148ca 100644 --- a/src/main/kotlin/app/viewmodels/TabViewModel.kt +++ b/src/main/kotlin/app/viewmodels/TabViewModel.kt @@ -305,6 +305,7 @@ class TabViewModel @Inject constructor( // Stashes list should only be updated if we are doing a stash operation, however it's a small operation // that we can afford to do when doing other operations stashesViewModel.refresh(git) + loadRepositoryState(git) } private suspend fun refreshRepositoryInfo() = tabState.safeProcessing(