From f293e9428c446f51a826cc07f300c53d29e9be05 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Sun, 16 Oct 2022 16:00:42 +0200 Subject: [PATCH] Improved events notifications. Removed GIt dir changes detection temporarily --- .../gitnuro/git/FileChangesWatcher.kt | 13 ++-- .../com/jetpackduba/gitnuro/git/TabState.kt | 64 ++++--------------- .../com/jetpackduba/gitnuro/ui/AppTab.kt | 1 - .../gitnuro/viewmodels/BranchesViewModel.kt | 5 +- .../gitnuro/viewmodels/DiffViewModel.kt | 8 +-- .../gitnuro/viewmodels/LogViewModel.kt | 4 +- .../viewmodels/RebaseInteractiveViewModel.kt | 6 +- .../gitnuro/viewmodels/RemotesViewModel.kt | 4 +- .../gitnuro/viewmodels/StashesViewModel.kt | 14 +--- .../gitnuro/viewmodels/StatusViewModel.kt | 8 +-- .../gitnuro/viewmodels/SubmodulesViewModel.kt | 4 +- .../gitnuro/viewmodels/TabViewModel.kt | 20 +++--- .../gitnuro/viewmodels/TagsViewModel.kt | 4 +- 13 files changed, 41 insertions(+), 114 deletions(-) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/FileChangesWatcher.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/FileChangesWatcher.kt index 3648bad..f5f8171 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/FileChangesWatcher.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/FileChangesWatcher.kt @@ -23,7 +23,6 @@ class FileChangesWatcher @Inject constructor() { val keys = mutableMapOf() suspend fun watchDirectoryPath(pathStr: String, ignoredDirsPath: List) = withContext(Dispatchers.IO) { - println(ignoredDirsPath) val watchService = FileSystems.getDefault().newWatchService() val path = Paths.get(pathStr) @@ -41,7 +40,7 @@ class FileChangesWatcher @Inject constructor() { override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult { val isIgnoredDirectory = ignoredDirsPath.any { "$pathStr/$it" == dir.toString() } - return if (!isIgnoredDirectory) { + return if (!isIgnoredDirectory && !isGitDir(dir, pathStr)) { val watchKey = dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY) keys[watchKey] = dir FileVisitResult.CONTINUE @@ -57,8 +56,6 @@ class FileChangesWatcher @Inject constructor() { val dir = keys[key] ?: return@withContext - val hasGitDirectoryChanged = dir.startsWith("$pathStr$systemSeparator.git$systemSeparator") - if (events.count() == 1) { val fileChanged = events.first().context().toString() val fullPathOfFileChanged = "$pathStr$systemSeparator.git$systemSeparator$fileChanged" @@ -70,9 +67,7 @@ class FileChangesWatcher @Inject constructor() { } } - printLog(TAG, "Has git dir changed: $hasGitDirectoryChanged") - - _changesNotifier.emit(hasGitDirectoryChanged) + _changesNotifier.emit(false) // Check if new directories have been added to add them to the watchService launch(Dispatchers.IO) { @@ -99,6 +94,10 @@ class FileChangesWatcher @Inject constructor() { } } + private fun isGitDir(dir: Path, pathStr: String): Boolean { + return dir.startsWith("$pathStr$systemSeparator.git$systemSeparator") + } + private fun isGitMessageFile(repoPath: String, fullPathOfFileChanged: String): Boolean { val gitDir = "$repoPath$systemSeparator.git$systemSeparator" return fullPathOfFileChanged == "${gitDir}COMMIT_EDITMSG" || diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/TabState.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/TabState.kt index 3cdf3f7..64438b0 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/TabState.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/TabState.kt @@ -26,14 +26,14 @@ class TabState @Inject constructor( private val _taskEvent = MutableSharedFlow() val taskEvent: SharedFlow = _taskEvent - var git: Git? = null - private val safeGit: Git + private var unsafeGit: Git? = null + val git: Git get() { - val git = this.git - if (git == null) { - throw CancellationException("Null git object") + val unsafeGit = this.unsafeGit + if (unsafeGit == null) { + throw CancellationException("Repository not available") } else - return git + return unsafeGit } private val _refreshData = MutableSharedFlow() @@ -48,6 +48,10 @@ class TabState @Inject constructor( private val _processing = MutableStateFlow(false) val processing: StateFlow = _processing + fun initGit(git: Git) { + this.unsafeGit = git + } + fun safeProcessing( showError: Boolean = true, refreshType: RefreshType, @@ -65,7 +69,7 @@ class TabState @Inject constructor( _processing.value = true } ) { - callback(safeGit) + callback(git) } } catch (ex: Exception) { hasProcessFailed = true @@ -112,7 +116,7 @@ class TabState @Inject constructor( operationRunning = true try { - block(safeGit) + block(git) } catch (ex: Exception) { ex.printStackTrace() @@ -121,52 +125,10 @@ class TabState @Inject constructor( if (showError) errorsManager.addError(newErrorNow(ex, ex.localizedMessage)) } finally { - launch { - // Add a slight delay because sometimes the file watcher takes a few moments to notify a change in the - // filesystem, therefore notifying late and being operationRunning already false (which leads to a full - // refresh because there have been changes in the git dir). This can be easily triggered by interactive - // rebase. - delay(500) - operationRunning = false - } - - if (refreshType != RefreshType.NONE && (!hasProcessFailed || refreshEvenIfCrashes)) _refreshData.emit(refreshType) - } - } - suspend fun coRunOperation( - showError: Boolean = false, - refreshType: RefreshType, - refreshEvenIfCrashes: Boolean = false, - block: suspend (git: Git) -> Unit - ) = withContext(Dispatchers.IO) { - var hasProcessFailed = false - - operationRunning = true - try { - block(safeGit) - } catch (ex: Exception) { - ex.printStackTrace() - - hasProcessFailed = true - - if (showError) - errorsManager.addError(newErrorNow(ex, ex.localizedMessage)) - } finally { - launch { - // Add a slight delay because sometimes the file watcher takes a few moments to notify a change in the - // filesystem, therefore notifying late and being operationRunning already false (which leads to a full - // refresh because there have been changes in the git dir). This can be easily triggered by interactive - // rebase. - delay(500) operationRunning = false - } - - - if (refreshType != RefreshType.NONE && (!hasProcessFailed || refreshEvenIfCrashes)) - _refreshData.emit(refreshType) } } @@ -211,9 +173,9 @@ class TabState @Inject constructor( _taskEvent.emit(taskEvent) } + @OptIn(ExperimentalCoroutinesApi::class) fun refreshFlowFiltered(vararg filters: RefreshType) = refreshData .filter { refreshType -> - printLog(TAG, "Filters: ${filters.joinToString()}. Refresh type $refreshType") filters.contains(refreshType) } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt index 868de4f..f4e4e73 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt @@ -48,7 +48,6 @@ fun AppTab( val repositorySelectionStatusValue = repositorySelectionStatus.value val isProcessing by tabViewModel.processing.collectAsState() - println("Tab name from scope = ${LocalTabScope.current.tabName.value}") LocalTabScope.current.appStateManager Box { Column( diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/BranchesViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/BranchesViewModel.kt index 39c3849..7e187f9 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/BranchesViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/BranchesViewModel.kt @@ -43,9 +43,7 @@ class BranchesViewModel @Inject constructor( tabScope.launch { tabState.refreshFlowFiltered(RefreshType.ALL_DATA) .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } } @@ -62,7 +60,6 @@ class BranchesViewModel @Inject constructor( branchesList.add(0, selectedBranch) } - _branches.value = branchesList } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/DiffViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/DiffViewModel.kt index dd7a703..1528a2c 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/DiffViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/DiffViewModel.kt @@ -60,11 +60,9 @@ class DiffViewModel @Inject constructor( RefreshType.UNCOMMITED_CHANGES, RefreshType.UNCOMMITED_CHANGES_AND_LOG, ).collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { - val diffResultValue = diffResult.value - if(diffResultValue is ViewDiffResult.Loaded) { - updateDiff(diffResultValue.diffEntryType) - } + val diffResultValue = diffResult.value + if (diffResultValue is ViewDiffResult.Loaded) { + updateDiff(diffResultValue.diffEntryType) } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/LogViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/LogViewModel.kt index 83f329d..efb2341 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/LogViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/LogViewModel.kt @@ -116,9 +116,7 @@ class LogViewModel @Inject constructor( RefreshType.ONLY_LOG, RefreshType.UNCOMMITED_CHANGES_AND_LOG, ).collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt index 7b15cb2..3271858 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt @@ -39,11 +39,9 @@ class RebaseInteractiveViewModel @Inject constructor( println("prepareSteps started") tabState.refreshData(RefreshType.REPO_STATE) - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - val messages = getRebaseLinesFullMessageUseCase(git, steps) + val messages = getRebaseLinesFullMessageUseCase(tabState.git, steps) - _rebaseState.value = RebaseInteractiveState.Loaded(steps, messages) - } + _rebaseState.value = RebaseInteractiveState.Loaded(steps, messages) println("prepareSteps mutex lock") rebaseInteractiveMutex.lock() diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RemotesViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RemotesViewModel.kt index 5aac8de..0b1afcf 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RemotesViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RemotesViewModel.kt @@ -38,9 +38,7 @@ class RemotesViewModel @Inject constructor( tabScope.launch { tabState.refreshFlowFiltered(RefreshType.ALL_DATA, RefreshType.REMOTES) .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StashesViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StashesViewModel.kt index 1a1bc43..2ea7470 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StashesViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StashesViewModel.kt @@ -30,22 +30,10 @@ class StashesViewModel @Inject constructor( get() = _stashStatus init { - tabScope.launch { - tabState.refreshData - .filter { refreshType -> refreshType == RefreshType.ALL_DATA } - .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } - } - } - tabScope.launch { tabState.refreshFlowFiltered(RefreshType.ALL_DATA, RefreshType.STASHES) .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt index a76cb4a..57979d3 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt @@ -70,9 +70,7 @@ class StatusViewModel @Inject constructor( RefreshType.UNCOMMITED_CHANGES, RefreshType.UNCOMMITED_CHANGES_AND_LOG, ).collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } } @@ -120,13 +118,13 @@ class StatusViewModel @Inject constructor( } fun resetStaged(statusEntry: StatusEntry) = tabState.runOperation( - refreshType = RefreshType.UNCOMMITED_CHANGES, + refreshType = RefreshType.UNCOMMITED_CHANGES_AND_LOG, ) { git -> resetEntryUseCase(git, statusEntry, staged = true) } fun resetUnstaged(statusEntry: StatusEntry) = tabState.runOperation( - refreshType = RefreshType.UNCOMMITED_CHANGES, + refreshType = RefreshType.UNCOMMITED_CHANGES_AND_LOG, ) { git -> resetEntryUseCase(git, statusEntry, staged = false) } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/SubmodulesViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/SubmodulesViewModel.kt index 8abe7b7..b0486e9 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/SubmodulesViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/SubmodulesViewModel.kt @@ -28,9 +28,7 @@ class SubmodulesViewModel @Inject constructor( tabScope.launch { tabState.refreshFlowFiltered(RefreshType.ALL_DATA, RefreshType.SUBMODULES) .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt index 0969641..3c7c97c 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt @@ -112,8 +112,6 @@ class TabViewModel @Inject constructor( when (refreshType) { RefreshType.NONE -> printLog(TAG, "Not refreshing...") RefreshType.REPO_STATE -> refreshRepositoryState() - RefreshType.UNCOMMITED_CHANGES -> checkUncommitedChanges() - RefreshType.UNCOMMITED_CHANGES_AND_LOG -> checkUncommitedChanges() else -> {} } } @@ -131,11 +129,8 @@ class TabViewModel @Inject constructor( launch { tabState.refreshFlowFiltered(RefreshType.ALL_DATA, RefreshType.REPO_STATE) .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - loadRepositoryState(git) - } + loadRepositoryState(tabState.git) } - } } } @@ -166,7 +161,7 @@ class TabViewModel @Inject constructor( repository.workTree // test if repository is valid _repositorySelectionStatus.value = RepositorySelectionStatus.Open(repository) val git = Git(repository) - tabState.git = git + tabState.initGit(git) onRepositoryChanged(repository.directory.parent) refreshRepositoryInfo() @@ -289,6 +284,7 @@ class TabViewModel @Inject constructor( refreshType = RefreshType.NONE, ) { updateDiffEntry() + tabState.refreshData(RefreshType.UNCOMMITED_CHANGES_AND_LOG) // // // Stashes list should only be updated if we are doing a stash operation, however it's a small operation // // that we can afford to do when doing other operations @@ -296,9 +292,9 @@ class TabViewModel @Inject constructor( // loadRepositoryState(git) } - private fun refreshRepositoryInfo() = tabState.safeProcessing( - refreshType = RefreshType.ALL_DATA, - ) {} + private suspend fun refreshRepositoryInfo() { + tabState.refreshData(RefreshType.ALL_DATA) + } fun credentialsDenied() { credentialsStateManager.updateState(CredentialsState.CredentialsDenied) @@ -413,8 +409,8 @@ class TabViewModel @Inject constructor( historyViewModel = null } - fun refreshAll() { - printLog(TAG, "Manual refresh triggered") + fun refreshAll() = tabScope.launch { + printLog(TAG, "Manual refresh triggered. IS OPERATION RUNNING ${tabState.operationRunning}") if (!tabState.operationRunning) { refreshRepositoryInfo() } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TagsViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TagsViewModel.kt index 0a1617b..9aed816 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TagsViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TagsViewModel.kt @@ -30,9 +30,7 @@ class TagsViewModel @Inject constructor( tabScope.launch { tabState.refreshFlowFiltered(RefreshType.ALL_DATA, RefreshType.STASHES) .collect { - tabState.coRunOperation(refreshType = RefreshType.NONE) { git -> - refresh(git) - } + refresh(tabState.git) } } }