Skip to content

Commit fe658b4

Browse files
committed
[LFS] Started adding push support for LFS objects via HTTP
1 parent 0ea5b5d commit fe658b4

15 files changed

+552
-30
lines changed

build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ repositories {
4848

4949
dependencies {
5050
val jgit = "7.1.0.202411261347-r"
51+
val ktorVersion = "3.0.3"
5152

5253
when {
5354
currentOs() == OS.LINUX && isLinuxAarch64 -> implementation(compose.desktop.linux_arm64)
@@ -60,6 +61,7 @@ dependencies {
6061
implementation(compose("org.jetbrains.compose.components:components-animatedimage"))
6162
implementation("org.eclipse.jgit:org.eclipse.jgit:$jgit")
6263
implementation("org.eclipse.jgit:org.eclipse.jgit.gpg.bc:$jgit")
64+
implementation("org.eclipse.jgit:org.eclipse.jgit.lfs:$jgit")
6365
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
6466
implementation("com.google.dagger:dagger:2.48.1")
6567
ksp("com.google.dagger:dagger-compiler:2.48.1")
@@ -75,6 +77,11 @@ dependencies {
7577
implementation("org.slf4j:slf4j-reload4j:2.0.7")
7678
implementation("androidx.datastore:datastore-preferences-core:1.0.0")
7779
implementation("org.bouncycastle:bcpg-jdk18on:1.78.1")
80+
implementation("io.ktor:ktor-client:$ktorVersion")
81+
implementation("io.ktor:ktor-client-cio:$ktorVersion")
82+
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
83+
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
84+
implementation("io.ktor:ktor-client-logging:$ktorVersion")
7885
}
7986

8087
fun currentOs(): OS {

src/main/kotlin/com/jetpackduba/gitnuro/App.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.jetpackduba.gitnuro.extensions.toWindowPlacement
2828
import com.jetpackduba.gitnuro.git.AppGpgSigner
2929
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
3030
import com.jetpackduba.gitnuro.keybindings.matchesBinding
31+
import com.jetpackduba.gitnuro.lfs.GLfsFactory
3132
import com.jetpackduba.gitnuro.logging.printError
3233
import com.jetpackduba.gitnuro.managers.AppStateManager
3334
import com.jetpackduba.gitnuro.managers.TempFilesManager
@@ -46,10 +47,12 @@ import com.jetpackduba.gitnuro.ui.components.TabInformation
4647
import com.jetpackduba.gitnuro.ui.context_menu.AppPopupMenu
4748
import com.jetpackduba.gitnuro.ui.dialogs.settings.ProxyType
4849
import kotlinx.coroutines.launch
50+
import org.eclipse.jgit.lfs.BuiltinLFS
4951
import org.eclipse.jgit.lib.GpgConfig
5052
import org.eclipse.jgit.lib.Signer
5153
import org.eclipse.jgit.lib.SignerFactory
5254
import org.eclipse.jgit.lib.Signers
55+
import org.eclipse.jgit.util.LfsFactory
5356
import java.io.File
5457
import java.io.FileOutputStream
5558
import java.net.Authenticator
@@ -85,6 +88,9 @@ class App {
8588
@Inject
8689
lateinit var signer: AppGpgSigner
8790

91+
@Inject
92+
lateinit var gLfsFactory: GLfsFactory
93+
8894
init {
8995
appComponent.inject(this)
9096
}
@@ -115,6 +121,7 @@ class App {
115121
}
116122

117123
tabsManager.loadPersistedTabs()
124+
gLfsFactory.register()
118125

119126
if (dirToOpen != null)
120127
addDirTab(dirToOpen)

src/main/kotlin/com/jetpackduba/gitnuro/credentials/CredentialsStateManager.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,28 @@ class CredentialsStateManager @Inject constructor() {
1818
fun updateState(newCredentialsState: CredentialsState) {
1919
_credentialsState.value = newCredentialsState
2020
}
21+
22+
fun requestCredentials(credentialsRequest: CredentialsRequest) {
23+
updateState(credentialsRequest)
24+
}
2125
}
2226

2327
sealed interface CredentialsState {
24-
object None : CredentialsState
25-
object CredentialsDenied : CredentialsState
28+
data object None : CredentialsState
29+
data object CredentialsDenied : CredentialsState
2630
}
2731

2832
sealed interface CredentialsAccepted : CredentialsState {
2933
data class SshCredentialsAccepted(val password: String) : CredentialsAccepted
3034
data class GpgCredentialsAccepted(val password: String) : CredentialsAccepted
3135
data class HttpCredentialsAccepted(val user: String, val password: String) : CredentialsAccepted
36+
data class LfsCredentialsAccepted(val user: String, val password: String) : CredentialsAccepted
3237
}
3338

34-
sealed interface CredentialsRequested : CredentialsState {
35-
object SshCredentialsRequested : CredentialsRequested
36-
data class GpgCredentialsRequested(val isRetry: Boolean, val password: String) : CredentialsRequested
37-
object HttpCredentialsRequested : CredentialsRequested
39+
sealed interface CredentialsRequest : CredentialsState {
40+
data object SshCredentialsRequest : CredentialsRequest
41+
data class GpgCredentialsRequest(val isRetry: Boolean, val password: String) : CredentialsRequest
42+
data object HttpCredentialsRequest : CredentialsRequest
43+
data object LfsCredentialsRequest : CredentialsRequest
3844
}
3945

src/main/kotlin/com/jetpackduba/gitnuro/credentials/GpgCredentialsProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class GpgCredentialsProvider @Inject constructor(
4848

4949
// Request passphrase
5050
credentialsStateManager.updateState(
51-
CredentialsRequested.GpgCredentialsRequested(
51+
CredentialsRequest.GpgCredentialsRequest(
5252
isRetry = isRetry,
5353
// Use previously set credentials for cases where this method is invoked again (like when the passphrase is not correct)
5454
password = credentialsSet?.second ?: ""
@@ -57,7 +57,7 @@ class GpgCredentialsProvider @Inject constructor(
5757

5858
var credentials = credentialsStateManager.currentCredentialsState
5959

60-
while (credentials is CredentialsRequested.GpgCredentialsRequested) {
60+
while (credentials is CredentialsRequest.GpgCredentialsRequest) {
6161
credentials = credentialsStateManager.currentCredentialsState
6262
}
6363

src/main/kotlin/com/jetpackduba/gitnuro/credentials/HttpCredentialsProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ class HttpCredentialsProvider @AssistedInject constructor(
157157
}
158158

159159
private fun askForCredentials(): CredentialsState {
160-
credentialsStateManager.updateState(CredentialsRequested.HttpCredentialsRequested)
160+
credentialsStateManager.updateState(CredentialsRequest.HttpCredentialsRequest)
161161
var credentials = credentialsStateManager.currentCredentialsState
162-
while (credentials is CredentialsRequested) {
162+
while (credentials is CredentialsRequest) {
163163
credentials = credentialsStateManager.currentCredentialsState
164164
}
165165

src/main/kotlin/com/jetpackduba/gitnuro/credentials/SshRemoteSession.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.jetpackduba.gitnuro.credentials
22

33
import Session
4-
import com.jetpackduba.gitnuro.exceptions.GitnuroException
54
import com.jetpackduba.gitnuro.exceptions.SshException
65
import com.jetpackduba.gitnuro.extensions.throwIfSshMessage
76
import org.eclipse.jgit.transport.RemoteSession
@@ -45,10 +44,10 @@ class SshRemoteSession @Inject constructor(
4544
var result = session.publicKeyAuth("")
4645

4746
if (result == 2) {//AuthStatus.DENIED) {
48-
credentialsStateManager.updateState(CredentialsRequested.SshCredentialsRequested)
47+
credentialsStateManager.updateState(CredentialsRequest.SshCredentialsRequest)
4948

5049
var credentials = credentialsStateManager.currentCredentialsState
51-
while (credentials is CredentialsRequested) {
50+
while (credentials is CredentialsRequest) {
5251
credentials = credentialsStateManager.currentCredentialsState
5352
}
5453

src/main/kotlin/com/jetpackduba/gitnuro/di/modules/NetworkModule.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package com.jetpackduba.gitnuro.di.modules
22

33
import com.jetpackduba.gitnuro.updates.UpdatesService
44
import dagger.Provides
5+
import io.ktor.client.*
6+
import io.ktor.client.engine.cio.*
7+
import io.ktor.client.plugins.logging.*
58
import retrofit2.Retrofit
69
import retrofit2.converter.scalars.ScalarsConverterFactory
10+
import java.security.cert.X509Certificate
711
import javax.inject.Inject
12+
import javax.net.ssl.X509TrustManager
813

914
@dagger.Module
1015
class NetworkModule {
@@ -16,4 +21,27 @@ class NetworkModule {
1621
.build()
1722
.create(UpdatesService::class.java)
1823
}
24+
25+
@Provides
26+
fun provideKtorHttpClient(): HttpClient {
27+
val httpClient = HttpClient(CIO) {
28+
install(Logging) {
29+
logger = Logger.DEFAULT
30+
level = LogLevel.ALL
31+
}
32+
engine {
33+
https {
34+
trustManager = object : X509TrustManager {
35+
override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) {}
36+
37+
override fun checkServerTrusted(p0: Array<out X509Certificate>?, p1: String?) {}
38+
39+
override fun getAcceptedIssuers(): Array<X509Certificate>? = null
40+
}
41+
}
42+
}
43+
}
44+
45+
return httpClient
46+
}
1947
}

0 commit comments

Comments
 (0)