Added merge feature

This commit is contained in:
Abdelilah El Aissaoui 2021-10-27 20:41:05 +02:00
parent d60b1a14a2
commit 71bf75ceca
8 changed files with 157 additions and 21 deletions

View File

@ -41,7 +41,7 @@ tasks.withType<KotlinCompile>() {
compose.desktop { compose.desktop {
application { application {
mainClass = "MainKt" mainClass = "app.MainKt"
nativeDistributions { nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.AppImage) targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.AppImage)

View File

@ -6,6 +6,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.eclipse.jgit.api.ListBranchCommand import org.eclipse.jgit.api.ListBranchCommand
import org.eclipse.jgit.api.MergeCommand
import org.eclipse.jgit.lib.Ref import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.revwalk.RevCommit
import javax.inject.Inject import javax.inject.Inject
@ -56,6 +57,19 @@ class BranchesManager @Inject constructor() {
.call() .call()
} }
suspend fun mergeBranch(git: Git, branch: Ref, fastForward: Boolean) = withContext(Dispatchers.IO) {
val fastForwardMode = if(fastForward)
MergeCommand.FastForwardMode.FF
else
MergeCommand.FastForwardMode.NO_FF
git
.merge()
.include(branch)
.setFastForward(fastForwardMode)
.call()
}
suspend fun deleteBranch(git: Git, branch: Ref) = withContext(Dispatchers.IO) { suspend fun deleteBranch(git: Git, branch: Ref) = withContext(Dispatchers.IO) {
git git

View File

@ -287,6 +287,13 @@ class GitManager @Inject constructor(
refreshRepositoryInfo() refreshRepositoryInfo()
} }
} }
fun mergeBranch(ref: Ref, fastForward: Boolean) = managerScope.launch {
safeProcessing {
branchesManager.mergeBranch(safeGit, ref, fastForward)
refreshRepositoryInfo()
}
}
} }

View File

@ -4,6 +4,7 @@ import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -61,6 +62,7 @@ fun CommitChanges(
.fillMaxWidth() .fillMaxWidth()
) { ) {
Column { Column {
SelectionContainer {
Text( Text(
text = commit.fullMessage, text = commit.fullMessage,
fontSize = 14.sp, fontSize = 14.sp,
@ -70,6 +72,7 @@ fun CommitChanges(
.padding(8.dp) .padding(8.dp)
.verticalScroll(scroll), .verticalScroll(scroll),
) )
}
Divider(modifier = Modifier.fillMaxWidth()) Divider(modifier = Modifier.fillMaxWidth())

View File

@ -2,20 +2,14 @@ package app.ui
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.TextButton import androidx.compose.material.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.input.pointer.pointerMoveFilter
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp

View File

@ -35,6 +35,7 @@ import app.theme.headerText
import app.theme.primaryTextColor import app.theme.primaryTextColor
import app.theme.secondaryTextColor import app.theme.secondaryTextColor
import app.ui.components.ScrollableLazyColumn import app.ui.components.ScrollableLazyColumn
import app.ui.dialogs.MergeDialog
import app.ui.dialogs.NewBranchDialog import app.ui.dialogs.NewBranchDialog
import app.ui.dialogs.NewTagDialog import app.ui.dialogs.NewTagDialog
import org.eclipse.jgit.lib.ObjectIdRef import org.eclipse.jgit.lib.ObjectIdRef
@ -69,6 +70,7 @@ fun Log(
onCreateBranchOnCommit: (branchName: String, graphNode: GraphNode) -> Unit, onCreateBranchOnCommit: (branchName: String, graphNode: GraphNode) -> Unit,
onCreateTagOnCommit: (tagName: String, graphNode: GraphNode) -> Unit, onCreateTagOnCommit: (tagName: String, graphNode: GraphNode) -> Unit,
onCheckoutRef: (ref: Ref) -> Unit, onCheckoutRef: (ref: Ref) -> Unit,
onMergeBranch: (ref: Ref, fastForwards: Boolean) -> Unit,
selectedIndex: MutableState<Int> = remember { mutableStateOf(-1) } selectedIndex: MutableState<Int> = remember { mutableStateOf(-1) }
) { ) {
val logStatusState = gitManager.logStatus.collectAsState() val logStatusState = gitManager.logStatus.collectAsState()
@ -275,7 +277,22 @@ fun Log(
commit = item, commit = item,
selected = selectedIndex.value == index, selected = selectedIndex.value == index,
refs = commitRefs, refs = commitRefs,
onCheckoutRef = onCheckoutRef onCheckoutRef = onCheckoutRef,
onMergeBranch = { ref ->
dialogManager.show {
MergeDialog(
currentBranchName = "HEAD",
mergeBranchName = ref.name,
onReject = {
dialogManager.dismiss()
},
onAccept = { fastForward ->
dialogManager.dismiss()
onMergeBranch(ref, fastForward)
}
)
}
},
) )
} }
} }
@ -293,6 +310,7 @@ fun CommitMessage(
selected: Boolean, selected: Boolean,
refs: List<Ref>, refs: List<Ref>,
onCheckoutRef: (ref: Ref) -> Unit, onCheckoutRef: (ref: Ref) -> Unit,
onMergeBranch: (ref: Ref) -> Unit,
) { ) {
val textColor = if (selected) { val textColor = if (selected) {
MaterialTheme.colors.primary MaterialTheme.colors.primary
@ -326,6 +344,9 @@ fun CommitMessage(
ref = ref, ref = ref,
onCheckoutBranch = { onCheckoutBranch = {
onCheckoutRef(ref) onCheckoutRef(ref)
},
onMergeBranch = {
onMergeBranch(ref)
} }
) )
} }
@ -475,15 +496,30 @@ fun UncommitedChangesGraphLine(
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun BranchChip(modifier: Modifier = Modifier, ref: Ref, onCheckoutBranch: () -> Unit) { fun BranchChip(
modifier: Modifier = Modifier,
isCurrentBranch: Boolean = false,
ref: Ref,
onCheckoutBranch: () -> Unit,
onMergeBranch: () -> Unit,
) {
val contextMenuItemsList = { val contextMenuItemsList = {
listOf( mutableListOf(
ContextMenuItem( ContextMenuItem(
label = "Checkout branch", label = "Checkout branch",
onClick = onCheckoutBranch onClick = onCheckoutBranch
),
).apply {
if (!isCurrentBranch)
add(
ContextMenuItem(
label = "Merge branch",
onClick = onMergeBranch
) )
) )
} }
}
RefChip( RefChip(
modifier, modifier,

View File

@ -108,6 +108,9 @@ fun RepositoryOpenPage(gitManager: GitManager, dialogManager: DialogManager) {
onCheckoutRef = { ref -> onCheckoutRef = { ref ->
gitManager.checkoutRef(ref) gitManager.checkoutRef(ref)
}, },
onMergeBranch = { ref , fastForward ->
gitManager.mergeBranch(ref, fastForward)
},
onRevCommitSelected = { commit -> onRevCommitSelected = { commit ->
selectedRevCommit = commit selectedRevCommit = commit
uncommitedChangesSelected = false uncommitedChangesSelected = false

View File

@ -0,0 +1,79 @@
package app.ui.dialogs
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusOrder
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@Composable
fun MergeDialog(
currentBranchName: String,
mergeBranchName: String,
fastForward: Boolean = false,
onReject: () -> Unit,
onAccept: (fastForward: Boolean) -> Unit
) {
var fastForwardCheck by remember { mutableStateOf(fastForward) }
Column(
modifier = Modifier
.background(MaterialTheme.colors.background),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
Row {
Text(
text = currentBranchName,
)
Text(" -----------> ")
Text(
text = mergeBranchName,
)
}
Row {
Checkbox(
checked = fastForwardCheck,
onCheckedChange = { checked ->
fastForwardCheck = checked
}
)
Text(
"Fast forward",
modifier = Modifier.padding(start = 8.dp)
)
}
Row(
modifier = Modifier
.padding(top = 16.dp)
.align(Alignment.End)
) {
TextButton(
modifier = Modifier.padding(end = 8.dp),
onClick = {
onReject()
}
) {
Text("Cancel")
}
Button(
onClick = {
onAccept(fastForwardCheck)
}
) {
Text("Merge")
}
}
}
}