From b7ece2e051eae2975cf5add845c93ab5cbab1cc0 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Thu, 22 Sep 2022 13:10:28 +0200 Subject: [PATCH] Added submodules init option --- .../kotlin/app/git/diff/HunkDiffGenerator.kt | 1 - .../submodules/InitalizeSubmoduleUseCase.kt | 14 +++++ .../git/submodules/UpdateSubmoduleUseCase.kt | 59 +++++++++++++++++++ src/main/kotlin/app/ui/Submodules.kt | 36 +++++++---- .../ui/context_menu/SubmoduleContextMenu.kt | 23 ++++++++ .../app/viewmodels/SubmodulesViewModel.kt | 20 ++++++- src/main/rules.txt | 48 +++++++++++++++ 7 files changed, 185 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/app/git/submodules/InitalizeSubmoduleUseCase.kt create mode 100644 src/main/kotlin/app/git/submodules/UpdateSubmoduleUseCase.kt create mode 100644 src/main/kotlin/app/ui/context_menu/SubmoduleContextMenu.kt create mode 100644 src/main/rules.txt diff --git a/src/main/kotlin/app/git/diff/HunkDiffGenerator.kt b/src/main/kotlin/app/git/diff/HunkDiffGenerator.kt index b27d5d7..0c881f2 100644 --- a/src/main/kotlin/app/git/diff/HunkDiffGenerator.kt +++ b/src/main/kotlin/app/git/diff/HunkDiffGenerator.kt @@ -3,7 +3,6 @@ package app.git.diff import app.extensions.lineAt import app.git.EntryContent import app.git.RawFileManager -import dagger.assisted.AssistedInject import org.eclipse.jgit.diff.* import org.eclipse.jgit.lib.Repository import org.eclipse.jgit.patch.FileHeader diff --git a/src/main/kotlin/app/git/submodules/InitalizeSubmoduleUseCase.kt b/src/main/kotlin/app/git/submodules/InitalizeSubmoduleUseCase.kt new file mode 100644 index 0000000..f9e4414 --- /dev/null +++ b/src/main/kotlin/app/git/submodules/InitalizeSubmoduleUseCase.kt @@ -0,0 +1,14 @@ +package app.git.submodules + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.eclipse.jgit.api.Git +import javax.inject.Inject + +class InitializeSubmoduleUseCase @Inject constructor() { + suspend operator fun invoke(git: Git, path: String): Unit = withContext(Dispatchers.IO) { + git.submoduleInit() + .addPath(path) + .call() + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/git/submodules/UpdateSubmoduleUseCase.kt b/src/main/kotlin/app/git/submodules/UpdateSubmoduleUseCase.kt new file mode 100644 index 0000000..bd25378 --- /dev/null +++ b/src/main/kotlin/app/git/submodules/UpdateSubmoduleUseCase.kt @@ -0,0 +1,59 @@ +package app.git.submodules + +import app.logging.printLog +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.eclipse.jgit.api.CloneCommand +import org.eclipse.jgit.api.Git +import org.eclipse.jgit.lib.AnyObjectId +import org.eclipse.jgit.lib.ProgressMonitor +import javax.inject.Inject + +private const val TAG = "UpdateSubmoduleUseCase" + +class UpdateSubmoduleUseCase @Inject constructor() { + suspend operator fun invoke(git: Git, path: String) = withContext(Dispatchers.IO) { + git.submoduleUpdate() + .addPath(path) + .setCallback( + object : CloneCommand.Callback { + override fun initializedSubmodules(submodules: MutableCollection?) { + + } + + override fun cloningSubmodule(path: String?) { + + } + + override fun checkingOut(commit: AnyObjectId?, path: String?) { + + } + + } + ) + .setProgressMonitor(object: ProgressMonitor { + override fun start(totalTasks: Int) { + printLog(TAG, "start $totalTasks") + } + + override fun beginTask(title: String?, totalWork: Int) { + printLog(TAG, "being task $title $totalWork") + } + + override fun update(completed: Int) { + printLog(TAG, "Completed $completed") + } + + override fun endTask() { + printLog(TAG, "endtask") + } + + override fun isCancelled(): Boolean { + printLog(TAG, "isCancelled") + return false + } + + }) + .call() + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/ui/Submodules.kt b/src/main/kotlin/app/ui/Submodules.kt index 97463eb..0a01460 100644 --- a/src/main/kotlin/app/ui/Submodules.kt +++ b/src/main/kotlin/app/ui/Submodules.kt @@ -1,5 +1,6 @@ package app.ui +import androidx.compose.foundation.ContextMenuArea import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.padding import androidx.compose.material.MaterialTheme @@ -14,6 +15,7 @@ import app.theme.secondaryTextColor import app.ui.components.SideMenuPanel import app.ui.components.SideMenuSubentry import app.ui.components.Tooltip +import app.ui.context_menu.submoduleContextMenuItems import app.viewmodels.SubmodulesViewModel import org.eclipse.jgit.submodule.SubmoduleStatus @@ -34,6 +36,7 @@ fun Submodules( itemContent = { submodule -> SubmoduleLineEntry( submodulePair = submodule, + onInitializeModule = { submodulesViewModel.initializeSubmodule(submodule.first) } ) } ) @@ -43,20 +46,29 @@ fun Submodules( @Composable private fun SubmoduleLineEntry( submodulePair: Pair, + onInitializeModule: () -> Unit, ) { - submodulePair.second.type - SideMenuSubentry( - text = submodulePair.first, - iconResourcePath = "topic.svg", - ) { - val stateName = submodulePair.second.type.toString() - Tooltip(stateName) { - Text( - text = stateName.first().toString(), - color = MaterialTheme.colors.secondaryTextColor, - style = MaterialTheme.typography.body2, - modifier = Modifier.padding(horizontal = 16.dp), + ContextMenuArea( + items = { + submoduleContextMenuItems( + submodulePair.second, + onInitializeModule = onInitializeModule ) } + ) { + SideMenuSubentry( + text = submodulePair.first, + iconResourcePath = "topic.svg", + ) { + val stateName = submodulePair.second.type.toString() + Tooltip(stateName) { + Text( + text = stateName.first().toString(), + color = MaterialTheme.colors.secondaryTextColor, + style = MaterialTheme.typography.body2, + modifier = Modifier.padding(horizontal = 16.dp), + ) + } + } } } \ No newline at end of file diff --git a/src/main/kotlin/app/ui/context_menu/SubmoduleContextMenu.kt b/src/main/kotlin/app/ui/context_menu/SubmoduleContextMenu.kt new file mode 100644 index 0000000..1f381bf --- /dev/null +++ b/src/main/kotlin/app/ui/context_menu/SubmoduleContextMenu.kt @@ -0,0 +1,23 @@ +package app.ui.context_menu + +import androidx.compose.foundation.ContextMenuItem +import androidx.compose.foundation.ExperimentalFoundationApi +import org.eclipse.jgit.submodule.SubmoduleStatus +import org.eclipse.jgit.submodule.SubmoduleStatusType + +@OptIn(ExperimentalFoundationApi::class) +fun submoduleContextMenuItems( + submoduleStatus: SubmoduleStatus, + onInitializeModule: () -> Unit, +): List { + return mutableListOf().apply { + if (submoduleStatus.type == SubmoduleStatusType.UNINITIALIZED) { + add( + ContextMenuItem( + label = "Initialize submodule", + onClick = onInitializeModule + ) + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/viewmodels/SubmodulesViewModel.kt b/src/main/kotlin/app/viewmodels/SubmodulesViewModel.kt index 4d5595b..46cde36 100644 --- a/src/main/kotlin/app/viewmodels/SubmodulesViewModel.kt +++ b/src/main/kotlin/app/viewmodels/SubmodulesViewModel.kt @@ -1,16 +1,22 @@ package app.viewmodels +import app.git.RefreshType +import app.git.TabState import app.git.submodules.GetSubmodulesUseCase +import app.git.submodules.InitializeSubmoduleUseCase +import app.git.submodules.UpdateSubmoduleUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import org.eclipse.jgit.api.Git -import org.eclipse.jgit.lib.Ref import org.eclipse.jgit.submodule.SubmoduleStatus import javax.inject.Inject class SubmodulesViewModel @Inject constructor( - private val getSubmodulesUseCase: GetSubmodulesUseCase -): ExpandableViewModel() { + private val tabState: TabState, + private val getSubmodulesUseCase: GetSubmodulesUseCase, + private val initializeSubmoduleUseCase: InitializeSubmoduleUseCase, + private val updateSubmoduleUseCase: UpdateSubmoduleUseCase, +) : ExpandableViewModel() { private val _submodules = MutableStateFlow>>(listOf()) val submodules: StateFlow>> get() = _submodules @@ -19,6 +25,14 @@ class SubmodulesViewModel @Inject constructor( _submodules.value = getSubmodulesUseCase(git).toList() } + fun initializeSubmodule(path: String) = tabState.safeProcessing( + showError = true, + refreshType = RefreshType.SUBMODULES, + ) { git -> + initializeSubmoduleUseCase(git, path) + updateSubmoduleUseCase(git, path) + } + suspend fun refresh(git: Git) { loadSubmodules(git) } diff --git a/src/main/rules.txt b/src/main/rules.txt new file mode 100644 index 0000000..ef68694 --- /dev/null +++ b/src/main/rules.txt @@ -0,0 +1,48 @@ +-dontobfuscate +-allowaccessmodification +-keepattributes SourceFile, LineNumberTable + +-keep class kotlin.** { *; } +-keep class kotlinx.coroutines.** { *; } +-keep class org.jetbrains.skia.** { *; } +-keep class org.jetbrains.skiko.** { *; } +-keep class androidx.compose.foundation.** { *; } + +-keep class MainKt { + public static void main(); +} + +-dontwarn org.apache.sshd.** +-dontnote org.apache.sshd.** + +-dontwarn okio.** +-dontnote okio.** + +-dontwarn okhttp3.** +-dontnote okhttp3.** + +-dontwarn retrofit2.** +-dontnote retrofit2.** + +-dontwarn kotlin.** +-dontnote kotlin.** + +-dontwarn kotlinx.** +-dontnote kotlinx.** + +-dontwarn org.slf4j.** +-dontnote org.slf4j.** + +-dontwarn androidx.compose.** +-dontnote androidx.compose.** +-keep class !my.package.name.** { *; } + + +-assumenosideeffects public class androidx.compose.runtime.ComposerKt { + void sourceInformation(androidx.compose.runtime.Composer,java.lang.String); + void sourceInformationMarkerStart(androidx.compose.runtime.Composer,int,java.lang.String); + void sourceInformationMarkerEnd(androidx.compose.runtime.Composer); +} + +-ignorewarnings +