From 0ea8199336ac0f0ef4dc0e20ec2940ea38e5a504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9da=20Housni=20Alaoui?= Date: Tue, 28 Apr 2020 21:32:26 +0200 Subject: [PATCH] Per project settings --- .../intellij/plugin/gerrit/GerritModule.java | 3 +- .../plugin/gerrit/GerritSettings.java | 311 +----------------- .../extension/GerritCheckoutProvider.java | 22 +- .../extension/GerritHttpAuthDataProvider.java | 17 +- .../plugin/gerrit/git/GerritGitUtil.java | 6 +- .../gerrit/push/GerritPushExtension.java | 2 +- .../plugin/gerrit/rest/GerritApiProvider.java | 11 +- .../plugin/gerrit/rest/GerritRestModule.java | 3 +- .../plugin/gerrit/rest/GerritUtil.java | 53 +-- .../gerrit/settings/GerritCredentials.java | 188 +++++++++++ .../settings/GerritProjectSettings.java | 176 ++++++++++ .../gerrit/settings/GerritSettings.java | 226 +++++++++++++ .../gerrit/ui/GerritChangeListPanel.java | 4 +- .../gerrit/ui/GerritChangeNodeDecorator.java | 6 +- .../ui/GerritChangeNodeDecoratorProvider.java | 26 ++ ...GerritCommentCountChangeNodeDecorator.java | 60 +++- .../gerrit/ui/GerritSettingsConfigurable.java | 117 ++----- .../GerritSettingsConfigurableProvider.java | 56 ++++ .../plugin/gerrit/ui/GerritToolWindow.java | 4 +- .../plugin/gerrit/ui/GerritUiModule.java | 8 +- .../GerritUpdatesNotificationComponent.java | 8 +- .../plugin/gerrit/ui/LoginDialog.java | 15 +- .../ui/RepositoryChangesBrowserProvider.java | 14 +- .../plugin/gerrit/ui/SettingsPanel.java | 46 ++- .../action/AbstractLoggedInChangeAction.java | 4 +- .../gerrit/ui/action/AddReviewersAction.java | 6 +- .../gerrit/ui/action/OpenInBrowserAction.java | 9 +- .../plugin/gerrit/ui/action/ReviewAction.java | 2 +- .../gerrit/ui/action/ReviewActionFactory.java | 2 +- .../gerrit/ui/action/ReviewActionGroup.java | 4 +- .../gerrit/ui/diff/AddCommentAction.java | 4 +- .../ui/diff/AddCommentActionBuilder.java | 2 +- .../gerrit/ui/diff/CommentDoneAction.java | 4 +- .../ui/diff/CommentGutterIconRenderer.java | 2 +- .../gerrit/ui/diff/CommentsDiffTool.java | 2 +- .../plugin/gerrit/ui/filter/BranchFilter.java | 2 +- src/main/resources/META-INF/plugin.xml | 8 +- .../plugin/gerrit/rest/GerritTestModule.java | 2 +- 38 files changed, 904 insertions(+), 531 deletions(-) create mode 100644 src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritCredentials.java create mode 100644 src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritProjectSettings.java create mode 100644 src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritSettings.java create mode 100644 src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecoratorProvider.java create mode 100644 src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurableProvider.java diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritModule.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritModule.java index 49ae40d1..dbac5f9e 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritModule.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritModule.java @@ -24,13 +24,13 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.intellij.openapi.components.ServiceManager; -import com.urswolfer.gerrit.client.rest.GerritAuthData; import com.urswolfer.intellij.plugin.gerrit.extension.GerritCheckoutProvider; import com.urswolfer.intellij.plugin.gerrit.extension.GerritHttpAuthDataProvider; import com.urswolfer.intellij.plugin.gerrit.git.GerritGitUtil; import com.urswolfer.intellij.plugin.gerrit.push.GerritPushExtension; import com.urswolfer.intellij.plugin.gerrit.rest.GerritRestModule; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.ui.GerritToolWindow; import com.urswolfer.intellij.plugin.gerrit.ui.GerritUiModule; import com.urswolfer.intellij.plugin.gerrit.ui.action.GerritActionsModule; @@ -91,7 +91,6 @@ public GerritSettings get() { } }; bind(GerritSettings.class).toProvider(settingsProvider).in(Singleton.class); - bind(GerritAuthData.class).toProvider(settingsProvider).in(Singleton.class); } protected void installOpenIdeDependenciesModule() { 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 aa619a61..8a511d35 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritSettings.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/GerritSettings.java @@ -1,314 +1,9 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * Copyright 2013 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; -import com.google.common.base.Optional; -import com.google.common.base.Strings; -import com.intellij.ide.passwordSafe.PasswordSafe; -import com.intellij.ide.passwordSafe.PasswordSafeException; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.openapi.components.State; -import com.intellij.openapi.components.Storage; -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 + * Placeholder allowing to retrieve the legacy password. * - * @author oleg - * @author Urs Wolfer + * @author Réda Housni Alaoui */ -@State(name = "GerritSettings", storages = @Storage("gerrit_settings.xml")) -public class GerritSettings implements PersistentStateComponent, GerritAuthData { - - private static final String GERRIT_SETTINGS_TAG = "GerritSettings"; - private static final String LOGIN = "Login"; - private static final String HOST = "Host"; - private static final String AUTOMATIC_REFRESH = "AutomaticRefresh"; - private static final String LIST_ALL_CHANGES = "ListAllChanges"; - private static final String REFRESH_TIMEOUT = "RefreshTimeout"; - private static final String REVIEW_NOTIFICATIONS = "ReviewNotifications"; - private static final String PUSH_TO_GERRIT = "PushToGerrit"; - private static final String SHOW_CHANGE_NUMBER_COLUMN = "ShowChangeNumberColumn"; - private static final String SHOW_CHANGE_ID_COLUMN = "ShowChangeIdColumn"; - private static final String SHOW_TOPIC_COLUMN = "ShowTopicColumn"; - private static final String SHOW_PROJECT_COLUMN = "ShowProjectColumn"; - private static final String CLONE_BASE_URL = "CloneBaseUrl"; - private static final String GERRIT_SETTINGS_PASSWORD_KEY = "GERRIT_SETTINGS_PASSWORD_KEY"; - - private String login = ""; - private String host = ""; - private boolean listAllChanges = false; - private boolean automaticRefresh = true; - private int refreshTimeout = 15; - private boolean refreshNotifications = true; - private boolean pushToGerrit = false; - private boolean showChangeNumberColumn = false; - private boolean showChangeIdColumn = false; - private boolean showTopicColumn = false; - private ShowProjectColumn showProjectColumn = ShowProjectColumn.AUTO; - private String cloneBaseUrl = ""; - - private Optional preloadedPassword; - private AtomicInteger passwordDialogShowLimit = new AtomicInteger(3); - - private Logger log; - - public Element getState() { - final Element element = new Element(GERRIT_SETTINGS_TAG); - element.setAttribute(LOGIN, (getLogin() != null ? getLogin() : "")); - element.setAttribute(HOST, (getHost() != null ? getHost() : "")); - element.setAttribute(LIST_ALL_CHANGES, Boolean.toString(getListAllChanges())); - element.setAttribute(AUTOMATIC_REFRESH, Boolean.toString(getAutomaticRefresh())); - element.setAttribute(REFRESH_TIMEOUT, Integer.toString(getRefreshTimeout())); - element.setAttribute(REVIEW_NOTIFICATIONS, Boolean.toString(getReviewNotifications())); - element.setAttribute(PUSH_TO_GERRIT, Boolean.toString(getPushToGerrit())); - element.setAttribute(SHOW_CHANGE_NUMBER_COLUMN, Boolean.toString(getShowChangeNumberColumn())); - element.setAttribute(SHOW_CHANGE_ID_COLUMN, Boolean.toString(getShowChangeIdColumn())); - element.setAttribute(SHOW_TOPIC_COLUMN, Boolean.toString(getShowTopicColumn())); - element.setAttribute(SHOW_PROJECT_COLUMN, getShowProjectColumn().name()); - element.setAttribute(CLONE_BASE_URL, (getCloneBaseUrl() != null ? getCloneBaseUrl() : "")); - return element; - } - - public void loadState(@NotNull final Element element) { - // All the logic on retrieving password was moved to getPassword action to cleanup initialization process - try { - setLogin(element.getAttributeValue(LOGIN)); - setHost(element.getAttributeValue(HOST)); - - setListAllChanges(getBooleanValue(element, LIST_ALL_CHANGES)); - setAutomaticRefresh(getBooleanValue(element, AUTOMATIC_REFRESH)); - setRefreshTimeout(getIntegerValue(element, REFRESH_TIMEOUT)); - setReviewNotifications(getBooleanValue(element, REVIEW_NOTIFICATIONS)); - setPushToGerrit(getBooleanValue(element, PUSH_TO_GERRIT)); - setShowChangeNumberColumn(getBooleanValue(element, SHOW_CHANGE_NUMBER_COLUMN)); - setShowChangeIdColumn(getBooleanValue(element, SHOW_CHANGE_ID_COLUMN)); - setShowTopicColumn(getBooleanValue(element, SHOW_TOPIC_COLUMN)); - setShowProjectColumn(getShowProjectColumnValue(element, SHOW_PROJECT_COLUMN)); - setCloneBaseUrl(element.getAttributeValue(CLONE_BASE_URL)); - } catch (Exception e) { - log.error("Error happened while loading gerrit settings: " + e); - } - } - - private boolean getBooleanValue(Element element, String attributeName) { - String attributeValue = element.getAttributeValue(attributeName); - if (attributeValue != null) { - return Boolean.valueOf(attributeValue); - } else { - return false; - } - } - - private int getIntegerValue(Element element, String attributeName) { - String attributeValue = element.getAttributeValue(attributeName); - if (attributeValue != null) { - return Integer.valueOf(attributeValue); - } else { - return 0; - } - } - - private ShowProjectColumn getShowProjectColumnValue(Element element, String attributeName) { - String attributeValue = element.getAttributeValue(attributeName); - if (attributeValue != null) { - return ShowProjectColumn.valueOf(attributeValue); - } else { - return ShowProjectColumn.AUTO; - } - } - - @Override - @Nullable - public String getLogin() { - return login; - } - - @Override - @NotNull - public String getPassword() { - if (!ApplicationManager.getApplication().isDispatchThread()) { - if (preloadedPassword == null) { - throw new IllegalStateException("Need to call #preloadPassword when password is required in background thread"); - } - } else { - if (!preloadPassword()) { - return ""; - } - } - return preloadedPassword.or(""); - } - - public boolean 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 - public boolean isHttpPassword() { - return false; - } - - @Override - public String getHost() { - return host; - } - - @Override - public boolean isLoginAndPasswordAvailable() { - return !Strings.isNullOrEmpty(getLogin()); - } - - public boolean getListAllChanges() { - return listAllChanges; - } - - public void setListAllChanges(boolean listAllChanges) { - this.listAllChanges = listAllChanges; - } - - public boolean getAutomaticRefresh() { - return automaticRefresh; - } - - public int getRefreshTimeout() { - return refreshTimeout; - } - - public boolean getReviewNotifications() { - return refreshNotifications; - } - - public void setLogin(final String login) { - this.login = login != null ? login : ""; - } - - public void setPassword(final String password) { - try { - PasswordSafe.getInstance().storePassword(null, GerritSettings.class, GERRIT_SETTINGS_PASSWORD_KEY, password != null ? password : ""); - } catch (PasswordSafeException e) { - log.info("Couldn't set password for key [" + GERRIT_SETTINGS_PASSWORD_KEY + "]", e); - } - } - - public void forgetPassword() { - try { - PasswordSafe.getInstance().removePassword(null, GerritSettings.class, GERRIT_SETTINGS_PASSWORD_KEY); - } catch (PasswordSafeException e) { - log.info("Couldn't forget password for key [" + GERRIT_SETTINGS_PASSWORD_KEY + "]", e); - } - } - - public void setHost(final String host) { - this.host = host; - } - - public void setAutomaticRefresh(final boolean automaticRefresh) { - this.automaticRefresh = automaticRefresh; - } - - public void setRefreshTimeout(final int refreshTimeout) { - this.refreshTimeout = refreshTimeout; - } - - public void setReviewNotifications(final boolean reviewNotifications) { - refreshNotifications = reviewNotifications; - } - - public void setPushToGerrit(boolean pushToGerrit) { - this.pushToGerrit = pushToGerrit; - } - - public boolean getPushToGerrit() { - return pushToGerrit; - } - - public boolean getShowChangeNumberColumn() { - return showChangeNumberColumn; - } - - public void setShowChangeNumberColumn(boolean showChangeNumberColumn) { - this.showChangeNumberColumn = showChangeNumberColumn; - } - - public boolean getShowChangeIdColumn() { - return showChangeIdColumn; - } - - public void setShowChangeIdColumn(boolean showChangeIdColumn) { - this.showChangeIdColumn = showChangeIdColumn; - } - - public boolean getShowTopicColumn() { - return showTopicColumn; - } - - public ShowProjectColumn getShowProjectColumn() { - return showProjectColumn; - } - - public void setShowProjectColumn(ShowProjectColumn showProjectColumn) { - this.showProjectColumn = showProjectColumn; - } - - public void setShowTopicColumn(boolean showTopicColumn) { - this.showTopicColumn = showTopicColumn; - } - - public void setCloneBaseUrl(String cloneBaseUrl) { - this.cloneBaseUrl = cloneBaseUrl; - } - - public String getCloneBaseUrl() { - return cloneBaseUrl; - } - - public void setLog(Logger log) { - this.log = log; - } - - public String getCloneBaseUrlOrHost() { - return Strings.isNullOrEmpty(cloneBaseUrl) ? host : cloneBaseUrl; - } +public interface GerritSettings { } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritCheckoutProvider.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritCheckoutProvider.java index abfeaaf3..1a5bcf9a 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritCheckoutProvider.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritCheckoutProvider.java @@ -37,9 +37,10 @@ import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.urswolfer.gerrit.client.rest.GerritRestApi; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.rest.GerritApiProvider; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.util.NotificationBuilder; import com.urswolfer.intellij.plugin.gerrit.util.NotificationService; @@ -82,7 +83,7 @@ public String apply(ProjectInfo from) { @Inject private NotificationService notificationService; @Inject - private GerritRestApi gerritApi; + private GerritApiProvider gerritApiProvider; @Override public void doCheckout(@NotNull final Project project, @Nullable final Listener listener) { @@ -107,7 +108,7 @@ public void doCheckout(@NotNull final Project project, @Nullable final Listener ImmutableSortedSet orderedProjects = ImmutableSortedSet.orderedBy(ID_REVERSE_ORDERING).addAll(availableProjects).build(); - String url = getCloneBaseUrl(); + String url = getCloneBaseUrl(project); final GitCloneDialog dialog = new GitCloneDialog(project); for (ProjectInfo projectInfo : orderedProjects) { @@ -144,13 +145,14 @@ public String getVcsName() { * * This can be cleaned up once https://code.google.com/p/gerrit/issues/detail?id=2208 is implemented. */ - private String getCloneBaseUrl() { - if (!Strings.isNullOrEmpty(gerritSettings.getCloneBaseUrl())) { - return gerritSettings.getCloneBaseUrl(); + private String getCloneBaseUrl(Project project) { + GerritProjectSettings projectSettings = gerritSettings.forProject(project); + if (!Strings.isNullOrEmpty(projectSettings.getCloneBaseUrl())) { + return projectSettings.getCloneBaseUrl(); } - String url = gerritSettings.getHost(); + String url = projectSettings.getHost(); try { - List changeInfos = gerritApi.changes().query() + List changeInfos = gerritApiProvider.get(project).changes().query() .withLimit(1) .withOption(ListChangesOption.CURRENT_REVISION) .get(); @@ -193,7 +195,7 @@ public void checkoutCompleted() { private void setupCommitMsgHook(String parentDirectory, String directoryName, Project project) { try { - InputStream commitMessageHook = gerritApi.tools().getCommitMessageHook(); + InputStream commitMessageHook = gerritApiProvider.get(project).tools().getCommitMessageHook(); File targetFile = new File(parentDirectory + '/' + directoryName + "/.git/hooks/commit-msg"); ByteStreams.copy(commitMessageHook, new FileOutputStream(targetFile)); //noinspection ResultOfMethodCallIgnored diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritHttpAuthDataProvider.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritHttpAuthDataProvider.java index 2e21f074..20e45719 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritHttpAuthDataProvider.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/extension/GerritHttpAuthDataProvider.java @@ -21,7 +21,8 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.AuthData; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import git4idea.remote.GitHttpAuthDataProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,20 +41,22 @@ public class GerritHttpAuthDataProvider implements GitHttpAuthDataProvider { @Nullable @Override public AuthData getAuthData(@NotNull String url) { - if (!gerritSettings.getHost().equalsIgnoreCase(url)) { + GerritProjectSettings projectSettings = gerritSettings.forFocusedProject(); + if (!projectSettings.getHost().equalsIgnoreCase(url)) { return null; } - String password = gerritSettings.getPassword(); - if (StringUtil.isEmptyOrSpaces(gerritSettings.getLogin()) || StringUtil.isEmptyOrSpaces(password)) { + String password = projectSettings.getPassword(); + if (StringUtil.isEmptyOrSpaces(projectSettings.getLogin()) || StringUtil.isEmptyOrSpaces(password)) { return null; } - return new AuthData(gerritSettings.getLogin(), password); + return new AuthData(projectSettings.getLogin(), password); } @Override public void forgetPassword(@NotNull String url) { - if (gerritSettings.getHost().equalsIgnoreCase(url)) { - gerritSettings.forgetPassword(); + GerritProjectSettings projectSettings = gerritSettings.forFocusedProject(); + if (projectSettings.getHost().equalsIgnoreCase(url)) { + projectSettings.forgetPassword(); } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/git/GerritGitUtil.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/git/GerritGitUtil.java index 2afd3dce..ec7c90a3 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/git/GerritGitUtil.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/git/GerritGitUtil.java @@ -46,7 +46,8 @@ import com.intellij.vcs.log.impl.HashImpl; import com.intellij.vcs.log.impl.VcsShortCommitDetailsImpl; import com.intellij.vcs.log.impl.VcsUserImpl; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.util.NotificationBuilder; import com.urswolfer.intellij.plugin.gerrit.util.NotificationService; import com.urswolfer.intellij.plugin.gerrit.util.UrlUtils; @@ -125,9 +126,10 @@ public Optional getRemoteForChange(Project project, GitRepository git List repositoryUrls = new ArrayList(); repositoryUrls.addAll(remote.getUrls()); repositoryUrls.addAll(remote.getPushUrls()); + GerritProjectSettings projectSettings = gerritSettings.forProject(project); for (String repositoryUrl : repositoryUrls) { if (UrlUtils.urlHasSameHost(repositoryUrl, url) - || UrlUtils.urlHasSameHost(repositoryUrl, gerritSettings.getCloneBaseUrlOrHost())) { + || UrlUtils.urlHasSameHost(repositoryUrl, projectSettings.getCloneBaseUrlOrHost())) { return Optional.of(remote); } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtension.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtension.java index cd4cdf8a..0bbdd298 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtension.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/push/GerritPushExtension.java @@ -20,7 +20,7 @@ import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import git4idea.push.GitPushOperation; import javassist.*; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritApiProvider.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritApiProvider.java index 9f22020e..37ced4f8 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritApiProvider.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritApiProvider.java @@ -17,15 +17,15 @@ package com.urswolfer.intellij.plugin.gerrit.rest; import com.google.inject.Inject; -import com.google.inject.Provider; +import com.intellij.openapi.project.Project; import com.urswolfer.gerrit.client.rest.GerritRestApi; import com.urswolfer.gerrit.client.rest.GerritRestApiFactory; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; /** * @author Urs Wolfer */ -public class GerritApiProvider implements Provider { +public class GerritApiProvider { @Inject private GerritSettings gerritSettings; @@ -40,10 +40,9 @@ public class GerritApiProvider implements Provider { @Inject private GerritRestApiFactory gerritRestApiFactory; - @Override - public GerritRestApi get() { + public GerritRestApi get(Project project) { return gerritRestApiFactory.create( - gerritSettings, + gerritSettings.forProject(project), certificateManagerClientBuilderExtension, loggerHttpClientBuilderExtension, proxyHttpClientBuilderExtension, diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritRestModule.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritRestModule.java index 9c2c6247..2231bbb6 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritRestModule.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritRestModule.java @@ -17,7 +17,6 @@ package com.urswolfer.intellij.plugin.gerrit.rest; import com.google.inject.AbstractModule; -import com.urswolfer.gerrit.client.rest.GerritRestApi; import com.urswolfer.gerrit.client.rest.GerritRestApiFactory; /** @@ -30,6 +29,6 @@ protected void configure() { bind(ProxyHttpClientBuilderExtension.class); bind(UserAgentClientBuilderExtension.class); bind(GerritRestApiFactory.class); - bind(GerritRestApi.class).toProvider(new GerritApiProvider()); + bind(GerritApiProvider.class); } } 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 968796bd..9b75c70a 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 @@ -58,7 +58,8 @@ import com.urswolfer.gerrit.client.rest.GerritRestApi; import com.urswolfer.gerrit.client.rest.GerritRestApiFactory; import com.urswolfer.gerrit.client.rest.http.HttpStatusException; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.SelectedRevisions; import com.urswolfer.intellij.plugin.gerrit.ui.LoginDialog; import com.urswolfer.intellij.plugin.gerrit.util.NotificationBuilder; @@ -70,9 +71,6 @@ import git4idea.i18n.GitBundle; import git4idea.repo.GitRemote; import git4idea.repo.GitRepository; -import org.jetbrains.annotations.NotNull; - -import javax.swing.event.HyperlinkEvent; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; @@ -81,6 +79,8 @@ import java.util.Map; import java.util.TreeMap; import java.util.concurrent.atomic.AtomicReference; +import javax.swing.event.HyperlinkEvent; +import org.jetbrains.annotations.NotNull; /** * Parts based on org.jetbrains.plugins.github.GithubUtil @@ -97,7 +97,7 @@ public class GerritUtil { @Inject private NotificationService notificationService; @Inject - private GerritRestApi gerritClient; + private GerritApiProvider gerritApiProvider; @Inject private GerritRestApiFactory gerritRestApiFactory; @Inject @@ -140,7 +140,7 @@ public void postReview(final String changeId, @Override public Void get() { try { - gerritClient.changes().id(changeId).revision(revision).review(reviewInput); + gerritApiProvider.get(project).changes().id(changeId).revision(revision).review(reviewInput); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -158,7 +158,7 @@ public void postSubmit(final String changeId, @Override public Void get() { try { - gerritClient.changes().id(changeId).current().submit(submitInput); + gerritApiProvider.get(project).changes().id(changeId).current().submit(submitInput); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -175,7 +175,7 @@ public void postPublish(final String changeId, @Override public Void get() { try { - gerritClient.changes().id(changeId).publish(); + gerritApiProvider.get(project).changes().id(changeId).publish(); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -192,7 +192,7 @@ public void delete(final String changeId, @Override public Void get() { try { - gerritClient.changes().id(changeId).delete(); + gerritApiProvider.get(project).changes().id(changeId).delete(); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -210,7 +210,7 @@ public void postAbandon(final String changeId, @Override public Void get() { try { - gerritClient.changes().id(changeId).abandon(abandonInput); + gerritApiProvider.get(project).changes().id(changeId).abandon(abandonInput); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -228,7 +228,7 @@ public void addReviewer(final String changeId, @Override public Void get() { try { - gerritClient.changes().id(changeId).addReviewer(reviewerName); + gerritApiProvider.get(project).changes().id(changeId).addReviewer(reviewerName); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -249,6 +249,7 @@ public void changeStarredStatus(final String id, @Override public Void get() { try { + GerritRestApi gerritClient = gerritApiProvider.get(project); if (starred) { gerritClient.accounts().self().starChange(id); } else { @@ -269,14 +270,14 @@ public void setReviewed(final int changeNr, final String revision, final String filePath, final Project project) { - if (!gerritSettings.isLoginAndPasswordAvailable()) { + if (!gerritSettings.forProject(project).isLoginAndPasswordAvailable()) { return; } Supplier supplier = new Supplier() { @Override public Void get() { try { - gerritClient.changes().id(changeNr).revision(revision).setReviewed(filePath, true); + gerritApiProvider.get(project).changes().id(changeNr).revision(revision).setReviewed(filePath, true); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -287,7 +288,7 @@ public Void get() { } public void getChangesToReview(Project project, Consumer> consumer) { - Changes.QueryRequest queryRequest = gerritClient.changes().query("is:open+reviewer:self") + Changes.QueryRequest queryRequest = gerritApiProvider.get(project).changes().query("is:open+reviewer:self") .withOption(ListChangesOption.DETAILED_ACCOUNTS); getChanges(queryRequest, project, consumer); } @@ -303,7 +304,7 @@ public void getChanges(final String query, final Project project, final Consumer Supplier supplier = new Supplier() { @Override public LoadChangesProxy get() { - Changes.QueryRequest queryRequest = gerritClient.changes().query(query) + Changes.QueryRequest queryRequest = gerritApiProvider.get(project).changes().query(query) .withOptions(EnumSet.of( ListChangesOption.ALL_REVISIONS, ListChangesOption.DETAILED_ACCOUNTS, @@ -377,7 +378,7 @@ private String getProjectQueryPart(Project project) { for (GitRepository repository : repositories) { remotes.addAll(repository.getRemotes()); } - List projectNames = getProjectNames(remotes); + List projectNames = getProjectNames(project, remotes); Iterable projectNamesWithQueryPrefix = Iterables.transform(projectNames, new Function() { @Override public String apply(String input) { @@ -391,12 +392,13 @@ public String apply(String input) { return String.format("(%s)", Joiner.on("+OR+").join(projectNamesWithQueryPrefix)); } - public List getProjectNames(Collection remotes) { + public List getProjectNames(Project project, Collection remotes) { + GerritProjectSettings projectSettings = gerritSettings.forProject(project); List projectNames = Lists.newArrayList(); for (GitRemote remote : remotes) { for (String remoteUrl : remote.getUrls()) { remoteUrl = UrlUtils.stripGitExtension(remoteUrl); - String projectName = getProjectName(gerritSettings.getHost(), gerritSettings.getCloneBaseUrl(), + String projectName = getProjectName(projectSettings.getHost(), projectSettings.getCloneBaseUrl(), remoteUrl); if (!Strings.isNullOrEmpty(projectName) && remoteUrl.endsWith(projectName)) { projectNames.add(projectName); @@ -406,7 +408,7 @@ public List getProjectNames(Collection remotes) { return projectNames; } - private String getProjectName(String gerritUrl, String gerritCloneBaseUrl, String url) { + private String getProjectName(String gerritUrl, String gerritCloneBaseUrl, String url) { String baseUrl = Strings.isNullOrEmpty(gerritCloneBaseUrl) ? gerritUrl : gerritCloneBaseUrl; if (!baseUrl.endsWith("/")) { baseUrl = baseUrl + "/"; @@ -457,6 +459,7 @@ public ChangeInfo get() { ListChangesOption.DETAILED_ACCOUNTS, ListChangesOption.LABELS, ListChangesOption.DETAILED_LABELS); + GerritRestApi gerritClient = gerritApiProvider.get(project); try { return gerritClient.changes().id(changeNr).get(options); } catch (HttpStatusException e) { @@ -491,6 +494,7 @@ public void getComments(final int changeNr, @Override public Map> get() { try { + GerritRestApi gerritClient = gerritApiProvider.get(project); Map> comments; if (includePublishedComments) { comments = gerritClient.changes().id(changeNr).revision(revision).comments(); @@ -499,7 +503,7 @@ public Map> get() { } Map> drafts; - if (includeDraftComments && gerritSettings.isLoginAndPasswordAvailable()) { + if (includeDraftComments && gerritSettings.forProject(project).isLoginAndPasswordAvailable()) { drafts = gerritClient.changes().id(changeNr).revision(revision).drafts(); } else { drafts = Maps.newHashMap(); @@ -536,6 +540,7 @@ public void saveDraftComment(final int changeNr, @Override public CommentInfo get() { try { + GerritRestApi gerritClient = gerritApiProvider.get(project); CommentInfo commentInfo; if (draftInput.id != null) { commentInfo = gerritClient.changes().id(changeNr).revision(revision) @@ -563,7 +568,7 @@ public void deleteDraftComment(final int changeNr, @Override public Void get() { try { - gerritClient.changes().id(changeNr).revision(revision).draft(draftCommentId).delete(); + gerritApiProvider.get(project).changes().id(changeNr).revision(revision).draft(draftCommentId).delete(); return null; } catch (RestApiException e) { throw new RuntimeException(e); @@ -591,7 +596,7 @@ private boolean testConnection(GerritAuthData gerritAuthData) throws RestApiExce */ public boolean checkCredentials(final Project project) { try { - return checkCredentials(project, gerritSettings); + return checkCredentials(project, gerritSettings.forProject(project)); } catch (Exception e) { // this method is a quick-check if we've got valid user setup. // if an exception happens, we'll show the reason in the login dialog that will be shown right after checkCredentials failure. @@ -630,7 +635,7 @@ public List getAvailableProjects(final Project project) { @Override public List compute() throws Exception { ProgressManager.getInstance().getProgressIndicator().setText("Extracting info about available repositories"); - return gerritClient.projects().list().get(); + return gerritApiProvider.get(project).projects().list().get(); } }); } @@ -723,7 +728,7 @@ public void run() { } } }; - if (gerritSettings.preloadPassword()) { + if (gerritSettings.forProject(project).preloadPassword()) { backgroundTask.queue(); } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritCredentials.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritCredentials.java new file mode 100644 index 00000000..6d911aef --- /dev/null +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritCredentials.java @@ -0,0 +1,188 @@ +/* + * Copyright 2020 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.settings; + +import com.google.common.base.Optional; +import com.google.common.base.Strings; +import com.intellij.ide.passwordSafe.PasswordSafe; +import com.intellij.ide.passwordSafe.PasswordSafeException; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.ui.Messages; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; + +/** + * @author Réda Housni Alaoui + */ +class GerritCredentials { + + private static final String HOST = "Host"; + private static final String LOGIN = "Login"; + private static final String PASSWORD_VERSION = "PasswordVersion"; + private static final String PASSWORD_KEY_PREFIX = "GERRIT_SETTINGS_PASSWORD_KEY"; + + private final Map passwordMigrationByVersion = new LinkedHashMap(); + private final int passwordTargetVersion; + + private Logger log; + + private String host = ""; + private String login = ""; + private int passwordVersion; + + private Optional preloadedPassword; + private AtomicInteger passwordDialogShowLimit = new AtomicInteger(3); + + GerritCredentials() { + passwordMigrationByVersion.put(1, new Version1PasswordMigration()); + passwordTargetVersion = Collections.max(passwordMigrationByVersion.keySet()); + } + + public void readFrom(Element element) { + update(element.getAttributeValue(HOST), element.getAttributeValue(LOGIN)); + this.passwordVersion = Integer.parseInt(element.getAttributeValue(PASSWORD_VERSION)); + } + + public void persistTo(Element element) { + element.setAttribute(LOGIN, (getLogin() != null ? getLogin() : "")); + element.setAttribute(HOST, (getHost() != null ? getHost() : "")); + element.setAttribute(PASSWORD_VERSION, String.valueOf(passwordVersion)); + } + + public void update(String host, String login) { + this.host = host; + this.login = login != null ? login : ""; + } + + public void update(String host, String login, final String password) { + update(host, login); + + String passwordKey = createPasswordStorageKey(); + try { + PasswordSafe.getInstance().storePassword(null, GerritProjectSettings.class, passwordKey, password != null ? password : ""); + } catch (PasswordSafeException e) { + log.info("Couldn't set password for key [" + passwordKey + "]", e); + } + } + + public void forgetPassword() { + String passwordKey = createPasswordStorageKey(); + try { + PasswordSafe.getInstance().removePassword(null, GerritProjectSettings.class, passwordKey); + } catch (PasswordSafeException e) { + log.info("Couldn't forget password for key [" + passwordKey + "]", e); + } + } + + @NotNull + public String getPassword() { + if (!ApplicationManager.getApplication().isDispatchThread()) { + if (preloadedPassword == null) { + throw new IllegalStateException("Need to call #preloadPassword when password is required in background thread"); + } + } else { + if (!preloadPassword()) { + return ""; + } + } + return preloadedPassword.or(""); + } + + public boolean preloadPassword() { + migratePassword(); + + String passwordKey = createPasswordStorageKey(); + String password = null; + try { + password = PasswordSafe.getInstance().getPassword(null, GerritProjectSettings.class, passwordKey); + } catch (PasswordSafeException e) { + log.info("Couldn't get password for key [" + passwordKey + "]", 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; + } + + private String createPasswordStorageKey() { + return PASSWORD_KEY_PREFIX + ":" + host + ":" + login; + } + + public String getHost() { + return host; + } + + public String getLogin() { + return login; + } + + public void setLog(Logger log) { + this.log = log; + } + + private void migratePassword() { + if (passwordVersion >= passwordTargetVersion) { + return; + } + + for (Map.Entry migration : passwordMigrationByVersion.entrySet()) { + if (passwordVersion >= migration.getKey()) { + continue; + } + migration.getValue().migrate(this); + } + this.passwordVersion = passwordTargetVersion; + } + + private static class Version1PasswordMigration implements PasswordMigration { + + @Override + public void migrate(GerritCredentials credentials) { + String legacyPassword = null; + try { + legacyPassword = PasswordSafe.getInstance().getPassword(null, + com.urswolfer.intellij.plugin.gerrit.GerritSettings.class, "GERRIT_SETTINGS_PASSWORD_KEY"); + } catch (PasswordSafeException e) { + // Do nothing + } + + if (legacyPassword == null) { + return; + } + + credentials.update(credentials.getHost(), credentials.getLogin(), legacyPassword); + } + } + + private interface PasswordMigration { + void migrate(GerritCredentials credentials); + } +} diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritProjectSettings.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritProjectSettings.java new file mode 100644 index 00000000..4ba4f6af --- /dev/null +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritProjectSettings.java @@ -0,0 +1,176 @@ +/* + * Copyright 2020 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.settings; + +import com.google.common.base.Strings; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.components.StoragePathMacros; +import com.intellij.openapi.diagnostic.Logger; +import com.urswolfer.gerrit.client.rest.GerritAuthData; +import com.urswolfer.intellij.plugin.gerrit.GerritModule; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import org.jdom.Element; +import org.jetbrains.annotations.Nullable; + +/** + * @author Réda Housni Alaoui + */ +@State( + name = "GerritProjectSettings", + storages = { + @Storage( + file = StoragePathMacros.PROJECT_CONFIG_DIR + "/gerrit_settings.xml" + )} +) +public class GerritProjectSettings implements PersistentStateComponent, GerritAuthData { + + private static final String GERRIT_SETTINGS_TAG = "GerritSettings"; + private static final String CLONE_BASE_URL = "CloneBaseUrl"; + private static final String VERSION_ATTRIBUTE = "version"; + + private final GerritCredentials credentials = new GerritCredentials(); + private final Map migrationByVersion = new LinkedHashMap(); + private final int targetVersion; + + private String cloneBaseUrl = ""; + private int version; + + private Logger log; + + public GerritProjectSettings() { + migrationByVersion.put(1, new Version1Migration()); + targetVersion = Collections.max(migrationByVersion.keySet()); + migrate(); + } + + @Nullable + @Override + public Element getState() { + final Element element = new Element(GERRIT_SETTINGS_TAG); + credentials.persistTo(element); + element.setAttribute(CLONE_BASE_URL, (getCloneBaseUrl() != null ? getCloneBaseUrl() : "")); + element.setAttribute(VERSION_ATTRIBUTE, String.valueOf(version)); + return element; + } + + @Override + public void loadState(Element element) { + try { + credentials.readFrom(element); + setCloneBaseUrl(element.getAttributeValue(CLONE_BASE_URL)); + version = Integer.parseInt(element.getAttributeValue(VERSION_ATTRIBUTE)); + migrate(); + } catch (Exception e) { + log.error("Error happened while loading gerrit settings: " + e); + } + } + + private void migrate() { + if (version >= targetVersion) { + return; + } + + for (Map.Entry migration : migrationByVersion.entrySet()) { + if (version >= migration.getKey()) { + continue; + } + migration.getValue().migrate(this); + } + this.version = targetVersion; + } + + public void setCredentials(String host, String login, String password) { + credentials.update(host, login, password); + } + + public void setCredentials(String host, String login) { + credentials.update(host, login); + } + + public void setCloneBaseUrl(String cloneBaseUrl) { + this.cloneBaseUrl = cloneBaseUrl; + } + + public String getCloneBaseUrl() { + return cloneBaseUrl; + } + + public String getCloneBaseUrlOrHost() { + return Strings.isNullOrEmpty(cloneBaseUrl) ? credentials.getHost() : cloneBaseUrl; + } + + @Override + public boolean isLoginAndPasswordAvailable() { + return !Strings.isNullOrEmpty(getLogin()); + } + + @Override + public String getLogin() { + return credentials.getLogin(); + } + + @Override + public String getPassword() { + return credentials.getPassword(); + } + + @Override + public boolean isHttpPassword() { + return false; + } + + @Override + public String getHost() { + return credentials.getHost(); + } + + public void setLog(Logger log) { + this.log = log; + } + + public boolean preloadPassword() { + return credentials.preloadPassword(); + } + + public void forgetPassword() { + credentials.forgetPassword(); + } + + private static class Version1Migration implements Migration { + + @Override + public void migrate(GerritProjectSettings projectSettings) { + GerritSettings gerritSettings = GerritModule.getInstance(GerritSettings.class); + String legacyHost = gerritSettings.getElement().getAttributeValue("Host"); + String legacyLogin = gerritSettings.getElement().getAttributeValue("Login"); + String legacyCloneBaseUrl = gerritSettings.getElement().getAttributeValue("CloneBaseUrl"); + + projectSettings.setCloneBaseUrl(legacyCloneBaseUrl); + projectSettings.setCredentials(legacyHost, legacyLogin); + } + } + + private interface Migration { + + void migrate(GerritProjectSettings projectSettings); + + } +} diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritSettings.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritSettings.java new file mode 100644 index 00000000..03ed64e2 --- /dev/null +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/settings/GerritSettings.java @@ -0,0 +1,226 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2013 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.settings; + +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.components.StoragePathMacros; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.urswolfer.intellij.plugin.gerrit.ui.ShowProjectColumn; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; + +/** + * Parts based on org.jetbrains.plugins.github.GithubSettings + * + * @author oleg + * @author Urs Wolfer + */ +@State( + name = "GerritSettings", + storages = { + @Storage( + file = StoragePathMacros.APP_CONFIG + "/gerrit_settings.xml" + )} +) +public class GerritSettings implements PersistentStateComponent { + + private static final String GERRIT_SETTINGS_TAG = "GerritSettings"; + private static final String AUTOMATIC_REFRESH = "AutomaticRefresh"; + private static final String LIST_ALL_CHANGES = "ListAllChanges"; + private static final String REFRESH_TIMEOUT = "RefreshTimeout"; + private static final String REVIEW_NOTIFICATIONS = "ReviewNotifications"; + private static final String PUSH_TO_GERRIT = "PushToGerrit"; + private static final String SHOW_CHANGE_NUMBER_COLUMN = "ShowChangeNumberColumn"; + private static final String SHOW_CHANGE_ID_COLUMN = "ShowChangeIdColumn"; + private static final String SHOW_TOPIC_COLUMN = "ShowTopicColumn"; + private static final String SHOW_PROJECT_COLUMN = "ShowProjectColumn"; + + private Element element; + + private boolean listAllChanges = false; + private boolean automaticRefresh = true; + private int refreshTimeout = 15; + private boolean refreshNotifications = true; + private boolean pushToGerrit = false; + private boolean showChangeNumberColumn = false; + private boolean showChangeIdColumn = false; + private boolean showTopicColumn = false; + private ShowProjectColumn showProjectColumn = ShowProjectColumn.AUTO; + + private Logger log; + + public Element getState() { + if (element == null){ + element = new Element(GERRIT_SETTINGS_TAG); + } + element.setAttribute(LIST_ALL_CHANGES, Boolean.toString(getListAllChanges())); + element.setAttribute(AUTOMATIC_REFRESH, Boolean.toString(getAutomaticRefresh())); + element.setAttribute(REFRESH_TIMEOUT, Integer.toString(getRefreshTimeout())); + element.setAttribute(REVIEW_NOTIFICATIONS, Boolean.toString(getReviewNotifications())); + element.setAttribute(PUSH_TO_GERRIT, Boolean.toString(getPushToGerrit())); + element.setAttribute(SHOW_CHANGE_NUMBER_COLUMN, Boolean.toString(getShowChangeNumberColumn())); + element.setAttribute(SHOW_CHANGE_ID_COLUMN, Boolean.toString(getShowChangeIdColumn())); + element.setAttribute(SHOW_TOPIC_COLUMN, Boolean.toString(getShowTopicColumn())); + element.setAttribute(SHOW_PROJECT_COLUMN, getShowProjectColumn().name()); + return element; + } + + public void loadState(@NotNull final Element element) { + // All the logic on retrieving password was moved to getPassword action to cleanup initialization process + try { + this.element = element; + setListAllChanges(getBooleanValue(element, LIST_ALL_CHANGES)); + setAutomaticRefresh(getBooleanValue(element, AUTOMATIC_REFRESH)); + setRefreshTimeout(getIntegerValue(element, REFRESH_TIMEOUT)); + setReviewNotifications(getBooleanValue(element, REVIEW_NOTIFICATIONS)); + setPushToGerrit(getBooleanValue(element, PUSH_TO_GERRIT)); + setShowChangeNumberColumn(getBooleanValue(element, SHOW_CHANGE_NUMBER_COLUMN)); + setShowChangeIdColumn(getBooleanValue(element, SHOW_CHANGE_ID_COLUMN)); + setShowTopicColumn(getBooleanValue(element, SHOW_TOPIC_COLUMN)); + setShowProjectColumn(getShowProjectColumnValue(element, SHOW_PROJECT_COLUMN)); + } catch (Exception e) { + log.error("Error happened while loading gerrit settings: " + e); + } + } + + public GerritProjectSettings forFocusedProject(){ + DataContext dataContext = DataManager.getInstance().getDataContextFromFocus().getResultSync(); + Project project = CommonDataKeys.PROJECT.getData(dataContext); + return forProject(project); + } + + public GerritProjectSettings forProject(Project project){ + GerritProjectSettings projectSettings = ServiceManager.getService(project, GerritProjectSettings.class); + projectSettings.setLog(log); + return projectSettings; + } + + private boolean getBooleanValue(Element element, String attributeName) { + String attributeValue = element.getAttributeValue(attributeName); + if (attributeValue != null) { + return Boolean.valueOf(attributeValue); + } else { + return false; + } + } + + private int getIntegerValue(Element element, String attributeName) { + String attributeValue = element.getAttributeValue(attributeName); + if (attributeValue != null) { + return Integer.valueOf(attributeValue); + } else { + return 0; + } + } + + private ShowProjectColumn getShowProjectColumnValue(Element element, String attributeName) { + String attributeValue = element.getAttributeValue(attributeName); + if (attributeValue != null) { + return ShowProjectColumn.valueOf(attributeValue); + } else { + return ShowProjectColumn.AUTO; + } + } + + public boolean getListAllChanges() { + return listAllChanges; + } + + public void setListAllChanges(boolean listAllChanges) { + this.listAllChanges = listAllChanges; + } + + public boolean getAutomaticRefresh() { + return automaticRefresh; + } + + public int getRefreshTimeout() { + return refreshTimeout; + } + + public boolean getReviewNotifications() { + return refreshNotifications; + } + + public void setAutomaticRefresh(final boolean automaticRefresh) { + this.automaticRefresh = automaticRefresh; + } + + public void setRefreshTimeout(final int refreshTimeout) { + this.refreshTimeout = refreshTimeout; + } + + public void setReviewNotifications(final boolean reviewNotifications) { + refreshNotifications = reviewNotifications; + } + + public void setPushToGerrit(boolean pushToGerrit) { + this.pushToGerrit = pushToGerrit; + } + + public boolean getPushToGerrit() { + return pushToGerrit; + } + + public boolean getShowChangeNumberColumn() { + return showChangeNumberColumn; + } + + public void setShowChangeNumberColumn(boolean showChangeNumberColumn) { + this.showChangeNumberColumn = showChangeNumberColumn; + } + + public boolean getShowChangeIdColumn() { + return showChangeIdColumn; + } + + public void setShowChangeIdColumn(boolean showChangeIdColumn) { + this.showChangeIdColumn = showChangeIdColumn; + } + + public boolean getShowTopicColumn() { + return showTopicColumn; + } + + public ShowProjectColumn getShowProjectColumn() { + return showProjectColumn; + } + + public void setShowProjectColumn(ShowProjectColumn showProjectColumn) { + this.showProjectColumn = showProjectColumn; + } + + public void setShowTopicColumn(boolean showTopicColumn) { + this.showTopicColumn = showTopicColumn; + } + + public void setLog(Logger log) { + this.log = log; + } + + Element getElement(){ + return element; + } +} diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeListPanel.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeListPanel.java index e0d3c61c..90f2f1ac 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeListPanel.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeListPanel.java @@ -44,7 +44,7 @@ import com.intellij.util.ui.ListTableModel; import com.intellij.util.ui.StatusText; import com.intellij.util.ui.UIUtil; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.SelectedRevisions; import com.urswolfer.intellij.plugin.gerrit.rest.LoadChangesProxy; import git4idea.GitUtil; @@ -168,7 +168,7 @@ public void actionPerformed(ActionEvent actionEvent) { } public void showSetupHintWhenRequired(final Project project) { - if (!gerritSettings.isLoginAndPasswordAvailable()) { + if (!gerritSettings.forProject(project).isLoginAndPasswordAvailable()) { StatusText emptyText = table.getEmptyText(); emptyText.appendText("Open "); emptyText.appendText("settings", SimpleTextAttributes.LINK_ATTRIBUTES, new ActionListener() { diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecorator.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecorator.java index 3850c845..c53b6250 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecorator.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecorator.java @@ -32,12 +32,12 @@ */ public interface GerritChangeNodeDecorator { /** - * Decorate the {@code component} on the provided {@code change} in the provided {@code project} + * Decorate the {@code component} on the provided {@code change} */ - void decorate(Project project, Change change, SimpleColoredComponent component, ChangeInfo selectedChange); + void decorate(Change change, SimpleColoredComponent component, ChangeInfo selectedChange); /** * This method is called, when a new change is selected in the changes list panel */ - void onChangeSelected(Project project, ChangeInfo selectedChange); + void onChangeSelected(ChangeInfo selectedChange); } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecoratorProvider.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecoratorProvider.java new file mode 100644 index 00000000..2a1bb714 --- /dev/null +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritChangeNodeDecoratorProvider.java @@ -0,0 +1,26 @@ +/* + * Copyright 2020 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; + +import com.intellij.openapi.project.Project; + +/** + * @author Réda Housni Alaoui + */ +public interface GerritChangeNodeDecoratorProvider { + GerritChangeNodeDecorator get(Project project); +} diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritCommentCountChangeNodeDecorator.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritCommentCountChangeNodeDecorator.java index 59e1ea61..c7c76348 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritCommentCountChangeNodeDecorator.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritCommentCountChangeNodeDecorator.java @@ -32,11 +32,16 @@ import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; import com.urswolfer.gerrit.client.rest.GerritRestApi; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.SelectedRevisions; +import com.urswolfer.intellij.plugin.gerrit.rest.GerritApiProvider; import com.urswolfer.intellij.plugin.gerrit.util.PathUtils; - -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; /** * @author Thomas Forrer @@ -44,14 +49,11 @@ public class GerritCommentCountChangeNodeDecorator implements GerritChangeNodeDecorator { private static final Joiner SUFFIX_JOINER = Joiner.on(", ").skipNulls(); - @Inject - private GerritRestApi gerritApi; - @Inject - private PathUtils pathUtils; - @Inject - private GerritSettings gerritSettings; - @Inject - private Logger log; + private final Project project; + private final GerritRestApi gerritApi; + private final PathUtils pathUtils; + private final GerritProjectSettings gerritSettings; + private final Logger log; private final SelectedRevisions selectedRevisions; @@ -59,8 +61,12 @@ public class GerritCommentCountChangeNodeDecorator implements GerritChangeNodeDe private Supplier>> comments = setupCommentsSupplier(); private Supplier>> drafts = setupDraftsSupplier(); - @Inject - public GerritCommentCountChangeNodeDecorator(SelectedRevisions selectedRevisions) { + private GerritCommentCountChangeNodeDecorator(Project project, GerritApiProvider gerritApiProvider, PathUtils pathUtils, GerritSettings gerritSettings, Logger log, SelectedRevisions selectedRevisions) { + this.project = project; + this.gerritApi = gerritApiProvider.get(project); + this.pathUtils = pathUtils; + this.gerritSettings = gerritSettings.forProject(project); + this.log = log; this.selectedRevisions = selectedRevisions; this.selectedRevisions.addObserver(new Observer() { @Override @@ -74,7 +80,7 @@ public void update(Observable o, Object arg) { } @Override - public void decorate(Project project, Change change, SimpleColoredComponent component, ChangeInfo selectedChange) { + public void decorate(Change change, SimpleColoredComponent component, ChangeInfo selectedChange) { String affectedFilePath = getAffectedFilePath(change); if (affectedFilePath != null) { String text = getNodeSuffix(project, affectedFilePath); @@ -86,7 +92,7 @@ public void decorate(Project project, Change change, SimpleColoredComponent comp } @Override - public void onChangeSelected(Project project, ChangeInfo selectedChange) { + public void onChangeSelected(ChangeInfo selectedChange) { this.selectedChange = selectedChange; comments = setupCommentsSupplier(); drafts = setupDraftsSupplier(); @@ -168,4 +174,28 @@ public Map> get() { private String getSelectedRevisionId() { return selectedRevisions.get(selectedChange); } + + public static class Provider implements GerritChangeNodeDecoratorProvider { + + @Inject + private PathUtils pathUtils; + @Inject + private GerritSettings gerritSettings; + @Inject + private GerritApiProvider gerritApiProvider; + @Inject + private Logger log; + + private final SelectedRevisions selectedRevisions; + + @Inject + Provider(SelectedRevisions selectedRevisions) { + this.selectedRevisions = selectedRevisions; + } + + @Override + public GerritChangeNodeDecorator get(Project project) { + return new GerritCommentCountChangeNodeDecorator(project, gerritApiProvider, pathUtils, gerritSettings, log, selectedRevisions); + } + } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurable.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurable.java index 964db146..3286fe32 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurable.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurable.java @@ -17,20 +17,16 @@ package com.urswolfer.intellij.plugin.gerrit.ui; -import com.google.inject.Inject; -import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vcs.VcsConfigurableProvider; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; +import javax.swing.JComponent; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; /** * Parts based on org.jetbrains.plugins.github.ui.GithubSettingsConfigurable @@ -38,15 +34,20 @@ * @author oleg * @author Urs Wolfer */ -public class GerritSettingsConfigurable implements SearchableConfigurable, VcsConfigurableProvider { +public class GerritSettingsConfigurable implements SearchableConfigurable { public static final String NAME = "Gerrit"; private static final String DEFAULT_PASSWORD_TEXT = "************"; private SettingsPanel settingsPane; - @Inject - private GerritSettings gerritSettings; - @Inject - private GerritUpdatesNotificationComponent gerritUpdatesNotificationComponent; + private final Project project; + private final GerritSettings gerritSettings; + private final GerritUpdatesNotificationComponent gerritUpdatesNotificationComponent; + + public GerritSettingsConfigurable(Project project, GerritSettings gerritSettings, GerritUpdatesNotificationComponent gerritUpdatesNotificationComponent) { + this.project = project; + this.gerritSettings = gerritSettings; + this.gerritUpdatesNotificationComponent = gerritUpdatesNotificationComponent; + } @NotNull public String getDisplayName() { @@ -60,15 +61,16 @@ public String getHelpTopic() { public JComponent createComponent() { if (settingsPane == null) { - settingsPane = GerritModule.getInstance(SettingsPanel.class); + settingsPane = GerritModule.getInstance(SettingsPanel.Factory.class).build(project); } return settingsPane.getPanel(); } public boolean isModified() { - return settingsPane != null && (!Comparing.equal(gerritSettings.getLogin(), settingsPane.getLogin()) || + GerritProjectSettings projectSettings = gerritSettings.forProject(project); + return settingsPane != null && (!Comparing.equal(projectSettings.getLogin(), settingsPane.getLogin()) || isPasswordModified() || - !Comparing.equal(gerritSettings.getHost(), settingsPane.getHost()) || + !Comparing.equal(projectSettings.getHost(), settingsPane.getHost()) || !Comparing.equal(gerritSettings.getAutomaticRefresh(), settingsPane.getAutomaticRefresh()) || !Comparing.equal(gerritSettings.getListAllChanges(), settingsPane.getListAllChanges()) || !Comparing.equal(gerritSettings.getRefreshTimeout(), settingsPane.getRefreshTimeout()) || @@ -78,7 +80,7 @@ public boolean isModified() { !Comparing.equal(gerritSettings.getShowChangeIdColumn(), settingsPane.getShowChangeIdColumn()) || !Comparing.equal(gerritSettings.getShowTopicColumn(), settingsPane.getShowTopicColumn()) || !Comparing.equal(gerritSettings.getShowProjectColumn(), settingsPane.getShowProjectColumn()) || - !Comparing.equal(gerritSettings.getCloneBaseUrl(), settingsPane.getCloneBaseUrl())); + !Comparing.equal(projectSettings.getCloneBaseUrl(), settingsPane.getCloneBaseUrl())); } private boolean isPasswordModified() { @@ -87,12 +89,13 @@ private boolean isPasswordModified() { public void apply() throws ConfigurationException { if (settingsPane != null) { - gerritSettings.setLogin(settingsPane.getLogin()); + GerritProjectSettings projectSettings = gerritSettings.forProject(project); if (isPasswordModified()) { - gerritSettings.setPassword(settingsPane.getPassword()); + projectSettings.setCredentials(settingsPane.getHost(), settingsPane.getLogin(), settingsPane.getPassword()); settingsPane.resetPasswordModification(); + } else { + projectSettings.setCredentials(settingsPane.getHost(), settingsPane.getLogin()); } - gerritSettings.setHost(settingsPane.getHost()); gerritSettings.setListAllChanges(settingsPane.getListAllChanges()); gerritSettings.setAutomaticRefresh(settingsPane.getAutomaticRefresh()); gerritSettings.setRefreshTimeout(settingsPane.getRefreshTimeout()); @@ -102,7 +105,7 @@ public void apply() throws ConfigurationException { gerritSettings.setShowChangeIdColumn(settingsPane.getShowChangeIdColumn()); gerritSettings.setShowTopicColumn(settingsPane.getShowTopicColumn()); gerritSettings.setShowProjectColumn(settingsPane.getShowProjectColumn()); - gerritSettings.setCloneBaseUrl(settingsPane.getCloneBaseUrl()); + projectSettings.setCloneBaseUrl(settingsPane.getCloneBaseUrl()); gerritUpdatesNotificationComponent.handleConfigurationChange(); } @@ -110,11 +113,12 @@ public void apply() throws ConfigurationException { public void reset() { if (settingsPane != null) { - String login = gerritSettings.getLogin(); + GerritProjectSettings projectSettings = gerritSettings.forProject(project); + String login = projectSettings.getLogin(); settingsPane.setLogin(login); settingsPane.setPassword(StringUtil.isEmptyOrSpaces(login) ? "" : DEFAULT_PASSWORD_TEXT); settingsPane.resetPasswordModification(); - settingsPane.setHost(gerritSettings.getHost()); + settingsPane.setHost(projectSettings.getHost()); settingsPane.setListAllChanges(gerritSettings.getListAllChanges()); settingsPane.setAutomaticRefresh(gerritSettings.getAutomaticRefresh()); settingsPane.setRefreshTimeout(gerritSettings.getRefreshTimeout()); @@ -124,7 +128,7 @@ public void reset() { settingsPane.setShowChangeIdColumn(gerritSettings.getShowChangeIdColumn()); settingsPane.setShowTopicColumn(gerritSettings.getShowTopicColumn()); settingsPane.setShowProjectColumn(gerritSettings.getShowProjectColumn()); - settingsPane.setCloneBaseUrl(gerritSettings.getCloneBaseUrl()); + settingsPane.setCloneBaseUrl(projectSettings.getCloneBaseUrl()); } } @@ -141,71 +145,4 @@ public Runnable enableSearch(String option) { return null; } - @Nullable - @Override - public Configurable getConfigurable(Project project) { - return this; - } - - public static class Proxy extends GerritSettingsConfigurable { - private GerritSettingsConfigurable delegate; - - public Proxy() { - delegate = GerritModule.getInstance(GerritSettingsConfigurable.class); - } - - @Override - @NotNull - public String getDisplayName() { - return delegate.getDisplayName(); - } - - @Override - @NotNull - public String getHelpTopic() { - return delegate.getHelpTopic(); - } - - @Override - public JComponent createComponent() { - return delegate.createComponent(); - } - - @Override - public boolean isModified() { - return delegate.isModified(); - } - - @Override - public void apply() throws ConfigurationException { - delegate.apply(); - } - - @Override - public void reset() { - delegate.reset(); - } - - @Override - public void disposeUIResources() { - delegate.disposeUIResources(); - } - - @Override - @NotNull - public String getId() { - return delegate.getId(); - } - - @Override - public Runnable enableSearch(String option) { - return delegate.enableSearch(option); - } - - @Nullable - @Override - public Configurable getConfigurable(Project project) { - return delegate.getConfigurable(project); - } - } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurableProvider.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurableProvider.java new file mode 100644 index 00000000..6f7994ab --- /dev/null +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritSettingsConfigurableProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright 2020 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; + +import com.google.inject.Inject; +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.VcsConfigurableProvider; +import com.urswolfer.intellij.plugin.gerrit.GerritModule; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; +import org.jetbrains.annotations.Nullable; + +/** + * @author Réda Housni Alaoui + */ +public class GerritSettingsConfigurableProvider implements VcsConfigurableProvider { + + @Inject + private GerritSettings gerritSettings; + @Inject + private GerritUpdatesNotificationComponent gerritUpdatesNotificationComponent; + + @Nullable + @Override + public Configurable getConfigurable(Project project) { + return new GerritSettingsConfigurable(project, gerritSettings, gerritUpdatesNotificationComponent); + } + + public static class Proxy extends GerritSettingsConfigurableProvider { + private GerritSettingsConfigurableProvider delegate; + + public Proxy() { + delegate = GerritModule.getInstance(GerritSettingsConfigurableProvider.class); + } + + @Nullable + @Override + public Configurable getConfigurable(Project project) { + return delegate.getConfigurable(project); + } + } +} diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritToolWindow.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritToolWindow.java index b6f6e7f6..82956536 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritToolWindow.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritToolWindow.java @@ -34,7 +34,7 @@ import com.intellij.ui.JBSplitter; import com.intellij.ui.OnePixelSplitter; import com.intellij.util.Consumer; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.rest.LoadChangesProxy; import com.urswolfer.intellij.plugin.gerrit.ui.filter.ChangesFilter; @@ -135,7 +135,7 @@ public void reloadChanges(final Project project, boolean requestSettingsIfNonExi } private void getChanges(Project project, boolean requestSettingsIfNonExistent, Consumer consumer) { - String apiUrl = gerritSettings.getHost(); + String apiUrl = gerritSettings.forProject(project).getHost(); if (Strings.isNullOrEmpty(apiUrl)) { if (requestSettingsIfNonExistent) { final LoginDialog dialog = new LoginDialog(project, gerritSettings, gerritUtil, log); diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUiModule.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUiModule.java index 39cdb15f..029ece51 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUiModule.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUiModule.java @@ -28,11 +28,11 @@ public class GerritUiModule extends AbstractModule { protected void configure() { install(new GerritFilterModule()); bind(GerritSelectRevisionInfoColumn.class); - Multibinder decorators = Multibinder.newSetBinder(binder(), GerritChangeNodeDecorator.class); - decorators.addBinding().to(GerritCommentCountChangeNodeDecorator.class); + Multibinder decoratorProviders = Multibinder.newSetBinder(binder(), GerritChangeNodeDecoratorProvider.class); + decoratorProviders.addBinding().to(GerritCommentCountChangeNodeDecorator.Provider.class); bind(RepositoryChangesBrowserProvider.class); - bind(SettingsPanel.class); - bind(GerritSettingsConfigurable.class); + bind(SettingsPanel.Factory.class); + bind(GerritSettingsConfigurableProvider.class); bind(GerritUpdatesNotificationComponent.class).asEagerSingleton(); bind(GerritChangeListPanel.class); } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUpdatesNotificationComponent.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUpdatesNotificationComponent.java index 1a7d32ad..7ff0748b 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUpdatesNotificationComponent.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/GerritUpdatesNotificationComponent.java @@ -23,7 +23,8 @@ import com.intellij.openapi.project.Project; import com.intellij.util.Consumer; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.util.NotificationBuilder; import com.urswolfer.intellij.plugin.gerrit.util.NotificationService; @@ -87,8 +88,9 @@ public void handleNotification() { return; } - if (Strings.isNullOrEmpty(gerritSettings.getHost()) - || Strings.isNullOrEmpty(gerritSettings.getLogin())) { + GerritProjectSettings projectSettings = gerritSettings.forProject(project); + if (Strings.isNullOrEmpty(projectSettings.getHost()) + || Strings.isNullOrEmpty(projectSettings.getLogin())) { return; } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/LoginDialog.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/LoginDialog.java index bd5a9379..b34fecd0 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/LoginDialog.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/LoginDialog.java @@ -21,7 +21,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.urswolfer.gerrit.client.rest.GerritAuthData; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritProjectSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import org.jetbrains.annotations.NotNull; @@ -50,9 +51,10 @@ public LoginDialog(final Project project, final GerritSettings gerritSettings, f this.project = project; this.log = log; loginPanel = new LoginPanel(this); - loginPanel.setHost(gerritSettings.getHost()); - loginPanel.setLogin(gerritSettings.getLogin()); - loginPanel.setPassword(gerritSettings.getPassword()); + GerritProjectSettings projectSettings = gerritSettings.forProject(project); + loginPanel.setHost(projectSettings.getHost()); + loginPanel.setLogin(projectSettings.getLogin()); + loginPanel.setPassword(projectSettings.getPassword()); setTitle("Login to Gerrit"); setOKButtonText("Login"); init(); @@ -88,9 +90,8 @@ protected void doOKAction() { try { boolean loggedSuccessfully = gerritUtil.checkCredentials(project, gerritAuthData); if (loggedSuccessfully) { - gerritSettings.setLogin(login); - gerritSettings.setPassword(password); - gerritSettings.setHost(host); + gerritSettings.forProject(project).setCredentials(host, login, password); + super.doOKAction(); } else { setErrorText("Can't login with given credentials"); diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/RepositoryChangesBrowserProvider.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/RepositoryChangesBrowserProvider.java index 7bbbfd6d..61e21959 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/RepositoryChangesBrowserProvider.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/RepositoryChangesBrowserProvider.java @@ -57,6 +57,7 @@ import git4idea.GitCommit; import git4idea.history.GitHistoryUtils; import git4idea.repo.GitRepository; +import java.util.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -82,7 +83,7 @@ public class RepositoryChangesBrowserProvider { @Inject private Logger log; @Inject - private Set changeNodeDecorators; + private Set changeNodeDecoratorProviders; @Inject private SelectedRevisions selectedRevisions; @@ -110,7 +111,8 @@ public void consume(ChangeInfo changeInfo) { private final class GerritRepositoryChangesBrowser extends RepositoryChangesBrowser { private ChangeInfo selectedChange; private Optional> baseRevision = Optional.absent(); - private Project project; + private final Project project; + private Set changeNodeDecorators; public GerritRepositoryChangesBrowser(Project project) { super(project, Collections.emptyList(), Collections.emptyList(), null); @@ -130,6 +132,10 @@ public void update(Observable o, Object arg) { } } }); + changeNodeDecorators = new HashSet(); + for(GerritChangeNodeDecoratorProvider decoratorProvider: changeNodeDecoratorProviders){ + changeNodeDecorators.add(decoratorProvider.get(project)); + } } @Override @@ -155,7 +161,7 @@ public void consume(ChangeInfo changeDetails) { baseRevision = Optional.absent(); selectBaseRevisionAction.setSelectedChange(selectedChange); for (GerritChangeNodeDecorator decorator : changeNodeDecorators) { - decorator.onChangeSelected(project, selectedChange); + decorator.onChangeSelected(selectedChange); } updateChangesBrowser(); } @@ -231,7 +237,7 @@ private ChangeNodeDecorator getChangeNodeDecorator() { @Override public void decorate(Change change, SimpleColoredComponent component, boolean isShowFlatten) { for (GerritChangeNodeDecorator decorator : changeNodeDecorators) { - decorator.decorate(project, change, component, selectedChange); + decorator.decorate(change, component, selectedChange); } } 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..af14cf5b 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 @@ -20,6 +20,7 @@ import com.google.common.base.Strings; import com.google.inject.Inject; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; @@ -27,16 +28,23 @@ import com.intellij.ui.GuiUtils; import com.intellij.ui.components.JBTextField; import com.urswolfer.gerrit.client.rest.GerritAuthData; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JSpinner; +import javax.swing.JTextField; +import javax.swing.JTextPane; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; /** * Parts based on org.jetbrains.plugins.github.ui.GithubSettingsPanel @@ -66,14 +74,10 @@ public class SettingsPanel { private boolean passwordModified; - @Inject - private GerritSettings gerritSettings; - @Inject - private GerritUtil gerritUtil; - @Inject - private Logger log; - - public SettingsPanel() { + private SettingsPanel(final Project project, + final GerritSettings gerritSettings, + final GerritUtil gerritUtil, + final Logger log) { hostTextField.getEmptyText().setText("https://review.example.org"); gerritLoginInfoTextField.setText(LoginPanel.LOGIN_CREDENTIALS_INFO); @@ -81,7 +85,7 @@ public SettingsPanel() { testButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - String password = isPasswordModified() ? getPassword() : gerritSettings.getPassword(); + String password = isPasswordModified() ? getPassword() : gerritSettings.forProject(project).getPassword(); String host = getHost(); if (Strings.isNullOrEmpty(host)) { Messages.showErrorDialog(pane, "Required field URL not specified", "Test Failure"); @@ -276,5 +280,19 @@ public String getCloneBaseUrl() { return cloneBaseUrlTextField.getText().trim(); } + public static class Factory { + + @Inject + private GerritSettings gerritSettings; + @Inject + private GerritUtil gerritUtil; + @Inject + private Logger log; + + public SettingsPanel build(Project project) { + return new SettingsPanel(project, gerritSettings, gerritUtil, log); + } + + } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AbstractLoggedInChangeAction.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AbstractLoggedInChangeAction.java index dcf9e4b8..1d158db8 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AbstractLoggedInChangeAction.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AbstractLoggedInChangeAction.java @@ -18,7 +18,7 @@ import com.google.inject.Inject; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import javax.swing.*; @@ -38,6 +38,6 @@ public AbstractLoggedInChangeAction(String text, String description, Icon icon) @Override public void update(AnActionEvent e) { - e.getPresentation().setEnabled(gerritSettings.isLoginAndPasswordAvailable()); + e.getPresentation().setEnabled(gerritSettings.forProject(e.getProject()).isLoginAndPasswordAvailable()); } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AddReviewersAction.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AddReviewersAction.java index c8de9af3..cd94a980 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AddReviewersAction.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/AddReviewersAction.java @@ -41,8 +41,8 @@ import com.intellij.ui.EditorTextFieldProvider; import com.intellij.ui.SoftWrapsEditorCustomization; import com.intellij.util.TextFieldCompletionProviderDumbAware; -import com.urswolfer.gerrit.client.rest.GerritRestApi; import com.urswolfer.intellij.plugin.gerrit.GerritModule; +import com.urswolfer.intellij.plugin.gerrit.rest.GerritApiProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -58,7 +58,7 @@ @SuppressWarnings("ComponentNotRegistered") // proxy class below is registered public class AddReviewersAction extends AbstractLoggedInChangeAction { @Inject - private GerritRestApi gerritApi; + private GerritApiProvider gerritApiProvider; public AddReviewersAction() { super("Add Reviewers", "Add Reviewers to Change", AllIcons.Toolwindows.ToolWindowTodo); @@ -73,7 +73,7 @@ public void actionPerformed(AnActionEvent anActionEvent) { return; } - AddReviewersDialog dialog = new AddReviewersDialog(project, true, gerritApi, selectedChange.get()); + AddReviewersDialog dialog = new AddReviewersDialog(project, true, gerritApiProvider.get(project), selectedChange.get()); dialog.show(); if (!dialog.isOK()) { return; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/OpenInBrowserAction.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/OpenInBrowserAction.java index 7e13584f..96fb64b2 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/OpenInBrowserAction.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/OpenInBrowserAction.java @@ -21,9 +21,10 @@ import com.google.inject.Inject; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; /** * @author Urs Wolfer @@ -43,12 +44,12 @@ public void actionPerformed(AnActionEvent anActionEvent) { if (!selectedChange.isPresent()) { return; } - String urlToOpen = getUrl(selectedChange.get()); + String urlToOpen = getUrl(anActionEvent.getProject(), selectedChange.get()); BrowserUtil.browse(urlToOpen); } - private String getUrl(ChangeInfo change) { - String url = gerritSettings.getHost(); + private String getUrl(Project project, ChangeInfo change) { + String url = gerritSettings.forProject(project).getHost(); int changeNumber = change._number; return String.format("%s/%s", url, changeNumber); } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewAction.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewAction.java index 2729aaf2..05e19cc2 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewAction.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewAction.java @@ -29,7 +29,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.project.Project; import com.intellij.util.Consumer; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.SelectedRevisions; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.ui.ReviewDialog; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionFactory.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionFactory.java index 503a2cae..38ed61f7 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionFactory.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionFactory.java @@ -17,7 +17,7 @@ package com.urswolfer.intellij.plugin.gerrit.ui.action; import com.google.inject.Inject; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.SelectedRevisions; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.util.NotificationService; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionGroup.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionGroup.java index b40d2991..47f54087 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionGroup.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/action/ReviewActionGroup.java @@ -34,7 +34,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -68,7 +68,7 @@ public ReviewActionGroup() { @Override public void update(AnActionEvent e) { - e.getPresentation().setEnabled(gerritSettings.isLoginAndPasswordAvailable()); + e.getPresentation().setEnabled(gerritSettings.forProject(e.getProject()).isLoginAndPasswordAvailable()); } @Override diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentAction.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentAction.java index 0489cad6..944b695e 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentAction.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentAction.java @@ -32,7 +32,7 @@ import com.intellij.openapi.ui.popup.JBPopupAdapter; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.util.Consumer; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import javax.swing.*; @@ -100,7 +100,7 @@ public void actionPerformed(AnActionEvent e) { @Override public void update(AnActionEvent e) { - e.getPresentation().setEnabled(gerritSettings.isLoginAndPasswordAvailable()); + e.getPresentation().setEnabled(gerritSettings.forProject(e.getProject()).isLoginAndPasswordAvailable()); } private void addVersionedComment(final Project project) { diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentActionBuilder.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentActionBuilder.java index f8732754..7af5ed61 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentActionBuilder.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/AddCommentActionBuilder.java @@ -6,7 +6,7 @@ import com.google.inject.Inject; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.markup.RangeHighlighter; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import javax.swing.*; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentDoneAction.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentDoneAction.java index a14178f2..513992b4 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentDoneAction.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentDoneAction.java @@ -28,7 +28,7 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.util.Consumer; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; /** @@ -84,6 +84,6 @@ public void consume(CommentInfo commentInfo) { @Override public void update(AnActionEvent e) { - e.getPresentation().setEnabled(gerritSettings.isLoginAndPasswordAvailable()); + e.getPresentation().setEnabled(gerritSettings.forProject(e.getProject()).isLoginAndPasswordAvailable()); } } diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentGutterIconRenderer.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentGutterIconRenderer.java index 37928be7..7bdc97c8 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentGutterIconRenderer.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentGutterIconRenderer.java @@ -27,7 +27,7 @@ import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.util.text.DateFormatUtil; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.util.CommentHelper; import com.urswolfer.intellij.plugin.gerrit.util.TextToHtml; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentsDiffTool.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentsDiffTool.java index b09b0fab..58e427c5 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentsDiffTool.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/diff/CommentsDiffTool.java @@ -58,7 +58,7 @@ import com.intellij.ui.PopupHandler; import com.intellij.util.Consumer; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.SelectedRevisions; import com.urswolfer.intellij.plugin.gerrit.rest.GerritUtil; import com.urswolfer.intellij.plugin.gerrit.util.GerritUserDataKeys; diff --git a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/BranchFilter.java b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/BranchFilter.java index ec25cbbb..5ebe85e0 100644 --- a/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/BranchFilter.java +++ b/src/main/java/com/urswolfer/intellij/plugin/gerrit/ui/filter/BranchFilter.java @@ -125,7 +125,7 @@ public void actionPerformed(AnActionEvent e) { } private String getNameForRepository(GitRepository repository) { - return Iterables.getFirst(gerritUtil.getProjectNames(repository.getRemotes()), ""); + return Iterables.getFirst(gerritUtil.getProjectNames(repository.getProject(), repository.getRemotes()), ""); } private final class BranchDescriptor { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f5dce2ba..ae45070a 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -466,9 +466,11 @@ - - + + + diff --git a/src/test/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritTestModule.java b/src/test/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritTestModule.java index 45fe80bd..b15065b7 100644 --- a/src/test/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritTestModule.java +++ b/src/test/java/com/urswolfer/intellij/plugin/gerrit/rest/GerritTestModule.java @@ -31,7 +31,7 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.urswolfer.gerrit.client.rest.GerritAuthData; import com.urswolfer.intellij.plugin.gerrit.GerritModule; -import com.urswolfer.intellij.plugin.gerrit.GerritSettings; +import com.urswolfer.intellij.plugin.gerrit.settings.GerritSettings; import com.urswolfer.intellij.plugin.gerrit.OpenIdeDependenciesModule; import git4idea.commands.Git; import org.easymock.EasyMock;