diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bd12979..136f0ae 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,6 +12,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -24,5 +25,6 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. Linux] - - Version [e.g. 1.0.1] + +- OS: [e.g. Linux] +- Version [e.g. 1.0.1] diff --git a/.github/workflows/build_with_tests.yml b/.github/workflows/build_with_tests.yml index 684bda4..e4fffc3 100644 --- a/.github/workflows/build_with_tests.yml +++ b/.github/workflows/build_with_tests.yml @@ -17,15 +17,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'corretto' - architecture: x64 - - name: Build with Gradle - uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 - with: - arguments: build + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'corretto' + architecture: x64 + - name: Build with Gradle + uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 + with: + arguments: build # TODO Add tests diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5aac26..d0f9cae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,28 +21,28 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - - name: Check out my other private repo - uses: actions/checkout@master - with: - repository: Microsoft/vcpkg - - name: Get vcpkg - run: | - dir -Force - bootstrap-vcpkg.bat - - name: Install libssh - run: | - ls -a - ./vcpkg.exe install libssh - shell: bash - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'corretto' - architecture: x64 - - name: Build with Gradle - uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 - with: - arguments: build + - name: Check out my other private repo + uses: actions/checkout@master + with: + repository: Microsoft/vcpkg + - name: Get vcpkg + run: | + dir -Force + bootstrap-vcpkg.bat + - name: Install libssh + run: | + ls -a + ./vcpkg.exe install libssh + shell: bash + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'corretto' + architecture: x64 + - name: Build with Gradle + uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 + with: + arguments: build diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 3bdde2a..8e590f4 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -2,7 +2,8 @@ ## Installing libssh -Gitnuro depends on libssh being present as an external, native library (using [JNA](https://github.com/java-native-access/jna)). +Gitnuro depends on libssh being present as an external, native library ( +using [JNA](https://github.com/java-native-access/jna)). While the release GitHub workflow packages it automatically, you'll need to install it manually when developing locally, such that it's available on the `$PATH`. See [here](https://www.libssh.org/get-it/) for one-liner installation instructions with your OS's package manager, or manually download a binary or compile it from source and place it in the @@ -22,10 +23,12 @@ You don't need this if you only use the JDK installed by IntelliJ IDEA. Check which Java version this project currently uses (`cat build.gradle.kts | grep JavaLanguageVersion`) and install it. For instance on Debian-based systems, you'd run: + ```bash sudo apt-get install openjdk-17-jre openjdk-17-jdk libssh-dev export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 ``` + Once it works (e.g. `./gradlew build`), you may want to add that latter line to your `/etc/environment`. ## Running the app / unit tests diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/App.kt b/src/main/kotlin/com/jetpackduba/gitnuro/App.kt index fdaee13..1956f1c 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/App.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/App.kt @@ -148,9 +148,10 @@ class App { .removeSuffix("$systemSeparator.git") val newKey = it.count() - val existingIndex = newList.indexOfFirst { repo -> repo.path?.removeSuffix(systemSeparator) == absolutePath } + val existingIndex = + newList.indexOfFirst { repo -> repo.path?.removeSuffix(systemSeparator) == absolutePath } - defaultSelectedTabKey = if(existingIndex == -1) { + defaultSelectedTabKey = if (existingIndex == -1) { newList.add(newAppTab(key = newKey, path = absolutePath)) newKey } else { diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/AppFilesManager.kt b/src/main/kotlin/com/jetpackduba/gitnuro/AppFilesManager.kt index 9a518e3..10b49da 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/AppFilesManager.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/AppFilesManager.kt @@ -35,7 +35,7 @@ class AppFilesManager @Inject constructor() { val appFolder = File(baseFolder, "gitnuro") // TODO test if mkdir fails for some reason - if(!appFolder.exists() || !appFolder.isDirectory) + if (!appFolder.exists() || !appFolder.isDirectory) appFolder.mkdir() return appFolder diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/TempFilesManager.kt b/src/main/kotlin/com/jetpackduba/gitnuro/TempFilesManager.kt index 435eb34..5d6c151 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/TempFilesManager.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/TempFilesManager.kt @@ -3,7 +3,6 @@ package com.jetpackduba.gitnuro import com.jetpackduba.gitnuro.di.TabScope import com.jetpackduba.gitnuro.extensions.openDirectory import java.io.File -import java.nio.file.Files import javax.inject.Inject @TabScope @@ -14,7 +13,7 @@ class TempFilesManager @Inject constructor( val appDataDir = appFilesManager.getAppFolder() val tempDir = appDataDir.openDirectory("tmp") - if(!tempDir.exists() || !tempDir.isDirectory) { + if (!tempDir.exists() || !tempDir.isDirectory) { tempDir.mkdir() } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GProcessLibSsh.kt b/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GProcessLibSsh.kt index 188d3ea..ef8f95d 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GProcessLibSsh.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GProcessLibSsh.kt @@ -1,6 +1,7 @@ package com.jetpackduba.gitnuro.credentials -import com.jetpackduba.gitnuro.ssh.libssh.* +import com.jetpackduba.gitnuro.ssh.libssh.LibSshChannel +import com.jetpackduba.gitnuro.ssh.libssh.LibSshSession import java.io.InputStream import java.io.OutputStream diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GRemoteSession.kt b/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GRemoteSession.kt index d3ad08f..8b51aad 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GRemoteSession.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/credentials/GRemoteSession.kt @@ -3,7 +3,6 @@ package com.jetpackduba.gitnuro.credentials import com.jetpackduba.gitnuro.ssh.libssh.LibSshOptions import com.jetpackduba.gitnuro.ssh.libssh.LibSshSession import org.apache.sshd.client.SshClient -import org.apache.sshd.client.future.ConnectFuture import org.eclipse.jgit.transport.RemoteSession import org.eclipse.jgit.transport.URIish import javax.inject.Inject @@ -43,7 +42,7 @@ class GRemoteSession @Inject constructor( session.connect() var result = session.userAuthPublicKeyAuto(null, null) - if(result == 1) { + if (result == 1) { credentialsStateManager.updateState(CredentialsRequested.SshCredentialsRequested) var credentials = credentialsStateManager.currentCredentialsState @@ -59,7 +58,7 @@ class GRemoteSession @Inject constructor( result = session.userAuthPublicKeyAuto(null, password) } - if(result != 0) + if (result != 0) throw Exception("Something went wrong with authentication. Code $result") this.session = session diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/credentials/HttpCredentialsProvider.kt b/src/main/kotlin/com/jetpackduba/gitnuro/credentials/HttpCredentialsProvider.kt index e67438e..624fe74 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/credentials/HttpCredentialsProvider.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/credentials/HttpCredentialsProvider.kt @@ -151,7 +151,9 @@ class HttpCredentialsProvider @AssistedInject constructor( bufferedReader.use { var line: String - while (bufferedReader.readLine().also { line = checkNotNull(it) { "Cancelled authentication" } } != null && !(usernameSet && passwordSet)) { + while (bufferedReader.readLine().also { + line = checkNotNull(it) { "Cancelled authentication" } + } != null && !(usernameSet && passwordSet)) { if (line.startsWith("username=")) { val split = line.split("=") val userName = split.getOrNull(1) ?: return ExternalCredentialsRequestResult.CREDENTIALS_NOT_STORED diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/di/AppComponent.kt b/src/main/kotlin/com/jetpackduba/gitnuro/di/AppComponent.kt index 874ecd1..a7f7988 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/di/AppComponent.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/di/AppComponent.kt @@ -4,8 +4,6 @@ import com.jetpackduba.gitnuro.App import com.jetpackduba.gitnuro.AppStateManager import com.jetpackduba.gitnuro.credentials.CredentialsStateManager import com.jetpackduba.gitnuro.di.modules.AppModule -import com.jetpackduba.gitnuro.di.modules.NetworkModule -import com.jetpackduba.gitnuro.di.modules.TabModule import com.jetpackduba.gitnuro.preferences.AppSettings import com.jetpackduba.gitnuro.viewmodels.SettingsViewModel import dagger.Component diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/extensions/Shell.kt b/src/main/kotlin/com/jetpackduba/gitnuro/extensions/Shell.kt index bc76e68..069de3a 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/extensions/Shell.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/extensions/Shell.kt @@ -28,7 +28,7 @@ fun runCommand(command: String): String? { fun runCommandWithoutResult(command: String, args: String, file: String): Boolean { val parts: Array = prepareCommand(command, args, file) - printLog(TAG, "Running command ${parts.joinToString( )}") + printLog(TAG, "Running command ${parts.joinToString()}") return try { val p = Runtime.getRuntime().exec(parts) ?: return false diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/DoCommitUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/DoCommitUseCase.kt index 320278b..4b8fa77 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/DoCommitUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/DoCommitUseCase.kt @@ -1,13 +1,9 @@ package com.jetpackduba.gitnuro.git.workspace -import com.jetpackduba.gitnuro.credentials.GpgCredentialsProvider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.eclipse.jgit.api.Git import org.eclipse.jgit.revwalk.RevCommit -import org.eclipse.jgit.transport.CredentialItem -import org.eclipse.jgit.transport.CredentialsProvider -import org.eclipse.jgit.transport.URIish import javax.inject.Inject class DoCommitUseCase @Inject constructor() { diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshSession.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshSession.kt index c830452..d411276 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshSession.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshSession.kt @@ -24,7 +24,7 @@ class LibSshSession @Inject constructor() { fun userAuthPublicKeyAuto(username: String?, password: String?): Int { val result = sshLib.ssh_userauth_publickey_auto(session, username, password) - if(result != 0) + if (result != 0) println("RESULT is $result. ERROR IS: ${getError()}") return result diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshWrapper.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshWrapper.kt index 3afa05c..1fff5ac 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshWrapper.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/LibSshWrapper.kt @@ -1,6 +1,5 @@ package com.jetpackduba.gitnuro.ssh.libssh -import com.jetpackduba.gitnuro.extensions.getCurrentOs import com.sun.jna.Library import com.sun.jna.Native import com.sun.jna.PointerType @@ -16,7 +15,7 @@ interface SSHLibrary : Library { fun ssh_options_parse_config(session: ssh_session, fileName: String?): Int - fun ssh_connect(session: ssh_session) : Int + fun ssh_connect(session: ssh_session): Int fun ssh_userauth_agent(session: ssh_session, username: String?): Int fun ssh_userauth_publickey_auto(session: ssh_session, username: String?, password: String?): Int @@ -29,7 +28,14 @@ interface SSHLibrary : Library { fun ssh_channel_request_exec(sshChannel: ssh_channel, command: String): Int fun ssh_channel_read(sshChannel: ssh_channel, buffer: ByteArray, count: Int, isStderr: Int): Int - fun ssh_channel_read_timeout(sshChannel: ssh_channel, buffer: ByteArray, count: Int, isStderr: Int, timeoutMs: Int): Int + fun ssh_channel_read_timeout( + sshChannel: ssh_channel, + buffer: ByteArray, + count: Int, + isStderr: Int, + timeoutMs: Int + ): Int + fun ssh_channel_poll(sshChannel: ssh_channel, isStderr: Int): Int fun ssh_channel_read_nonblocking(sshChannel: ssh_channel, buffer: ByteArray, count: Int, isStderr: Int): Int fun ssh_channel_write(sshChannel: ssh_channel, data: ByteArray, len: Int): Int diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/streams/LibSshChannelInputStream.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/streams/LibSshChannelInputStream.kt index 8c65dc7..d5bb3c5 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/streams/LibSshChannelInputStream.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ssh/libssh/streams/LibSshChannelInputStream.kt @@ -11,7 +11,7 @@ class LibSshChannelInputStream(private val sshChannel: ssh_channel) : InputStrea override fun read(b: ByteArray, off: Int, len: Int): Int { val byteArray = ByteArray(len) val result = sshLib.ssh_channel_read(sshChannel, byteArray, len, 0) - for(i in 0 until len) { + for (i in 0 until len) { b[off + i] = byteArray[i] } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt index 6c509f4..860cb9b 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt @@ -38,7 +38,6 @@ fun AppTab( val repositorySelectionStatusValue = repositorySelectionStatus.value val isProcessing by tabViewModel.processing.collectAsState() - LocalTabScope.current.appStateManager Box { Column( modifier = Modifier @@ -95,7 +94,6 @@ fun AppTab( } } - if (isProcessing) { Box( modifier = Modifier diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt index b21d559..4bd4d57 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt @@ -22,14 +22,13 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.input.key.onPreviewKeyEvent import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import com.jetpackduba.gitnuro.extensions.* import com.jetpackduba.gitnuro.keybindings.KeybindingOption import com.jetpackduba.gitnuro.keybindings.matchesBinding import com.jetpackduba.gitnuro.theme.notoSansMonoFontFamily -import com.jetpackduba.gitnuro.theme.tertiarySurface import com.jetpackduba.gitnuro.theme.secondarySurface +import com.jetpackduba.gitnuro.theme.tertiarySurface import com.jetpackduba.gitnuro.ui.components.PrimaryButton import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn import org.eclipse.jgit.blame.BlameResult diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/FileHistory.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/FileHistory.kt index 1701ab9..45cd748 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/FileHistory.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/FileHistory.kt @@ -27,8 +27,8 @@ import com.jetpackduba.gitnuro.extensions.toSmartSystemString import com.jetpackduba.gitnuro.git.diff.DiffResult import com.jetpackduba.gitnuro.keybindings.KeybindingOption import com.jetpackduba.gitnuro.keybindings.matchesBinding -import com.jetpackduba.gitnuro.theme.tertiarySurface import com.jetpackduba.gitnuro.theme.onBackgroundSecondary +import com.jetpackduba.gitnuro.theme.tertiarySurface import com.jetpackduba.gitnuro.ui.components.AvatarImage import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn import com.jetpackduba.gitnuro.ui.components.TooltipText diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt index 5d88279..e125349 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt @@ -11,7 +11,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.jetpackduba.gitnuro.theme.textButtonColors import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField import com.jetpackduba.gitnuro.ui.components.PrimaryButton import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn @@ -148,7 +147,7 @@ fun RebaseCommit( onMessageChanged(it) }, textStyle = MaterialTheme.typography.body2, - backgroundColor = if(rebaseLine.action == Action.REWORD) { + backgroundColor = if (rebaseLine.action == Action.REWORD) { MaterialTheme.colors.background } else MaterialTheme.colors.surface diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt index 80b11fd..25a24bc 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt @@ -53,9 +53,10 @@ fun SidePanel( .padding(start = 8.dp) ) - ScrollableLazyColumn(modifier = Modifier - .fillMaxSize() - .padding(top = 4.dp) + ScrollableLazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(top = 4.dp) ) { localBranches( branchesState = branchesState, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/SystemDialogs.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/SystemDialogs.kt index 0c9dd57..9400736 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/SystemDialogs.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/SystemDialogs.kt @@ -89,7 +89,7 @@ private fun openJvmDialog( UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) } - if(isMac) { + if (isMac) { System.setProperty("apple.awt.fileDialogForDirectories", "true") val fileChooser = if (basePath.isNullOrEmpty()) FileDialog(null as java.awt.Frame?, "Open", FileDialog.LOAD) @@ -110,7 +110,7 @@ private fun openJvmDialog( val fileChooser = if (basePath.isNullOrEmpty()) JFileChooser() else - JFileChooser(basePath) + JFileChooser(basePath) fileChooser.fileSelectionMode = pickerType.value fileChooser.showOpenDialog(null) return if (fileChooser.selectedFile != null) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt index 9e4759b..eea9a95 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt @@ -40,7 +40,10 @@ import com.jetpackduba.gitnuro.theme.* import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn import com.jetpackduba.gitnuro.ui.components.SecondaryButton import com.jetpackduba.gitnuro.ui.components.gitnuroViewModel -import com.jetpackduba.gitnuro.ui.context_menu.* +import com.jetpackduba.gitnuro.ui.context_menu.ContextMenu +import com.jetpackduba.gitnuro.ui.context_menu.ContextMenuElement +import com.jetpackduba.gitnuro.ui.context_menu.EntryType +import com.jetpackduba.gitnuro.ui.context_menu.statusEntriesContextMenuItems import com.jetpackduba.gitnuro.viewmodels.StageStatus import com.jetpackduba.gitnuro.viewmodels.StatusViewModel import org.eclipse.jgit.lib.RepositoryState @@ -83,7 +86,7 @@ fun UncommitedChanges( } val canCommit = commitMessage.isNotEmpty() && staged.isNotEmpty() - val canAmend = commitMessage.isNotEmpty() && statusViewModel.hasPreviousCommits + val canAmend = commitMessage.isNotEmpty() && statusViewModel.hasPreviousCommits LaunchedEffect(statusViewModel) { statusViewModel.commitMessageChangesFlow.collect { newCommitMessage -> diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/WelcomePage.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/WelcomePage.kt index 1b41a57..190fc47 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/WelcomePage.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/WelcomePage.kt @@ -26,7 +26,6 @@ import com.jetpackduba.gitnuro.extensions.* import com.jetpackduba.gitnuro.theme.onBackgroundSecondary import com.jetpackduba.gitnuro.theme.textButtonColors import com.jetpackduba.gitnuro.ui.dialogs.AppInfoDialog -import com.jetpackduba.gitnuro.ui.dialogs.CloneDialog import com.jetpackduba.gitnuro.updates.Update import com.jetpackduba.gitnuro.viewmodels.TabViewModel diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/PrimaryButton.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/PrimaryButton.kt index e603051..1d553d4 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/PrimaryButton.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/PrimaryButton.kt @@ -1,6 +1,5 @@ package com.jetpackduba.gitnuro.ui.components -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape @@ -14,7 +13,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.jetpackduba.gitnuro.extensions.backgroundIf import com.jetpackduba.gitnuro.extensions.handMouseClickable -import com.jetpackduba.gitnuro.extensions.handOnHover @Composable @@ -33,7 +31,7 @@ fun PrimaryButton( .clip(RoundedCornerShape(4.dp)) .backgroundIf(enabled, backgroundColor, backgroundDisabled) .run { - if(enabled) { + if (enabled) { handMouseClickable { onClick() } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/PullContextMenu.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/PullContextMenu.kt index c912522..98ce1df 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/PullContextMenu.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/PullContextMenu.kt @@ -1,7 +1,5 @@ package com.jetpackduba.gitnuro.ui.context_menu -import androidx.compose.foundation.ExperimentalFoundationApi - fun pullContextMenuItems( onPullRebase: () -> Unit, onFetchAll: () -> Unit, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/GpgPasswordDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/GpgPasswordDialog.kt index b761454..d0cc30a 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/GpgPasswordDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/GpgPasswordDialog.kt @@ -1,29 +1,7 @@ package com.jetpackduba.gitnuro.ui.dialogs -import androidx.compose.foundation.layout.* -import androidx.compose.material.Icon -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusProperties -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.key.onPreviewKeyEvent -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp +import androidx.compose.runtime.Composable import com.jetpackduba.gitnuro.credentials.CredentialsRequested -import com.jetpackduba.gitnuro.credentials.CredentialsState -import com.jetpackduba.gitnuro.keybindings.KeybindingOption -import com.jetpackduba.gitnuro.keybindings.matchesBinding -import com.jetpackduba.gitnuro.theme.outlinedTextFieldColors -import com.jetpackduba.gitnuro.theme.onBackgroundSecondary -import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField -import com.jetpackduba.gitnuro.ui.components.PrimaryButton @Composable fun GpgPasswordDialog( @@ -31,15 +9,15 @@ fun GpgPasswordDialog( onReject: () -> Unit, onAccept: (password: String) -> Unit ) { - PasswordDialog( - title = "Introduce your GPG key's password", - subtitle = "Your GPG key is protected with a password", - icon = "key.svg", - cancelButtonText = "Do not sign", - isRetry = gpgCredentialsRequested.isRetry, - password = gpgCredentialsRequested.password, - retryMessage = "Invalid password, please try again", - onReject = onReject, - onAccept = onAccept, - ) + PasswordDialog( + title = "Introduce your GPG key's password", + subtitle = "Your GPG key is protected with a password", + icon = "key.svg", + cancelButtonText = "Do not sign", + isRetry = gpgCredentialsRequested.isRetry, + password = gpgCredentialsRequested.password, + retryMessage = "Invalid password, please try again", + onReject = onReject, + onAccept = onAccept, + ) } \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/QuickActionsDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/QuickActionsDialog.kt index 5c485d1..7a55a32 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/QuickActionsDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/QuickActionsDialog.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp import com.jetpackduba.gitnuro.extensions.backgroundIf import com.jetpackduba.gitnuro.extensions.handMouseClickable import com.jetpackduba.gitnuro.keybindings.KeybindingOption -import com.jetpackduba.gitnuro.keybindings.keybindings import com.jetpackduba.gitnuro.keybindings.matchesBinding import com.jetpackduba.gitnuro.theme.backgroundSelected import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/UserPasswordDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/UserPasswordDialog.kt index 8b87470..a75c8d4 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/UserPasswordDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/UserPasswordDialog.kt @@ -1,10 +1,8 @@ package com.jetpackduba.gitnuro.ui.dialogs -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme -import androidx.compose.material.OutlinedTextField import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -21,7 +19,6 @@ import androidx.compose.ui.unit.dp import com.jetpackduba.gitnuro.keybindings.KeybindingOption import com.jetpackduba.gitnuro.keybindings.matchesBinding import com.jetpackduba.gitnuro.theme.onBackgroundSecondary -import com.jetpackduba.gitnuro.theme.outlinedTextFieldColors import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField import com.jetpackduba.gitnuro.ui.components.PrimaryButton diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt index 6c29f4a..1b55e68 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/RebaseInteractiveViewModel.kt @@ -8,7 +8,6 @@ import com.jetpackduba.gitnuro.git.rebase.AbortRebaseUseCase import com.jetpackduba.gitnuro.git.rebase.GetRebaseLinesFullMessageUseCase import com.jetpackduba.gitnuro.git.rebase.ResumeRebaseInteractiveUseCase import com.jetpackduba.gitnuro.git.rebase.StartRebaseInteractiveUseCase -import com.jetpackduba.gitnuro.logging.printLog import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.runBlocking diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt index 94f367e..8bc12af 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/StatusViewModel.kt @@ -194,6 +194,7 @@ class StatusViewModel @Inject constructor( private suspend fun loadHasUncommitedChanges(git: Git) = withContext(Dispatchers.IO) { lastUncommitedChangesState = checkHasUncommitedChangedUseCase(git) } + fun amend(isAmend: Boolean) { _isAmend.value = isAmend diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt index 9eec338..2d4823d 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt @@ -3,7 +3,6 @@ package com.jetpackduba.gitnuro.viewmodels import com.jetpackduba.gitnuro.AppStateManager import com.jetpackduba.gitnuro.ErrorsManager import com.jetpackduba.gitnuro.credentials.CredentialsAccepted -import com.jetpackduba.gitnuro.credentials.CredentialsRequested import com.jetpackduba.gitnuro.credentials.CredentialsState import com.jetpackduba.gitnuro.credentials.CredentialsStateManager import com.jetpackduba.gitnuro.git.* @@ -21,7 +20,8 @@ import com.jetpackduba.gitnuro.ui.SelectedItem import com.jetpackduba.gitnuro.updates.Update import com.jetpackduba.gitnuro.updates.UpdatesRepository import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.errors.CheckoutConflictException import org.eclipse.jgit.blame.BlameResult diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt index 6595ed8..8819ebb 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt @@ -1,7 +1,7 @@ package com.jetpackduba.gitnuro.viewmodels import com.jetpackduba.gitnuro.di.TabScope -import com.jetpackduba.gitnuro.viewmodels.sidepanel.* +import com.jetpackduba.gitnuro.viewmodels.sidepanel.SidePanelViewModel import javax.inject.Inject import javax.inject.Provider diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/BranchesViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/BranchesViewModel.kt index 17abada..eb83480 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/BranchesViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/BranchesViewModel.kt @@ -16,7 +16,6 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.Ref -import javax.inject.Inject private const val TAG = "BranchesViewModel" @@ -40,17 +39,18 @@ class BranchesViewModel @AssistedInject constructor( private val _branches = MutableStateFlow>(listOf()) private val _currentBranch = MutableStateFlow(null) - val branchesState = combine(_branches, _currentBranch, isExpanded, filter) { branches, currentBranch, isExpanded, filter -> - BranchesState( - branches = branches.filter { it.simpleName.lowercaseContains(filter) }, - isExpanded = isExpanded, - currentBranch = currentBranch + val branchesState = + combine(_branches, _currentBranch, isExpanded, filter) { branches, currentBranch, isExpanded, filter -> + BranchesState( + branches = branches.filter { it.simpleName.lowercaseContains(filter) }, + isExpanded = isExpanded, + currentBranch = currentBranch + ) + }.stateIn( + scope = tabScope, + started = SharingStarted.Eagerly, + initialValue = BranchesState(emptyList(), isExpanded.value, null) ) - }.stateIn( - scope = tabScope, - started = SharingStarted.Eagerly, - initialValue = BranchesState(emptyList(), isExpanded.value, null) - ) init { diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/RemotesViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/RemotesViewModel.kt index 5dc7a72..ceaa94a 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/RemotesViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/sidepanel/RemotesViewModel.kt @@ -103,7 +103,7 @@ class RemotesViewModel @AssistedInject constructor( val remotes = this.remotes.value val remoteInfo = remotes.firstOrNull { it.remoteInfo.remoteConfig.name == remoteName } - if(remoteInfo != null) { + if (remoteInfo != null) { val newRemoteInfo = remoteInfo.copy(isExpanded = !remoteClicked.isExpanded) val newRemotesList = remotes.toMutableList() val indexToReplace = newRemotesList.indexOf(remoteInfo) diff --git a/src/main/resources/error.svg b/src/main/resources/error.svg index 5d4e432..6d997de 100644 --- a/src/main/resources/error.svg +++ b/src/main/resources/error.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/src/main/resources/fetch.svg b/src/main/resources/fetch.svg index 562c9c9..f49b10b 100644 --- a/src/main/resources/fetch.svg +++ b/src/main/resources/fetch.svg @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/src/main/resources/key.svg b/src/main/resources/key.svg index d92ef4a..59a71b7 100644 --- a/src/main/resources/key.svg +++ b/src/main/resources/key.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/merge.svg b/src/main/resources/merge.svg index 6792d95..a64ed08 100644 --- a/src/main/resources/merge.svg +++ b/src/main/resources/merge.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/search.svg b/src/main/resources/search.svg index 1465559..18aa74b 100644 --- a/src/main/resources/search.svg +++ b/src/main/resources/search.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/src/main/resources/terminal.svg b/src/main/resources/terminal.svg index 427ca0e..58dcce2 100644 --- a/src/main/resources/terminal.svg +++ b/src/main/resources/terminal.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/visibility.svg b/src/main/resources/visibility.svg index 267ed2f..7609ff2 100644 --- a/src/main/resources/visibility.svg +++ b/src/main/resources/visibility.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/src/main/resources/visibility_off.svg b/src/main/resources/visibility_off.svg index 9952b8c..2f0e9e9 100644 --- a/src/main/resources/visibility_off.svg +++ b/src/main/resources/visibility_off.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file 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 aeead36..0f0646d 100644 --- a/src/test/kotlin/com/jetpackduba/gitnuro/app/git/BeforeRepoAllTestsExtension.kt +++ b/src/test/kotlin/com/jetpackduba/gitnuro/app/git/BeforeRepoAllTestsExtension.kt @@ -1,6 +1,9 @@ package com.jetpackduba.gitnuro.app.git -import com.jetpackduba.gitnuro.credentials.* +import com.jetpackduba.gitnuro.credentials.CredentialsStateManager +import com.jetpackduba.gitnuro.credentials.GRemoteSession +import com.jetpackduba.gitnuro.credentials.GSessionManager +import com.jetpackduba.gitnuro.credentials.HttpCredentialsProvider import com.jetpackduba.gitnuro.di.factories.HttpCredentialsFactory import com.jetpackduba.gitnuro.git.remote_operations.CloneRepositoryUseCase import com.jetpackduba.gitnuro.git.remote_operations.HandleTransportUseCase