From 6359716fb8b0226a4ec18d3c98bc1c7fcf2d944b Mon Sep 17 00:00:00 2001 From: kh1 Date: Fri, 22 Mar 2013 15:00:11 +0100 Subject: Rewrite copy configuration function. Fix broken function naming. Copy only files that are referenced inside the config file. Replace ":" as well, copy fails here on W8. Task-number: QTIFW-221 Change-Id: Ic039a8c54d4bb391fcd644c9da0dba7b20bda0f5 Reviewed-by: Niels Weber Reviewed-by: Tim Jenssen --- tools/binarycreator/binarycreator.cpp | 128 +++++++++++++++------------------- 1 file changed, 56 insertions(+), 72 deletions(-) (limited to 'tools') diff --git a/tools/binarycreator/binarycreator.cpp b/tools/binarycreator/binarycreator.cpp index d247525ea..7c9770aa4 100644 --- a/tools/binarycreator/binarycreator.cpp +++ b/tools/binarycreator/binarycreator.cpp @@ -479,89 +479,67 @@ static void printUsage() std::cout << std::endl; } -static QString createMetaDataDirectory(const QInstallerTools::PackageInfoVector &packages, - const QString &packagesDir, const QString &configFile) +void copyInstallerConfigurationToDirectory(const QString &configFile, const QString &targetDir) { - const QInstaller::Settings &settings = QInstaller::Settings::fromFileAndPrefix(configFile, QString()); + qDebug() << "Begin to copy configuration file and data."; - const QString metapath = createTemporaryDirectory(); - generateMetaDataDirectory(metapath, packagesDir, packages, settings.applicationName(), - settings.applicationVersion()); + const QString sourceConfigFile = QFileInfo(configFile).absoluteFilePath(); + const QString targetConfigFile = targetDir + QLatin1String("/config.xml"); + QInstallerTools::copyWithException(sourceConfigFile, targetConfigFile, QLatin1String("configuration")); - const QString tempConfigDirPath = metapath + QLatin1String("/installer-config"); - QInstaller::mkdir(tempConfigDirPath); - QString absoluteConfigPath = QFileInfo(configFile).absolutePath(); + QFile configXml(targetConfigFile); + QInstaller::openForRead(&configXml, configXml.fileName()); - QDirIterator it(absoluteConfigPath, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); - while (it.hasNext()) { - const QString next = it.next(); - if (next.contains(QLatin1String("/."))) // skip files that are in directories starting with a dot + QDomDocument dom; + dom.setContent(&configXml); + configXml.close(); + + // iterate over all child elements, searching for relative file names + const QDomNodeList children = dom.documentElement().childNodes(); + const QString sourceConfigFilePath = QFileInfo(sourceConfigFile).absolutePath(); + for (int i = 0; i < children.count(); ++i) { + QDomElement domElement = children.at(i).toElement(); + if (domElement.isNull()) continue; - qDebug() << "Found configuration file: " << next; - const QFileInfo sourceFileInfo(next); - const QString source = sourceFileInfo.absoluteFilePath(); - QFileInfo targetFileInfo(tempConfigDirPath, QFileInfo(next).fileName()); - - if (QFileInfo(next).fileName() == QFileInfo(configFile).fileName()) - targetFileInfo.setFile(tempConfigDirPath, QLatin1String("config.xml")); - - const QDir targetDir = targetFileInfo.dir(); - if (!targetDir.exists()) - QInstaller::mkpath(targetFileInfo.absolutePath()); - const QString target = targetFileInfo.absoluteFilePath(); - - if (!QFile::copy(source, target)) - throw Error(QString::fromLatin1("Could not copy %1.").arg(source)); - - if (sourceFileInfo.fileName() == QFileInfo(configFile).fileName()) { - QFile configXml(targetDir.filePath(QLatin1String("config.xml"))); - configXml.open(QIODevice::ReadOnly); - QDomDocument dom; - dom.setContent(&configXml); - configXml.close(); - - // iterate over all child elements, searching for relative file names - const QDomNodeList children = dom.documentElement().childNodes(); - for (int i = 0; i < children.count(); ++i) { - QDomElement domElement = children.at(i).toElement(); - if (domElement.isNull()) - continue; - - QFileInfo elementFileInfo(absoluteConfigPath, domElement.text()); + const QString tagName = domElement.tagName(); + const QString elementText = domElement.text(); + qDebug() << QString::fromLatin1("Read dom element: <%1>%2.").arg(tagName, elementText); + + QString newName = domElement.text().replace(QRegExp(QLatin1String("\\\\|/|\\.|:")), + QLatin1String("_")); + + QString targetFile; + QFileInfo elementFileInfo; + if (tagName == QLatin1String("Icon") || tagName == QLatin1String("InstallerApplicationIcon")) { #if defined(Q_OS_MAC) - const QFileInfo iconFileInfo(absoluteConfigPath, domElement.text() + QLatin1String(".icns")); + const QString suffix = QLatin1String(".icns"); #elif defined(Q_OS_WIN) - const QFileInfo iconFileInfo(absoluteConfigPath, domElement.text() + QLatin1String(".ico")); + const QString suffix = QLatin1String(".ico"); #else - const QFileInfo iconFileInfo(absoluteConfigPath, domElement.text() + QLatin1String(".png")); + const QString suffix = QLatin1String(".png"); #endif - if (!elementFileInfo.exists() && iconFileInfo.exists()) - elementFileInfo = iconFileInfo; - - if (!elementFileInfo.exists() || elementFileInfo.absolutePath() == QFileInfo(configFile).dir().absolutePath()) - continue; - - if (elementFileInfo.isDir()) - continue; + elementFileInfo = QFileInfo(sourceConfigFilePath, elementText + suffix); + targetFile = targetDir + QLatin1Char('/') + newName + suffix; + } else { + elementFileInfo = QFileInfo(sourceConfigFilePath, elementText); + const QString suffix = elementFileInfo.completeSuffix(); + if (!suffix.isEmpty()) + newName.append(QLatin1Char('.') + suffix); + targetFile = targetDir + QLatin1Char('/') + newName; + } + if (!elementFileInfo.exists() || elementFileInfo.isDir()) + continue; - const QString newName = domElement.text().replace(QRegExp(QLatin1String("\\\\|/|\\.")), - QLatin1String("_")); + domElement.replaceChild(dom.createTextNode(newName), domElement.firstChild()); + QInstallerTools::copyWithException(elementFileInfo.absoluteFilePath(), targetFile, tagName); + } - if (!QFile::exists(targetDir.absoluteFilePath(newName))) { - if (!QFile::copy(elementFileInfo.absoluteFilePath(), targetDir.absoluteFilePath(newName))) - throw Error(QString::fromLatin1("Could not copy %1.").arg(domElement.text())); - } - domElement.replaceChild(dom.createTextNode(newName), domElement.firstChild()); - } + QInstaller::openForWrite(&configXml, configXml.fileName()); + QTextStream stream(&configXml); + dom.save(stream, 4); - openForWrite(&configXml, configXml.fileName()); - QTextStream stream(&configXml); - dom.save(stream, 4); - qDebug() << "done.\n"; - } - } - return metapath; + qDebug() << "done.\n"; } static int printErrorAndUsageAndExit(const QString &err) @@ -716,11 +694,17 @@ int main(int argc, char **argv) qDebug() << "Parsed arguments, ok."; int exitCode = EXIT_FAILURE; - QString tmpMetaDir; + const QString tmpMetaDir = createTemporaryDirectory(); try { QInstallerTools::PackageInfoVector packages = createListOfPackages(packagesDirectory, filteredPackages, ftype); - tmpMetaDir = createMetaDataDirectory(packages, packagesDirectory, configFile); + { + const Settings settings = Settings::fromFileAndPrefix(configFile, QString()); + generateMetaDataDirectory(tmpMetaDir, packagesDirectory, packages, settings.applicationName(), + settings.applicationVersion()); + } + + copyInstallerConfigurationToDirectory(configFile, tmpMetaDir + QLatin1String("/installer-config")); { QSettings confInternal(tmpMetaDir + QLatin1String("/config/config-internal.ini") , QSettings::IniFormat); -- cgit v1.2.3