diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2017-03-04 17:38:12 +0100 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2017-03-09 22:03:05 +0000 |
commit | 209cc214341226cb5c04283b7c3c8b1221bf3b5b (patch) | |
tree | 35d61c28721fb8cadec0235cb60b451e44dddf8e /src/plugins/git | |
parent | b0ac6435b3786854e7a8d10cf4d8df49ca74618a (diff) | |
download | qt-creator-209cc214341226cb5c04283b7c3c8b1221bf3b5b.tar.gz |
Git: Add input validation to RemoteAdditionDialog
Use FancyLineEdits to indicate invalid inputs for
remote names and URLs.
For remote names:
* Check for duplicate remote names and indicate these
* Remove invalid chars during input
For remote URLs:
* Check if the input matches a valid URL or
existing local directory
Task-number: QTCREATORBUG-15998
Change-Id: I224e669f16e34e2cd3d075c602b431ce5bbdd391
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/git')
-rw-r--r-- | src/plugins/git/remoteadditiondialog.ui | 11 | ||||
-rw-r--r-- | src/plugins/git/remotedialog.cpp | 53 | ||||
-rw-r--r-- | src/plugins/git/remotemodel.cpp | 7 | ||||
-rw-r--r-- | src/plugins/git/remotemodel.h | 1 |
4 files changed, 68 insertions, 4 deletions
diff --git a/src/plugins/git/remoteadditiondialog.ui b/src/plugins/git/remoteadditiondialog.ui index 8f389eeb8a..3768c8945d 100644 --- a/src/plugins/git/remoteadditiondialog.ui +++ b/src/plugins/git/remoteadditiondialog.ui @@ -22,7 +22,7 @@ </widget> </item> <item row="0" column="1"> - <widget class="QLineEdit" name="nameEdit"/> + <widget class="Utils::FancyLineEdit" name="nameEdit"/> </item> <item row="1" column="0"> <widget class="QLabel" name="urlLabel"> @@ -32,7 +32,7 @@ </widget> </item> <item row="1" column="1"> - <widget class="QLineEdit" name="urlEdit"/> + <widget class="Utils::FancyLineEdit" name="urlEdit"/> </item> <item row="2" column="0" colspan="2"> <widget class="QDialogButtonBox" name="buttonBox"> @@ -46,6 +46,13 @@ </item> </layout> </widget> + <customwidgets> + <customwidget> + <class>Utils::FancyLineEdit</class> + <extends>QLineEdit</extends> + <header location="global">utils/fancylineedit.h</header> + </customwidget> + </customwidgets> <resources/> <connections> <connection> diff --git a/src/plugins/git/remotedialog.cpp b/src/plugins/git/remotedialog.cpp index 7fc352e179..6ab4d0449f 100644 --- a/src/plugins/git/remotedialog.cpp +++ b/src/plugins/git/remotedialog.cpp @@ -31,10 +31,12 @@ #include "ui_remotedialog.h" #include "ui_remoteadditiondialog.h" +#include <utils/fancylineedit.h> #include <utils/headerviewstretcher.h> #include <vcsbase/vcsoutputwindow.h> #include <QMessageBox> +#include <QRegularExpression> namespace Git { namespace Internal { @@ -46,10 +48,55 @@ namespace Internal { class RemoteAdditionDialog : public QDialog { public: - RemoteAdditionDialog() + RemoteAdditionDialog(const QStringList &remoteNames) : + m_invalidRemoteNameChars(GitPlugin::invalidBranchAndRemoteNamePattern()), + m_remoteNames(remoteNames) { m_ui.setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + m_ui.nameEdit->setValidationFunction([this](Utils::FancyLineEdit *edit, QString *errorMessage) { + if (!edit) + return false; + + QString input = edit->text(); + edit->setText(input.replace(m_invalidRemoteNameChars, "_")); + + // "Intermediate" patterns, may change to Acceptable when user edits further: + + if (input.endsWith(".lock")) //..may not end with ".lock" + return false; + + if (input.endsWith('.')) // no dot at the end (but allowed in the middle) + return false; + + if (input.endsWith('/')) // no slash at the end (but allowed in the middle) + return false; + + if (m_remoteNames.contains(input)) { + if (errorMessage) + *errorMessage = tr("A remote with the name \"%1\" already exists.").arg(input); + return false; + } + + // is a valid remote name + return !input.isEmpty(); + }); + connect(m_ui.nameEdit, &QLineEdit::textChanged, [this]() { + m_ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_ui.nameEdit->isValid()); + }); + + m_ui.urlEdit->setValidationFunction([](Utils::FancyLineEdit *edit, QString *errorMessage) { + if (!edit || edit->text().isEmpty()) + return false; + + const GitRemote r(edit->text()); + if (!r.isValid && errorMessage) + *errorMessage = tr("The URL may not be valid."); + + return r.isValid; + }); + + m_ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } QString remoteName() const @@ -64,6 +111,8 @@ public: private: Ui::RemoteAdditionDialog m_ui; + const QRegularExpression m_invalidRemoteNameChars; + QStringList m_remoteNames; }; @@ -125,7 +174,7 @@ void RemoteDialog::refreshRemotes() void RemoteDialog::addRemote() { - RemoteAdditionDialog addDialog; + RemoteAdditionDialog addDialog(m_remoteModel->allRemoteNames()); if (addDialog.exec() != QDialog::Accepted) return; diff --git a/src/plugins/git/remotemodel.cpp b/src/plugins/git/remotemodel.cpp index 2ba274f983..7cd14b1258 100644 --- a/src/plugins/git/remotemodel.cpp +++ b/src/plugins/git/remotemodel.cpp @@ -27,6 +27,8 @@ #include "gitplugin.h" #include "gitclient.h" +#include <utils/algorithm.h> + namespace Git { namespace Internal { @@ -34,6 +36,11 @@ namespace Internal { RemoteModel::RemoteModel(QObject *parent) : QAbstractTableModel(parent) { } +QStringList RemoteModel::allRemoteNames() const +{ + return Utils::transform(m_remotes, std::mem_fn(&Remote::name)); +} + QString RemoteModel::remoteName(int row) const { return m_remotes.at(row).name; diff --git a/src/plugins/git/remotemodel.h b/src/plugins/git/remotemodel.h index c6b976ac5c..467d9de3b5 100644 --- a/src/plugins/git/remotemodel.h +++ b/src/plugins/git/remotemodel.h @@ -42,6 +42,7 @@ public: void clear(); bool refresh(const QString &workingDirectory, QString *errorMessage); + QStringList allRemoteNames() const; QString remoteName(int row) const; QString remoteUrl(int row) const; |