diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2017-03-06 23:20:55 +0200 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2017-03-08 18:57:20 +0000 |
commit | 69f978efca60012e55a443a88bf86c1cae7be728 (patch) | |
tree | fc4bc03eb74045f9cd86b8575e326c602a6f95c2 /src/plugins/git/gerrit/gerritparameters.cpp | |
parent | b7412814ab2389bfb1d5c8e6771310cbc6c6553e (diff) | |
download | qt-creator-69f978efca60012e55a443a88bf86c1cae7be728.tar.gz |
Gerrit: Split GerritServer to its own file
It became much larger than GerritParameters. No reason to keep them
together.
Change-Id: Ib125f124940e95b0e15616d150f6b44fdb428284
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Diffstat (limited to 'src/plugins/git/gerrit/gerritparameters.cpp')
-rw-r--r-- | src/plugins/git/gerrit/gerritparameters.cpp | 191 |
1 files changed, 2 insertions, 189 deletions
diff --git a/src/plugins/git/gerrit/gerritparameters.cpp b/src/plugins/git/gerrit/gerritparameters.cpp index 86f8acde28..b98f36b896 100644 --- a/src/plugins/git/gerrit/gerritparameters.cpp +++ b/src/plugins/git/gerrit/gerritparameters.cpp @@ -25,19 +25,11 @@ #include "gerritparameters.h" #include "gerritplugin.h" -#include "authenticationdialog.h" -#include "../gitplugin.h" -#include "../gitclient.h" -#include <coreplugin/shellcommand.h> #include <utils/hostosinfo.h> #include <utils/pathchooser.h> -#include <QDebug> #include <QDir> -#include <QFileInfo> -#include <QJsonDocument> -#include <QRegularExpression> #include <QSettings> #include <QStandardPaths> @@ -54,14 +46,10 @@ static const char portFlagKeyC[] = "PortFlag"; static const char sshKeyC[] = "Ssh"; static const char curlKeyC[] = "Curl"; static const char httpsKeyC[] = "Https"; -static const char defaultHostC[] = "codereview.qt-project.org"; static const char savedQueriesKeyC[] = "SavedQueries"; -static const char accountUrlC[] = "/accounts/self"; static const char defaultPortFlag[] = "-p"; -enum { defaultPort = 29418 }; - static inline QString detectApp(const char *defaultExe) { const QString defaultApp = HostOsInfo::withExecutableSuffix(QLatin1String(defaultExe)); @@ -100,37 +88,6 @@ static inline QString detectSsh() return detectApp("ssh"); } -bool GerritUser::isSameAs(const GerritUser &other) const -{ - if (!userName.isEmpty() && !other.userName.isEmpty()) - return userName == other.userName; - if (!fullName.isEmpty() && !other.fullName.isEmpty()) - return fullName == other.fullName; - return false; -} - -GerritServer::GerritServer() - : host(defaultHostC) - , port(defaultPort) -{ -} - -GerritServer::GerritServer(const QString &host, unsigned short port, - const QString &userName, HostType type) - : host(host) - , port(port) - , type(type) -{ - user.userName = userName; -} - -bool GerritServer::operator==(const GerritServer &other) const -{ - if (port && other.port && port != other.port) - return false; - return host == other.host && user.isSameAs(other.user) && type == other.type; -} - void GerritParameters::setPortFlagBySshType() { bool isPlink = false; @@ -147,150 +104,6 @@ GerritParameters::GerritParameters() { } -QString GerritServer::hostArgument() const -{ - if (!authenticated || user.userName.isEmpty()) - return host; - return user.userName + '@' + host; -} - -QString GerritServer::url(UrlType urlType) const -{ - QString protocol; - switch (type) { - case Ssh: protocol = "ssh"; break; - case Http: protocol = "http"; break; - case Https: protocol = "https"; break; - } - QString res = protocol + "://"; - if (type == Ssh || urlType != DefaultUrl) - res += hostArgument(); - else - res += host; - if (port) - res += ':' + QString::number(port); - if (type != Ssh) { - res += rootPath; - if (authenticated && urlType == RestUrl) - res += "/a"; - } - return res; -} - -bool GerritServer::fillFromRemote(const QString &remote, const GerritParameters ¶meters) -{ - static const QRegularExpression remotePattern( - "^(?:(?<protocol>[^:]+)://)?(?:(?<user>[^@]+)@)?(?<host>[^:/]+)" - "(?::(?<port>\\d+))?:?(?<path>/.*)$"); - - // Skip local remotes (refer to the root or relative path) - if (remote.isEmpty() || remote.startsWith('/') || remote.startsWith('.')) - return false; - // On Windows, local paths typically starts with <drive>: - if (HostOsInfo::isWindowsHost() && remote[1] == ':') - return false; - QRegularExpressionMatch match = remotePattern.match(remote); - if (!match.hasMatch()) - return false; - const QString protocol = match.captured("protocol"); - if (protocol == "https") - type = GerritServer::Https; - else if (protocol == "http") - type = GerritServer::Http; - else if (protocol.isEmpty() || protocol == "ssh") - type = GerritServer::Ssh; - else - return false; - const QString userName = match.captured("user"); - user.userName = userName.isEmpty() ? parameters.server.user.userName : userName; - host = match.captured("host"); - port = match.captured("port").toUShort(); - if (host.contains("github.com")) // Clearly not gerrit - return false; - if (type != GerritServer::Ssh) { - curlBinary = parameters.curl; - if (curlBinary.isEmpty() || !QFile::exists(curlBinary)) - return false; - rootPath = match.captured("path"); - // Strip the last part of the path, which is always the repo name - // The rest of the path needs to be inspected to find the root path - // (can be http://example.net/review) - ascendPath(); - if (!resolveRoot()) - return false; - } - return true; -} - -QStringList GerritServer::curlArguments() -{ - // -k - insecure - do not validate certificate - // -f - fail silently on server error - // -n - use credentials from ~/.netrc (or ~/_netrc on Windows) - // -sS - silent, except server error (no progress) - // --basic, --digest - try both authentication types - return {"-kfnsS", "--basic", "--digest"}; -} - -int GerritServer::testConnection() -{ - static Git::Internal::GitClient *const client = Git::Internal::GitPlugin::client(); - const QStringList arguments = curlArguments() << (url(RestUrl) + accountUrlC); - const SynchronousProcessResponse resp = client->vcsFullySynchronousExec( - QString(), FileName::fromString(curlBinary), arguments, - Core::ShellCommand::NoOutput); - if (resp.result == SynchronousProcessResponse::Finished) { - QString output = resp.stdOut(); - output.remove(0, output.indexOf('\n')); // Strip first line - QJsonDocument doc = QJsonDocument::fromJson(output.toUtf8()); - if (!doc.isNull()) - user.fullName = doc.object().value("name").toString(); - return 200; - } - const QRegularExpression errorRegexp("returned error: (\\d+)"); - QRegularExpressionMatch match = errorRegexp.match(resp.stdErr()); - if (match.hasMatch()) - return match.captured(1).toInt(); - return 400; -} - -bool GerritServer::setupAuthentication() -{ - AuthenticationDialog dialog(this); - if (!dialog.exec()) - return false; - authenticated = dialog.isAuthenticated(); - return true; -} - -bool GerritServer::ascendPath() -{ - const int lastSlash = rootPath.lastIndexOf('/'); - if (lastSlash == -1) - return false; - rootPath = rootPath.left(lastSlash); - return true; -} - -bool GerritServer::resolveRoot() -{ - for (;;) { - switch (testConnection()) { - case 200: - return true; - case 401: - return setupAuthentication(); - case 404: - if (!ascendPath()) - return false; - break; - default: // unknown error - fail - return false; - } - } - return false; -} - bool GerritParameters::equals(const GerritParameters &rhs) const { return server == rhs.server && ssh == rhs.ssh && curl == rhs.curl && https == rhs.https; @@ -319,11 +132,11 @@ void GerritParameters::saveQueries(QSettings *s) const void GerritParameters::fromSettings(const QSettings *s) { const QString rootKey = QLatin1String(settingsGroupC) + '/'; - server.host = s->value(rootKey + hostKeyC, defaultHostC).toString(); + server.host = s->value(rootKey + hostKeyC, GerritServer::defaultHost()).toString(); server.user.userName = s->value(rootKey + userKeyC, QString()).toString(); ssh = s->value(rootKey + sshKeyC, QString()).toString(); curl = s->value(rootKey + curlKeyC).toString(); - server.port = s->value(rootKey + portKeyC, QVariant(int(defaultPort))).toInt(); + server.port = ushort(s->value(rootKey + portKeyC, QVariant(GerritServer::defaultPort)).toInt()); portFlag = s->value(rootKey + portFlagKeyC, defaultPortFlag).toString(); savedQueries = s->value(rootKey + savedQueriesKeyC, QString()).toString() .split(','); |