From d7e1cefacfdc3000cab0eaeed612918b8326bda7 Mon Sep 17 00:00:00 2001 From: Ivan Semenov Date: Tue, 23 Jan 2018 21:03:47 +0300 Subject: [PATCH] Github clone url autocomplete list loader --- .../GithubRepositoryHostingService.java | 73 +++++++++++++++++++ .../plugins/github/util/GithubUrlUtil.java | 16 +++- 2 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 plugins/github/src/org/jetbrains/plugins/github/extensions/GithubRepositoryHostingService.java diff --git a/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubRepositoryHostingService.java b/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubRepositoryHostingService.java new file mode 100644 index 000000000000..23eda1a14619 --- /dev/null +++ b/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubRepositoryHostingService.java @@ -0,0 +1,73 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.github.extensions; + +import com.intellij.dvcs.hosting.RepositoryListLoader; +import com.intellij.dvcs.hosting.RepositoryListLoadingException; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; +import git4idea.DialogManager; +import git4idea.remote.GitRepositoryHostingService; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.github.api.GithubApiUtil; +import org.jetbrains.plugins.github.api.data.GithubRepo; +import org.jetbrains.plugins.github.ui.GithubLoginDialog; +import org.jetbrains.plugins.github.util.*; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class GithubRepositoryHostingService extends GitRepositoryHostingService { + @NotNull + @Override + public String getServiceDisplayName() { + return "GitHub"; + } + + @Override + @NotNull + public RepositoryListLoader getRepositoryListLoader(@NotNull Project project) { + return new RepositoryListLoader() { + @NotNull private final GithubAuthDataHolder myAuthDataHolder = GithubAuthDataHolder.createFromSettings(); + + @Override + public boolean isEnabled() { + return AuthLevel.LOGGED.accepts(myAuthDataHolder.getAuthData()); + } + + @Override + public boolean enable() { + GithubAuthData currentAuthData = myAuthDataHolder.getAuthData(); + myAuthDataHolder.runTransaction(currentAuthData, () -> { + GithubLoginDialog dialog = new GithubLoginDialog(project, currentAuthData, AuthLevel.LOGGED); + DialogManager.show(dialog); + if (dialog.isOK()) { + GithubAuthData authData = dialog.getAuthData(); + GithubSettings.getInstance().setAuthData(authData, dialog.isSavePasswordSelected()); + return authData; + } + return currentAuthData; + }); + return isEnabled(); + } + + @NotNull + @Override + public List getAvailableRepositories(@NotNull ProgressIndicator progressIndicator) throws RepositoryListLoadingException { + try { + return GithubUtil.runTask(project, myAuthDataHolder, progressIndicator, connection -> GithubApiUtil.getAvailableRepos(connection)) + .stream() + .sorted(Comparator.comparing(GithubRepo::getUserName).thenComparing(GithubRepo::getName)) + .map(repo -> GithubUrlUtil + .getCloneUrl(GithubUrlUtil.getGitHostWithoutProtocol(myAuthDataHolder.getAuthData().getHost()), + repo.getUserName(), + repo.getName())) + .collect(Collectors.toList()); + } + catch (Exception e) { + throw new RepositoryListLoadingException("Error connecting to Github", e); + } + } + }; + } +} diff --git a/plugins/github/src/org/jetbrains/plugins/github/util/GithubUrlUtil.java b/plugins/github/src/org/jetbrains/plugins/github/util/GithubUrlUtil.java index 5b21a226d172..6bc000e1eaab 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/util/GithubUrlUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/util/GithubUrlUtil.java @@ -104,7 +104,12 @@ public class GithubUrlUtil { */ @NotNull public static String getGitHostWithoutProtocol() { - return removeTrailingSlash(removeProtocolPrefix(GithubSettings.getInstance().getHost())); + return getGitHostWithoutProtocol(GithubSettings.getInstance().getHost()); + } + + @NotNull + public static String getGitHostWithoutProtocol(@NotNull String host) { + return removeTrailingSlash(removeProtocolPrefix(host)); } /* @@ -209,11 +214,16 @@ public class GithubUrlUtil { @NotNull public static String getCloneUrl(@NotNull String user, @NotNull String repo) { + return getCloneUrl(getGitHostWithoutProtocol(), user, repo); + } + + @NotNull + public static String getCloneUrl(@NotNull String host, @NotNull String user, @NotNull String repo) { if (GithubSettings.getInstance().isCloneGitUsingSsh()) { - return "git@" + getGitHostWithoutProtocol() + ":" + user + "/" + repo + ".git"; + return "git@" + host + ":" + user + "/" + repo + ".git"; } else { - return getApiProtocol() + getGitHostWithoutProtocol() + "/" + user + "/" + repo + ".git"; + return getApiProtocol() + host + "/" + user + "/" + repo + ".git"; } } }