forked from qt-creator/qt-creator
VCS: Refresh submit editor status when it might change
Including Git implementation Task-number: QTCREATORBUG-5644 Change-Id: Ic5dede99d93b84e5d271292b4694216f51e66882 Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
@@ -808,8 +808,7 @@ Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const Commit
|
||||
submitEditor->setCheckScriptWorkingDirectory(m_submitRepository);
|
||||
const QString title = amend ? tr("Amend %1").arg(cd.amendSHA1) : tr("Git Commit");
|
||||
submitEditor->setDisplayName(title);
|
||||
if (amend) // Allow for just correcting the message
|
||||
submitEditor->setEmptyFileListEnabled(true);
|
||||
submitEditor->setAmend(amend);
|
||||
connect(submitEditor, SIGNAL(diff(QStringList,QStringList)), this, SLOT(submitEditorDiff(QStringList,QStringList)));
|
||||
connect(submitEditor, SIGNAL(merge(QStringList)), this, SLOT(submitEditorMerge(QStringList)));
|
||||
return editor;
|
||||
|
||||
@@ -27,13 +27,16 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "commitdata.h"
|
||||
#include "gitclient.h"
|
||||
#include "gitconstants.h"
|
||||
#include "gitplugin.h"
|
||||
#include "gitsubmiteditor.h"
|
||||
#include "gitsubmiteditorwidget.h"
|
||||
#include "gitconstants.h"
|
||||
#include "commitdata.h"
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
#include <vcsbase/submitfilemodel.h>
|
||||
#include <vcsbase/vcsbaseoutputwindow.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QStringList>
|
||||
@@ -49,7 +52,8 @@ namespace Internal {
|
||||
|
||||
GitSubmitEditor::GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters, QWidget *parent) :
|
||||
VcsBaseSubmitEditor(parameters, new GitSubmitEditorWidget(parent)),
|
||||
m_model(0)
|
||||
m_model(0),
|
||||
m_amend(false)
|
||||
{
|
||||
connect(this, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(slotDiffSelected(QStringList)));
|
||||
}
|
||||
@@ -59,6 +63,25 @@ GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget()
|
||||
return static_cast<GitSubmitEditorWidget *>(widget());
|
||||
}
|
||||
|
||||
static void mergeFileModels(VcsBase::SubmitFileModel *model, const VcsBase::SubmitFileModel *source)
|
||||
{
|
||||
int j = 0;
|
||||
for (int i = 0; i < model->rowCount() && j < source->rowCount(); ++i) {
|
||||
CommitData::StateFilePair stateFile(
|
||||
static_cast<FileStates>(model->extraData(i).toInt()), model->file(i));
|
||||
for (; j < source->rowCount(); ++j) {
|
||||
CommitData::StateFilePair sourceStateFile(
|
||||
static_cast<FileStates>(source->extraData(j).toInt()), source->file(j));
|
||||
if (stateFile == sourceStateFile) {
|
||||
model->setChecked(i, source->checked(j));
|
||||
break;
|
||||
} else if (stateFile < sourceStateFile) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GitSubmitEditor::setCommitData(const CommitData &d)
|
||||
{
|
||||
GitSubmitEditorWidget *w = submitEditorWidget();
|
||||
@@ -67,7 +90,9 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
|
||||
w->setHasUnmerged(false);
|
||||
|
||||
m_commitEncoding = d.commitEncoding;
|
||||
m_workingDirectory = d.panelInfo.repository;
|
||||
|
||||
VcsBase::SubmitFileModel *oldModel = m_model;
|
||||
m_model = new VcsBase::SubmitFileModel(this);
|
||||
if (!d.files.isEmpty()) {
|
||||
for (QList<CommitData::StateFilePair>::const_iterator it = d.files.constBegin();
|
||||
@@ -87,9 +112,19 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
|
||||
QVariant(static_cast<int>(state)));
|
||||
}
|
||||
}
|
||||
if (oldModel) {
|
||||
mergeFileModels(m_model, oldModel);
|
||||
delete oldModel;
|
||||
}
|
||||
setFileModel(m_model, d.panelInfo.repository);
|
||||
}
|
||||
|
||||
void GitSubmitEditor::setAmend(bool amend)
|
||||
{
|
||||
m_amend = amend;
|
||||
setEmptyFileListEnabled(amend); // Allow for just correcting the message
|
||||
}
|
||||
|
||||
void GitSubmitEditor::slotDiffSelected(const QStringList &files)
|
||||
{
|
||||
// Sort it apart into unmerged/staged/unstaged files
|
||||
@@ -116,6 +151,17 @@ void GitSubmitEditor::slotDiffSelected(const QStringList &files)
|
||||
emit merge(unmergedFiles);
|
||||
}
|
||||
|
||||
void GitSubmitEditor::updateFileModel()
|
||||
{
|
||||
GitClient *client = GitPlugin::instance()->gitClient();
|
||||
QString errorMessage, commitTemplate;
|
||||
CommitData data;
|
||||
if (client->getCommitData(m_workingDirectory, m_amend, &commitTemplate, &data, &errorMessage))
|
||||
setCommitData(data);
|
||||
else
|
||||
VcsBase::VcsBaseOutputWindow::instance()->append(errorMessage);
|
||||
}
|
||||
|
||||
GitSubmitEditorPanelData GitSubmitEditor::panelData() const
|
||||
{
|
||||
return const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->panelData();
|
||||
|
||||
@@ -52,6 +52,7 @@ public:
|
||||
explicit GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters, QWidget *parent);
|
||||
|
||||
void setCommitData(const CommitData &);
|
||||
void setAmend(bool amend);
|
||||
GitSubmitEditorPanelData panelData() const;
|
||||
|
||||
signals:
|
||||
@@ -60,6 +61,7 @@ signals:
|
||||
|
||||
protected:
|
||||
QByteArray fileContents() const;
|
||||
void updateFileModel();
|
||||
|
||||
private slots:
|
||||
void slotDiffSelected(const QStringList &);
|
||||
@@ -69,6 +71,8 @@ private:
|
||||
|
||||
VcsBase::SubmitFileModel *m_model;
|
||||
QString m_commitEncoding;
|
||||
bool m_amend;
|
||||
QString m_workingDirectory;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
Reference in New Issue
Block a user