Make AbstractPackagingStep and derived classes thread safe

Change-Id: I30d412dde2484b756dd2f06ed0a7b5030c14c9eb
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
This commit is contained in:
Daniel Teske
2011-10-13 18:53:49 +02:00
parent 2c2a8a7889
commit 487b56b0b7
6 changed files with 161 additions and 71 deletions

View File

@@ -77,9 +77,38 @@ AbstractMaemoPackageCreationStep::~AbstractMaemoPackageCreationStep()
{ {
} }
bool AbstractMaemoPackageCreationStep::init()
{
if (!AbstractPackagingStep::init())
return false;
m_packagingNeeded = isPackagingNeeded();
if (!isPackagingNeeded())
return true;
if (!qt4BuildConfiguration()) {
raiseError(tr("No Qt4 build configuration"));
return false;
}
m_environment = qt4BuildConfiguration()->environment();
if (qt4BuildConfiguration()->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild) {
m_environment.appendOrSet(QLatin1String("DEB_BUILD_OPTIONS"),
QLatin1String("nostrip"), QLatin1String(" "));
}
if (!qt4BuildConfiguration()->qtVersion()) {
raiseError(tr("Packaging failed: No Qt version."));
return false;
}
m_qmakeCommand = qt4BuildConfiguration()->qtVersion()->qmakeCommand();
return true;
}
void AbstractMaemoPackageCreationStep::run(QFutureInterface<bool> &fi) void AbstractMaemoPackageCreationStep::run(QFutureInterface<bool> &fi)
{ {
if (!isPackagingNeeded()) { if (!m_packagingNeeded) {
emit addOutput(tr("Package up to date."), MessageOutput); emit addOutput(tr("Package up to date."), MessageOutput);
fi.reportResult(true); fi.reportResult(true);
return; return;
@@ -145,12 +174,6 @@ AbstractRpmBasedQt4MaemoTarget *AbstractMaemoPackageCreationStep::rpmBasedMaemoT
return qobject_cast<AbstractRpmBasedQt4MaemoTarget*>(buildConfiguration()->target()); return qobject_cast<AbstractRpmBasedQt4MaemoTarget*>(buildConfiguration()->target());
} }
QString AbstractMaemoPackageCreationStep::projectName() const
{
return qt4BuildConfiguration()->qt4Target()->qt4Project()
->rootProjectNode()->displayName().toLower();
}
bool AbstractMaemoPackageCreationStep::isPackagingNeeded() const bool AbstractMaemoPackageCreationStep::isPackagingNeeded() const
{ {
if (AbstractPackagingStep::isPackagingNeeded()) if (AbstractPackagingStep::isPackagingNeeded())
@@ -190,18 +213,15 @@ QString AbstractMaemoPackageCreationStep::nativePath(const QFile &file)
bool AbstractMaemoPackageCreationStep::callPackagingCommand(QProcess *proc, bool AbstractMaemoPackageCreationStep::callPackagingCommand(QProcess *proc,
const QStringList &arguments) const QStringList &arguments)
{ {
preparePackagingProcess(proc, qt4BuildConfiguration(), packageDirectory()); proc->setEnvironment(m_environment.toStringList());
const QtSupport::BaseQtVersion * const qtVersion = qt4BuildConfiguration()->qtVersion(); proc->setWorkingDirectory(cachedPackageDirectory());
if (!qtVersion) {
raiseError(tr("Packaging failed: No Qt version.")); const QString madCommand = MaemoGlobal::madCommand(m_qmakeCommand);
return false;
}
const QString madCommand = MaemoGlobal::madCommand(qtVersion->qmakeCommand());
const QString cmdLine = madCommand + QLatin1Char(' ') const QString cmdLine = madCommand + QLatin1Char(' ')
+ arguments.join(QLatin1String(" ")); + arguments.join(QLatin1String(" "));
emit addOutput(tr("Package Creation: Running command '%1'.").arg(cmdLine), emit addOutput(tr("Package Creation: Running command '%1'.").arg(cmdLine),
BuildStep::MessageOutput); BuildStep::MessageOutput);
MaemoGlobal::callMad(*proc, arguments, qtVersion->qmakeCommand(), true); MaemoGlobal::callMad(*proc, arguments, m_qmakeCommand, true);
if (!proc->waitForStarted()) { if (!proc->waitForStarted()) {
raiseError(tr("Packaging failed: Could not start command '%1'. Reason: %2") raiseError(tr("Packaging failed: Could not start command '%1'. Reason: %2")
.arg(cmdLine, proc->errorString())); .arg(cmdLine, proc->errorString()));
@@ -221,7 +241,6 @@ bool AbstractMaemoPackageCreationStep::callPackagingCommand(QProcess *proc,
return true; return true;
} }
void AbstractMaemoPackageCreationStep::preparePackagingProcess(QProcess *proc, void AbstractMaemoPackageCreationStep::preparePackagingProcess(QProcess *proc,
const Qt4BuildConfiguration *bc, const QString &workingDir) const Qt4BuildConfiguration *bc, const QString &workingDir)
{ {
@@ -244,6 +263,9 @@ QString AbstractMaemoPackageCreationStep::replaceDots(const QString &name) const
return name; return name;
} }
////////////////
// MaemoDebianPackageCreationStep
////////////////
MaemoDebianPackageCreationStep::MaemoDebianPackageCreationStep(BuildStepList *bsl) MaemoDebianPackageCreationStep::MaemoDebianPackageCreationStep(BuildStepList *bsl)
: AbstractMaemoPackageCreationStep(bsl, CreatePackageId) : AbstractMaemoPackageCreationStep(bsl, CreatePackageId)
@@ -266,13 +288,25 @@ void MaemoDebianPackageCreationStep::ctor()
setDefaultDisplayName(tr("Create Debian Package")); setDefaultDisplayName(tr("Create Debian Package"));
} }
bool MaemoDebianPackageCreationStep::init()
{
if (!AbstractMaemoPackageCreationStep::init())
return false;
m_maddeRoot = MaemoGlobal::maddeRoot(qt4BuildConfiguration()->qtVersion()->qmakeCommand());
m_projectDirectory = buildConfiguration()->target()->project()->projectDirectory();
m_pkgFileName = maemoTarget()->packageFileName();
m_packageName = maemoTarget()->packageName();
m_templatesDirPath = debBasedMaemoTarget()->debianDirPath();
m_debugBuild = qt4BuildConfiguration()->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild;
checkProjectName();
return true;
}
bool MaemoDebianPackageCreationStep::createPackage(QProcess *buildProc, bool MaemoDebianPackageCreationStep::createPackage(QProcess *buildProc,
const QFutureInterface<bool> &fi) const QFutureInterface<bool> &fi)
{ {
Q_UNUSED(fi); Q_UNUSED(fi);
checkProjectName(); const bool inSourceBuild = QFileInfo(cachedPackageDirectory()) == QFileInfo(m_projectDirectory);
const QString projectDir = buildConfiguration()->target()->project()->projectDirectory();
const bool inSourceBuild = QFileInfo(packageDirectory()) == QFileInfo(projectDir);
if (!copyDebianFiles(inSourceBuild)) if (!copyDebianFiles(inSourceBuild))
return false; return false;
const QStringList args = QStringList() << QLatin1String("dpkg-buildpackage") const QStringList args = QStringList() << QLatin1String("dpkg-buildpackage")
@@ -280,35 +314,33 @@ bool MaemoDebianPackageCreationStep::createPackage(QProcess *buildProc,
if (!callPackagingCommand(buildProc, args)) if (!callPackagingCommand(buildProc, args))
return false; return false;
QFile::remove(packageFilePath()); QFile::remove(cachedPackageFilePath());
// Workaround for non-working dh_builddeb --destdir=. // Workaround for non-working dh_builddeb --destdir=.
if (!QDir(packageDirectory()).isRoot()) { if (!QDir(cachedPackageDirectory()).isRoot()) {
const AbstractQt4MaemoTarget * const target = maemoTarget();
QString error; QString error;
const QString pkgFileName = target->packageFileName();
if (!error.isEmpty()) if (!error.isEmpty())
raiseError(tr("Packaging failed: Could not get package name.")); raiseError(tr("Packaging failed: Could not get package name."));
const QString changesSourceFileName = QFileInfo(pkgFileName).completeBaseName() const QString changesSourceFileName = QFileInfo(m_pkgFileName).completeBaseName()
+ QLatin1String(".changes"); + QLatin1String(".changes");
const QString changesTargetFileName = replaceDots(QFileInfo(pkgFileName).completeBaseName()) const QString changesTargetFileName = replaceDots(QFileInfo(m_pkgFileName).completeBaseName())
+ QLatin1String(".changes"); + QLatin1String(".changes");
const QString packageSourceDir = packageDirectory() + QLatin1String("/../"); const QString packageSourceDir = cachedPackageDirectory() + QLatin1String("/../");
const QString packageSourceFilePath = packageSourceDir + pkgFileName; const QString packageSourceFilePath = packageSourceDir + m_pkgFileName;
const QString changesSourceFilePath = packageSourceDir + changesSourceFileName; const QString changesSourceFilePath = packageSourceDir + changesSourceFileName;
const QString changesTargetFilePath const QString changesTargetFilePath
= packageDirectory() + QLatin1Char('/') + changesTargetFileName; = cachedPackageDirectory() + QLatin1Char('/') + changesTargetFileName;
QFile::remove(changesTargetFilePath); QFile::remove(changesTargetFilePath);
if (!QFile::rename(packageSourceFilePath, packageFilePath()) if (!QFile::rename(packageSourceFilePath, cachedPackageFilePath())
|| !QFile::rename(changesSourceFilePath, changesTargetFilePath)) { || !QFile::rename(changesSourceFilePath, changesTargetFilePath)) {
raiseError(tr("Packaging failed: Could not move package files from '%1' to '%2'.") raiseError(tr("Packaging failed: Could not move package files from '%1' to '%2'.")
.arg(packageSourceDir, packageDirectory())); .arg(packageSourceDir, cachedPackageDirectory()));
return false; return false;
} }
} }
if (inSourceBuild) { if (inSourceBuild) {
buildProc->start(packagingCommand(qt4BuildConfiguration(), QLatin1String("dh_clean"))); buildProc->start(packagingCommand(m_maddeRoot, QLatin1String("dh_clean")));
buildProc->waitForFinished(); buildProc->waitForFinished();
buildProc->terminate(); buildProc->terminate();
} }
@@ -344,7 +376,7 @@ void MaemoDebianPackageCreationStep::checkProjectName()
bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild) bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild)
{ {
const QString debianDirPath = packageDirectory() + QLatin1String("/debian"); const QString debianDirPath = cachedPackageDirectory() + QLatin1String("/debian");
const QString magicFilePath const QString magicFilePath
= debianDirPath + QLatin1Char('/') + MagicFileName; = debianDirPath + QLatin1Char('/') + MagicFileName;
if (inSourceBuild && QFileInfo(debianDirPath).isDir() if (inSourceBuild && QFileInfo(debianDirPath).isDir()
@@ -362,16 +394,15 @@ bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild)
.arg(debianDirPath, error)); .arg(debianDirPath, error));
return false; return false;
} }
QDir buildDir(packageDirectory()); QDir buildDir(cachedPackageDirectory());
if (!buildDir.mkdir("debian")) { if (!buildDir.mkdir("debian")) {
raiseError(tr("Could not create Debian directory '%1'.").arg(debianDirPath)); raiseError(tr("Could not create Debian directory '%1'.").arg(debianDirPath));
return false; return false;
} }
const QString templatesDirPath = debBasedMaemoTarget()->debianDirPath(); QDir templatesDir(m_templatesDirPath);
QDir templatesDir(templatesDirPath);
const QStringList &files = templatesDir.entryList(QDir::Files); const QStringList &files = templatesDir.entryList(QDir::Files);
foreach (const QString &fileName, files) { foreach (const QString &fileName, files) {
const QString srcFile = templatesDirPath + QLatin1Char('/') + fileName; const QString srcFile = m_templatesDirPath + QLatin1Char('/') + fileName;
QString newFileName = fileName; QString newFileName = fileName;
if (newFileName == Qt4HarmattanTarget::aegisManifestFileName()) { if (newFileName == Qt4HarmattanTarget::aegisManifestFileName()) {
// If the user has touched the Aegis manifest file, we copy it for use // If the user has touched the Aegis manifest file, we copy it for use
@@ -379,7 +410,7 @@ bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild)
// unless the user explicitly requests that no manifest should be created. // unless the user explicitly requests that no manifest should be created.
if (QFileInfo(srcFile).size() == 0) if (QFileInfo(srcFile).size() == 0)
continue; continue;
newFileName = maemoTarget()->packageName() + QLatin1String(".aegis"); newFileName = m_packageName + QLatin1String(".aegis");
} }
const QString destFile = debianDirPath + QLatin1Char('/') + newFileName; const QString destFile = debianDirPath + QLatin1Char('/') + newFileName;
@@ -424,12 +455,9 @@ bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild)
return true; return true;
} }
QString MaemoDebianPackageCreationStep::packagingCommand(const Qt4BuildConfiguration *bc, QString MaemoDebianPackageCreationStep::packagingCommand(const QString &maddeRoot, const QString &commandName)
const QString &commandName)
{ {
QString perl; QString perl;
QtSupport::BaseQtVersion *v = bc->qtVersion();
const QString maddeRoot = MaemoGlobal::maddeRoot(v->qmakeCommand());
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
perl = maddeRoot + QLatin1String("/bin/perl.exe "); perl = maddeRoot + QLatin1String("/bin/perl.exe ");
#endif #endif
@@ -457,10 +485,8 @@ bool MaemoDebianPackageCreationStep::adaptRulesFile(
return false; return false;
} }
QByteArray content = reader.data(); QByteArray content = reader.data();
const Qt4BuildConfiguration * const bc = qt4BuildConfiguration();
// Always check for dependencies in release builds. // Always check for dependencies in release builds.
if (!(bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild)) if (!m_debugBuild)
ensureShlibdeps(content); ensureShlibdeps(content);
Utils::FileSaver saver(rulesFilePath); Utils::FileSaver saver(rulesFilePath);
@@ -474,6 +500,9 @@ bool MaemoDebianPackageCreationStep::adaptRulesFile(
return true; return true;
} }
/////////////////
// MaemoRpmPackageCreationStep
/////////////////
MaemoRpmPackageCreationStep::MaemoRpmPackageCreationStep(BuildStepList *bsl) MaemoRpmPackageCreationStep::MaemoRpmPackageCreationStep(BuildStepList *bsl)
: AbstractMaemoPackageCreationStep(bsl, CreatePackageId) : AbstractMaemoPackageCreationStep(bsl, CreatePackageId)
@@ -493,22 +522,27 @@ void MaemoRpmPackageCreationStep::ctor()
setDefaultDisplayName(tr("Create RPM Package")); setDefaultDisplayName(tr("Create RPM Package"));
} }
bool MaemoRpmPackageCreationStep::init()
{
m_specFile = rpmBasedMaemoTarget()->specFilePath();
m_packageFileName = rpmBasedMaemoTarget()->packageFileName();
return AbstractMaemoPackageCreationStep::init();
}
bool MaemoRpmPackageCreationStep::createPackage(QProcess *buildProc, bool MaemoRpmPackageCreationStep::createPackage(QProcess *buildProc,
const QFutureInterface<bool> &fi) const QFutureInterface<bool> &fi)
{ {
setPackagingStarted();
Q_UNUSED(fi); Q_UNUSED(fi);
const QStringList args = QStringList() << QLatin1String("rrpmbuild") const QStringList args = QStringList() << QLatin1String("rrpmbuild")
<< QLatin1String("-bb") << rpmBasedMaemoTarget()->specFilePath(); << QLatin1String("-bb") << m_specFile;
if (!callPackagingCommand(buildProc, args)) if (!callPackagingCommand(buildProc, args))
return false; return false;
QFile::remove(packageFilePath()); QFile::remove(cachedPackageFilePath());
const QString packageSourceFilePath = rpmBuildDir() + QLatin1Char('/') const QString packageSourceFilePath = rpmBuildDir() + QLatin1Char('/')
+ rpmBasedMaemoTarget()->packageFileName(); + m_packageFileName;
if (!QFile::rename(packageSourceFilePath, packageFilePath())) { if (!QFile::rename(packageSourceFilePath, cachedPackageFilePath())) {
raiseError(tr("Packaging failed: Could not move package file from %1 to %2.") raiseError(tr("Packaging failed: Could not move package file from %1 to %2.")
.arg(packageSourceFilePath, packageFilePath())); .arg(packageSourceFilePath, cachedPackageFilePath()));
return false; return false;
} }
@@ -524,7 +558,7 @@ bool MaemoRpmPackageCreationStep::isMetaDataNewerThan(const QDateTime &packageDa
QString MaemoRpmPackageCreationStep::rpmBuildDir() const QString MaemoRpmPackageCreationStep::rpmBuildDir() const
{ {
return packageDirectory() + QLatin1String("/rrpmbuild"); return cachedPackageDirectory() + QLatin1String("/rrpmbuild");
} }
const QString MaemoRpmPackageCreationStep::CreatePackageId const QString MaemoRpmPackageCreationStep::CreatePackageId

View File

@@ -32,7 +32,8 @@
#ifndef MAEMOPACKAGECREATIONSTEP_H #ifndef MAEMOPACKAGECREATIONSTEP_H
#define MAEMOPACKAGECREATIONSTEP_H #define MAEMOPACKAGECREATIONSTEP_H
#include<remotelinux/abstractpackagingstep.h> #include <remotelinux/abstractpackagingstep.h>
#include <utils/environment.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QDateTime; class QDateTime;
@@ -81,6 +82,7 @@ protected:
bool callPackagingCommand(QProcess *proc, const QStringList &arguments); bool callPackagingCommand(QProcess *proc, const QStringList &arguments);
QString replaceDots(const QString &name) const; QString replaceDots(const QString &name) const;
virtual bool init();
private slots: private slots:
void handleBuildOutput(); void handleBuildOutput();
@@ -94,11 +96,13 @@ private:
virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi) = 0; virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi) = 0;
virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const = 0; virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const = 0;
QString projectName() const;
static QString nativePath(const QFile &file); static QString nativePath(const QFile &file);
bool isPackagingNeeded() const; bool isPackagingNeeded() const;
const Qt4ProjectManager::Qt4BuildConfiguration *m_lastBuildConfig; const Qt4ProjectManager::Qt4BuildConfiguration *m_lastBuildConfig;
bool m_packagingNeeded;
Utils::Environment m_environment;
QString m_qmakeCommand;
}; };
@@ -115,16 +119,23 @@ private:
MaemoDebianPackageCreationStep(ProjectExplorer::BuildStepList *buildConfig, MaemoDebianPackageCreationStep(ProjectExplorer::BuildStepList *buildConfig,
MaemoDebianPackageCreationStep *other); MaemoDebianPackageCreationStep *other);
virtual bool init();
virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi); virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi);
virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const; virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const;
void ctor(); void ctor();
static QString packagingCommand(const Qt4ProjectManager::Qt4BuildConfiguration *bc, static QString packagingCommand(const QString &maddeRoot, const QString &commandName);
const QString &commandName);
bool copyDebianFiles(bool inSourceBuild); bool copyDebianFiles(bool inSourceBuild);
void checkProjectName(); void checkProjectName();
bool adaptRulesFile(const QString &templatePath, const QString &rulesFilePath); bool adaptRulesFile(const QString &templatePath, const QString &rulesFilePath);
QString m_maddeRoot;
QString m_projectDirectory;
QString m_pkgFileName;
QString m_packageName;
QString m_templatesDirPath;
bool m_debugBuild;
static const QString CreatePackageId; static const QString CreatePackageId;
}; };
@@ -136,6 +147,7 @@ public:
MaemoRpmPackageCreationStep(ProjectExplorer::BuildStepList *bsl); MaemoRpmPackageCreationStep(ProjectExplorer::BuildStepList *bsl);
private: private:
bool init();
virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi); virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi);
virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const; virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const;
@@ -145,6 +157,9 @@ private:
void ctor(); void ctor();
QString rpmBuildDir() const; QString rpmBuildDir() const;
QString m_specFile;
QString m_packageFileName;
static const QString CreatePackageId; static const QString CreatePackageId;
}; };

View File

@@ -51,10 +51,10 @@ namespace Internal {
class AbstractPackagingStepPrivate class AbstractPackagingStepPrivate
{ {
public: public:
AbstractPackagingStepPrivate() : currentBuildConfiguration(0), running(false) { } AbstractPackagingStepPrivate() : currentBuildConfiguration(0) { }
BuildConfiguration *currentBuildConfiguration; BuildConfiguration *currentBuildConfiguration;
bool running; QString cachedPackageFilePath;
QString cachedPackageDirectory; QString cachedPackageDirectory;
}; };
@@ -78,6 +78,9 @@ void AbstractPackagingStep::ctor()
connect(target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), connect(target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)),
SLOT(handleBuildConfigurationChanged())); SLOT(handleBuildConfigurationChanged()));
handleBuildConfigurationChanged(); handleBuildConfigurationChanged();
connect(this, SIGNAL(unmodifyDeploymentInfo()),
this, SLOT(setDeploymentInfoUnmodified()));
} }
AbstractPackagingStep::~AbstractPackagingStep() AbstractPackagingStep::~AbstractPackagingStep()
@@ -97,6 +100,11 @@ void AbstractPackagingStep::handleBuildConfigurationChanged()
emit packageFilePathChanged(); emit packageFilePathChanged();
} }
QString AbstractPackagingStep::cachedPackageFilePath() const
{
return d->cachedPackageFilePath;
}
QString AbstractPackagingStep::packageFilePath() const QString AbstractPackagingStep::packageFilePath() const
{ {
if (packageDirectory().isEmpty()) if (packageDirectory().isEmpty())
@@ -104,10 +112,13 @@ QString AbstractPackagingStep::packageFilePath() const
return packageDirectory() + QLatin1Char('/') + packageFileName(); return packageDirectory() + QLatin1Char('/') + packageFileName();
} }
QString AbstractPackagingStep::cachedPackageDirectory() const
{
return d->cachedPackageDirectory;
}
QString AbstractPackagingStep::packageDirectory() const QString AbstractPackagingStep::packageDirectory() const
{ {
if (d->running)
return d->cachedPackageDirectory;
return d->currentBuildConfiguration return d->currentBuildConfiguration
? d->currentBuildConfiguration->buildDirectory() : QString(); ? d->currentBuildConfiguration->buildDirectory() : QString();
} }
@@ -137,19 +148,25 @@ bool AbstractPackagingStep::isPackagingNeeded() const
bool AbstractPackagingStep::init() bool AbstractPackagingStep::init()
{ {
d->cachedPackageDirectory = packageDirectory(); d->cachedPackageDirectory = packageDirectory();
d->cachedPackageFilePath = packageFilePath();
return true; return true;
} }
void AbstractPackagingStep::setPackagingStarted() void AbstractPackagingStep::setPackagingStarted()
{ {
d->running = true;
} }
// called in ::run thread
void AbstractPackagingStep::setPackagingFinished(bool success) void AbstractPackagingStep::setPackagingFinished(bool success)
{ {
d->running = false;
if (success) if (success)
deployConfiguration()->deploymentInfo()->setUnmodified(); emit unmodifyDeploymentInfo();
}
// called in gui thread
void AbstractPackagingStep::setDeploymentInfoUnmodified()
{
deployConfiguration()->deploymentInfo()->setUnmodified();
} }
void AbstractPackagingStep::raiseError(const QString &errorMessage) void AbstractPackagingStep::raiseError(const QString &errorMessage)

View File

@@ -36,7 +36,8 @@
#include <projectexplorer/buildstep.h> #include <projectexplorer/buildstep.h>
namespace RemoteLinux { namespace RemoteLinux {
class RemoteLinuxDeployConfiguration; class RemoteLinuxDeployConfiguration;
class DeploymentInfo;
namespace Internal { namespace Internal {
class AbstractPackagingStepPrivate; class AbstractPackagingStepPrivate;
@@ -52,10 +53,12 @@ public:
~AbstractPackagingStep(); ~AbstractPackagingStep();
QString packageFilePath() const; QString packageFilePath() const;
QString cachedPackageFilePath() const;
bool init(); bool init();
signals: signals:
void packageFilePathChanged(); void packageFilePathChanged();
void unmodifyDeploymentInfo();
protected: protected:
void setPackagingStarted(); void setPackagingStarted();
@@ -63,12 +66,14 @@ protected:
void raiseError(const QString &errorMessage); void raiseError(const QString &errorMessage);
RemoteLinuxDeployConfiguration *deployConfiguration() const; RemoteLinuxDeployConfiguration *deployConfiguration() const;
QString cachedPackageDirectory() const;
QString packageDirectory() const; QString packageDirectory() const;
virtual bool isPackagingNeeded() const; virtual bool isPackagingNeeded() const;
private slots: private slots:
void handleBuildConfigurationChanged(); void handleBuildConfigurationChanged();
void setDeploymentInfoUnmodified();
private: private:
virtual QString packageFileName() const = 0; virtual QString packageFileName() const = 0;

View File

@@ -114,6 +114,22 @@ void TarPackageCreationStep::ctor()
setDefaultDisplayName(displayName()); setDefaultDisplayName(displayName());
} }
bool TarPackageCreationStep::init()
{
if (!AbstractPackagingStep::init())
return false;
m_packagingNeeded = isPackagingNeeded();
if (!m_packagingNeeded)
return true;
const QSharedPointer<DeploymentInfo> deploymentInfo = deployConfiguration()->deploymentInfo();
for (int i = 0; i < deploymentInfo->deployableCount(); ++i) {
m_files.append(deploymentInfo->deployableAt(i));
}
return true;
}
void TarPackageCreationStep::run(QFutureInterface<bool> &fi) void TarPackageCreationStep::run(QFutureInterface<bool> &fi)
{ {
setPackagingStarted(); setPackagingStarted();
@@ -129,23 +145,21 @@ void TarPackageCreationStep::run(QFutureInterface<bool> &fi)
bool TarPackageCreationStep::doPackage(QFutureInterface<bool> &fi) bool TarPackageCreationStep::doPackage(QFutureInterface<bool> &fi)
{ {
emit addOutput(tr("Creating tarball..."), MessageOutput); emit addOutput(tr("Creating tarball..."), MessageOutput);
if (!isPackagingNeeded()) { if (!m_packagingNeeded) {
emit addOutput(tr("Tarball up to date, skipping packaging."), MessageOutput); emit addOutput(tr("Tarball up to date, skipping packaging."), MessageOutput);
return true; return true;
} }
// TODO: Optimization: Only package changed files // TODO: Optimization: Only package changed files
QFile tarFile(packageFilePath()); QFile tarFile(cachedPackageFilePath());
if (!tarFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { if (!tarFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
raiseError(tr("Error: tar file %1 cannot be opened (%2).") raiseError(tr("Error: tar file %1 cannot be opened (%2).")
.arg(QDir::toNativeSeparators(packageFilePath()), tarFile.errorString())); .arg(QDir::toNativeSeparators(cachedPackageFilePath()), tarFile.errorString()));
return false; return false;
} }
const QSharedPointer<DeploymentInfo> deploymentInfo = deployConfiguration()->deploymentInfo(); foreach (const DeployableFile &d, m_files) {
for (int i = 0; i < deploymentInfo->deployableCount(); ++i) {
const DeployableFile &d = deploymentInfo->deployableAt(i);
QFileInfo fileInfo(d.localFilePath); QFileInfo fileInfo(d.localFilePath);
if (!appendFile(tarFile, fileInfo, d.remoteDir + QLatin1Char('/') if (!appendFile(tarFile, fileInfo, d.remoteDir + QLatin1Char('/')
+ fileInfo.fileName(), fi)) { + fileInfo.fileName(), fi)) {
@@ -275,7 +289,7 @@ bool TarPackageCreationStep::writeHeader(QFile &tarFile, const QFileInfo &fileIn
header.chksum[sizeof header.chksum-1] = 0; header.chksum[sizeof header.chksum-1] = 0;
if (!tarFile.write(reinterpret_cast<char *>(&header), sizeof header)) { if (!tarFile.write(reinterpret_cast<char *>(&header), sizeof header)) {
raiseError(tr("Error writing tar file '%1': %2") raiseError(tr("Error writing tar file '%1': %2")
.arg(QDir::toNativeSeparators(packageFilePath()), tarFile.errorString())); .arg(QDir::toNativeSeparators(cachedPackageFilePath()), tarFile.errorString()));
return false; return false;
} }
return true; return true;

View File

@@ -33,6 +33,7 @@
#include "abstractpackagingstep.h" #include "abstractpackagingstep.h"
#include "remotelinux_export.h" #include "remotelinux_export.h"
#include "deployablefile.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFile; class QFile;
@@ -51,6 +52,7 @@ public:
static QString stepId(); static QString stepId();
static QString displayName(); static QString displayName();
bool init();
void run(QFutureInterface<bool> &fi); void run(QFutureInterface<bool> &fi);
private: private:
ProjectExplorer::BuildStepConfigWidget *createConfigWidget(); ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
@@ -63,6 +65,9 @@ private:
const QString &remoteFilePath, const QFutureInterface<bool> &fi); const QString &remoteFilePath, const QFutureInterface<bool> &fi);
bool writeHeader(QFile &tarFile, const QFileInfo &fileInfo, bool writeHeader(QFile &tarFile, const QFileInfo &fileInfo,
const QString &remoteFilePath); const QString &remoteFilePath);
bool m_packagingNeeded;
QList<DeployableFile> m_files;
}; };
} // namespace RemoteLinux } // namespace RemoteLinux