Added set the tracking branch when pushing a new branch
This commit is contained in:
parent
c92ccf1f6d
commit
87399eccf4
@ -9,19 +9,23 @@ import javax.inject.Inject
|
|||||||
|
|
||||||
class SetTrackingBranchUseCase @Inject constructor() {
|
class SetTrackingBranchUseCase @Inject constructor() {
|
||||||
operator fun invoke(git: Git, ref: Ref, remoteName: String?, remoteBranch: Ref?) {
|
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 repository: Repository = git.repository
|
||||||
val config: StoredConfig = repository.config
|
val config: StoredConfig = repository.config
|
||||||
|
|
||||||
if (remoteName == null || remoteBranch == null) {
|
if (remoteName == null || remoteBranchName == null) {
|
||||||
config.unset("branch", ref.simpleName, "remote")
|
config.unset("branch", refName, "remote")
|
||||||
config.unset("branch", ref.simpleName, "merge")
|
config.unset("branch", refName, "merge")
|
||||||
} else {
|
} else {
|
||||||
config.setString("branch", ref.simpleName, "remote", remoteName)
|
config.setString("branch", refName, "remote", remoteName)
|
||||||
config.setString(
|
config.setString(
|
||||||
"branch",
|
"branch",
|
||||||
ref.simpleName,
|
refName,
|
||||||
"merge",
|
"merge",
|
||||||
BranchesConstants.UPSTREAM_BRANCH_CONFIG_PREFIX + remoteBranch.simpleName
|
BranchesConstants.UPSTREAM_BRANCH_CONFIG_PREFIX + remoteBranchName
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ class HandleTransportUseCase @Inject constructor(
|
|||||||
private val sessionManager: GSessionManager,
|
private val sessionManager: GSessionManager,
|
||||||
private val httpCredentialsProvider: HttpCredentialsFactory,
|
private val httpCredentialsProvider: HttpCredentialsFactory,
|
||||||
) {
|
) {
|
||||||
suspend operator fun invoke(git: Git?, block: suspend CredentialsHandler.() -> Unit) {
|
suspend operator fun <R> invoke(git: Git?, block: suspend CredentialsHandler.() -> R): R {
|
||||||
var cache: CredentialsCache? = null
|
var cache: CredentialsCache? = null
|
||||||
|
|
||||||
val credentialsHandler = object : CredentialsHandler {
|
val credentialsHandler = object : CredentialsHandler {
|
||||||
@ -37,8 +37,10 @@ class HandleTransportUseCase @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
credentialsHandler.block()
|
val result = credentialsHandler.block()
|
||||||
cache?.cacheCredentialsIfNeeded()
|
cache?.cacheCredentialsIfNeeded()
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.jetpackduba.gitnuro.git.remote_operations
|
package com.jetpackduba.gitnuro.git.remote_operations
|
||||||
|
|
||||||
import com.jetpackduba.gitnuro.git.branches.GetTrackingBranchUseCase
|
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.branches.TrackingBranch
|
||||||
import com.jetpackduba.gitnuro.git.isRejected
|
import com.jetpackduba.gitnuro.git.isRejected
|
||||||
import com.jetpackduba.gitnuro.git.statusMessage
|
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.RefLeaseSpec
|
||||||
import org.eclipse.jgit.transport.RefSpec
|
import org.eclipse.jgit.transport.RefSpec
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.math.max
|
||||||
|
|
||||||
class PushBranchUseCase @Inject constructor(
|
class PushBranchUseCase @Inject constructor(
|
||||||
private val handleTransportUseCase: HandleTransportUseCase,
|
private val handleTransportUseCase: HandleTransportUseCase,
|
||||||
private val getTrackingBranchUseCase: GetTrackingBranchUseCase,
|
private val getTrackingBranchUseCase: GetTrackingBranchUseCase,
|
||||||
|
private val setTrackingBranchUseCase: SetTrackingBranchUseCase,
|
||||||
private val appSettingsRepository: AppSettingsRepository,
|
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) {
|
suspend operator fun invoke(git: Git, force: Boolean, pushTags: Boolean) = withContext(Dispatchers.IO) {
|
||||||
val currentBranch = git.repository.fullBranch
|
val currentBranch = git.repository.branch
|
||||||
val tracking = getTrackingBranchUseCase(git, git.repository.branch)
|
val fullCurrentBranch = git.repository.fullBranch
|
||||||
|
|
||||||
|
val tracking = getTrackingBranchUseCase(git, currentBranch)
|
||||||
val refSpecStr = if (tracking != null) {
|
val refSpecStr = if (tracking != null) {
|
||||||
"$currentBranch:${Constants.R_HEADS}${tracking.branch}"
|
"$fullCurrentBranch:${Constants.R_HEADS}${tracking.branch}"
|
||||||
} else {
|
} else {
|
||||||
currentBranch
|
fullCurrentBranch
|
||||||
}
|
}
|
||||||
handleTransportUseCase(git) {
|
|
||||||
|
val remoteRefUpdate = handleTransportUseCase(git) {
|
||||||
push(git, tracking, refSpecStr, force, pushTags)
|
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(
|
private suspend fun CredentialsHandler.push(
|
||||||
@ -117,5 +131,7 @@ class PushBranchUseCase @Inject constructor(
|
|||||||
|
|
||||||
throw Exception(error.toString())
|
throw Exception(error.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return@withContext pushResult.firstOrNull()?.remoteUpdates?.firstOrNull()
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user