diff --git a/gradle.properties b/gradle.properties index 4cd03dfd..465f4c75 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ ideaVersion=IC-15.0.5 ijPluginRepoChannel= downloadIdeaSources=false -version=1.2.4-142 +version=1.2.5-142 javaVersion=1.6 diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritSettings.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritSettings.java index 49dba82e..30eaaa6b 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritSettings.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritSettings.java @@ -27,15 +27,12 @@ import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.ui.Messages; import com.urswolfer.gerrit.client.rest.GerritAuthData; import com.urswolfer.intellij.plugin.gerrit.ui.ShowProjectColumn; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.concurrent.atomic.AtomicInteger; - /** * Parts based on org.jetbrains.plugins.github.GithubSettings * @@ -80,7 +77,6 @@ public class GerritSettings implements PersistentStateComponent, Gerrit private String cloneBaseUrl = ""; private Optional preloadedPassword; - private AtomicInteger passwordDialogShowLimit = new AtomicInteger(3); private Logger log; @@ -163,33 +159,19 @@ public String getPassword() { throw new IllegalStateException("Need to call #preloadPassword when password is required in background thread"); } } else { - if (!preloadPassword()) { - return ""; - } + preloadPassword(); } return preloadedPassword.or(""); } - public boolean preloadPassword() { + public void preloadPassword() { String password = null; try { password = PasswordSafe.getInstance().getPassword(null, GerritSettings.class, GERRIT_SETTINGS_PASSWORD_KEY); } catch (PasswordSafeException e) { log.info("Couldn't get password for key [" + GERRIT_SETTINGS_PASSWORD_KEY + "]", e); } - if (Strings.isNullOrEmpty(password) && !Strings.isNullOrEmpty(getLogin())) { - if (passwordDialogShowLimit.decrementAndGet() <= 0) { - return false; - } - password = Messages.showPasswordDialog( - String.format("Password for accessing Gerrit required (Login: %s, URL: %s).", getLogin(), getHost()), - "Gerrit Password"); - if (password == null) { - return false; - } - } preloadedPassword = Optional.fromNullable(password); - return true; } @Override diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtensionPanel.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtensionPanel.java index 98194822..5f71686d 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtensionPanel.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtensionPanel.java @@ -57,6 +57,7 @@ public class GerritPushExtensionPanel extends JPanel { private JCheckBox pushToGerritCheckBox; private JCheckBox privateCheckBox; + private JCheckBox unmarkPrivateCheckBox; private JCheckBox publishDraftCommentsCheckBox; private JCheckBox wipCheckBox; private JCheckBox draftChangeCheckBox; @@ -155,55 +156,59 @@ private void createLayout() { pushToGerritCheckBox = new JCheckBox("Push to Gerrit"); mainPanel.add(pushToGerritCheckBox); - indentedSettingPanel = new JPanel(new GridLayoutManager(11, 2)); + indentedSettingPanel = new JPanel(new GridLayoutManager(12, 2)); privateCheckBox = new JCheckBox("Private (Gerrit 2.15+)"); privateCheckBox.setToolTipText("Push a private change or to turn a change private."); indentedSettingPanel.add(privateCheckBox, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); + unmarkPrivateCheckBox = new JCheckBox("Unmark Private (Gerrit 2.15+)"); + unmarkPrivateCheckBox.setToolTipText("Unmark an existing change private."); + indentedSettingPanel.add(unmarkPrivateCheckBox, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); + wipCheckBox = new JCheckBox("WIP (Work-In-Progress Changes) (Gerrit 2.15+)"); wipCheckBox.setToolTipText("Push a wip change or to turn a change to wip."); - indentedSettingPanel.add(wipCheckBox, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); + indentedSettingPanel.add(wipCheckBox, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); publishDraftCommentsCheckBox = new JCheckBox("Publish Draft Comments (Gerrit 2.15+)"); publishDraftCommentsCheckBox.setToolTipText("If you have draft comments on the change(s) that are updated by the push, the publish-comments option will cause them to be published."); - indentedSettingPanel.add(publishDraftCommentsCheckBox, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); + indentedSettingPanel.add(publishDraftCommentsCheckBox, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); draftChangeCheckBox = new JCheckBox("Draft-Change (Gerrit older than 2.15)"); draftChangeCheckBox.setToolTipText("Publish change as draft (reviewers cannot submit change)."); - indentedSettingPanel.add(draftChangeCheckBox, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); + indentedSettingPanel.add(draftChangeCheckBox, new GridConstraints(5, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); submitChangeCheckBox = new JCheckBox("Submit Change"); submitChangeCheckBox.setToolTipText("Changes can be directly submitted on push. This is primarily useful for " + "teams that don't want to do code review but want to use Gerrit’s submit strategies to handle " + "contention on busy branches. Using submit creates a change and submits it immediately, if the caller " + "has submit permission."); - indentedSettingPanel.add(submitChangeCheckBox, new GridConstraints(5, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); + indentedSettingPanel.add(submitChangeCheckBox, new GridConstraints(6, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null)); branchTextField = addTextField( "Branch:", "The push destination branch.", - 6); + 7); topicTextField = addTextField( "Topic:", "A short topic associated with all of the changes in the same group, such as the local topic branch name.", - 7); + 8); hashTagTextField = addTextField( "Hashtag (Gerrit 2.15+):", "Include a hashtag associated with all of the changes in the same group.", - 8); + 9); reviewersTextField = addTextField( "Reviewers (user names, comma separated):", "Users which will be added as reviewers.", - 9); + 10); ccTextField = addTextField( "CC (user names, comma separated):", "Users which will receive carbon copies of the notification message.", - 10); + 11); final JPanel settingLayoutPanel = new JPanel(); settingLayoutPanel.setAlignmentX(Component.LEFT_ALIGNMENT); @@ -247,6 +252,7 @@ private void addChangeListener() { ChangeActionListener gerritPushChangeListener = new ChangeActionListener(); pushToGerritCheckBox.addActionListener(gerritPushChangeListener); privateCheckBox.addActionListener(gerritPushChangeListener); + unmarkPrivateCheckBox.addActionListener(gerritPushChangeListener); wipCheckBox.addActionListener(gerritPushChangeListener); publishDraftCommentsCheckBox.addActionListener(gerritPushChangeListener); draftChangeCheckBox.addActionListener(gerritPushChangeListener); @@ -276,6 +282,8 @@ private String getRef() { List gerritSpecs = Lists.newArrayList(); if (privateCheckBox.isSelected()) { gerritSpecs.add("private"); + } else if (unmarkPrivateCheckBox.isSelected()) { + gerritSpecs.add("remove-private"); } if (wipCheckBox.isSelected()) { gerritSpecs.add("wip"); @@ -302,6 +310,11 @@ private String getRef() { return ref; } + private void handlePrivateCheckBoxExclusive() { + privateCheckBox.setEnabled(!unmarkPrivateCheckBox.isSelected()); + unmarkPrivateCheckBox.setEnabled(!privateCheckBox.isSelected()); + } + private void handleCommaSeparatedUserNames(List gerritSpecs, JTextField textField, String option) { Iterable items = COMMA_SPLITTER.split(textField.getText()); for (String item : items) { @@ -323,6 +336,9 @@ private void updateDestinationBranch() { private void setSettingsEnabled(boolean enabled) { UIUtil.setEnabled(indentedSettingPanel, enabled, true); + if (enabled) { + handlePrivateCheckBoxExclusive(); + } } /** @@ -332,6 +348,7 @@ private class ChangeActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { updateDestinationBranch(); + handlePrivateCheckBoxExclusive(); } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritUtil.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritUtil.java index 6df93394..999e03bb 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritUtil.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritUtil.java @@ -723,9 +723,8 @@ public void run() { } } }; - if (gerritSettings.preloadPassword()) { - backgroundTask.queue(); - } + gerritSettings.preloadPassword(); + backgroundTask.queue(); } }); } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/SettingsPanel.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/SettingsPanel.java index a68c1438..e0c78698 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/SettingsPanel.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/SettingsPanel.java @@ -88,7 +88,12 @@ public void actionPerformed(ActionEvent e) { return; } try { - GerritAuthData.Basic gerritAuthData = new GerritAuthData.Basic(host, getLogin(), password); + GerritAuthData.Basic gerritAuthData = new GerritAuthData.Basic(host, getLogin(), password) { + @Override + public boolean isLoginAndPasswordAvailable() { + return !Strings.isNullOrEmpty(getLogin()); + } + }; if (gerritUtil.checkCredentials(ProjectManager.getInstance().getDefaultProject(), gerritAuthData)) { Messages.showInfoMessage(pane, "Connection successful", "Success"); } else { diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/AttentionFilter.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/AttentionFilter.java new file mode 100644 index 00000000..ec829b42 --- /dev/null +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/AttentionFilter.java @@ -0,0 +1,32 @@ +/* + * Copyright 2021 Urs Wolfer + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.urswolfer.intellij.plugin.gerrit.ui.filter; + +/** + * @author Urs Wolfer + */ +public class AttentionFilter extends AbstractUserFilter { + @Override + public String getActionLabel() { + return "Attention"; + } + + @Override + public String getQueryField() { + return "attention"; + } +} diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/GerritFilterModule.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/GerritFilterModule.java index 48fe3d2b..cc028ebd 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/GerritFilterModule.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/GerritFilterModule.java @@ -31,6 +31,7 @@ protected void configure() { filters.addBinding().to(BranchFilter.class); filters.addBinding().to(AssigneeFilter.class); filters.addBinding().to(ReviewerFilter.class); + filters.addBinding().to(AttentionFilter.class); filters.addBinding().to(OwnerFilter.class); filters.addBinding().to(IsStarredFilter.class); diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f311c58b..7177c05d 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -89,6 +89,13 @@ href="https://github.com/uwolfer/gerrit-intellij-plugin#pre-releases"> https://github.com/uwolfer/gerrit-intellij-plugin#pre-releases. +
  • 1.2.5
  • +
      +
    • add "Unmark Private" to push dialog
    • +
    • add "Attention" filter
    • +
    • add support for recent IntelliJ 2021.2 builds
    • +
    • minor fixes and improvements
    • +
  • 1.2.4
    • fix assertion error in logs when running some Git operations