[git] Toggle auto-fetch with explicit checkbox (IJPL-75190)

(cherry picked from commit 019302d7e51a754214b0f0232c37dea9327935ef)

IJ-MR-192060

GitOrigin-RevId: 4fa1c77b5add6b8afa2bc51be91bb8cca11c96cf
This commit is contained in:
Ilia.Shulgin
2026-02-23 20:21:12 +00:00
committed by intellij-monorepo-bot
parent c0c01ac7e4
commit 6f7e464f8f
5 changed files with 38 additions and 37 deletions
+2 -2
View File
@@ -132,9 +132,7 @@ e:git4idea.config.GitIncomingRemoteCheckStrategy
- sf:FETCH:git4idea.config.GitIncomingRemoteCheckStrategy
- sf:LS_REMOTE:git4idea.config.GitIncomingRemoteCheckStrategy
- sf:NONE:git4idea.config.GitIncomingRemoteCheckStrategy
- f:getDescription():java.lang.String
- s:getEntries():kotlin.enums.EnumEntries
- f:getText():java.lang.String
- s:valueOf(java.lang.String):git4idea.config.GitIncomingRemoteCheckStrategy
- s:values():git4idea.config.GitIncomingRemoteCheckStrategy[]
e:git4idea.config.GitSaveChangesPolicy
@@ -245,8 +243,10 @@ f:git4idea.config.GitVcsSettings
- noStateLoaded():V
- saveCommitAuthor(java.lang.String):V
- setAddSuffixToCherryPicks(Z):V
- setAutoFetch(Z):V
- setAutoUpdateIfPushRejected(Z):V
- setBranchGroupingSettings(com.intellij.dvcs.branch.GroupingKey,Z):V
- setCheckRemote(Z):V
- setCommitRenamesSeparately(Z):V
- setFetchTagsMode(git4idea.fetch.GitFetchTagsMode):V
- setFilterByActionInPopup(Z):V
@@ -797,12 +797,8 @@ settings.synchronize.branch.protection.rules.description=GitHub rules are added
settings.credential.helper=Use credential helper
settings.filter.update.info=Filter "Update Project" information by paths:
settings.clean.working.tree=Clean working tree using:
settings.git.incoming.change.strategy.text=Check for incoming changes using:
settings.git.incoming.change.strategy.text.fetch=fetch
settings.git.incoming.change.strategy.description.fetch=Fetching all remotes
settings.git.incoming.change.strategy.text.lsremote=ls-remote
settings.git.incoming.change.strategy.description.lsremote=Do not fetch remotes
settings.git.incoming.change.strategy.text.none=Do not check
settings.git.auto.fetch.text=Fetch remote changes automatically
settings.git.check.remote.text=Check remote for incoming changes
settings.git.incoming.change.strategy.condition.comment=Requires ''{0}'' option to be enabled in Advanced Settings
settings.git.update.method.rebase.description=&Rebase the current branch on top of incoming changes
settings.git.update.method.rebase=Rebase
@@ -1,23 +1,11 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package git4idea.config
import git4idea.i18n.GitBundle
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.PropertyKey
/**
* Defines operation to be used to check incoming commits on remote.
*/
enum class GitIncomingRemoteCheckStrategy(
textKey: @Nls @PropertyKey(resourceBundle = GitBundle.BUNDLE) String,
descriptionKey: @Nls @PropertyKey(resourceBundle = GitBundle.BUNDLE) String? = null,
) {
FETCH("settings.git.incoming.change.strategy.text.fetch",
"settings.git.incoming.change.strategy.description.fetch"),
LS_REMOTE("settings.git.incoming.change.strategy.text.lsremote",
"settings.git.incoming.change.strategy.description.lsremote"),
NONE("settings.git.incoming.change.strategy.text.none");
val text: @Nls String = GitBundle.message(textKey)
val description: @Nls String? = descriptionKey?.let(GitBundle::message)
enum class GitIncomingRemoteCheckStrategy {
FETCH,
LS_REMOTE,
NONE;
}
@@ -267,6 +267,14 @@ public final class GitVcsSettings extends SimplePersistentStateComponent<GitVcsO
return getState().getIncomingCommitsCheckStrategy();
}
public void setAutoFetch(boolean value) {
setIncomingCommitsCheckStrategy(value ? GitIncomingRemoteCheckStrategy.FETCH : GitIncomingRemoteCheckStrategy.LS_REMOTE);
}
public void setCheckRemote(boolean value) {
setIncomingCommitsCheckStrategy(value ? GitIncomingRemoteCheckStrategy.LS_REMOTE : GitIncomingRemoteCheckStrategy.NONE);
}
public void setIncomingCommitsCheckStrategy(@Nullable GitIncomingRemoteCheckStrategy strategy) {
GitIncomingRemoteCheckStrategy strategyToSet = strategy != null ? strategy : GitIncomingRemoteCheckStrategy.LS_REMOTE;
getState().setIncomingCommitsCheckStrategy(strategyToSet);
@@ -51,6 +51,7 @@ import com.intellij.ui.dsl.listCellRenderer.listCellRenderer
import com.intellij.ui.layout.AdvancedSettingsPredicate
import com.intellij.ui.layout.ComponentPredicate
import com.intellij.ui.layout.ValidationInfoBuilder
import com.intellij.ui.layout.and
import com.intellij.ui.layout.not
import com.intellij.util.Function
import com.intellij.util.execution.ParametersListUtil
@@ -66,6 +67,7 @@ import git4idea.cherrypick.settingsMessage
import git4idea.config.GitExecutableSelectorPanel.Companion.createGitExecutableSelectorRow
import git4idea.config.gpg.GpgSignConfigurableRow.Companion.createGpgSignRow
import git4idea.fetch.GitFetchTagsMode
import git4idea.i18n.GitBundle
import git4idea.i18n.GitBundle.message
import git4idea.index.enableStagingArea
import git4idea.repo.GitRepositoryManager
@@ -84,7 +86,6 @@ private fun projectSettings(project: Project) = GitVcsSettings.getInstance(proje
private val applicationSettings get() = GitVcsApplicationSettings.getInstance()
private val gitOptionGroupName get() = message("settings.git.option.group")
// @formatter:off
private fun cdSyncBranches(project: Project) = CheckboxDescriptor(DvcsBundle.message("sync.setting"), { projectSettings(project).syncSetting == DvcsSyncSettings.Value.SYNC }, { projectSettings(project).syncSetting = if (it) DvcsSyncSettings.Value.SYNC else DvcsSyncSettings.Value.DONT_SYNC }, groupName = gitOptionGroupName)
private fun cdAddCherryPickSuffix(project: Project) = CheckboxDescriptor(message("settings.add.suffix"), { projectSettings(project).shouldAddSuffixToCherryPicksOfPublishedCommits() }, { projectSettings(project).setAddSuffixToCherryPicks(it) }, groupName = gitOptionGroupName)
private fun cdWarnAboutCrlf(project: Project) = CheckboxDescriptor(message("settings.crlf"), { projectSettings(project).warnAboutCrlf() }, { projectSettings(project).setWarnAboutCrlf(it) }, groupName = gitOptionGroupName)
@@ -101,6 +102,20 @@ private val cdCombineStashesAndShelves get() =
private fun cdExcludeIgnored(project: Project) = CheckboxDescriptor(VcsBundle.message("ignored.file.ignored.to.excluded.label"), { VcsConfiguration.getInstance(project).MARK_IGNORED_AS_EXCLUDED }, { VcsConfiguration.getInstance(project).MARK_IGNORED_AS_EXCLUDED = it }, groupName = gitOptionGroupName)
// @formatter:on
private fun cdAutoFetch(project: Project) = CheckboxDescriptor(
message("settings.git.auto.fetch.text"),
{ projectSettings(project).incomingCommitsCheckStrategy == GitIncomingRemoteCheckStrategy.FETCH },
projectSettings(project)::setAutoFetch,
groupName = gitOptionGroupName,
)
private fun cdCheckRemoteForIncoming(project: Project) = CheckboxDescriptor(
message("settings.git.check.remote.text"),
{ projectSettings(project).incomingCommitsCheckStrategy != GitIncomingRemoteCheckStrategy.NONE },
projectSettings(project)::setCheckRemote,
groupName = gitOptionGroupName,
)
internal fun gitOptionDescriptors(project: Project): List<OptionDescription> {
val list = mutableListOf(
cdAutoUpdateOnPush(project),
@@ -110,6 +125,7 @@ internal fun gitOptionDescriptors(project: Project): List<OptionDescription> {
cdWarnAboutBadFileNames(project),
cdEnableStagingArea,
cdExcludeIgnored(project),
cdAutoFetch(project),
)
val manager = GitRepositoryManager.getInstance(project)
if (manager.moreThanOneRoot()) {
@@ -134,22 +150,15 @@ internal class GitVcsPanel(private val project: Project) :
private val projectSettings get() = GitVcsSettings.getInstance(project)
private fun Panel.checkIncomingChangesRows() {
val predicate = AdvancedSettingsPredicate("git.update.incoming.outgoing.info", disposable!!)
row(message("settings.git.incoming.change.strategy.text")) {
comboBox(EnumComboBoxModel(GitIncomingRemoteCheckStrategy::class.java), listCellRenderer("") {
text(value.text)
value.description?.let { description ->
text(description) {
foreground = greyForeground
}
}
}).bindItem(projectSettings::getIncomingCommitsCheckStrategy, projectSettings::setIncomingCommitsCheckStrategy)
}.enabledIf(predicate)
val advancedSettingsPredicate = AdvancedSettingsPredicate("git.update.incoming.outgoing.info", disposable!!)
lateinit var autoFetchCheckBox: Cell<JBCheckBox>
row { autoFetchCheckBox = checkBox(cdAutoFetch(project)) }.enabledIf(advancedSettingsPredicate)
row { checkBox(cdCheckRemoteForIncoming(project)) }.enabledIf(autoFetchCheckBox.selected.not().and(advancedSettingsPredicate))
indent {
row {
comment(
message("settings.git.incoming.change.strategy.condition.comment", message("advanced.setting.git.update.incoming.outgoing.info")))
.visibleIf(predicate.not())
.visibleIf(advancedSettingsPredicate.not())
.applyToComponent {
putClientProperty(DslComponentProperty.VERTICAL_COMPONENT_GAP, VerticalComponentGap(top = false))
}