diff --git a/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt b/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt index bfd74b7..b309ca9 100644 --- a/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt +++ b/src/main/kotlin/app/extensions/RepositoryStateExtensions.kt @@ -6,4 +6,7 @@ val RepositoryState.isMerging 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 + get() = this == RepositoryState.CHERRY_PICKING || this == RepositoryState.CHERRY_PICKING_RESOLVED + +val RepositoryState.isReverting + get() = this == RepositoryState.REVERTING || this == RepositoryState.REVERTING_RESOLVED \ No newline at end of file diff --git a/src/main/kotlin/app/git/TabState.kt b/src/main/kotlin/app/git/TabState.kt index 74a0fd9..dd7f0dd 100644 --- a/src/main/kotlin/app/git/TabState.kt +++ b/src/main/kotlin/app/git/TabState.kt @@ -25,7 +25,7 @@ class TabState @Inject constructor( val taskEvent: SharedFlow = _taskEvent var git: Git? = null - val safeGit: Git + private val safeGit: Git get() { val git = this.git if (git == null) { diff --git a/src/main/kotlin/app/ui/Menu.kt b/src/main/kotlin/app/ui/Menu.kt index 4fa745e..5393e7f 100644 --- a/src/main/kotlin/app/ui/Menu.kt +++ b/src/main/kotlin/app/ui/Menu.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.input.pointer.PointerIconDefaults import androidx.compose.ui.input.pointer.pointerHoverIcon import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import app.extensions.handMouseClickable import app.theme.primaryTextColor import app.ui.context_menu.* diff --git a/src/main/kotlin/app/ui/UncommitedChanges.kt b/src/main/kotlin/app/ui/UncommitedChanges.kt index d133ad5..b9109f0 100644 --- a/src/main/kotlin/app/ui/UncommitedChanges.kt +++ b/src/main/kotlin/app/ui/UncommitedChanges.kt @@ -21,20 +21,16 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.input.key.Key -import androidx.compose.ui.input.key.isCtrlPressed -import androidx.compose.ui.input.key.key import androidx.compose.ui.input.key.onPreviewKeyEvent import androidx.compose.ui.input.pointer.pointerMoveFilter -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import app.extensions.* import app.git.DiffEntryType import app.git.StatusEntry +import app.git.StatusType import app.keybindings.KeybindingOption import app.keybindings.matchesBinding import app.theme.* @@ -226,6 +222,17 @@ fun UncommitedChanges( doCommit(false) } ) + repositoryState.isReverting -> RevertingButtons( + haveConflictsBeenSolved = unstaged.none { it.statusType == StatusType.CONFLICTING }, + canCommit = commitMessage.isNotBlank(), + onAbort = { + statusViewModel.resetRepoState() + statusViewModel.updateCommitMessage("") + }, + onCommit = { + doCommit(false) + } + ) else -> UncommitedChangesButtons( canCommit = canCommit, canAmend = canAmend, @@ -394,6 +401,34 @@ fun RebasingButtons( } } +@Composable +fun RevertingButtons( + canCommit: Boolean, + haveConflictsBeenSolved: Boolean, + onAbort: () -> Unit, + onCommit: () -> Unit, +) { + Row( + modifier = Modifier.fillMaxWidth() + ) { + AbortButton( + modifier = Modifier + .weight(1f) + .padding(end = 4.dp), + onClick = onAbort + ) + + ConfirmationButton( + text = "Continue", + modifier = Modifier + .weight(1f) + .padding(start = 4.dp), + enabled = canCommit && haveConflictsBeenSolved, + onClick = onCommit, + ) + } +} + @Composable fun AbortButton(modifier: Modifier, onClick: () -> Unit) { Button( diff --git a/src/main/kotlin/app/ui/log/Log.kt b/src/main/kotlin/app/ui/log/Log.kt index 2aafb94..f7a6b99 100644 --- a/src/main/kotlin/app/ui/log/Log.kt +++ b/src/main/kotlin/app/ui/log/Log.kt @@ -639,6 +639,7 @@ fun UncommitedChangesLine( repositoryState.isRebasing -> "Pending changes to rebase" repositoryState.isMerging -> "Pending changes to merge" repositoryState.isCherryPicking -> "Pending changes to cherry-pick" + repositoryState.isReverting -> "Pending changes to revert" else -> "Uncommited changes" } diff --git a/src/main/kotlin/app/viewmodels/StatusViewModel.kt b/src/main/kotlin/app/viewmodels/StatusViewModel.kt index d5dbb92..925ad52 100644 --- a/src/main/kotlin/app/viewmodels/StatusViewModel.kt +++ b/src/main/kotlin/app/viewmodels/StatusViewModel.kt @@ -3,6 +3,7 @@ package app.viewmodels import androidx.compose.foundation.lazy.LazyListState import app.extensions.delayedStateChange import app.extensions.isMerging +import app.extensions.isReverting import app.git.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow @@ -47,7 +48,10 @@ class StatusViewModel @Inject constructor( ) { git -> val messageToPersist = savedCommitMessage.message.ifBlank { null } - if (git.repository.repositoryState.isMerging) { + if (git.repository.repositoryState.isMerging || + git.repository.repositoryState.isRebasing || + git.repository.repositoryState.isReverting + ) { git.repository.writeMergeCommitMsg(messageToPersist) } else if (git.repository.repositoryState == RepositoryState.SAFE) { git.repository.writeCommitEditMsg(messageToPersist) @@ -134,8 +138,9 @@ class StatusViewModel @Inject constructor( private fun messageByRepoState(git: Git): String { val message: String? = if ( - git.repository.repositoryState == RepositoryState.MERGING || - git.repository.repositoryState == RepositoryState.REBASING_MERGE + git.repository.repositoryState.isMerging || + git.repository.repositoryState.isRebasing || + git.repository.repositoryState.isReverting ) { git.repository.readMergeCommitMsg() } else {