forked from qt-creator/qt-creator
Git/Clean: Fix issues with submodules
- If the git config contained old entries for submodules that were removed (they are not cleaned from the config automatically), it would add submodules with empty "dir", which lead to infinite recursion - When recursing into submodules, we need to prepend the paths from the git output with the relative path from the main repository Change-Id: I0bc6a1973f4cdeb1c3f09c05cd7736c25471f72e Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
@@ -1795,10 +1795,16 @@ SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) const
|
|||||||
foreach (const QString &submoduleName, result.keys()) {
|
foreach (const QString &submoduleName, result.keys()) {
|
||||||
gitmodulesFile.beginGroup(QLatin1String("submodule \"") +
|
gitmodulesFile.beginGroup(QLatin1String("submodule \"") +
|
||||||
submoduleName + QLatin1Char('"'));
|
submoduleName + QLatin1Char('"'));
|
||||||
result[submoduleName].dir = gitmodulesFile.value(QLatin1String("path")).toString();
|
const QString path = gitmodulesFile.value(QLatin1String("path")).toString();
|
||||||
QString ignore = gitmodulesFile.value(QLatin1String("ignore")).toString();
|
if (path.isEmpty()) { // invalid submodule entry in config
|
||||||
if (!ignore.isEmpty() && result[submoduleName].ignore.isEmpty())
|
result.remove(submoduleName);
|
||||||
result[submoduleName].ignore = ignore;
|
} else {
|
||||||
|
SubmoduleData &submoduleRef = result[submoduleName];
|
||||||
|
submoduleRef.dir = path;
|
||||||
|
QString ignore = gitmodulesFile.value(QLatin1String("ignore")).toString();
|
||||||
|
if (!ignore.isEmpty() && submoduleRef.ignore.isEmpty())
|
||||||
|
submoduleRef.ignore = ignore;
|
||||||
|
}
|
||||||
gitmodulesFile.endGroup();
|
gitmodulesFile.endGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1827,37 +1833,43 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString &
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve list of files to be cleaned
|
// Retrieve list of files to be cleaned
|
||||||
bool GitClient::cleanList(const QString &workingDirectory, const QString &flag, QStringList *files, QString *errorMessage)
|
bool GitClient::cleanList(const QString &workingDirectory, const QString &modulePath,
|
||||||
|
const QString &flag, QStringList *files, QString *errorMessage)
|
||||||
{
|
{
|
||||||
|
const QString directory = workingDirectory + QLatin1Char('/') + modulePath;
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("clean") << QLatin1String("--dry-run") << flag;
|
args << QLatin1String("clean") << QLatin1String("--dry-run") << flag;
|
||||||
QByteArray outputText;
|
QByteArray outputText;
|
||||||
QByteArray errorText;
|
QByteArray errorText;
|
||||||
const bool rc = vcsFullySynchronousExec(workingDirectory, args, &outputText, &errorText);
|
const bool rc = vcsFullySynchronousExec(directory, args, &outputText, &errorText);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
msgCannotRun(QStringList(QLatin1String("clean")), workingDirectory,
|
msgCannotRun(QStringList(QLatin1String("clean")), directory,
|
||||||
errorText, errorMessage);
|
errorText, errorMessage);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Filter files that git would remove
|
// Filter files that git would remove
|
||||||
|
const QString relativeBase = modulePath.isEmpty() ? QString() : modulePath + QLatin1Char('/');
|
||||||
const QString prefix = QLatin1String("Would remove ");
|
const QString prefix = QLatin1String("Would remove ");
|
||||||
foreach (const QString &line, commandOutputLinesFromLocal8Bit(outputText))
|
foreach (const QString &line, commandOutputLinesFromLocal8Bit(outputText))
|
||||||
if (line.startsWith(prefix))
|
if (line.startsWith(prefix))
|
||||||
files->push_back(line.mid(prefix.size()));
|
files->push_back(relativeBase + line.mid(prefix.size()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GitClient::synchronousCleanList(const QString &workingDirectory, QStringList *files,
|
bool GitClient::synchronousCleanList(const QString &workingDirectory, const QString &modulePath,
|
||||||
QStringList *ignoredFiles, QString *errorMessage)
|
QStringList *files, QStringList *ignoredFiles,
|
||||||
|
QString *errorMessage)
|
||||||
{
|
{
|
||||||
bool res = cleanList(workingDirectory, QLatin1String("-df"), files, errorMessage);
|
bool res = cleanList(workingDirectory, modulePath, QLatin1String("-df"), files, errorMessage);
|
||||||
res &= cleanList(workingDirectory, QLatin1String("-dXf"), ignoredFiles, errorMessage);
|
res &= cleanList(workingDirectory, modulePath, QLatin1String("-dXf"), ignoredFiles, errorMessage);
|
||||||
|
|
||||||
SubmoduleDataMap submodules = submoduleList(workingDirectory);
|
SubmoduleDataMap submodules = submoduleList(workingDirectory + QLatin1Char('/') + modulePath);
|
||||||
foreach (const SubmoduleData &submodule, submodules) {
|
foreach (const SubmoduleData &submodule, submodules) {
|
||||||
if (submodule.ignore != QLatin1String("all")
|
if (submodule.ignore != QLatin1String("all")
|
||||||
&& submodule.ignore != QLatin1String("dirty")) {
|
&& submodule.ignore != QLatin1String("dirty")) {
|
||||||
res &= synchronousCleanList(workingDirectory + QLatin1Char('/') + submodule.dir,
|
const QString submodulePath = modulePath.isEmpty() ? submodule.dir
|
||||||
|
: modulePath + QLatin1Char('/') + submodule.dir;
|
||||||
|
res &= synchronousCleanList(workingDirectory, submodulePath,
|
||||||
files, ignoredFiles, errorMessage);
|
files, ignoredFiles, errorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ public:
|
|||||||
bool synchronousReset(const QString &workingDirectory,
|
bool synchronousReset(const QString &workingDirectory,
|
||||||
const QStringList &files = QStringList(),
|
const QStringList &files = QStringList(),
|
||||||
QString *errorMessage = 0);
|
QString *errorMessage = 0);
|
||||||
bool synchronousCleanList(const QString &workingDirectory, QStringList *files, QStringList *ignoredFiles, QString *errorMessage);
|
bool synchronousCleanList(const QString &workingDirectory, const QString &modulePath, QStringList *files, QStringList *ignoredFiles, QString *errorMessage);
|
||||||
bool synchronousApplyPatch(const QString &workingDirectory, const QString &file, QString *errorMessage, const QStringList &arguments = QStringList());
|
bool synchronousApplyPatch(const QString &workingDirectory, const QString &file, QString *errorMessage, const QStringList &arguments = QStringList());
|
||||||
bool synchronousInit(const QString &workingDirectory);
|
bool synchronousInit(const QString &workingDirectory);
|
||||||
bool synchronousCheckoutFiles(const QString &workingDirectory,
|
bool synchronousCheckoutFiles(const QString &workingDirectory,
|
||||||
@@ -377,7 +377,7 @@ private:
|
|||||||
const QString &workingDirectory,
|
const QString &workingDirectory,
|
||||||
const QString &fileName,
|
const QString &fileName,
|
||||||
const QString &gitBinDirectory);
|
const QString &gitBinDirectory);
|
||||||
bool cleanList(const QString &workingDirectory, const QString &flag, QStringList *files, QString *errorMessage);
|
bool cleanList(const QString &workingDirectory, const QString &modulePath, const QString &flag, QStringList *files, QString *errorMessage);
|
||||||
|
|
||||||
enum ContinueCommandMode {
|
enum ContinueCommandMode {
|
||||||
ContinueOnly,
|
ContinueOnly,
|
||||||
|
|||||||
@@ -1114,7 +1114,7 @@ void GitPlugin::cleanRepository(const QString &directory)
|
|||||||
QStringList files;
|
QStringList files;
|
||||||
QStringList ignoredFiles;
|
QStringList ignoredFiles;
|
||||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||||
const bool gotFiles = m_gitClient->synchronousCleanList(directory, &files, &ignoredFiles, &errorMessage);
|
const bool gotFiles = m_gitClient->synchronousCleanList(directory, QString(), &files, &ignoredFiles, &errorMessage);
|
||||||
QApplication::restoreOverrideCursor();
|
QApplication::restoreOverrideCursor();
|
||||||
|
|
||||||
if (!gotFiles) {
|
if (!gotFiles) {
|
||||||
|
|||||||
Reference in New Issue
Block a user