parent
05852a6034
commit
098d37f983
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,7 @@ import com.jetpackduba.gitnuro.git.rebase.AbortRebaseUseCase
|
|||||||
import com.jetpackduba.gitnuro.git.repository.GetRepositoryStateUseCase
|
import com.jetpackduba.gitnuro.git.repository.GetRepositoryStateUseCase
|
||||||
import com.jetpackduba.gitnuro.git.repository.InitLocalRepositoryUseCase
|
import com.jetpackduba.gitnuro.git.repository.InitLocalRepositoryUseCase
|
||||||
import com.jetpackduba.gitnuro.git.repository.OpenRepositoryUseCase
|
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.stash.StashChangesUseCase
|
||||||
import com.jetpackduba.gitnuro.git.workspace.StageUntrackedFileUseCase
|
import com.jetpackduba.gitnuro.git.workspace.StageUntrackedFileUseCase
|
||||||
import com.jetpackduba.gitnuro.logging.printLog
|
import com.jetpackduba.gitnuro.logging.printLog
|
||||||
@ -46,6 +47,7 @@ class TabViewModel @Inject constructor(
|
|||||||
private val getRepositoryStateUseCase: GetRepositoryStateUseCase,
|
private val getRepositoryStateUseCase: GetRepositoryStateUseCase,
|
||||||
private val initLocalRepositoryUseCase: InitLocalRepositoryUseCase,
|
private val initLocalRepositoryUseCase: InitLocalRepositoryUseCase,
|
||||||
private val openRepositoryUseCase: OpenRepositoryUseCase,
|
private val openRepositoryUseCase: OpenRepositoryUseCase,
|
||||||
|
private val openSubmoduleRepositoryUseCase: OpenSubmoduleRepositoryUseCase,
|
||||||
private val diffViewModelProvider: Provider<DiffViewModel>,
|
private val diffViewModelProvider: Provider<DiffViewModel>,
|
||||||
private val rebaseInteractiveViewModelProvider: Provider<RebaseInteractiveViewModel>,
|
private val rebaseInteractiveViewModelProvider: Provider<RebaseInteractiveViewModel>,
|
||||||
private val historyViewModelProvider: Provider<HistoryViewModel>,
|
private val historyViewModelProvider: Provider<HistoryViewModel>,
|
||||||
@ -165,15 +167,25 @@ class TabViewModel @Inject constructor(
|
|||||||
|
|
||||||
_repositorySelectionStatus.value = RepositorySelectionStatus.Opening(directory.absolutePath)
|
_repositorySelectionStatus.value = RepositorySelectionStatus.Opening(directory.absolutePath)
|
||||||
|
|
||||||
val repository: Repository = openRepositoryUseCase(directory)
|
|
||||||
|
|
||||||
try {
|
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
|
repository.workTree // test if repository is valid
|
||||||
_repositorySelectionStatus.value = RepositorySelectionStatus.Open(repository)
|
_repositorySelectionStatus.value = RepositorySelectionStatus.Open(repository)
|
||||||
val git = Git(repository)
|
val git = Git(repository)
|
||||||
tabState.initGit(git)
|
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)
|
tabState.newSelectedItem(selectedItem = SelectedItem.UncommitedChanges)
|
||||||
newDiffSelected = null
|
newDiffSelected = null
|
||||||
refreshRepositoryInfo()
|
refreshRepositoryInfo()
|
||||||
|
Loading…
Reference in New Issue
Block a user