summaryrefslogtreecommitdiff
path: root/src/plugins/git
diff options
context:
space:
mode:
authorPetar Perisin <petar.perisin@gmail.com>2013-06-10 23:30:03 +0200
committerPetar Perisin <petar.perisin@gmail.com>2013-06-17 22:22:31 +0200
commit159a7d61dd650524701950f9bccb3c2cfe0581fd (patch)
treeb7e0fb7d97244caf3f0d5810d9f8032bda04fb1a /src/plugins/git
parentdce41176d8bcdf0c06179953da150deb12e25be8 (diff)
downloadqt-creator-159a7d61dd650524701950f9bccb3c2cfe0581fd.tar.gz
Git - stash scope guard in submoduleUpdate
Change-Id: I888d4013e88fdc6977f29ef3e27d243e55a1f1a7 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/git')
-rw-r--r--src/plugins/git/gitclient.cpp90
-rw-r--r--src/plugins/git/gitclient.h7
-rw-r--r--src/plugins/git/gitplugin.cpp2
3 files changed, 83 insertions, 16 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 79db65edc8..3998427e46 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1237,7 +1237,7 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory,
outputWindow()->appendError(msg);
return false;
}
- promptSubmoduleUpdate(workingDirectory);
+ updateSubmodulesIfNeeded(workingDirectory, true);
return true;
}
@@ -1951,6 +1951,30 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi
return result;
}
+QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirectory,
+ QString *errorMessage)
+{
+ QByteArray outputTextData;
+ QByteArray errorText;
+ QStringList arguments;
+
+ // get submodule status
+ arguments << QLatin1String("submodule") << QLatin1String("status");
+ if (!fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) {
+ QString error = tr("Cannot retrieve submodule status of \"%1\": %2")
+ .arg(QDir::toNativeSeparators(workingDirectory),
+ commandOutputFromLocal8Bit(errorText));
+
+ if (errorMessage)
+ *errorMessage = error;
+ else
+ outputWindow()->append(error);
+
+ return QStringList();
+ }
+ return commandOutputLinesFromLocal8Bit(outputTextData);
+}
+
SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory)
{
SubmoduleDataMap result;
@@ -2201,23 +2225,63 @@ bool GitClient::fullySynchronousGit(const QString &workingDirectory,
flags);
}
-void GitClient::submoduleUpdate(const QString &workingDirectory)
+void GitClient::updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt)
{
+ if (!m_updatedSubmodules.isEmpty() || submoduleList(workingDirectory).isEmpty())
+ return;
+
+ QStringList submoduleStatus = synchronousSubmoduleStatus(workingDirectory);
+ if (submoduleStatus.isEmpty())
+ return;
+
+ bool updateNeeded = false;
+ foreach (const QString &status, submoduleStatus) {
+ if (status.startsWith(QLatin1Char('+'))) {
+ updateNeeded = true;
+ break;
+ }
+ }
+ if (!updateNeeded)
+ return;
+
+ if (prompt && QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"),
+ tr("Would you like to update submodules?"),
+ QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) {
+ return;
+ }
+
+ foreach (const QString &statusLine, submoduleStatus) {
+ // stash only for lines starting with +
+ // because only they would be updated
+ if (!statusLine.startsWith(QLatin1Char('+')))
+ continue;
+
+ // get submodule name
+ const int nameStart = statusLine.indexOf(QLatin1Char(' '), 2) + 1;
+ const int nameLength = statusLine.indexOf(QLatin1Char(' '), nameStart) - nameStart;
+ const QString submoduleDir = workingDirectory + QLatin1Char('/')
+ + statusLine.mid(nameStart, nameLength);
+
+ if (beginStashScope(submoduleDir, QLatin1String("SubmoduleUpdate"))) {
+ m_updatedSubmodules.append(submoduleDir);
+ } else {
+ finishSubmoduleUpdate();
+ return;
+ }
+ }
+
QStringList arguments;
arguments << QLatin1String("submodule") << QLatin1String("update");
- executeGit(workingDirectory, arguments, 0, true, true);
+
+ VcsBase::Command *cmd = executeGit(workingDirectory, arguments, 0, true, true);
+ connect(cmd, SIGNAL(finished(bool,int,QVariant)), this, SLOT(finishSubmoduleUpdate()));
}
-void GitClient::promptSubmoduleUpdate(const QString &workingDirectory)
+void GitClient::finishSubmoduleUpdate()
{
- if (submoduleList(workingDirectory).isEmpty())
- return;
-
- if (QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"),
- tr("Would you like to update submodules?"),
- QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
- submoduleUpdate(workingDirectory);
- }
+ foreach (const QString &submoduleDir, m_updatedSubmodules)
+ endStashScope(submoduleDir);
+ m_updatedSubmodules.clear();
}
// Trim a git status file spec: "modified: foo .cpp" -> "modified: foo .cpp"
@@ -2852,7 +2916,7 @@ bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase)
bool ok = executeAndHandleConflicts(workingDirectory, arguments, abortCommand);
if (ok)
- promptSubmoduleUpdate(workingDirectory);
+ updateSubmodulesIfNeeded(workingDirectory, true);
return ok;
}
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index cf0ead6c0d..73875499e7 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -179,8 +179,7 @@ public:
bool synchronousCheckout(const QString &workingDirectory, const QString &ref, QString *errorMessage);
bool synchronousCheckout(const QString &workingDirectory, const QString &ref)
{ return synchronousCheckout(workingDirectory, ref, 0); }
- void submoduleUpdate(const QString &workingDirectory);
- void promptSubmoduleUpdate(const QString &workingDirectory);
+ void updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt);
// Do a stash and return identier.
enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 };
@@ -208,6 +207,8 @@ public:
QMap<QString,QString> synchronousRemotesList(const QString &workingDirectory,
QString *errorMessage = 0);
+ QStringList synchronousSubmoduleStatus(const QString &workingDirectory,
+ QString *errorMessage = 0);
SubmoduleDataMap submoduleList(const QString &workingDirectory);
bool synchronousShow(const QString &workingDirectory, const QString &id,
QString *output, QString *errorMessage);
@@ -324,6 +325,7 @@ private slots:
void slotBlameRevisionRequested(const QString &source, QString change, int lineNumber);
void appendOutputData(const QByteArray &data) const;
void appendOutputDataSilently(const QByteArray &data) const;
+ void finishSubmoduleUpdate();
private:
QTextCodec *getSourceCodec(const QString &file) const;
@@ -392,6 +394,7 @@ private:
GitSettings *m_settings;
QString m_gitQtcEditor;
QMap<QString, StashInfo> m_stashInfo;
+ QStringList m_updatedSubmodules;
bool m_disableEditor;
};
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 80232b36b6..b7d4976978 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -1237,7 +1237,7 @@ void GitPlugin::updateSubmodules()
{
const VcsBase::VcsBasePluginState state = currentState();
QTC_ASSERT(state.hasTopLevel(), return);
- m_gitClient->submoduleUpdate(state.topLevel());
+ m_gitClient->updateSubmodulesIfNeeded(state.topLevel(), false);
}
// If the file is modified in an editor, make sure it is saved.