From 552ac17d0e810bcd5e7bc527a32e080b79cbacce Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Sun, 16 Apr 2023 02:07:51 +0200 Subject: [PATCH] Added option to clone submodules when cloning a repo --- .../CloneRepositoryUseCase.kt | 3 +- .../gitnuro/ui/dialogs/CloneDialog.kt | 33 ++++++++++++++++++- .../gitnuro/viewmodels/CloneViewModel.kt | 4 +-- .../app/git/BeforeRepoAllTestsExtension.kt | 2 +- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/CloneRepositoryUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/CloneRepositoryUseCase.kt index d595004..b18031b 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/CloneRepositoryUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/CloneRepositoryUseCase.kt @@ -18,7 +18,7 @@ private const val TAG = "CloneRepositoryUseCase" class CloneRepositoryUseCase @Inject constructor( private val handleTransportUseCase: HandleTransportUseCase, ) { - operator fun invoke(directory: File, url: String): Flow = callbackFlow { + operator fun invoke(directory: File, url: String, cloneSubmodules: Boolean): Flow = callbackFlow { var lastTitle: String = "" var lastTotalWork = 0 var progress = 0 @@ -64,6 +64,7 @@ class CloneRepositoryUseCase @Inject constructor( } ) .setTransportConfigCallback { handleTransportUseCase(it, null) } + .setCloneSubmodules(cloneSubmodules) .call() ensureActive() diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt index 8300693..dc40b13 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt @@ -2,6 +2,7 @@ package com.jetpackduba.gitnuro.ui.dialogs import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* @@ -18,6 +19,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.unit.dp +import com.jetpackduba.gitnuro.extensions.handMouseClickable import com.jetpackduba.gitnuro.git.CloneStatus import com.jetpackduba.gitnuro.theme.outlinedTextFieldColors @@ -85,6 +87,7 @@ private fun CloneInput( ) { var url by remember { mutableStateOf(cloneViewModel.url) } var directory by remember { mutableStateOf(cloneViewModel.directory) } + var cloneSubmodules by remember { mutableStateOf(true) } val urlFocusRequester = remember { FocusRequester() } val directoryFocusRequester = remember { FocusRequester() } @@ -174,6 +177,34 @@ private fun CloneInput( } } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.handMouseClickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + cloneSubmodules = !cloneSubmodules + } + .fillMaxWidth() + .padding(top = 16.dp) + ) { + Checkbox( + checked = cloneSubmodules, + onCheckedChange = { + cloneSubmodules = it + }, + modifier = Modifier + .padding(all = 8.dp) + .size(12.dp) + ) + + Text( + "Clone submodules recursively", + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onBackground, + ) + } + if (errorMessage != null) { Box( modifier = Modifier @@ -213,7 +244,7 @@ private fun CloneInput( ) PrimaryButton( onClick = { - cloneViewModel.clone(directory, url) + cloneViewModel.clone(directory, url, cloneSubmodules) }, modifier = Modifier .focusRequester(cloneButtonFocusRequester) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/CloneViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/CloneViewModel.kt index c131ddd..b09e76c 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/CloneViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/CloneViewModel.kt @@ -26,7 +26,7 @@ class CloneViewModel @Inject constructor( private var cloneJob: Job? = null - fun clone(directoryPath: String, url: String) { + fun clone(directoryPath: String, url: String, cloneSubmodules: Boolean) { cloneJob = tabState.safeProcessingWithoutGit { if (directoryPath.isBlank()) { _cloneStatus.value = CloneStatus.Fail("Invalid empty directory") @@ -69,7 +69,7 @@ class CloneViewModel @Inject constructor( repoDir.mkdir() } - cloneRepositoryUseCase(repoDir, url) + cloneRepositoryUseCase(repoDir, url, cloneSubmodules) .flowOn(Dispatchers.IO) .collect { newCloneStatus -> _cloneStatus.value = newCloneStatus diff --git a/src/test/kotlin/com/jetpackduba/gitnuro/app/git/BeforeRepoAllTestsExtension.kt b/src/test/kotlin/com/jetpackduba/gitnuro/app/git/BeforeRepoAllTestsExtension.kt index 0f0646d..9dade71 100644 --- a/src/test/kotlin/com/jetpackduba/gitnuro/app/git/BeforeRepoAllTestsExtension.kt +++ b/src/test/kotlin/com/jetpackduba/gitnuro/app/git/BeforeRepoAllTestsExtension.kt @@ -51,7 +51,7 @@ class BeforeRepoAllTestsExtension : BeforeAllCallback, AfterAllCallback { }, ) ) - cloneRepositoryUseCase(repoDir, REPO_URL) + cloneRepositoryUseCase(repoDir, REPO_URL, false) .flowOn(Dispatchers.IO) .collect { newCloneStatus -> println("Cloning test repository: $newCloneStatus")