[git] IJPL-171799 Allow setting upstream when changing remote only

(cherry picked from commit 254d0905374904611564cbb154007885441fb605)

IJ-MR-150510

GitOrigin-RevId: a7ba139ac6095ec83bd80fe96e7b89d66a30fe12
This commit is contained in:
Ilia.Shulgin
2024-11-19 16:07:01 +01:00
committed by intellij-monorepo-bot
parent 45aeba9f76
commit ffbe2f59c3

View File

@@ -117,11 +117,11 @@ public class GitPushTargetPanel extends PushTargetPanel<GitPushTarget> {
// "Set upstream" checkbox isn't shown if there is no existing tracking branch
defaultTarget.getTargetType() == GitPushTargetType.TRACKING_BRANCH && !defaultTarget.isNewBranchCreated()
) {
myUpstreamCheckbox = new SetUpstreamCheckbox(defaultTarget.getBranch().getNameForRemoteOperations());
myUpstreamCheckbox = new SetUpstreamCheckbox(defaultTarget.getBranch());
myTargetEditor.addDocumentListener(new DocumentListener() {
@Override
public void documentChanged(@NotNull DocumentEvent event) {
myUpstreamCheckbox.setVisible(myTargetEditor.getText());
myUpstreamCheckbox.setVisible(myTargetEditor.getText(), myRemoteRenderer.getText());
}
});
add(myUpstreamCheckbox, BorderLayout.EAST);
@@ -172,7 +172,7 @@ public class GitPushTargetPanel extends PushTargetPanel<GitPushTarget> {
myRemoteRenderer.updateLinkText(noRemotes ? GitBundle.message("push.dialog.target.panel.define.remote") : initialRemote);
if (myUpstreamCheckbox != null) {
myUpstreamCheckbox.setVisible(initialBranch);
myUpstreamCheckbox.setVisible(initialBranch, initialRemote);
}
myTargetEditor.setVisible(!noRemotes);
@@ -309,10 +309,11 @@ public class GitPushTargetPanel extends PushTargetPanel<GitPushTarget> {
myTargetRenderer.setSelected(isSelected);
myTargetRenderer.setTransparent(!isActive);
myTargetRenderer.render(renderer);
GitRemoteBranch targetBranch = (target != null) ? target.getBranch() : null;
boolean newUpstream = myUpstreamCheckbox != null &&
target != null &&
targetBranch != null &&
myUpstreamCheckbox.isSelected() &&
!myUpstreamCheckbox.isDefaultUpstream(target.getBranch().getNameForRemoteOperations());
!myUpstreamCheckbox.isDefaultUpstream(targetBranch.getNameForRemoteOperations(), targetBranch.getRemote().getName());
if (newRemoteBranch || newUpstream) {
renderer.setIconOnTheRight(true);
}
@@ -342,7 +343,7 @@ public class GitPushTargetPanel extends PushTargetPanel<GitPushTarget> {
// Checkbox should be explicitly enabled and disabled when toggling editing, as click
// to start editing can change checkbox state
// See BasicTreeUi#startEditing for details
myUpstreamCheckbox.setVisible(myTargetEditor.getText());
myUpstreamCheckbox.setVisible(myTargetEditor.getText(), myRemoteRenderer.getText());
myUpstreamCheckbox.setEnabled(true);
}
}
@@ -530,24 +531,25 @@ public class GitPushTargetPanel extends PushTargetPanel<GitPushTarget> {
}
private static class SetUpstreamCheckbox extends JBCheckBox {
private final String upstreamBranchName;
private final GitRemoteBranch defaultTarget;
SetUpstreamCheckbox(String upstreamBranchName) {
SetUpstreamCheckbox(GitRemoteBranch defaultTarget) {
super(GitBundle.message("push.dialog.target.panel.upstream.checkbox"), false);
this.upstreamBranchName = upstreamBranchName;
this.defaultTarget = defaultTarget;
setBorder(JBUI.Borders.empty(0, 5, 0, 10));
setOpaque(false);
setFocusable(false);
}
public void setVisible(String targetName) {
public void setVisible(String targetName, String remoteName) {
boolean valid = GitRefNameValidator.getInstance().checkInput(targetName);
setVisible(valid && !isDefaultUpstream(targetName));
setVisible(valid && !isDefaultUpstream(targetName, remoteName));
}
public boolean isDefaultUpstream(String targetName) {
return upstreamBranchName.equals(targetName);
public boolean isDefaultUpstream(String targetName, String remoteName) {
return defaultTarget.getNameForRemoteOperations().equals(targetName) &&
defaultTarget.getRemote().getName().equals(remoteName);
}
}