summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2014-06-20 16:00:20 +0300
committerOrgad Shaneh <orgads@gmail.com>2014-06-24 12:00:22 +0200
commitf3106ebafe9a02904e822e9698c8b4cbb6c7e0f5 (patch)
tree3699d48f4a88e7ae07705a1399424c7709dcf55c
parentaaa7cd58514557dbba3294f071168a8d0d8ede3f (diff)
downloadqt-creator-f3106ebafe9a02904e822e9698c8b4cbb6c7e0f5.tar.gz
Git: Use a separate thread for updating commit data
Task-number: QTCREATORBUG-12449 Change-Id: I3057ca458272daac72c54abce1d6f9acf6a5d4af Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
-rw-r--r--src/plugins/git/gitclient.cpp5
-rw-r--r--src/plugins/git/gitclient.h3
-rw-r--r--src/plugins/git/gitsubmiteditor.cpp83
-rw-r--r--src/plugins/git/gitsubmiteditor.h5
-rw-r--r--src/plugins/vcsbase/submiteditorwidget.cpp10
-rw-r--r--src/plugins/vcsbase/submiteditorwidget.h3
6 files changed, 100 insertions, 9 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 7bec91dce3..43601b187c 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -3174,6 +3174,11 @@ void GitClient::handleMergeConflicts(const QString &workingDir, const QString &c
}
}
+void GitClient::addFuture(const QFuture<void> &future)
+{
+ m_synchronizer.addFuture(future);
+}
+
// Subversion: git svn
void GitClient::synchronousSubversionFetch(const QString &workingDirectory)
{
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 1b20d75e2a..1972852cb8 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -35,6 +35,7 @@
#include <coreplugin/editormanager/ieditor.h>
+#include <QFutureSynchronizer>
#include <QObject>
#include <QString>
#include <QStringList>
@@ -329,6 +330,7 @@ public:
void endStashScope(const QString &workingDirectory);
bool isValidRevision(const QString &revision) const;
void handleMergeConflicts(const QString &workingDir, const QString &commit, const QStringList &files, const QString &abortCommand);
+ void addFuture(const QFuture<void> &future);
static QString msgNoChangedFiles();
static QString msgNoCommits(bool includeRemote);
@@ -433,6 +435,7 @@ private:
int m_contextDiffFileIndex;
int m_contextChunkIndex;
QPointer<DiffEditor::DiffEditorController> m_contextDocument;
+ QFutureSynchronizer<void> m_synchronizer; // for commit updates
};
} // namespace Internal
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index e35e298e88..d7844723b3 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -34,6 +34,7 @@
#include "gitsubmiteditorwidget.h"
#include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/progressmanager/progressmanager.h>
#include <utils/qtcassert.h>
#include <vcsbase/submitfilemodel.h>
#include <vcsbase/vcsbaseoutputwindow.h>
@@ -41,6 +42,9 @@
#include <QDebug>
#include <QStringList>
#include <QTextCodec>
+#include <QtConcurrentRun>
+
+static const char TASK_UPDATE_COMMIT[] = "Git.UpdateCommit";
namespace Git {
namespace Internal {
@@ -80,6 +84,38 @@ private:
}
};
+class CommitDataFetcher : public QObject
+{
+ Q_OBJECT
+
+public:
+ CommitDataFetcher(CommitType commitType, const QString &workingDirectory) :
+ m_commitData(commitType),
+ m_workingDirectory(workingDirectory)
+ {
+ }
+
+ void start()
+ {
+ GitClient *client = GitPlugin::instance()->gitClient();
+ QString commitTemplate;
+ bool success = client->getCommitData(m_workingDirectory, &commitTemplate,
+ m_commitData, &m_errorMessage);
+ emit finished(success);
+ }
+
+ const CommitData &commitData() const { return m_commitData; }
+ const QString &errorMessage() const { return m_errorMessage; }
+
+signals:
+ void finished(bool result);
+
+private:
+ CommitData m_commitData;
+ QString m_workingDirectory;
+ QString m_errorMessage;
+};
+
/* The problem with git is that no diff can be obtained to for a random
* multiselection of staged/unstaged files; it requires the --cached
* option for staged files. So, we sort apart the diff file lists
@@ -90,12 +126,18 @@ GitSubmitEditor::GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *p
m_model(0),
m_commitEncoding(0),
m_commitType(SimpleCommit),
- m_firstUpdate(true)
+ m_firstUpdate(true),
+ m_commitDataFetcher(0)
{
connect(this, SIGNAL(diffSelectedFiles(QList<int>)), this, SLOT(slotDiffSelected(QList<int>)));
connect(submitEditorWidget(), SIGNAL(show(QString)), this, SLOT(showCommit(QString)));
}
+GitSubmitEditor::~GitSubmitEditor()
+{
+ resetCommitDataFetcher();
+}
+
GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget()
{
return static_cast<GitSubmitEditorWidget *>(widget());
@@ -106,6 +148,14 @@ const GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget() const
return static_cast<GitSubmitEditorWidget *>(widget());
}
+void GitSubmitEditor::resetCommitDataFetcher()
+{
+ if (!m_commitDataFetcher)
+ return;
+ disconnect(m_commitDataFetcher, SIGNAL(finished(bool)), this, SLOT(commitDataRetrieved(bool)));
+ connect(m_commitDataFetcher, SIGNAL(finished(bool)), m_commitDataFetcher, SLOT(deleteLater()));
+}
+
void GitSubmitEditor::setCommitData(const CommitData &d)
{
m_commitEncoding = d.commitEncoding;
@@ -181,19 +231,32 @@ void GitSubmitEditor::updateFileModel()
}
if (m_workingDirectory.isEmpty())
return;
- GitClient *client = GitPlugin::instance()->gitClient();
- QString errorMessage, commitTemplate;
- CommitData data(m_commitType);
- if (client->getCommitData(m_workingDirectory, &commitTemplate, data, &errorMessage)) {
- setCommitData(data);
+ submitEditorWidget()->setUpdateInProgress(true);
+ resetCommitDataFetcher();
+ m_commitDataFetcher = new CommitDataFetcher(m_commitType, m_workingDirectory);
+ connect(m_commitDataFetcher, SIGNAL(finished(bool)), this, SLOT(commitDataRetrieved(bool)));
+ QFuture<void> future = QtConcurrent::run(m_commitDataFetcher, &CommitDataFetcher::start);
+ Core::ProgressManager::addTask(future, tr("Refreshing Commit Data"), TASK_UPDATE_COMMIT);
+
+ GitPlugin::instance()->gitClient()->addFuture(future);
+}
+
+void GitSubmitEditor::commitDataRetrieved(bool success)
+{
+ GitSubmitEditorWidget *w = submitEditorWidget();
+ w->setUpdateInProgress(false);
+ if (success) {
+ setCommitData(m_commitDataFetcher->commitData());
submitEditorWidget()->refreshLog(m_workingDirectory);
- widget()->setEnabled(true);
+ w->setEnabled(true);
} else {
// Nothing to commit left!
- VcsBase::VcsBaseOutputWindow::instance()->appendError(errorMessage);
+ VcsBase::VcsBaseOutputWindow::instance()->appendError(m_commitDataFetcher->errorMessage());
m_model->clear();
- widget()->setEnabled(false);
+ w->setEnabled(false);
}
+ m_commitDataFetcher->deleteLater();
+ m_commitDataFetcher = 0;
}
GitSubmitEditorPanelData GitSubmitEditor::panelData() const
@@ -222,3 +285,5 @@ QByteArray GitSubmitEditor::fileContents() const
} // namespace Internal
} // namespace Git
+
+#include "gitsubmiteditor.moc"
diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h
index ed5b3924d7..57c1d4f20f 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -43,6 +43,7 @@ namespace Internal {
class GitSubmitEditorWidget;
class CommitData;
+class CommitDataFetcher;
struct GitSubmitEditorPanelData;
class GitSubmitEditor : public VcsBase::VcsBaseSubmitEditor
@@ -50,6 +51,7 @@ class GitSubmitEditor : public VcsBase::VcsBaseSubmitEditor
Q_OBJECT
public:
explicit GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters, QWidget *parent);
+ ~GitSubmitEditor();
void setCommitData(const CommitData &);
GitSubmitEditorPanelData panelData() const;
@@ -68,10 +70,12 @@ protected:
private slots:
void slotDiffSelected(const QList<int> &rows);
void showCommit(const QString &commit);
+ void commitDataRetrieved(bool success);
private:
inline GitSubmitEditorWidget *submitEditorWidget();
inline const GitSubmitEditorWidget *submitEditorWidget() const;
+ void resetCommitDataFetcher();
VcsBase::SubmitFileModel *m_model;
QTextCodec *m_commitEncoding;
@@ -79,6 +83,7 @@ private:
QString m_amendSHA1;
QString m_workingDirectory;
bool m_firstUpdate;
+ CommitDataFetcher *m_commitDataFetcher;
};
} // namespace Internal
diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp
index 10d6a93ce9..7f070a978e 100644
--- a/src/plugins/vcsbase/submiteditorwidget.cpp
+++ b/src/plugins/vcsbase/submiteditorwidget.cpp
@@ -156,6 +156,7 @@ struct SubmitEditorWidgetPrivate
bool m_commitEnabled;
bool m_ignoreChange;
bool m_descriptionMandatory;
+ bool m_updateInProgress;
QActionPushButton *m_submitButton;
};
@@ -170,6 +171,7 @@ SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() :
m_commitEnabled(false),
m_ignoreChange(false),
m_descriptionMandatory(true),
+ m_updateInProgress(false),
m_submitButton(0)
{
}
@@ -567,12 +569,20 @@ void SubmitEditorWidget::descriptionTextChanged()
bool SubmitEditorWidget::canSubmit() const
{
+ if (d->m_updateInProgress)
+ return false;
if (isDescriptionMandatory() && cleanupDescription(descriptionText()).trimmed().isEmpty())
return false;
const unsigned checkedCount = checkedFilesCount();
return d->m_emptyFileListEnabled || checkedCount > 0;
}
+void SubmitEditorWidget::setUpdateInProgress(bool value)
+{
+ d->m_updateInProgress = value;
+ updateSubmitAction();
+}
+
QString SubmitEditorWidget::commitName() const
{
return tr("&Commit");
diff --git a/src/plugins/vcsbase/submiteditorwidget.h b/src/plugins/vcsbase/submiteditorwidget.h
index 3293e56d00..6d84197735 100644
--- a/src/plugins/vcsbase/submiteditorwidget.h
+++ b/src/plugins/vcsbase/submiteditorwidget.h
@@ -104,6 +104,7 @@ public:
QList<SubmitFieldWidget *> submitFieldWidgets() const;
virtual bool canSubmit() const;
+ void setUpdateInProgress(bool value);
signals:
void diffSelected(const QList<int> &);
@@ -126,6 +127,8 @@ protected:
protected slots:
void descriptionTextChanged();
+
+public slots:
void updateSubmitAction();
private slots: