aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/api/internaljobs.cpp6
-rw-r--r--tests/auto/api/tst_api.cpp15
2 files changed, 18 insertions, 3 deletions
diff --git a/src/lib/corelib/api/internaljobs.cpp b/src/lib/corelib/api/internaljobs.cpp
index d9b97329a..9bb619db5 100644
--- a/src/lib/corelib/api/internaljobs.cpp
+++ b/src/lib/corelib/api/internaljobs.cpp
@@ -237,8 +237,8 @@ TopLevelProjectPtr InternalSetupProjectJob::project() const
void InternalSetupProjectJob::start()
{
- const TopLevelProjectConstPtr existingProject = m_existingProject;
BuildGraphLocker *bgLocker = m_existingProject ? m_existingProject->bgLocker : 0;
+ bool deleteLocker = false;
try {
const ErrorInfo err = m_parameters.expandBuildConfiguration();
if (err.hasError())
@@ -253,17 +253,19 @@ void InternalSetupProjectJob::start()
bgLocker = new BuildGraphLocker(ProjectBuildData::deriveBuildGraphFilePath(buildDir,
projectId),
logger(), m_parameters.waitLockBuildGraph(), observer());
+ deleteLocker = true;
}
execute();
if (m_existingProject)
m_existingProject->bgLocker = 0;
m_newProject->bgLocker = bgLocker;
+ deleteLocker = false;
} catch (const ErrorInfo &error) {
m_newProject.clear();
setError(error);
// Delete the build graph locker if and only if we allocated it here.
- if (!existingProject)
+ if (deleteLocker)
delete bgLocker;
}
emit finished(this);
diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp
index cbc0a5237..284b04e07 100644
--- a/tests/auto/api/tst_api.cpp
+++ b/tests/auto/api/tst_api.cpp
@@ -283,7 +283,7 @@ void TestApi::buildGraphLocking()
qPrintable(setupJob->error().toString()));
QVERIFY2(QFileInfo(lockFile).isFile(), qPrintable(lockFile));
- // Case 3: Changing the build directory of an existing project to something con-competing.
+ // Case 3: Changing the build directory of an existing project to something non-competing.
qbs::SetupProjectParameters setupParams3 = setupParams2;
setupParams3.setBuildRoot(setupParams.buildRoot() + "/3");
setupJob.reset(qbs::Project().setupProject(setupParams3, m_logSink, 0));
@@ -294,6 +294,19 @@ void TestApi::buildGraphLocking()
const QString newLockFile = setupParams3.buildRoot() + '/' + buildDirName + '/'
+ buildDirName + ".bg.lock";
QVERIFY2(QFileInfo(newLockFile).isFile(), qPrintable(newLockFile));
+ qbs::Project project3 = setupJob->project();
+ QVERIFY(project3.isValid());
+
+ // Case 4: Changing the build directory again, but cancelling the job.
+ setupJob.reset(project3.setupProject(setupParams2, m_logSink, 0));
+ setupJob->cancel();
+ waitForFinished(setupJob.data());
+ QVERIFY(setupJob->error().hasError());
+ QVERIFY2(!QFileInfo(lockFile).exists(), qPrintable(lockFile));
+ QVERIFY2(QFileInfo(newLockFile).isFile(), qPrintable(newLockFile));
+ setupJob.reset(nullptr);
+ project3 = qbs::Project();
+ QVERIFY2(!QFileInfo(newLockFile).exists(), qPrintable(newLockFile));
}
void TestApi::buildProject()