summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/installer/metadatajob.cpp98
-rw-r--r--src/libs/installer/metadatajob.h2
-rw-r--r--tools/common/repositorygen.cpp66
-rw-r--r--tools/common/repositorygen.h2
-rw-r--r--tools/devtool/main.cpp2
-rw-r--r--tools/repogen/repogen.cpp21
6 files changed, 134 insertions, 57 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index 7976be8ee..5fe660315 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -588,56 +588,55 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re
if (!checksum.isNull())
testCheckSum = (checksum.toElement().text().toLower() == scTrue);
+ // If we have top level sha1 element, we have compressed all metadata inside
+ // one repository to a single 7z file. Fetch that instead of component specific
+ // meta 7z files.
+ const QDomNode sha1 = root.firstChildElement(scSHA1);
QDomNodeList children = root.childNodes();
- for (int i = 0; i < children.count(); ++i) {
- const QDomElement el = children.at(i).toElement();
- if (!el.isNull() && el.tagName() == QLatin1String("PackageUpdate")) {
- const QDomNodeList c2 = el.childNodes();
- QString packageName, packageVersion, packageHash;
- bool metaFound = false;
- for (int j = 0; j < c2.count(); ++j) {
- if (c2.at(j).toElement().tagName() == scName)
- packageName = c2.at(j).toElement().text();
- else if (c2.at(j).toElement().tagName() == scVersion)
- packageVersion = (online ? c2.at(j).toElement().text() : QString());
- else if ((c2.at(j).toElement().tagName() == QLatin1String("SHA1")) && testCheckSum)
- packageHash = c2.at(j).toElement().text();
- else {
- foreach (QString meta, metaElements) {
- if (c2.at(j).toElement().tagName() == meta) {
- metaFound = true;
- break;
+ if (sha1.isNull()) {
+ bool metaFound = false;
+ for (int i = 0; i < children.count(); ++i) {
+ const QDomElement el = children.at(i).toElement();
+ if (!el.isNull() && el.tagName() == QLatin1String("PackageUpdate")) {
+ const QDomNodeList c2 = el.childNodes();
+ QString packageName, packageVersion, packageHash;
+ for (int j = 0; j < c2.count(); ++j) {
+ if (c2.at(j).toElement().tagName() == scName)
+ packageName = c2.at(j).toElement().text();
+ else if (c2.at(j).toElement().tagName() == scVersion)
+ packageVersion = (online ? c2.at(j).toElement().text() : QString());
+ else if ((c2.at(j).toElement().tagName() == QLatin1String("SHA1")) && testCheckSum)
+ packageHash = c2.at(j).toElement().text();
+ else {
+ foreach (QString meta, metaElements) {
+ if (c2.at(j).toElement().tagName() == meta) {
+ metaFound = true;
+ break;
+ }
}
}
}
- }
-
- const QString repoUrl = metadata.repository.url().toString();
- //If script element is not found, no need to fetch metadata
- if (metaFound) {
- FileTaskItem item(QString::fromLatin1("%1/%2/%3meta.7z").arg(repoUrl, packageName,
- packageVersion), metadata.directory + QString::fromLatin1("/%1-%2-meta.7z")
- .arg(packageName, packageVersion));
-
- QAuthenticator authenticator;
- authenticator.setUser(metadata.repository.username());
- authenticator.setPassword(metadata.repository.password());
-
- item.insert(TaskRole::UserRole, metadata.directory);
- item.insert(TaskRole::Checksum, packageHash.toLatin1());
- item.insert(TaskRole::Authenticator, QVariant::fromValue(authenticator));
- item.insert(TaskRole::Name, packageName);
-
- m_packages.append(item);
- } else {
- QString fileName = metadata.directory + QLatin1Char('/') + packageName;
- QDir directory(fileName);
- if (!directory.exists()) {
- directory.mkdir(fileName);
+ const QString repoUrl = metadata.repository.url().toString();
+ //If script element is not found, no need to fetch metadata
+ if (metaFound) {
+ addFileTaskItem(QString::fromLatin1("%1/%2/%3meta.7z").arg(repoUrl, packageName, packageVersion),
+ metadata.directory + QString::fromLatin1("/%1-%2-meta.7z").arg(packageName, packageVersion),
+ metadata, packageHash, packageName);
+ } else {
+ QString fileName = metadata.directory + QLatin1Char('/') + packageName;
+ QDir directory(fileName);
+ if (!directory.exists()) {
+ directory.mkdir(fileName);
+ }
}
}
}
+ } else {
+ const QString repoUrl = metadata.repository.url().toString();
+ addFileTaskItem(QString::fromLatin1("%1/meta.7z").arg(repoUrl),
+ metadata.directory + QString::fromLatin1("/meta.7z"), metadata, sha1.toElement().text(), QString());
}
+
if (metadata.repository.categoryname().isEmpty()) {
m_metaFromDefaultRepositories.insert(metadata.directory, metadata);
} else {
@@ -792,4 +791,19 @@ QSet<Repository> MetadataJob::getRepositories()
return repositories;
}
+void MetadataJob::addFileTaskItem(const QString &source, const QString &target, const Metadata &metadata,
+ const QString &sha1, const QString &packageName)
+{
+ FileTaskItem item(source, target);
+ QAuthenticator authenticator;
+ authenticator.setUser(metadata.repository.username());
+ authenticator.setPassword(metadata.repository.password());
+
+ item.insert(TaskRole::UserRole, metadata.directory);
+ item.insert(TaskRole::Checksum, sha1.toLatin1());
+ item.insert(TaskRole::Authenticator, QVariant::fromValue(authenticator));
+ item.insert(TaskRole::Name, packageName);
+ m_packages.append(item);
+}
+
} // namespace QInstaller
diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h
index cd4f87cd6..e3a7f6a44 100644
--- a/src/libs/installer/metadatajob.h
+++ b/src/libs/installer/metadatajob.h
@@ -99,6 +99,8 @@ private:
void resetCompressedFetch();
Status parseUpdatesXml(const QList<FileTaskResult> &results);
QSet<Repository> getRepositories();
+ void addFileTaskItem(const QString &source, const QString &target, const Metadata &metadata,
+ const QString &sha1, const QString &packageName);
private:
PackageManagerCore *m_core;
diff --git a/tools/common/repositorygen.cpp b/tools/common/repositorygen.cpp
index 7034d32fb..d47189764 100644
--- a/tools/common/repositorygen.cpp
+++ b/tools/common/repositorygen.cpp
@@ -626,14 +626,17 @@ QHash<QString, QString> QInstallerTools::buildPathToVersionMapping(const Package
}
static void writeSHA1ToNodeWithName(QDomDocument &doc, QDomNodeList &list, const QByteArray &sha1sum,
- const QString &nodename)
+ const QString &nodename = QString())
{
- qDebug() << "Searching sha1sum node for" << nodename;
+ if (nodename.isEmpty())
+ qDebug() << "Searching sha1sum node.";
+ else
+ qDebug() << "Searching sha1sum node for " << nodename;
QString sha1Value = QString::fromLatin1(sha1sum.toHex().constData());
for (int i = 0; i < list.size(); ++i) {
QDomNode curNode = list.at(i);
QDomNode nameTag = curNode.firstChildElement(scName);
- if (!nameTag.isNull() && nameTag.toElement().text() == nodename) {
+ if ((!nameTag.isNull() && nameTag.toElement().text() == nodename) || nodename.isEmpty()) {
QDomNode sha1Node = curNode.firstChildElement(scSHA1);
if (!sha1Node.isNull() && sha1Node.hasChildNodes()) {
QDomNode sha1NodeChild = sha1Node.firstChild();
@@ -656,7 +659,7 @@ static void writeSHA1ToNodeWithName(QDomDocument &doc, QDomNodeList &list, const
}
void QInstallerTools::compressMetaDirectories(const QString &repoDir, const QString &baseDir,
- const QHash<QString, QString> &versionMapping)
+ const QHash<QString, QString> &versionMapping, bool createUnitedMetadata, bool createOnlyUnitedMetadata)
{
QDomDocument doc;
QDomElement root;
@@ -683,19 +686,60 @@ void QInstallerTools::compressMetaDirectories(const QString &repoDir, const QStr
const QString fn = QLatin1String(versionPrefix.toLatin1() + "meta.7z");
const QString tmpTarget = repoDir + QLatin1String("/") +fn;
Lib7z::createArchive(tmpTarget, QStringList() << absPath, Lib7z::TmpFile::No);
+ }
- // remove the files that got compressed
- QInstaller::removeFiles(absPath, true);
+ QStringList absPaths;
+ if (createUnitedMetadata || createOnlyUnitedMetadata) {
+ QStringList finalTargets;
+ foreach (const QString &i, sub) {
+ QDir sd(dir);
+ sd.cd(i);
+ const QString absPath = sd.absolutePath();
+ finalTargets.append(absPath);
+ absPaths.append(absPath);
+ }
+
+ // Compress all metadata from repository to one single 7z
+ const QString fn = QLatin1String("meta.7z");
+ const QString tmpTarget = repoDir + QLatin1String("/") +fn;
+ Lib7z::createArchive(tmpTarget, finalTargets, Lib7z::TmpFile::No);
QFile tmp(tmpTarget);
tmp.open(QFile::ReadOnly);
const QByteArray sha1Sum = QInstaller::calculateHash(&tmp, QCryptographicHash::Sha1);
- writeSHA1ToNodeWithName(doc, elements, sha1Sum, path);
- const QString finalTarget = absPath + QLatin1String("/") + fn;
- if (!tmp.rename(finalTarget)) {
- throw QInstaller::Error(QString::fromLatin1("Cannot move file \"%1\" to \"%2\".").arg(
- QDir::toNativeSeparators(tmpTarget), QDir::toNativeSeparators(finalTarget)));
+ elements = doc.elementsByTagName(QLatin1String("Updates"));
+ writeSHA1ToNodeWithName(doc, elements, sha1Sum, QString());
+ }
+
+ if (!createOnlyUnitedMetadata) {
+ foreach (const QString &i, sub) {
+ QDir sd(dir);
+ sd.cd(i);
+ const QString absPath = sd.absolutePath();
+ const QString path = QString(i).remove(baseDir);
+ const QString versionPrefix = versionMapping[path];
+ if (path.isNull())
+ continue;
+ const QString fn = QLatin1String(versionPrefix.toLatin1() + "meta.7z");
+ const QString tmpTarget = repoDir + QLatin1String("/") + fn;
+ Lib7z::createArchive(tmpTarget, QStringList() << absPath, Lib7z::TmpFile::No);
+ // remove the files that got compressed
+ QInstaller::removeFiles(absPath, true);
+ QFile tmp(tmpTarget);
+ tmp.open(QFile::ReadOnly);
+ const QByteArray sha1Sum = QInstaller::calculateHash(&tmp, QCryptographicHash::Sha1);
+ writeSHA1ToNodeWithName(doc, elements, sha1Sum, path);
+ const QString finalTarget = absPath + QLatin1String("/") + fn;
+ if (!tmp.rename(finalTarget)) {
+ throw QInstaller::Error(QString::fromLatin1("Cannot move file \"%1\" to \"%2\".").arg(
+ QDir::toNativeSeparators(tmpTarget), QDir::toNativeSeparators(finalTarget)));
+ }
+
}
+ } else {
+ // remove the files that got compressed
+ foreach (const QString path, absPaths)
+ QInstaller::removeFiles(path, true);
}
QInstaller::openForWrite(&existingUpdatesXml);
diff --git a/tools/common/repositorygen.h b/tools/common/repositorygen.h
index ead9e15be..c3ae6869f 100644
--- a/tools/common/repositorygen.h
+++ b/tools/common/repositorygen.h
@@ -67,7 +67,7 @@ PackageInfoVector createListOfRepositoryPackages(const QStringList &repositoryDi
QHash<QString, QString> buildPathToVersionMapping(const PackageInfoVector &info);
void compressMetaDirectories(const QString &repoDir, const QString &baseDir,
- const QHash<QString, QString> &versionMapping);
+ const QHash<QString, QString> &versionMapping, bool createUnitedMetadata, bool createOnlyUnitedMetadata);
void copyMetaData(const QString &outDir, const QString &dataDir, const PackageInfoVector &packages,
const QString &appName, const QString& appVersion);
diff --git a/tools/devtool/main.cpp b/tools/devtool/main.cpp
index dbe8f2b09..208ef148e 100644
--- a/tools/devtool/main.cpp
+++ b/tools/devtool/main.cpp
@@ -96,7 +96,7 @@ static QStringList split(int index, const QString &description)
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
- app.setApplicationVersion(QLatin1String("1.0.0"));
+ app.setApplicationVersion(QLatin1String("2.0.0"));
QCommandLineParser parser;
QCommandLineOption help = parser.addHelpOption();
diff --git a/tools/repogen/repogen.cpp b/tools/repogen/repogen.cpp
index e785ffd04..2d16fa720 100644
--- a/tools/repogen/repogen.cpp
+++ b/tools/repogen/repogen.cpp
@@ -68,6 +68,13 @@ static void printUsage()
std::cout << " -v|--verbose Verbose output" << std::endl;
+ std::cout << " --unite-metadata Combine all metadata into one 7z. This speeds up metadata " << std::endl;
+ std::cout << " download phase. Creates also metadata 7z per component for " << std::endl;
+ std::cout << " backward compatibility." << std::endl;
+
+ std::cout << " --unite-metadata-only Combine all metadata into one 7z. This speeds up metadata " << std::endl;
+ std::cout << " download phase." << std::endl;
+
std::cout << std::endl;
std::cout << "Example:" << std::endl;
std::cout << " " << appName << " -p ../examples/packages repository/"
@@ -99,6 +106,8 @@ int main(int argc, char** argv)
QInstallerTools::FilterType filterType = QInstallerTools::Exclude;
bool remove = false;
bool updateExistingRepositoryWithNewComponents = false;
+ bool createUnitedMetadata = false;
+ bool createOnlyUnitedMetadata = false;
//TODO: use a for loop without removing values from args like it is in binarycreator.cpp
//for (QStringList::const_iterator it = args.begin(); it != args.end(); ++it) {
@@ -176,7 +185,14 @@ int main(int argc, char** argv)
} else if (args.first() == QLatin1String("-r") || args.first() == QLatin1String("--remove")) {
remove = true;
args.removeFirst();
- } else {
+ } else if (args.first() == QLatin1String("--unite-metadata")) {
+ createUnitedMetadata = true;
+ args.removeFirst();
+ } else if (args.first() == QLatin1String("--unite-metadata-only")) {
+ createOnlyUnitedMetadata = true;
+ args.removeFirst();
+ }
+ else {
printUsage();
return 1;
}
@@ -281,7 +297,8 @@ int main(int argc, char** argv)
QInstallerTools::copyComponentData(directories, repositoryDir, &packages);
QInstallerTools::copyMetaData(tmpMetaDir, repositoryDir, packages, QLatin1String("{AnyApplication}"),
QLatin1String(QUOTE(IFW_REPOSITORY_FORMAT_VERSION)));
- QInstallerTools::compressMetaDirectories(tmpMetaDir, tmpMetaDir, pathToVersionMapping);
+ QInstallerTools::compressMetaDirectories(tmpMetaDir, tmpMetaDir, pathToVersionMapping,
+ createUnitedMetadata, createOnlyUnitedMetadata);
QDirIterator it(repositoryDir, QStringList(QLatin1String("Updates*.xml")), QDir::Files | QDir::CaseSensitive);
while (it.hasNext()) {