diff --git a/src/tools/qpatch/files-to-patch-linux b/src/tools/qpatch/files-to-patch-linux index ab1139d8005e692396e230674d1ff264b7d7e836..8fa0394d0b319e7ff0520f01ed2e2d682bf85fdd 100644 --- a/src/tools/qpatch/files-to-patch-linux +++ b/src/tools/qpatch/files-to-patch-linux @@ -281,6 +281,7 @@ plugins/sqldrivers/libqsqlite.so plugins/sqldrivers/libqsqlite2.so plugins/sqldrivers/libqsqlmysql.so plugins/sqldrivers/libqsqlpsql.so +%% lib/libQtCore.la lib/libQt3Support.la lib/libQtCLucene.la diff --git a/src/tools/qpatch/qpatch.cpp b/src/tools/qpatch/qpatch.cpp index 10930c7f21f43404a9a548cc31eaf6c4ebde3126..c6f29c794fecd5d0b901251497c3df2be8b76a78 100644 --- a/src/tools/qpatch/qpatch.cpp +++ b/src/tools/qpatch/qpatch.cpp @@ -9,7 +9,7 @@ int main(int argc, char *argv[]) args.removeFirst(); if (args.size() != 3) { - std::cerr << "Usage: qpatch file oldQtDir newQtDir" << std::endl; + std::cerr << "Usage: qpatch file.list oldQtDir newQtDir" << std::endl; return EXIT_FAILURE; } @@ -17,10 +17,6 @@ int main(int argc, char *argv[]) const QByteArray qtDirPath = QFile::encodeName(args.takeFirst()); const QByteArray newQtPath = QFile::encodeName(args.takeFirst()); - QString suffix; - if (! args.isEmpty()) - suffix = args.takeFirst(); - if (qtDirPath.size() < newQtPath.size()) { std::cerr << "qpatch: error: newQtDir needs to be less than " << qtDirPath.size() << " characters." << std::endl; @@ -33,44 +29,54 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - QStringList filesToPatch; + QStringList filesToPatch, textFilesToPatch; + bool readingTextFilesToPatch = false; + + // read the input file QTextStream in(&fn); + forever { - QString line; - line = in.readLine(); + const QString line = in.readLine(); if (line.isNull()) break; - filesToPatch.append(line); - } + else if (line.isEmpty()) + continue; + + else if (line.startsWith(QLatin1String("%%"))) + readingTextFilesToPatch = true; + else if (readingTextFilesToPatch) + textFilesToPatch.append(line); + + else + filesToPatch.append(line); + } foreach (QString fileName, filesToPatch) { + QString prefix = newQtPath; - QString prefix; - prefix += newQtPath; if (! prefix.endsWith(QLatin1Char('/'))) prefix += QLatin1Char('/'); fileName.prepend(prefix); - qDebug() << "patch file:" << fileName; - continue; - QFile file(fileName); if (! file.open(QFile::ReadOnly)) { - std::cerr << "qpatch: warning: file not found" << std::endl; + std::cerr << "qpatch: warning: file `" << qPrintable(fileName) << "' not found" << std::endl; continue; } - const QFile::Permissions permissions = file.permissions(); - const QByteArray source = file.readAll(); file.close(); + int index = 0; - QVector<char> patched; + if (! file.open(QFile::WriteOnly | QFile::Truncate)) { + std::cerr << "qpatch: error: file `" << qPrintable(fileName) << "' not writable" << std::endl; + continue; + } forever { int start = source.indexOf(qtDirPath, index); @@ -78,26 +84,26 @@ int main(int argc, char *argv[]) break; int endOfString = start; - while (source.at(endOfString)) - ++endOfString; + for (; endOfString < source.size(); ++endOfString) { + if (! source.at(endOfString)) + break; + } ++endOfString; // include the '\0' - //qDebug() << "*** found string:" << source.mid(start, endOfString - start); - - for (int i = index; i < start; ++i) - patched.append(source.at(i)); + if (index != start) + file.write(source.constData() + index, start - index); int length = endOfString - start; QVector<char> s; - for (const char *x = newQtPath.constData(); x != newQtPath.constEnd() - 1; ++x) + for (const char *x = newQtPath.constData(); x != newQtPath.constEnd(); ++x) s.append(*x); const int qtDirPathLength = qtDirPath.size(); - for (const char *x = source.constData() + start + qtDirPathLength - 1; - x != source.constData() + endOfString; ++x) + for (const char *x = source.constData() + start + qtDirPathLength; + x != source.constData() + endOfString; ++x) s.append(*x); const int oldSize = s.size(); @@ -105,20 +111,44 @@ int main(int argc, char *argv[]) for (int i = oldSize; i < length; ++i) s.append('\0'); - for (int i = 0; i < s.size(); ++i) - patched.append(s.at(i)); +#if 0 + std::cout << "replace string: " << source.mid(start, endOfString - start).constData() + << " with: " << s.constData() << std::endl; +#endif + + file.write(s.constData(), s.size()); index = endOfString; } - for (int i = index; i < source.size(); ++i) - patched.append(source.at(i)); + if (index != source.size()) + file.write(source.constData() + index, source.size() - index); + } - QFile out(fileName /* + suffix*/); - out.setPermissions(permissions); - if (out.open(QFile::WriteOnly)) { - out.write(patched.constData(), patched.size()); + foreach (QString fileName, textFilesToPatch) { + QString prefix = newQtPath; + + if (! prefix.endsWith(QLatin1Char('/'))) + prefix += QLatin1Char('/'); + + fileName.prepend(prefix); + + QFile file(fileName); + if (! file.open(QFile::ReadOnly)) { + std::cerr << "qpatch: warning: file `" << qPrintable(fileName) << "' not found" << std::endl; + continue; } + + QByteArray source = file.readAll(); + file.close(); + + if (! file.open(QFile::WriteOnly | QFile::Truncate)) { + std::cerr << "qpatch: error: file `" << qPrintable(fileName) << "' not writable" << std::endl; + continue; + } + + source.replace(qtDirPath, newQtPath); + file.write(source); } return 0;