From be5c2ea372198047d626001cf3a1ed8d866ed1d3 Mon Sep 17 00:00:00 2001 From: Nikita Baryshnikov Date: Wed, 5 Jun 2013 12:28:13 +0300 Subject: [PATCH] Mercurial: Handle HTTP authentication Make it possible to pull and push onto online repositories with http authorization. Task-number: QTCREATORBUG-5104 Change-Id: Id5f5a865d301e644002e4fa8b7056d08fd9b7467 Reviewed-by: hjk --- src/plugins/mercurial/srcdestdialog.cpp | 39 +++++++++++++++++++++++-- src/plugins/mercurial/srcdestdialog.h | 3 ++ src/plugins/mercurial/srcdestdialog.ui | 18 ++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/plugins/mercurial/srcdestdialog.cpp b/src/plugins/mercurial/srcdestdialog.cpp index 7ca90565457..2a55fdd9fad 100644 --- a/src/plugins/mercurial/srcdestdialog.cpp +++ b/src/plugins/mercurial/srcdestdialog.cpp @@ -29,8 +29,13 @@ #include "srcdestdialog.h" #include "ui_srcdestdialog.h" +#include "mercurialplugin.h" +#include +#include +#include +using namespace VcsBase; using namespace Mercurial::Internal; SrcDestDialog::SrcDestDialog(QWidget *parent) : @@ -39,6 +44,13 @@ SrcDestDialog::SrcDestDialog(QWidget *parent) : { m_ui->setupUi(this); m_ui->localPathChooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); + QUrl repoUrl(getRepoUrl()); + if (repoUrl.isEmpty()) + return; + if (!repoUrl.password().isEmpty()) + repoUrl.setPassword(QLatin1String("***")); + m_ui->defaultPath->setText(repoUrl.toString()); + m_ui->promptForCredentials->setChecked(!repoUrl.scheme().isEmpty() && repoUrl.scheme() != QLatin1String("file")); } SrcDestDialog::~SrcDestDialog() @@ -53,9 +65,32 @@ void SrcDestDialog::setPathChooserKind(Utils::PathChooser::Kind kind) QString SrcDestDialog::getRepositoryString() const { - if (m_ui->defaultButton->isChecked()) - return QString(); + if (m_ui->defaultButton->isChecked()) { + QUrl repoUrl(getRepoUrl()); + if (m_ui->promptForCredentials && (repoUrl.userName().isEmpty() || repoUrl.password().isEmpty())) { + if (repoUrl.userName().isEmpty()) { + QString user = QInputDialog::getText(0, tr("Enter user name"), tr("User name:")); + if (user.isEmpty()) + return repoUrl.toString(); + repoUrl.setUserName(user); + } + if (repoUrl.password().isEmpty()) { + QString password = QInputDialog::getText(0, tr("Enter password"), tr("Password:"), QLineEdit::Password); + if (!password.isEmpty()) + repoUrl.setPassword(password); + } + } + return repoUrl.toString(); + } if (m_ui->localButton->isChecked()) return m_ui->localPathChooser->path(); return m_ui->urlLineEdit->text(); } + +QUrl SrcDestDialog::getRepoUrl() const +{ + MercurialPlugin *plugin = MercurialPlugin::instance(); + const VcsBasePluginState state = plugin->currentState(); + QSettings settings(QString(QLatin1String("%1/.hg/hgrc")).arg(state.currentProjectPath()), QSettings::IniFormat); + return settings.value(QLatin1String("paths/default")).toUrl(); +} diff --git a/src/plugins/mercurial/srcdestdialog.h b/src/plugins/mercurial/srcdestdialog.h index ffe42d04229..0bcdf21a647 100644 --- a/src/plugins/mercurial/srcdestdialog.h +++ b/src/plugins/mercurial/srcdestdialog.h @@ -49,6 +49,9 @@ public: void setPathChooserKind(Utils::PathChooser::Kind kind); QString getRepositoryString() const; +private: + QUrl getRepoUrl() const; + private: Ui::SrcDestDialog *m_ui; }; diff --git a/src/plugins/mercurial/srcdestdialog.ui b/src/plugins/mercurial/srcdestdialog.ui index c32ba1c127d..3d20f31f68c 100644 --- a/src/plugins/mercurial/srcdestdialog.ui +++ b/src/plugins/mercurial/srcdestdialog.ui @@ -60,6 +60,24 @@ + + + + + + + + + + + + + Prompt for credentials + + + + +