From 87399eccf4b08ff234abd36a221ad7e223e5da09 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Sat, 14 Sep 2024 01:19:13 +0200 Subject: [PATCH] Added set the tracking branch when pushing a new branch --- .../git/branches/SetTrackingBranchUseCase.kt | 16 +++++++---- .../HandleTransportUseCase.kt | 6 ++-- .../remote_operations/PushBranchUseCase.kt | 28 +++++++++++++++---- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/branches/SetTrackingBranchUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/branches/SetTrackingBranchUseCase.kt index b5a5fdb..07ad755 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/branches/SetTrackingBranchUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/branches/SetTrackingBranchUseCase.kt @@ -9,19 +9,23 @@ import javax.inject.Inject class SetTrackingBranchUseCase @Inject constructor() { operator fun invoke(git: Git, ref: Ref, remoteName: String?, remoteBranch: Ref?) { + invoke(git, ref.simpleName, remoteName, remoteBranch?.simpleName) + } + + operator fun invoke(git: Git, refName: String, remoteName: String?, remoteBranchName: String?) { val repository: Repository = git.repository val config: StoredConfig = repository.config - if (remoteName == null || remoteBranch == null) { - config.unset("branch", ref.simpleName, "remote") - config.unset("branch", ref.simpleName, "merge") + if (remoteName == null || remoteBranchName == null) { + config.unset("branch", refName, "remote") + config.unset("branch", refName, "merge") } else { - config.setString("branch", ref.simpleName, "remote", remoteName) + config.setString("branch", refName, "remote", remoteName) config.setString( "branch", - ref.simpleName, + refName, "merge", - BranchesConstants.UPSTREAM_BRANCH_CONFIG_PREFIX + remoteBranch.simpleName + BranchesConstants.UPSTREAM_BRANCH_CONFIG_PREFIX + remoteBranchName ) } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/HandleTransportUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/HandleTransportUseCase.kt index c5da668..8fec560 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/HandleTransportUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/HandleTransportUseCase.kt @@ -12,7 +12,7 @@ class HandleTransportUseCase @Inject constructor( private val sessionManager: GSessionManager, private val httpCredentialsProvider: HttpCredentialsFactory, ) { - suspend operator fun invoke(git: Git?, block: suspend CredentialsHandler.() -> Unit) { + suspend operator fun invoke(git: Git?, block: suspend CredentialsHandler.() -> R): R { var cache: CredentialsCache? = null val credentialsHandler = object : CredentialsHandler { @@ -37,8 +37,10 @@ class HandleTransportUseCase @Inject constructor( } } - credentialsHandler.block() + val result = credentialsHandler.block() cache?.cacheCredentialsIfNeeded() + + return result } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/PushBranchUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/PushBranchUseCase.kt index 59344cb..a290b47 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/PushBranchUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/remote_operations/PushBranchUseCase.kt @@ -1,6 +1,7 @@ package com.jetpackduba.gitnuro.git.remote_operations import com.jetpackduba.gitnuro.git.branches.GetTrackingBranchUseCase +import com.jetpackduba.gitnuro.git.branches.SetTrackingBranchUseCase import com.jetpackduba.gitnuro.git.branches.TrackingBranch import com.jetpackduba.gitnuro.git.isRejected import com.jetpackduba.gitnuro.git.statusMessage @@ -14,24 +15,37 @@ import org.eclipse.jgit.lib.ProgressMonitor import org.eclipse.jgit.transport.RefLeaseSpec import org.eclipse.jgit.transport.RefSpec import javax.inject.Inject +import kotlin.math.max class PushBranchUseCase @Inject constructor( private val handleTransportUseCase: HandleTransportUseCase, private val getTrackingBranchUseCase: GetTrackingBranchUseCase, + private val setTrackingBranchUseCase: SetTrackingBranchUseCase, private val appSettingsRepository: AppSettingsRepository, ) { - // TODO This use case should also set the tracking branch to the new remote branch suspend operator fun invoke(git: Git, force: Boolean, pushTags: Boolean) = withContext(Dispatchers.IO) { - val currentBranch = git.repository.fullBranch - val tracking = getTrackingBranchUseCase(git, git.repository.branch) + val currentBranch = git.repository.branch + val fullCurrentBranch = git.repository.fullBranch + + val tracking = getTrackingBranchUseCase(git, currentBranch) val refSpecStr = if (tracking != null) { - "$currentBranch:${Constants.R_HEADS}${tracking.branch}" + "$fullCurrentBranch:${Constants.R_HEADS}${tracking.branch}" } else { - currentBranch + fullCurrentBranch } - handleTransportUseCase(git) { + + val remoteRefUpdate = handleTransportUseCase(git) { push(git, tracking, refSpecStr, force, pushTags) } + + + if (tracking == null && remoteRefUpdate != null) { + // [remoteRefUpdate.trackingRefUpdate.localName] should have the following format: refs/remotes/REMOTE_NAME/BRANCH_NAME + val remoteBranchPathSplit = remoteRefUpdate.trackingRefUpdate.localName.split("/") + val remoteName = remoteBranchPathSplit.getOrNull(2) + val remoteBranchName = remoteBranchPathSplit.takeLast(max(0, remoteBranchPathSplit.count() - 3)).joinToString("/") + setTrackingBranchUseCase(git, currentBranch, remoteName, remoteBranchName) + } } private suspend fun CredentialsHandler.push( @@ -117,5 +131,7 @@ class PushBranchUseCase @Inject constructor( throw Exception(error.toString()) } + + return@withContext pushResult.firstOrNull()?.remoteUpdates?.firstOrNull() } } \ No newline at end of file