Added support to opening submodules directly

Fixes #58
This commit is contained in:
Abdelilah El Aissaoui 2023-03-25 16:08:01 +01:00
parent 05852a6034
commit 098d37f983
No known key found for this signature in database
GPG Key ID: 7587FC860F594869
2 changed files with 50 additions and 3 deletions

View File

@ -0,0 +1,35 @@
package com.jetpackduba.gitnuro.git.repository
import com.jetpackduba.gitnuro.exceptions.InvalidDirectoryException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.submodule.SubmoduleWalk
import java.io.File
import javax.inject.Inject
class OpenSubmoduleRepositoryUseCase @Inject constructor(
private val openRepositoryUseCase: OpenRepositoryUseCase
) {
suspend operator fun invoke(directory: File): Repository = withContext(Dispatchers.IO) {
val parent = getRepositoryParent(directory)
?: throw InvalidDirectoryException("Submodule's parent repository not found")
val repository = openRepositoryUseCase(parent)
val submoduleRelativePath = directory.absolutePath.removePrefix("${repository.directory.parent}/")
return@withContext SubmoduleWalk.getSubmoduleRepository(repository, submoduleRelativePath)
?: throw InvalidDirectoryException("Invalid submodule directory. Check if the submodule has been initialized before trying to open it.")
}
private fun getRepositoryParent(directory: File?): File? {
if (directory == null) return null
if (directory.listFiles()?.any { it.name == ".git" && it.isDirectory } == true) {
return directory
}
return getRepositoryParent(directory.parentFile)
}
}

View File

@ -11,6 +11,7 @@ import com.jetpackduba.gitnuro.git.rebase.AbortRebaseUseCase
import com.jetpackduba.gitnuro.git.repository.GetRepositoryStateUseCase
import com.jetpackduba.gitnuro.git.repository.InitLocalRepositoryUseCase
import com.jetpackduba.gitnuro.git.repository.OpenRepositoryUseCase
import com.jetpackduba.gitnuro.git.repository.OpenSubmoduleRepositoryUseCase
import com.jetpackduba.gitnuro.git.stash.StashChangesUseCase
import com.jetpackduba.gitnuro.git.workspace.StageUntrackedFileUseCase
import com.jetpackduba.gitnuro.logging.printLog
@ -46,6 +47,7 @@ class TabViewModel @Inject constructor(
private val getRepositoryStateUseCase: GetRepositoryStateUseCase,
private val initLocalRepositoryUseCase: InitLocalRepositoryUseCase,
private val openRepositoryUseCase: OpenRepositoryUseCase,
private val openSubmoduleRepositoryUseCase: OpenSubmoduleRepositoryUseCase,
private val diffViewModelProvider: Provider<DiffViewModel>,
private val rebaseInteractiveViewModelProvider: Provider<RebaseInteractiveViewModel>,
private val historyViewModelProvider: Provider<HistoryViewModel>,
@ -165,15 +167,25 @@ class TabViewModel @Inject constructor(
_repositorySelectionStatus.value = RepositorySelectionStatus.Opening(directory.absolutePath)
val repository: Repository = openRepositoryUseCase(directory)
try {
val repository: Repository = if (directory.listFiles()?.any { it.name == ".git" && it.isFile } == true) {
openSubmoduleRepositoryUseCase(directory)
} else {
openRepositoryUseCase(directory)
}
repository.workTree // test if repository is valid
_repositorySelectionStatus.value = RepositorySelectionStatus.Open(repository)
val git = Git(repository)
tabState.initGit(git)
onRepositoryChanged(repository.directory.parent)
val path = if(directory.name == ".git") {
directory.parent
} else
directory.absolutePath
onRepositoryChanged(path)
tabState.newSelectedItem(selectedItem = SelectedItem.UncommitedChanges)
newDiffSelected = null
refreshRepositoryInfo()