From e25a4c083c3bc0bb31e9f1779ada313f983e39f94cbfb30a331842c872d47d25 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Fri, 28 Jun 2019 14:32:03 +0000 Subject: [PATCH] Accepting request 712125 from KDE:Qt:5.13 - Add patch to restore compatibility with akonadi's PGSQL backend (see https://bugs.archlinux.org/task/62997): * 0001-Revert-Always-escape-the-table-names-when-creating-t.patch - Disable libzstd support again, it breaks various existing codebases (QTBUG-76521) - Update to 5.13.0: * New bugfix release * No changelog available * For more details about Qt 5.13 please see: * http://code.qt.io/cgit/qt/qtbase.git/plain/dist/changes-5.13.0/?h=5.13 - Remove patches, now upstream: * 0001-Add-quoting-to-deal-with-empty-CMAKE_CXX_STANDARD_LI.patch - Add patches to improve compatibility with Krita: * 0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch * 0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch * 0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch - Revert yet another commit to fix linker errors: * 0001-Revert-qmake-link-qt-libraries-by-full-path.patch - Enable libzstd support - Revert some commits in the hope of fixing some broken paths (QTBUG-76255): * 0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch * 0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch * 0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch - Add patch to fix some cmake module config files (QTBUG-76244): OBS-URL: https://build.opensuse.org/request/show/712125 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtbase?expand=0&rev=97 --- ...-of-QDockWidget-when-it-gets-undocke.patch | 51 ++ ...-Fix-page-breaking-with-large-images.patch | 122 ---- ...cape-the-table-names-when-creating-t.patch | 652 ++++++++++++++++++ ...-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch | 34 + ...qmake-link-qt-libraries-by-full-path.patch | 147 ++++ ...ce-absolute-Qt-lib-dir-in-.prl-files.patch | 26 + ...x-build-libs-with-no-feature-regular.patch | 87 ++- ...-LeaveEvent-for-accepted-QTabletEven.patch | 50 ++ ...n-ID-for-recognition-of-UGEE-tablets.patch | 30 + ...eplacements-if-libdir-is-in-QMAKE_DE.patch | 29 + libqt5-qtbase.changes | 92 +++ libqt5-qtbase.spec | 42 +- qapplication-emit-palettechanged.patch | 31 - qtbase-everywhere-src-5.12.3.tar.xz | 3 - qtbase-everywhere-src-5.13.0.tar.xz | 3 + reproducible-qrc-time.patch | 26 - 16 files changed, 1184 insertions(+), 241 deletions(-) create mode 100644 0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch delete mode 100644 0001-Fix-page-breaking-with-large-images.patch create mode 100644 0001-Revert-Always-escape-the-table-names-when-creating-t.patch create mode 100644 0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch create mode 100644 0001-Revert-qmake-link-qt-libraries-by-full-path.patch create mode 100644 0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch create mode 100644 0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch create mode 100644 0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch create mode 100644 0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch delete mode 100644 qapplication-emit-palettechanged.patch delete mode 100644 qtbase-everywhere-src-5.12.3.tar.xz create mode 100644 qtbase-everywhere-src-5.13.0.tar.xz delete mode 100644 reproducible-qrc-time.patch diff --git a/0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch b/0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch new file mode 100644 index 0000000..79eadec --- /dev/null +++ b/0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch @@ -0,0 +1,51 @@ +From a69373ff735e1ae3e14b5a05a08e4aebf9216185 Mon Sep 17 00:00:00 2001 +From: Dmitry Kazakov +Date: Thu, 6 Dec 2018 16:16:27 +0300 +Subject: [PATCH 1/3] Fix notification of QDockWidget when it gets undocked + +Before the patch the notification was emitted only when the docker +was attached to the panel or changed a position on it. + +It looks like the old behavior was documented in a unittest, +so this patch might actually be a "behavior change". + +Change-Id: Id3ffbd2018a8e68844d174328dd1c4ceb7fa01d3 +Reviewed-by: Richard Moe Gustavsen +--- + src/widgets/widgets/qdockwidget.cpp | 2 ++ + tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp | 6 +++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp +index 4041c730b8..f98e0e44db 100644 +--- a/src/widgets/widgets/qdockwidget.cpp ++++ b/src/widgets/widgets/qdockwidget.cpp +@@ -1182,6 +1182,8 @@ void QDockWidgetPrivate::setWindowState(bool floating, bool unplug, const QRect + QMainWindowLayout *mwlayout = qt_mainwindow_layout_from_dock(q); + if (mwlayout) + emit q->dockLocationChanged(mwlayout->dockWidgetArea(q)); ++ } else { ++ emit q->dockLocationChanged(Qt::NoDockWidgetArea); + } + } + +diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp +index f8ce6a2c0a..625116654d 100644 +--- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp ++++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp +@@ -670,7 +670,11 @@ void tst_QDockWidget::dockLocationChanged() + spy.clear(); + + dw.setFloating(true); +- QTest::qWait(100); ++ QTRY_COMPARE(spy.count(), 1); ++ QCOMPARE(qvariant_cast(spy.at(0).at(0)), ++ Qt::NoDockWidgetArea); ++ spy.clear(); ++ + dw.setFloating(false); + QTRY_COMPARE(spy.count(), 1); + QCOMPARE(qvariant_cast(spy.at(0).at(0)), +-- +2.21.0 + diff --git a/0001-Fix-page-breaking-with-large-images.patch b/0001-Fix-page-breaking-with-large-images.patch deleted file mode 100644 index 843e0f7..0000000 --- a/0001-Fix-page-breaking-with-large-images.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 1d4523091db7e83e895f5a392bb43b02d0367658 Mon Sep 17 00:00:00 2001 -From: Lars Knoll -Date: Fri, 26 Apr 2019 09:15:52 +0200 -Subject: [PATCH] Fix page breaking with large images - -Don't go into an infinite loop breaking pages, when an image is about -as large as the page. Correctly take top and bottom margins into account -when calculating whether the image could fit on one page. - -Amends change 416b4cf685030114837bd375664fd12047895a62. - -Fixes: QTBUG-73730 -Change-Id: Id311ddf05510be3b1d131702f4e17025a9861e58 -Reviewed-by: Simon Hausmann ---- - src/gui/text/qtextdocumentlayout.cpp | 5 +- - .../tst_qtextdocumentlayout.cpp | 60 +++++++++++++++++++ - 2 files changed, 64 insertions(+), 1 deletion(-) - -diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp -index 2e1a2b5bff..bed0a2c450 100644 ---- a/src/gui/text/qtextdocumentlayout.cpp -+++ b/src/gui/text/qtextdocumentlayout.cpp -@@ -145,6 +145,9 @@ struct QTextLayoutStruct { - inline QFixed absoluteY() const - { return frameY + y; } - -+ inline QFixed contentHeight() const -+ { return pageHeight - pageBottomMargin - pageTopMargin; } -+ - inline int currentPage() const - { return pageHeight == 0 ? 0 : (absoluteY() / pageHeight).truncate(); } - -@@ -2701,7 +2704,7 @@ void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosi - getLineHeightParams(blockFormat, line, scaling, &lineAdjustment, &lineBreakHeight, &lineHeight, &lineBottom); - - while (layoutStruct->pageHeight > 0 && layoutStruct->absoluteY() + lineBreakHeight > layoutStruct->pageBottom && -- layoutStruct->pageHeight >= lineBreakHeight) { -+ layoutStruct->contentHeight() >= lineBreakHeight) { - layoutStruct->newPage(); - - floatMargins(layoutStruct->y, layoutStruct, &left, &right); -diff --git a/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp b/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp -index c79f787547..f66b16b970 100644 ---- a/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp -+++ b/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp -@@ -59,6 +59,8 @@ private slots: - void imageAtRightAlignedTab(); - void blockVisibility(); - -+ void largeImage(); -+ - private: - QTextDocument *doc; - }; -@@ -347,5 +349,63 @@ void tst_QTextDocumentLayout::blockVisibility() - QCOMPARE(doc->size(), halfSize); - } - -+void tst_QTextDocumentLayout::largeImage() -+{ -+ auto img = QImage(400, 500, QImage::Format_ARGB32_Premultiplied); -+ img.fill(Qt::black); -+ -+ { -+ QTextDocument document; -+ -+ document.addResource(QTextDocument::ImageResource, -+ QUrl("data://test.png"), QVariant(img)); -+ document.setPageSize({500, 504}); -+ -+ auto html = ""; -+ document.setHtml(html); -+ -+ QCOMPARE(document.pageCount(), 2); -+ } -+ -+ { -+ QTextDocument document; -+ -+ document.addResource(QTextDocument::ImageResource, -+ QUrl("data://test.png"), QVariant(img)); -+ document.setPageSize({500, 508}); -+ -+ auto html = ""; -+ document.setHtml(html); -+ -+ QCOMPARE(document.pageCount(), 1); -+ } -+ -+ { -+ QTextDocument document; -+ -+ document.addResource(QTextDocument::ImageResource, -+ QUrl("data://test.png"), QVariant(img)); -+ document.setPageSize({585, 250}); -+ -+ auto html = ""; -+ document.setHtml(html); -+ -+ QCOMPARE(document.pageCount(), 3); -+ } -+ -+ { -+ QTextDocument document; -+ -+ document.addResource(QTextDocument::ImageResource, -+ QUrl("data://test.png"), QVariant(img)); -+ document.setPageSize({585, 258}); -+ -+ auto html = ""; -+ document.setHtml(html); -+ -+ QCOMPARE(document.pageCount(), 2); -+ } -+} -+ - QTEST_MAIN(tst_QTextDocumentLayout) - #include "tst_qtextdocumentlayout.moc" --- -2.21.0 - diff --git a/0001-Revert-Always-escape-the-table-names-when-creating-t.patch b/0001-Revert-Always-escape-the-table-names-when-creating-t.patch new file mode 100644 index 0000000..7c4461f --- /dev/null +++ b/0001-Revert-Always-escape-the-table-names-when-creating-t.patch @@ -0,0 +1,652 @@ +From abc2468e46b1f0263f79615cd8d78c559436e3d4 Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Wed, 26 Jun 2019 14:18:58 +0200 +Subject: [PATCH] Revert "Always escape the table names when creating the SQL + statement" + +This reverts commit 461ef575bcf778ba24b0be6b775098d4b80ae5e1. +--- + src/plugins/sqldrivers/mysql/qsql_mysql.cpp | 2 +- + src/plugins/sqldrivers/psql/qsql_psql.cpp | 24 +++- + .../doc/snippets/code/doc_src_sql-driver.qdoc | 13 --- + src/sql/doc/src/sql-driver.qdoc | 17 --- + src/sql/kernel/qsqldatabase.cpp | 10 -- + src/sql/kernel/qsqldriver.cpp | 16 +-- + .../sql/kernel/qsqldatabase/tst_databases.h | 14 +-- + .../kernel/qsqldatabase/tst_qsqldatabase.cpp | 110 +++++++----------- + .../sql/kernel/qsqlquery/tst_qsqlquery.cpp | 14 ++- + .../tst_qsqlrelationaltablemodel.cpp | 14 ++- + .../qsqltablemodel/tst_qsqltablemodel.cpp | 10 ++ + 11 files changed, 106 insertions(+), 138 deletions(-) + +diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +index febbe58506..80c0c9c522 100644 +--- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp ++++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +@@ -1551,7 +1551,7 @@ QSqlIndex QMYSQLDriver::primaryIndex(const QString& tablename) const + QSqlQuery i(createResult()); + QString stmt(QLatin1String("show index from %1;")); + QSqlRecord fil = record(tablename); +- i.exec(stmt.arg(escapeIdentifier(tablename, QSqlDriver::TableName))); ++ i.exec(stmt.arg(tablename)); + while (i.isActive() && i.next()) { + if (i.value(2).toString() == QLatin1String("PRIMARY")) { + idx.append(fil.field(i.value(4).toString())); +diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp +index c1be91cb22..7abd1f242b 100644 +--- a/src/plugins/sqldrivers/psql/qsql_psql.cpp ++++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp +@@ -1396,8 +1396,16 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString &tablename) const + QString tbl = tablename; + QString schema; + qSplitTableName(tbl, schema); +- schema = stripDelimiters(schema, QSqlDriver::TableName); +- tbl = stripDelimiters(tbl, QSqlDriver::TableName); ++ ++ if (isIdentifierEscaped(tbl, QSqlDriver::TableName)) ++ tbl = stripDelimiters(tbl, QSqlDriver::TableName); ++ else ++ tbl = std::move(tbl).toLower(); ++ ++ if (isIdentifierEscaped(schema, QSqlDriver::TableName)) ++ schema = stripDelimiters(schema, QSqlDriver::TableName); ++ else ++ schema = std::move(schema).toLower(); + + QString stmt = QStringLiteral("SELECT pg_attribute.attname, pg_attribute.atttypid::int, " + "pg_class.relname " +@@ -1432,8 +1440,16 @@ QSqlRecord QPSQLDriver::record(const QString &tablename) const + QString tbl = tablename; + QString schema; + qSplitTableName(tbl, schema); +- schema = stripDelimiters(schema, QSqlDriver::TableName); +- tbl = stripDelimiters(tbl, QSqlDriver::TableName); ++ ++ if (isIdentifierEscaped(tbl, QSqlDriver::TableName)) ++ tbl = stripDelimiters(tbl, QSqlDriver::TableName); ++ else ++ tbl = std::move(tbl).toLower(); ++ ++ if (isIdentifierEscaped(schema, QSqlDriver::TableName)) ++ schema = stripDelimiters(schema, QSqlDriver::TableName); ++ else ++ schema = std::move(schema).toLower(); + + QString stmt = QStringLiteral("SELECT pg_attribute.attname, pg_attribute.atttypid::int, " + "pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, " +diff --git a/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc +index 9709deeccb..d127bdf8a5 100644 +--- a/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc ++++ b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc +@@ -237,16 +237,3 @@ Could not create database object + //! [38] + QPSQLDriver::getResult: Query results lost - probably discarded on executing another SQL query. + //! [38] +- +-//! [39] +-CREATE TABLE "testTable" ("id" INTEGER); +-//! [39] +- +-//! [40] +-QString tableString("testTable"); +-QSqlQuery q; +-// Create table query is not quoted, therefore it is mapped to lower case +-q.exec(QString("CREATE TABLE %1 (id INTEGER)").arg(tableString)); +-// Call toLower() on the string so that it can be matched +-QSqlRecord rec = database.record(tableString.toLower()); +-//! [40] +diff --git a/src/sql/doc/src/sql-driver.qdoc b/src/sql/doc/src/sql-driver.qdoc +index cccce48bb3..fd95e89812 100644 +--- a/src/sql/doc/src/sql-driver.qdoc ++++ b/src/sql/doc/src/sql-driver.qdoc +@@ -381,23 +381,6 @@ + multibyte enabled PostgreSQL server can be found in the PostgreSQL + Administrator Guide, Chapter 5. + +- \section3 QPSQL Case Sensitivity +- +- PostgreSQL databases will only respect case sensitivity if the table or field +- name is quoted when the table is created. So for example, a SQL query such +- as: +- +- \snippet code/doc_src_sql-driver.qdoc 39 +- +- will ensure that it can be accessed with the same case that was used. If the +- table or field name is not quoted when created, the actual table name +- or field name will be lower-case. When QSqlDatabase::record() or +- QSqlDatabase::primaryIndex() access a table or field that was unquoted +- when created, the name passed to the function must be lower-case to +- ensure it is found. For example: +- +- \snippet code/doc_src_sql-driver.qdoc 40 +- + \section3 QPSQL BLOB Support + + Binary Large Objects are supported through the \c BYTEA field type in +diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp +index d63a9e59a8..12ab9671b5 100644 +--- a/src/sql/kernel/qsqldatabase.cpp ++++ b/src/sql/kernel/qsqldatabase.cpp +@@ -1088,11 +1088,6 @@ QStringList QSqlDatabase::tables(QSql::TableType type) const + Returns the primary index for table \a tablename. If no primary + index exists, an empty QSqlIndex is returned. + +- \note Some drivers, such as the \l {QPSQL Case Sensitivity}{QPSQL} +- driver, may may require you to pass \a tablename in lower case if +- the table was not quoted when created. See the +- \l{sql-driver.html}{Qt SQL driver} documentation for more information. +- + \sa tables(), record() + */ + +@@ -1107,11 +1102,6 @@ QSqlIndex QSqlDatabase::primaryIndex(const QString& tablename) const + the table (or view) called \a tablename. The order in which the + fields appear in the record is undefined. If no such table (or + view) exists, an empty record is returned. +- +- \note Some drivers, such as the \l {QPSQL Case Sensitivity}{QPSQL} +- driver, may may require you to pass \a tablename in lower case if +- the table was not quoted when created. See the +- \l{sql-driver.html}{Qt SQL driver} documentation for more information. + */ + + QSqlRecord QSqlDatabase::record(const QString& tablename) const +diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp +index 7f7b81b05b..8c6ae382f6 100644 +--- a/src/sql/kernel/qsqldriver.cpp ++++ b/src/sql/kernel/qsqldriver.cpp +@@ -488,8 +488,6 @@ QString QSqlDriver::stripDelimiters(const QString &identifier, IdentifierType ty + QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, + const QSqlRecord &rec, bool preparedStatement) const + { +- const auto tableNameString = tableName.isEmpty() ? QString() +- : prepareIdentifier(tableName, QSqlDriver::TableName, this); + int i; + QString s; + s.reserve(128); +@@ -502,12 +500,13 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, + if (s.isEmpty()) + return s; + s.chop(2); +- s = QLatin1String("SELECT ") + s + QLatin1String(" FROM ") + tableNameString; ++ s.prepend(QLatin1String("SELECT ")).append(QLatin1String(" FROM ")).append(tableName); + break; + case WhereStatement: + { +- const QString tableNamePrefix = tableNameString.isEmpty() +- ? QString() : tableNameString + QLatin1Char('.'); ++ const QString tableNamePrefix = tableName.isEmpty() ++ ? QString() ++ : prepareIdentifier(tableName, QSqlDriver::TableName, this) + QLatin1Char('.'); + for (int i = 0; i < rec.count(); ++i) { + if (!rec.isGenerated(i)) + continue; +@@ -524,7 +523,8 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, + break; + } + case UpdateStatement: +- s = s + QLatin1String("UPDATE ") + tableNameString + QLatin1String(" SET "); ++ s.append(QLatin1String("UPDATE ")).append(tableName).append( ++ QLatin1String(" SET ")); + for (i = 0; i < rec.count(); ++i) { + if (!rec.isGenerated(i)) + continue; +@@ -541,10 +541,10 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, + s.clear(); + break; + case DeleteStatement: +- s = s + QLatin1String("DELETE FROM ") + tableNameString; ++ s.append(QLatin1String("DELETE FROM ")).append(tableName); + break; + case InsertStatement: { +- s = s + QLatin1String("INSERT INTO ") + tableNameString + QLatin1String(" ("); ++ s.append(QLatin1String("INSERT INTO ")).append(tableName).append(QLatin1String(" (")); + QString vals; + for (i = 0; i < rec.count(); ++i) { + if (!rec.isGenerated(i)) +diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h +index 55875359ff..97397e3159 100644 +--- a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h ++++ b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h +@@ -79,14 +79,14 @@ inline QString fixupTableName(const QString &tableName, QSqlDatabase db) + return tbName; + } + +-inline static QString qTableName(const QString &prefix, const char *sourceFileName, +- QSqlDatabase db, bool escape = true) ++inline static QString qTableName(const QString& prefix, const char *sourceFileName, QSqlDatabase db) + { +- const auto tableStr = fixupTableName(QString(QLatin1String("dbtst") + db.driverName() + +- QString::number(qHash(QLatin1String(sourceFileName) + +- "_" + qGetHostName().replace("-", "_")), 16) + +- "_" + prefix), db); +- return escape ? db.driver()->escapeIdentifier(tableStr, QSqlDriver::TableName) : tableStr; ++ QString tableStr = QLatin1String("dbtst"); ++ if (db.driverName().toLower().contains("ODBC")) ++ tableStr += QLatin1String("_odbc"); ++ return fixupTableName(QString(QLatin1String("dbtst") + db.driverName() + ++ QString::number(qHash(QLatin1String(sourceFileName) + ++ "_" + qGetHostName().replace( "-", "_" )), 16) + "_" + prefix), db); + } + + inline static QString qTableName(const QString& prefix, QSqlDatabase db) +diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp +index f309231b10..75db31e45f 100644 +--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp ++++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp +@@ -314,8 +314,10 @@ void tst_QSqlDatabase::createTestTables(QSqlDatabase db) + " (id integer not null, t_varchar varchar(40) not null, " + "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))")); + } ++ + if (testWhiteSpaceNames(db.driverName())) { +- QString qry = "create table " + qTableName("qtest test", __FILE__, db) ++ QString qry = "create table " ++ + db.driver()->escapeIdentifier(tableName + " test", QSqlDriver::TableName) + + '(' + + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName) + + " int not null primary key)"; +@@ -339,7 +341,6 @@ void tst_QSqlDatabase::dropTestTables(QSqlDatabase db) + const QString qtestTable = qTableName("qtest", __FILE__, db); + QStringList tableNames; + tableNames << qtestTable +- << qTableName("qtest test", __FILE__, db) + << qTableName("qtestfields", __FILE__, db) + << qTableName("qtestalter", __FILE__, db) + << qTableName("qtest_temp", __FILE__, db) +@@ -512,9 +513,7 @@ void tst_QSqlDatabase::tables() + CHECK_DATABASE(db); + QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); + +- const auto qtest(qTableName("qtest", __FILE__, db, false)), +- qtest_view(qTableName("qtest_view", __FILE__, db, false)), +- temp_tab(qTableName("test_tab", __FILE__, db, false)); ++ const QString qtest(qTableName("qtest", __FILE__, db)), qtest_view(qTableName("qtest_view", __FILE__, db)), temp_tab(qTableName("test_tab", __FILE__, db)); + + bool views = true; + bool tempTables = false; +@@ -579,10 +578,10 @@ void tst_QSqlDatabase::whitespaceInIdentifiers() + const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); + + if (testWhiteSpaceNames(db.driverName())) { +- const auto tableName(qTableName("qtest test", __FILE__, db, false)); ++ const QString tableName(qTableName("qtest", __FILE__, db) + " test"); + QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive)); + +- QSqlRecord rec = db.record(tableName); ++ QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName)); + QCOMPARE(rec.count(), 1); + QCOMPARE(rec.fieldName(0), QString("test test")); + if (dbType == QSqlDriver::Oracle) +@@ -590,7 +589,7 @@ void tst_QSqlDatabase::whitespaceInIdentifiers() + else + QCOMPARE(rec.field(0).type(), QVariant::Int); + +- QSqlIndex idx = db.primaryIndex(tableName); ++ QSqlIndex idx = db.primaryIndex(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName)); + QCOMPARE(idx.count(), 1); + QCOMPARE(idx.fieldName(0), QString("test test")); + if (dbType == QSqlDriver::Oracle) +@@ -608,12 +607,11 @@ void tst_QSqlDatabase::alterTable() + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + const QString qtestalter(qTableName("qtestalter", __FILE__, db)); +- const auto noEscapeAlterTable = qTableName("qtestalter", __FILE__, db, false); + + QSqlQuery q(db); + + QVERIFY_SQL(q, exec("create table " + qtestalter + " (F1 char(20), F2 char(20), F3 char(20))")); +- QSqlRecord rec = db.record(noEscapeAlterTable); ++ QSqlRecord rec = db.record(qtestalter); + QCOMPARE((int)rec.count(), 3); + + int i; +@@ -625,7 +623,7 @@ void tst_QSqlDatabase::alterTable() + QSKIP("DBMS doesn't support dropping columns in ALTER TABLE statement"); + } + +- rec = db.record(noEscapeAlterTable); ++ rec = db.record(qtestalter); + + QCOMPARE((int)rec.count(), 2); + +@@ -683,16 +681,13 @@ void tst_QSqlDatabase::testRecord(const FieldDef fieldDefs[], const QSqlRecord& + void tst_QSqlDatabase::commonFieldTest(const FieldDef fieldDefs[], QSqlDatabase db, const int fieldCount) + { + CHECK_DATABASE(db); +- const QStringList tableNames = { qTableName("qtestfields", __FILE__, db), +- qTableName("qtestfields", __FILE__, db, false) }; +- for (const QString table : tableNames) { +- QSqlRecord rec = db.record(table); +- QCOMPARE(rec.count(), fieldCount + 1); +- testRecord(fieldDefs, rec, db); +- } ++ const QString tableName = qTableName("qtestfields", __FILE__, db); ++ QSqlRecord rec = db.record(tableName); ++ QCOMPARE((int)rec.count(), fieldCount+1); ++ testRecord(fieldDefs, rec, db); ++ + QSqlQuery q(db); +- // Only check the escaped entry +- QVERIFY_SQL(q, exec("select * from " + tableNames.at(0))); ++ QVERIFY_SQL(q, exec("select * from " + tableName)); + } + + void tst_QSqlDatabase::recordTDS() +@@ -851,8 +846,12 @@ void tst_QSqlDatabase::recordPSQL() + QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriver::PostgreSQL) + QVERIFY_SQL( q, exec("set client_min_messages='warning'")); +- q.exec("drop sequence " + qTableName("qtestfields_t_bigserial_seq", __FILE__, db)); +- q.exec("drop sequence " + qTableName("qtestfields_t_serial_seq", __FILE__, db)); ++ const QString tableName = qTableName("qtestfields", __FILE__, db); ++ q.exec("drop sequence " + tableName + "_t_bigserial_seq"); ++ q.exec("drop sequence " + tableName + "_t_serial_seq"); ++ // older psql cut off the table name ++ q.exec("drop sequence " + tableName + "_t_bigserial_seq"); ++ q.exec("drop sequence " + tableName + "_t_serial_seq"); + + const int fieldCount = createFieldTable(fieldDefs, db); + QVERIFY(fieldCount > 0); +@@ -1206,40 +1205,27 @@ void tst_QSqlDatabase::caseSensivity() + const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); + + bool cs = false; +- if (dbType == QSqlDriver::MySqlServer || dbType == QSqlDriver::SQLite +- || dbType == QSqlDriver::Sybase || dbType == QSqlDriver::PostgreSQL ++ if (dbType == QSqlDriver::MySqlServer || dbType == QSqlDriver::SQLite || dbType == QSqlDriver::Sybase + || dbType == QSqlDriver::MSSqlServer || db.driverName().startsWith("QODBC")) + cs = true; + +- QSqlRecord rec = db.record(qTableName("qtest", __FILE__, db, false)); ++ QSqlRecord rec = db.record(qTableName("qtest", __FILE__, db)); + QVERIFY((int)rec.count() > 0); + if (!cs) { +- rec = db.record(qTableName("QTEST", __FILE__, db, false).toUpper()); ++ rec = db.record(qTableName("QTEST", __FILE__, db).toUpper()); + QVERIFY((int)rec.count() > 0); +- rec = db.record(qTableName("qTesT", __FILE__, db, false)); ++ rec = db.record(qTableName("qTesT", __FILE__, db)); + QVERIFY((int)rec.count() > 0); + } + +- rec = db.primaryIndex(qTableName("qtest", __FILE__, db, false)); ++ rec = db.primaryIndex(qTableName("qtest", __FILE__, db)); + QVERIFY((int)rec.count() > 0); + if (!cs) { +- rec = db.primaryIndex(qTableName("QTEST", __FILE__, db, false).toUpper()); ++ rec = db.primaryIndex(qTableName("QTEST", __FILE__, db).toUpper()); + QVERIFY((int)rec.count() > 0); +- rec = db.primaryIndex(qTableName("qTesT", __FILE__, db, false)); ++ rec = db.primaryIndex(qTableName("qTesT", __FILE__, db)); + QVERIFY((int)rec.count() > 0); + } +- +- // Explicit test for case sensitive table creation without quoting +- QSqlQuery qry(db); +- const auto noQuotesTable = qTableName("NoQuotes", __FILE__, db, false); +- tst_Databases::safeDropTable(db, noQuotesTable); +- QVERIFY_SQL(qry, exec("CREATE TABLE " + noQuotesTable + " (id INTEGER)")); +- QVERIFY_SQL(qry, exec("INSERT INTO " + noQuotesTable + " VALUES(1)")); +- QVERIFY_SQL(qry, exec("SELECT * FROM " + noQuotesTable)); +- QVERIFY_SQL(qry, next()); +- QCOMPARE(qry.value(0).toInt(), 1); +- rec = db.record(cs ? noQuotesTable.toLower() : noQuotesTable); +- QVERIFY(rec.count() > 0); + } + + void tst_QSqlDatabase::noEscapedFieldNamesInRecord() +@@ -1274,19 +1260,17 @@ void tst_QSqlDatabase::psql_schemas() + const QString schemaName = qTableName("qtestschema", __FILE__, db); + QVERIFY_SQL(q, exec("CREATE SCHEMA " + schemaName)); + +- const auto table = schemaName + '.' + qTableName("qtesttable", __FILE__, db); +- const auto noescapeTable = qTableName("qtestschema", __FILE__, db, false) + '.' + +- qTableName("qtesttable", __FILE__, db, false); ++ QString table = schemaName + '.' + qTableName("qtesttable", __FILE__, db); + QVERIFY_SQL(q, exec("CREATE TABLE " + table + " (id int primary key, name varchar(20))")); + +- QVERIFY(db.tables().contains(noescapeTable, Qt::CaseInsensitive)); ++ QVERIFY(db.tables().contains(table, Qt::CaseInsensitive)); + +- QSqlRecord rec = db.record(noescapeTable); ++ QSqlRecord rec = db.record(table); + QCOMPARE(rec.count(), 2); + QCOMPARE(rec.fieldName(0), QString("id")); + QCOMPARE(rec.fieldName(1), QString("name")); + +- QSqlIndex idx = db.primaryIndex(noescapeTable); ++ QSqlIndex idx = db.primaryIndex(table); + QCOMPARE(idx.count(), 1); + QCOMPARE(idx.fieldName(0), QString("id")); + } +@@ -1304,21 +1288,18 @@ void tst_QSqlDatabase::psql_escapedIdentifiers() + QSqlQuery q(db); + QVERIFY_SQL( q, exec("set client_min_messages='warning'")); + +- const char bumpyCase[] = "qtestScHeMa"; +- const QString schemaName(qTableName(bumpyCase, __FILE__, db)), ++ const QString schemaName(qTableName("qtestScHeMa", __FILE__, db)), + tableName(qTableName("qtest", __FILE__, db)), + field1Name(QLatin1String("fIeLdNaMe")), + field2Name(QLatin1String("ZuLu")); + +- q.exec(QString("DROP SCHEMA %1 CASCADE").arg(schemaName)); +- const auto createSchema = QString("CREATE SCHEMA %1").arg(schemaName); ++ q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName)); ++ QString createSchema = QString("CREATE SCHEMA \"%1\"").arg(schemaName); + QVERIFY_SQL(q, exec(createSchema)); +- const auto createTable = QString("CREATE TABLE %1.%2 (\"%3\" int PRIMARY KEY, \"%4\" varchar(20))") +- .arg(schemaName, tableName, field1Name, field2Name); ++ QString createTable = QString("CREATE TABLE \"%1\".\"%2\" (\"%3\" int PRIMARY KEY, \"%4\" varchar(20))").arg(schemaName).arg(tableName).arg(field1Name).arg(field2Name); + QVERIFY_SQL(q, exec(createTable)); + +- QVERIFY(db.tables().contains(qTableName(bumpyCase, __FILE__, db, false) + '.' + +- qTableName("qtest", __FILE__, db, false), Qt::CaseSensitive)); ++ QVERIFY(db.tables().contains(schemaName + '.' + tableName, Qt::CaseSensitive)); + + QSqlField fld1(field1Name, QVariant::Int); + QSqlField fld2(field2Name, QVariant::String); +@@ -1326,9 +1307,7 @@ void tst_QSqlDatabase::psql_escapedIdentifiers() + rec.append(fld1); + rec.append(fld2); + +- QVERIFY_SQL(q, exec(drv->sqlStatement(QSqlDriver::SelectStatement, +- schemaName + '.' + tableName, +- rec, false))); ++ QVERIFY_SQL(q, exec(drv->sqlStatement(QSqlDriver::SelectStatement, db.driver()->escapeIdentifier(schemaName, QSqlDriver::TableName) + '.' + db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName), rec, false))); + + rec = q.record(); + QCOMPARE(rec.count(), 2); +@@ -1336,7 +1315,7 @@ void tst_QSqlDatabase::psql_escapedIdentifiers() + QCOMPARE(rec.fieldName(1), field2Name); + QCOMPARE(rec.field(0).type(), QVariant::Int); + +- q.exec(QString("DROP SCHEMA %1 CASCADE").arg(schemaName)); ++ q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName)); + } + + void tst_QSqlDatabase::psql_escapeBytea() +@@ -2167,7 +2146,7 @@ void tst_QSqlDatabase::eventNotificationPSQL() + CHECK_DATABASE(db); + + QSqlQuery query(db); +- const auto procedureName = qTableName("posteventProc", __FILE__, db, false); ++ QString procedureName = qTableName("posteventProc", __FILE__, db); + QString payload = "payload"; + QSqlDriver &driver=*(db.driver()); + QVERIFY_SQL(driver, subscribeToNotification(procedureName)); +@@ -2191,22 +2170,21 @@ void tst_QSqlDatabase::eventNotificationSQLite() + QSKIP("QSQLITE specific test"); + } + const QString tableName(qTableName("sqlitnotifytest", __FILE__, db)); +- const auto noEscapeTableName(qTableName("sqlitnotifytest", __FILE__, db, false)); + tst_Databases::safeDropTable(db, tableName); + + QSignalSpy notificationSpy(db.driver(), SIGNAL(notification(QString))); + QSignalSpy notificationSpyExt(db.driver(), SIGNAL(notification(QString,QSqlDriver::NotificationSource,QVariant))); + QSqlQuery q(db); + QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id INTEGER, realVal REAL)")); +- db.driver()->subscribeToNotification(noEscapeTableName); ++ db.driver()->subscribeToNotification(tableName); + QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id, realVal) VALUES (1, 2.3)")); + QTRY_COMPARE(notificationSpy.count(), 1); + QTRY_COMPARE(notificationSpyExt.count(), 1); + QList arguments = notificationSpy.takeFirst(); +- QCOMPARE(arguments.at(0).toString(), noEscapeTableName); ++ QCOMPARE(arguments.at(0).toString(), tableName); + arguments = notificationSpyExt.takeFirst(); +- QCOMPARE(arguments.at(0).toString(), noEscapeTableName); +- db.driver()->unsubscribeFromNotification(noEscapeTableName); ++ QCOMPARE(arguments.at(0).toString(), tableName); ++ db.driver()->unsubscribeFromNotification(tableName); + QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id, realVal) VALUES (1, 2.3)")); + QTRY_COMPARE(notificationSpy.count(), 0); + QTRY_COMPARE(notificationSpyExt.count(), 0); +diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +index 784d0a70d7..710f26b72d 100644 +--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp ++++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +@@ -1098,7 +1098,7 @@ void tst_QSqlQuery::record() + for (int i = 0; i < 3; ++i) + QCOMPARE(q.record().field(i).tableName().toLower(), lowerQTest); + q.clear(); +- const auto tst_record = qTableName("tst_record", __FILE__, db, false).toLower(); ++ const auto tst_record = qTableName("tst_record", __FILE__, db).toLower(); + SETUP_RECORD_TABLE; + CHECK_RECORD; + q.clear(); +@@ -3763,13 +3763,15 @@ void tst_QSqlQuery::QTBUG_5251() + const QString timetest(qTableName("timetest", __FILE__, db)); + tst_Databases::safeDropTable(db, timetest); + QSqlQuery q(db); +- QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + timetest + QStringLiteral(" (t TIME)"))); +- QVERIFY_SQL(q, exec(QStringLiteral("INSERT INTO ") + timetest + +- QStringLiteral(" VALUES ('1:2:3.666')"))); ++ QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE \"") + timetest + QStringLiteral("\" (t TIME)"))); ++ QVERIFY_SQL(q, exec(QStringLiteral("INSERT INTO \"") + timetest + ++ QStringLiteral("\" VALUES ('1:2:3.666')"))); + + QSqlTableModel timetestModel(0,db); + timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit); + timetestModel.setTable(timetest); ++ if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QVERIFY_SQL(timetestModel, select()); + + QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666")); +@@ -3778,8 +3780,8 @@ void tst_QSqlQuery::QTBUG_5251() + QVERIFY_SQL(timetestModel, submitAll()); + QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500")); + +- QVERIFY_SQL(q, exec(QStringLiteral("UPDATE ") + timetest + +- QStringLiteral(" SET t = '0:11:22.33'"))); ++ QVERIFY_SQL(q, exec(QStringLiteral("UPDATE \"") + timetest + ++ QStringLiteral("\" SET t = '0:11:22.33'"))); + QVERIFY_SQL(timetestModel, select()); + QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330")); + +diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp +index 722ef9c570..e4a277e096 100644 +--- a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp ++++ b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp +@@ -122,13 +122,13 @@ void tst_QSqlRelationalTableModel::recreateTestTables(QSqlDatabase db) + QVERIFY_SQL( q, exec("insert into " + reltest5 + " values('mister', 'Mr')")); + + if (testWhiteSpaceNames(db.driverName())) { +- const auto reltest6 = qTableName("rel test6", __FILE__, db); ++ QString reltest6 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test6", QSqlDriver::TableName); + QVERIFY_SQL( q, exec("create table " + reltest6 + " (id int not null primary key, " + db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName) + + " int, " + db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName) + " int)")); + QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(1, 1,9)")); + QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(2, 2,8)")); + +- const auto reltest7 = qTableName("rel test7", __FILE__, db); ++ QString reltest7 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test7", QSqlDriver::TableName); + QVERIFY_SQL( q, exec("create table " + reltest7 + " (" + db.driver()->escapeIdentifier("city id", QSqlDriver::TableName) + " int not null primary key, " + db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName) + " varchar(20))")); + QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(1, 'New York')")); + QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(2, 'Washington')")); +@@ -170,8 +170,8 @@ void tst_QSqlRelationalTableModel::dropTestTables( QSqlDatabase db ) + << reltest3 + << reltest4 + << reltest5 +- << qTableName("rel test6", __FILE__, db) +- << qTableName("rel test7", __FILE__, db) ++ << (qTableName("rel", __FILE__, db) + " test6") ++ << (qTableName( "rel", __FILE__, db) + " test7") + << qTableName("CASETEST1", db) + << qTableName("casetest1", db); + tst_Databases::safeDropTables( db, tableNames ); +@@ -1379,9 +1379,9 @@ void tst_QSqlRelationalTableModel::whiteSpaceInIdentifiers() + if (!testWhiteSpaceNames(db.driverName())) + QSKIP("White space test irrelevant for driver"); + QSqlRelationalTableModel model(0, db); +- model.setTable(qTableName("rel test6", __FILE__, db)); ++ model.setTable(db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test6", QSqlDriver::TableName)); + model.setSort(0, Qt::DescendingOrder); +- model.setRelation(1, QSqlRelation(qTableName("rel test7", __FILE__, db), ++ model.setRelation(1, QSqlRelation(db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test7", QSqlDriver::TableName), + db.driver()->escapeIdentifier("city id", QSqlDriver::FieldName), + db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName))); + QVERIFY_SQL(model, select()); +@@ -1547,6 +1547,8 @@ void tst_QSqlRelationalTableModel::relationOnFirstColumn() + + //modify the model data + QVERIFY_SQL(model, setData(model.index(0, 0), 40)); ++ if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QVERIFY_SQL(model, submit()); + QVERIFY_SQL(model, setData(model.index(1, 0), 50)); + QVERIFY_SQL(model, submit()); +diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp +index b617151a36..da31f437d9 100644 +--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp ++++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp +@@ -383,6 +383,8 @@ void tst_QSqlTableModel::selectRow() + q.exec("UPDATE " + tbl + " SET a = 'Qt' WHERE id = 1"); + QCOMPARE(model.data(idx).toString(), QString("b")); + model.selectRow(1); ++ if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QCOMPARE(model.data(idx).toString(), QString("Qt")); + + // Check if selectRow() refreshes a changed row. +@@ -439,6 +441,8 @@ void tst_QSqlTableModel::selectRowOverride() + // both rows should have changed + QCOMPARE(model.data(idx).toString(), QString("Qt")); + idx = model.index(2, 1); ++ if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QCOMPARE(model.data(idx).toString(), QString("Qt")); + + q.exec("DELETE FROM " + tbl); +@@ -850,6 +854,8 @@ void tst_QSqlTableModel::insertRowFailure() + + // populate 1 row + const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); ++ if (dbType == QSqlDriver::PostgreSQL && submitpolicy != QSqlTableModel::OnManualSubmit) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QVERIFY_SQL(model, insertRecord(0, values)); + QVERIFY_SQL(model, submitAll()); + QVERIFY_SQL(model, select()); +@@ -893,6 +899,8 @@ void tst_QSqlTableModel::insertRowFailure() + // restore empty table + model.revertAll(); + QVERIFY_SQL(model, removeRow(0)); ++ if (dbType == QSqlDriver::PostgreSQL) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QVERIFY_SQL(model, submitAll()); + QVERIFY_SQL(model, select()); + QCOMPARE(model.rowCount(), 0); +@@ -2001,6 +2009,8 @@ void tst_QSqlTableModel::tableModifyWithBlank() + //Should be equivalent to QSqlQuery INSERT INTO... command) + QVERIFY_SQL(model, insertRow(0)); + QVERIFY_SQL(model, setData(model.index(0,0),timeString)); ++ if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) ++ QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort); + QVERIFY_SQL(model, submitAll()); + + //set a filter on the table so the only record we get is the one we just made +-- +2.21.0 + diff --git a/0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch b/0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch new file mode 100644 index 0000000..f158688 --- /dev/null +++ b/0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch @@ -0,0 +1,34 @@ +From a473f90a3637255d8443ab8621b57a3e9d90b031 Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Thu, 6 Jun 2019 20:05:27 +0200 +Subject: [PATCH 1/3] Revert "Fix QMAKE_PRL_INSTALL_REPLACE for macOS" + +This reverts commit 015d7f16cb0b6812950caa3bcde3b6758403ae34. +--- + mkspecs/features/qt_common.prf | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf +index e64dfa98c2..17a07dbab9 100644 +--- a/mkspecs/features/qt_common.prf ++++ b/mkspecs/features/qt_common.prf +@@ -49,14 +49,10 @@ contains(TEMPLATE, .*lib) { + lib_replace.match = $$rplbase/lib + lib_replace.replace = $$qqt_libdir + } ++ !equals(qt_libdir, $$rplbase/lib): \ ++ lib_replace.match = \\($$lib_replace.match\\)\\|\\($$qt_libdir\\) + lib_replace.CONFIG = path + QMAKE_PRL_INSTALL_REPLACE += lib_replace +- !equals(qt_libdir, $$rplbase/lib) { +- qtlibdir_replace.match = $$qt_libdir +- qtlibdir_replace.replace = $$qqt_libdir +- qtlibdir_replace.CONFIG = path +- QMAKE_PRL_INSTALL_REPLACE += qtlibdir_replace +- } + } + + # The remainder of this file must not apply to host tools/libraries, +-- +2.21.0 + diff --git a/0001-Revert-qmake-link-qt-libraries-by-full-path.patch b/0001-Revert-qmake-link-qt-libraries-by-full-path.patch new file mode 100644 index 0000000..53bbe74 --- /dev/null +++ b/0001-Revert-qmake-link-qt-libraries-by-full-path.patch @@ -0,0 +1,147 @@ +From c28456522b71dfb207bfe47f91d6b0eeaec109bf Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Fri, 7 Jun 2019 13:31:40 +0200 +Subject: [PATCH] Revert "qmake: link qt libraries by full path" + +This reverts commit 5b3dfa470ed7ea40103daa785286ab71fb7aa230. +--- + mkspecs/features/qt.prf | 31 +++++++++++++++++------------- + mkspecs/features/win32/opengl.prf | 16 ++++----------- + mkspecs/features/win32/windows.prf | 7 ++++--- + mkspecs/linux-lsb-g++/qmake.conf | 1 + + 4 files changed, 27 insertions(+), 28 deletions(-) + +diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf +index 3a71376029..5ac640190a 100644 +--- a/mkspecs/features/qt.prf ++++ b/mkspecs/features/qt.prf +@@ -145,14 +145,12 @@ import_plugins:qtConfig(static) { + # the plugin path. Unknown plugins must rely on the default link path. + plug_type = $$eval(QT_PLUGIN.$${plug}.TYPE) + !isEmpty(plug_type) { +- plug_name = $$QMAKE_PREFIX_STATICLIB$${plug}$$qtPlatformTargetSuffix().$$QMAKE_EXTENSION_STATICLIB + plug_path = $$eval(QT_PLUGIN.$${plug}.PATH) + isEmpty(plug_path): \ + plug_path = $$[QT_INSTALL_PLUGINS/get] +- LIBS += $$plug_path/$$plug_type/$$plug_name +- } else { +- LIBS += -l$${plug}$$qtPlatformTargetSuffix() ++ LIBS += -L$$plug_path/$$plug_type + } ++ LIBS += -l$${plug}$$qtPlatformTargetSuffix() + } + } + +@@ -197,6 +195,8 @@ for(ever) { + qtProcessModuleFlags(DEFINES, QT.$${QTLIB}.DEFINES) + + MODULE_INCLUDES -= $$QMAKE_DEFAULT_INCDIRS ++ MODULE_LIBS_ADD = $$MODULE_LIBS ++ MODULE_LIBS_ADD -= $$QMAKE_DEFAULT_LIBDIRS + + # Frameworks shouldn't need include paths, but much code does not use + # module-qualified #includes, so by default we add paths which point +@@ -209,17 +209,23 @@ for(ever) { + !isEmpty(MODULE_MODULE) { + contains(MODULE_CONFIG, lib_bundle) { + framework = $$MODULE_MODULE +- # Linking frameworks by absolute path does not work. + LIBS$$var_sfx += -framework $$framework + } else { ++ !isEmpty(MODULE_LIBS_ADD): \ ++ LIBS$$var_sfx += -L$$MODULE_LIBS_ADD ++ + lib = $$MODULE_MODULE$$qtPlatformTargetSuffix() +- win32|contains(MODULE_CONFIG, staticlib) { +- lib = $$MODULE_LIBS/$$QMAKE_PREFIX_STATICLIB$${lib}.$$QMAKE_EXTENSION_STATICLIB +- PRE_TARGETDEPS += $$lib +- } else { +- lib = $$MODULE_LIBS/$$QMAKE_PREFIX_SHLIB$${lib}.$$QMAKE_EXTENSION_SHLIB ++ LIBS$$var_sfx += -l$$lib ++ ++ contains(MODULE_CONFIG, staticlib): \ ++ PRE_TARGETDEPS *= $$MODULE_LIBS/$${QMAKE_PREFIX_STATICLIB}$${lib}.$${QMAKE_EXTENSION_STATICLIB} ++ ++ !isEmpty(QMAKE_LSB) { ++ !isEmpty(MODULE_LIBS_ADD): \ ++ QMAKE_LFLAGS *= --lsb-libpath=$$MODULE_LIBS_ADD ++ QMAKE_LFLAGS *= --lsb-shared-libs=$$lib ++ QMAKE_LIBDIR *= /opt/lsb/lib + } +- LIBS$$var_sfx += $$lib + } + } + QMAKE_USE$$var_sfx += $$MODULE_USES +@@ -289,8 +295,7 @@ contains(all_qt_module_deps, qml): \ + for (key, IMPORTS._KEYS_) { + PATH = $$eval(IMPORTS.$${key}.path) + PLUGIN = $$eval(IMPORTS.$${key}.plugin) +- !isEmpty(PATH):!isEmpty(PLUGIN): \ +- LIBS += $$PATH/$$QMAKE_PREFIX_STATICLIB$${PLUGIN}$$qtPlatformTargetSuffix().$$QMAKE_EXTENSION_STATICLIB ++ !isEmpty(PATH):!isEmpty(PLUGIN): LIBS *= -L$$PATH -l$${PLUGIN}$$qtPlatformTargetSuffix() + } + + # create qml_plugin_import.cpp +diff --git a/mkspecs/features/win32/opengl.prf b/mkspecs/features/win32/opengl.prf +index f21848f941..c6fba7770f 100644 +--- a/mkspecs/features/win32/opengl.prf ++++ b/mkspecs/features/win32/opengl.prf +@@ -1,21 +1,13 @@ + QT_FOR_CONFIG += gui + +-defineTest(prependOpenGlLib) { +- path = $$QT.core.libs/$$QMAKE_PREFIX_STATICLIB$$1 +- ext = .$$QMAKE_EXTENSION_STATICLIB +- QMAKE_LIBS_OPENGL_ES2 = $${path}$${ext} $$QMAKE_LIBS_OPENGL_ES2 +- QMAKE_LIBS_OPENGL_ES2_DEBUG = $${path}d$${ext} $$QMAKE_LIBS_OPENGL_ES2_DEBUG +- export(QMAKE_LIBS_OPENGL_ES2) +- export(QMAKE_LIBS_OPENGL_ES2_DEBUG) +-} +- + qtConfig(opengles2) { + # Depending on the configuration we use libQtANGLE or libEGL and libGLESv2 + qtConfig(combined-angle-lib) { +- prependOpenGlLib($$LIBQTANGLE_NAME) ++ QMAKE_LIBS_OPENGL_ES2 = -l$${LIBQTANGLE_NAME} $$QMAKE_LIBS_OPENGL_ES2 ++ QMAKE_LIBS_OPENGL_ES2_DEBUG = -l$${LIBQTANGLE_NAME}d $$QMAKE_LIBS_OPENGL_ES2_DEBUG + } else { +- prependOpenGlLib($$LIBGLESV2_NAME) +- prependOpenGlLib($$LIBEGL_NAME) ++ QMAKE_LIBS_OPENGL_ES2 = -l$${LIBEGL_NAME} -l$${LIBGLESV2_NAME} $$QMAKE_LIBS_OPENGL_ES2 ++ QMAKE_LIBS_OPENGL_ES2_DEBUG = -l$${LIBEGL_NAME}d -l$${LIBGLESV2_NAME}d $$QMAKE_LIBS_OPENGL_ES2_DEBUG + } + # For Desktop, use the ANGLE library location passed on from configure. + INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES2 +diff --git a/mkspecs/features/win32/windows.prf b/mkspecs/features/win32/windows.prf +index 272170d428..ecb167bf18 100644 +--- a/mkspecs/features/win32/windows.prf ++++ b/mkspecs/features/win32/windows.prf +@@ -6,9 +6,10 @@ contains(TEMPLATE, ".*app") { + + qt:for(entryLib, $$list($$unique(QMAKE_LIBS_QT_ENTRY))) { + isEqual(entryLib, -lqtmain) { +- lib = $$QT.core.libs/$${QMAKE_PREFIX_STATICLIB}qtmain$$QT_LIBINFIX$$qtPlatformTargetSuffix().$$QMAKE_EXTENSION_STATICLIB +- PRE_TARGETDEPS += $$lib +- QMAKE_LIBS += $$lib ++ !contains(QMAKE_DEFAULT_LIBDIRS, $$QT.core.libs): \ ++ QMAKE_LIBS += -L$$QT.core.libs ++ CONFIG(debug, debug|release): QMAKE_LIBS += $${entryLib}$${QT_LIBINFIX}d ++ else: QMAKE_LIBS += $${entryLib}$${QT_LIBINFIX} + } else { + QMAKE_LIBS += $${entryLib} + } +diff --git a/mkspecs/linux-lsb-g++/qmake.conf b/mkspecs/linux-lsb-g++/qmake.conf +index eb7b87b57b..80353cd5f6 100644 +--- a/mkspecs/linux-lsb-g++/qmake.conf ++++ b/mkspecs/linux-lsb-g++/qmake.conf +@@ -13,6 +13,7 @@ load(qt_config) + + QMAKE_LIBS_THREAD += -lrt + ++QMAKE_LSB = 1 + QMAKE_CC = lsbcc + QMAKE_CXX = lsbc++ + +-- +2.21.0 + diff --git a/0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch b/0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch new file mode 100644 index 0000000..a0b5b88 --- /dev/null +++ b/0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch @@ -0,0 +1,26 @@ +From 71b2d89fd5e3427b767e29b5f0bb6d4ca41806fa Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Thu, 6 Jun 2019 20:05:37 +0200 +Subject: [PATCH 2/3] Revert "Replace absolute Qt lib dir in .prl files" + +This reverts commit f00de3322e05c62021082463b6de24805afc1355. +--- + mkspecs/features/qt_common.prf | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf +index 17a07dbab9..e51aa4766b 100644 +--- a/mkspecs/features/qt_common.prf ++++ b/mkspecs/features/qt_common.prf +@@ -49,8 +49,6 @@ contains(TEMPLATE, .*lib) { + lib_replace.match = $$rplbase/lib + lib_replace.replace = $$qqt_libdir + } +- !equals(qt_libdir, $$rplbase/lib): \ +- lib_replace.match = \\($$lib_replace.match\\)\\|\\($$qt_libdir\\) + lib_replace.CONFIG = path + QMAKE_PRL_INSTALL_REPLACE += lib_replace + } +-- +2.21.0 + diff --git a/0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch b/0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch index 68ae02f..fb435d5 100644 --- a/0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch +++ b/0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch @@ -15,11 +15,11 @@ This reverts commit 3b514f853595c686d4ed8830567c1f27ea533faf. src/testlib/qtaptestlogger.cpp | 11 +---------- 7 files changed, 4 insertions(+), 50 deletions(-) -diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp -index 090436a3c7..6541b97595 100644 ---- a/src/corelib/kernel/qvariant.cpp -+++ b/src/corelib/kernel/qvariant.cpp -@@ -1052,13 +1052,11 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) +Index: qtbase-everywhere-src-5.13.0-beta2/src/corelib/kernel/qvariant.cpp +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/corelib/kernel/qvariant.cpp ++++ qtbase-everywhere-src-5.13.0-beta2/src/corelib/kernel/qvariant.cpp +@@ -1052,13 +1052,11 @@ static bool convert(const QVariant::Priv return false; #ifndef QT_BOOTSTRAPPED @@ -33,7 +33,7 @@ index 090436a3c7..6541b97595 100644 case QMetaType::QJsonValue: switch (d->type) { case QMetaType::Nullptr: -@@ -1234,11 +1232,9 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) +@@ -1234,11 +1232,9 @@ static bool convert(const QVariant::Priv case QVariant::Url: *static_cast(result) = QCborValue(*v_cast(d)); break; @@ -45,11 +45,11 @@ index 090436a3c7..6541b97595 100644 case QVariant::Uuid: *static_cast(result) = QCborValue(*v_cast(d)); break; -diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp -index 80ef515fd2..e53b6a0326 100644 ---- a/src/corelib/serialization/qcborvalue.cpp -+++ b/src/corelib/serialization/qcborvalue.cpp -@@ -1771,7 +1771,6 @@ QCborValue::QCborValue(const QUrl &url) +Index: qtbase-everywhere-src-5.13.0-beta2/src/corelib/serialization/qcborvalue.cpp +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/corelib/serialization/qcborvalue.cpp ++++ qtbase-everywhere-src-5.13.0-beta2/src/corelib/serialization/qcborvalue.cpp +@@ -1772,7 +1772,6 @@ QCborValue::QCborValue(const QUrl &url) container->elements[1].type = String; } @@ -57,7 +57,7 @@ index 80ef515fd2..e53b6a0326 100644 /*! Creates a QCborValue object of the regular expression pattern extended type and containing the value represented by \a rx. The value can later be retrieved -@@ -1790,7 +1789,6 @@ QCborValue::QCborValue(const QRegularExpression &rx) +@@ -1791,7 +1790,6 @@ QCborValue::QCborValue(const QRegularExp // change type t = RegularExpression; } @@ -65,7 +65,7 @@ index 80ef515fd2..e53b6a0326 100644 /*! Creates a QCborValue object of the UUID extended type and containing the -@@ -1944,7 +1942,6 @@ QUrl QCborValue::toUrl(const QUrl &defaultValue) const +@@ -1945,7 +1943,6 @@ QUrl QCborValue::toUrl(const QUrl &defau return QUrl::fromEncoded(byteData->asByteArrayView()); } @@ -73,7 +73,7 @@ index 80ef515fd2..e53b6a0326 100644 /*! Returns the regular expression value stored in this QCborValue, if it is of the regular expression pattern extended type. Otherwise, it returns \a -@@ -1963,7 +1960,6 @@ QRegularExpression QCborValue::toRegularExpression(const QRegularExpression &def +@@ -1964,7 +1961,6 @@ QRegularExpression QCborValue::toRegular Q_ASSERT(n == -1); return QRegularExpression(container->stringAt(1)); } @@ -81,7 +81,7 @@ index 80ef515fd2..e53b6a0326 100644 /*! Returns the UUID value stored in this QCborValue, if it is of the UUID -@@ -2404,16 +2400,12 @@ uint qHash(const QCborValue &value, uint seed) +@@ -2874,16 +2870,12 @@ uint qHash(const QCborValue &value, uint return qHash(value.toDateTime(), seed); case QCborValue::Url: return qHash(value.toUrl(), seed); @@ -98,7 +98,7 @@ index 80ef515fd2..e53b6a0326 100644 } Q_ASSERT(value.isSimpleType()); -@@ -2458,16 +2450,12 @@ static QDebug debugContents(QDebug &dbg, const QCborValue &v) +@@ -2928,16 +2920,12 @@ static QDebug debugContents(QDebug &dbg, return dbg << v.toDateTime(); case QCborValue::Url: return dbg << v.toUrl(); @@ -115,10 +115,10 @@ index 80ef515fd2..e53b6a0326 100644 } if (v.isSimpleType()) return dbg << v.toSimpleType(); -diff --git a/src/corelib/serialization/qcborvalue.h b/src/corelib/serialization/qcborvalue.h -index d6ba4e88d8..105af1ba73 100644 ---- a/src/corelib/serialization/qcborvalue.h -+++ b/src/corelib/serialization/qcborvalue.h +Index: qtbase-everywhere-src-5.13.0-beta2/src/corelib/serialization/qcborvalue.h +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/corelib/serialization/qcborvalue.h ++++ qtbase-everywhere-src-5.13.0-beta2/src/corelib/serialization/qcborvalue.h @@ -43,9 +43,7 @@ #include #include @@ -130,7 +130,7 @@ index d6ba4e88d8..105af1ba73 100644 #include #include #include -@@ -157,9 +155,7 @@ public: +@@ -159,9 +157,7 @@ public: explicit QCborValue(const QDateTime &dt); explicit QCborValue(const QUrl &url); @@ -140,7 +140,7 @@ index d6ba4e88d8..105af1ba73 100644 explicit QCborValue(const QUuid &uuid); ~QCborValue() { if (container) dispose(); } -@@ -237,9 +233,7 @@ public: +@@ -239,9 +235,7 @@ public: QString toString(const QString &defaultValue = {}) const; QDateTime toDateTime(const QDateTime &defaultValue = {}) const; QUrl toUrl(const QUrl &defaultValue = {}) const; @@ -149,7 +149,7 @@ index d6ba4e88d8..105af1ba73 100644 -#endif QUuid toUuid(const QUuid &defaultValue = {}) const; - #ifdef Q_QDOC + // only forward-declared, need split functions @@ -386,10 +380,8 @@ public: { return concrete().toDateTime(defaultValue); } QUrl toUrl(const QUrl &defaultValue = {}) const @@ -161,10 +161,10 @@ index d6ba4e88d8..105af1ba73 100644 QUuid toUuid(const QUuid &defaultValue = {}) const { return concrete().toUuid(defaultValue); } -diff --git a/src/corelib/serialization/qjsoncbor.cpp b/src/corelib/serialization/qjsoncbor.cpp -index 4f756df97c..158f1950d0 100644 ---- a/src/corelib/serialization/qjsoncbor.cpp -+++ b/src/corelib/serialization/qjsoncbor.cpp +Index: qtbase-everywhere-src-5.13.0-beta2/src/corelib/serialization/qjsoncbor.cpp +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/corelib/serialization/qjsoncbor.cpp ++++ qtbase-everywhere-src-5.13.0-beta2/src/corelib/serialization/qjsoncbor.cpp @@ -543,19 +543,14 @@ QVariant QCborValue::toVariant() const case Url: return toUrl(); @@ -185,7 +185,7 @@ index 4f756df97c..158f1950d0 100644 } if (isSimpleType()) -@@ -719,10 +714,8 @@ QCborValue QCborValue::fromVariant(const QVariant &variant) +@@ -719,10 +714,8 @@ QCborValue QCborValue::fromVariant(const case QVariant::Hash: return QCborMap::fromVariantHash(variant.toHash()); #ifndef QT_BOOTSTRAPPED @@ -196,10 +196,10 @@ index 4f756df97c..158f1950d0 100644 case QMetaType::QJsonValue: return fromJsonValue(variant.toJsonValue()); case QMetaType::QJsonObject: -diff --git a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp -index 0a3a37863a..f151713400 100644 ---- a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp -+++ b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp +Index: qtbase-everywhere-src-5.13.0-beta2/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp ++++ qtbase-everywhere-src-5.13.0-beta2/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp @@ -51,9 +51,7 @@ #include #include @@ -211,10 +211,10 @@ index 0a3a37863a..f151713400 100644 #include #if defined(Q_OS_LINUX) -diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp -index d42a33c22b..ddb8f45188 100644 ---- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp -+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp +Index: qtbase-everywhere-src-5.13.0-beta2/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp ++++ qtbase-everywhere-src-5.13.0-beta2/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp @@ -48,9 +48,7 @@ #undef register #include @@ -242,10 +242,10 @@ index d42a33c22b..ddb8f45188 100644 } if (!m_supportsThreading) { qCDebug(lcQpaGl).nospace() << "Multithreaded OpenGL disabled: " -diff --git a/src/testlib/qtaptestlogger.cpp b/src/testlib/qtaptestlogger.cpp -index 540b36e273..e73609de3d 100644 ---- a/src/testlib/qtaptestlogger.cpp -+++ b/src/testlib/qtaptestlogger.cpp +Index: qtbase-everywhere-src-5.13.0-beta2/src/testlib/qtaptestlogger.cpp +=================================================================== +--- qtbase-everywhere-src-5.13.0-beta2.orig/src/testlib/qtaptestlogger.cpp ++++ qtbase-everywhere-src-5.13.0-beta2/src/testlib/qtaptestlogger.cpp @@ -43,9 +43,7 @@ #include "qtestresult_p.h" #include "qtestassert.h" @@ -257,7 +257,7 @@ index 540b36e273..e73609de3d 100644 QT_BEGIN_NAMESPACE -@@ -150,7 +148,6 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description, +@@ -150,7 +148,6 @@ void QTapTestLogger::addIncident(Inciden outputString(YAML_INDENT "---\n"); if (type != XFail) { @@ -265,7 +265,7 @@ index 540b36e273..e73609de3d 100644 // This is fragile, but unfortunately testlib doesn't plumb // the expected and actual values to the loggers (yet). static QRegularExpression verifyRegex( -@@ -211,12 +208,6 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description, +@@ -211,12 +208,6 @@ void QTapTestLogger::addIncident(Inciden YAML_INDENT "# %s\n", description); outputString(unparsableDescription.data()); } @@ -278,6 +278,3 @@ index 540b36e273..e73609de3d 100644 } if (file) { --- -2.20.1 - diff --git a/0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch b/0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch new file mode 100644 index 0000000..67c65fa --- /dev/null +++ b/0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch @@ -0,0 +1,50 @@ +From 34db59a076dd824401f952b305a4f575b0140f79 Mon Sep 17 00:00:00 2001 +From: Dmitry Kazakov +Date: Mon, 11 Mar 2019 13:18:06 +0300 +Subject: [PATCH 2/3] Synthesize Enter/LeaveEvent for accepted QTabletEvent + +When the tablet event is accepted, then Qt doesn't synthesize a mouse +event, it means that QApplicationPrivate::sendMouseEvent() will not be +called, and, therefore, enter/leave events will not be dispatched. + +The patch looks a bit hackish. Ideally, the synthesize should happen +in QGuiApplicationPrivate::processTabletEvent(), which takes the decision +about synthesizing mouse events. But there is not enough information +on this level: neither qt_last_mouse_receiver nor the receiver widget +are known at this stage. + +On Windows and other platforms where there is a parallel stream of +mouse events synthesized by the platform, we shouldn't generate these +events manually. + +Change-Id: Ifbad6284483ee282ad129db54606f5d0d9ddd633 +--- + src/widgets/kernel/qwidgetwindow.cpp | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp +index fbc71cd0ea..729a7f701a 100644 +--- a/src/widgets/kernel/qwidgetwindow.cpp ++++ b/src/widgets/kernel/qwidgetwindow.cpp +@@ -1051,6 +1051,18 @@ void QWidgetWindow::handleTabletEvent(QTabletEvent *event) + event->setAccepted(ev.isAccepted()); + } + ++ /** ++ * Synthesize Enter/Leave events if it is requested by the system and user ++ */ ++ if (widget != qt_last_mouse_receiver && ++ event->isAccepted() && ++ !QWindowSystemInterfacePrivate::TabletEvent::platformSynthesizesMouse && ++ qApp->testAttribute(Qt::AA_SynthesizeMouseForUnhandledTabletEvents)) { ++ ++ QApplicationPrivate::dispatchEnterLeave(widget, qt_last_mouse_receiver, event->globalPos()); ++ qt_last_mouse_receiver = widget; ++ } ++ + if (event->type() == QEvent::TabletRelease && event->buttons() == Qt::NoButton) + qt_tablet_target = 0; + } +-- +2.21.0 + diff --git a/0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch b/0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch new file mode 100644 index 0000000..cf77d5c --- /dev/null +++ b/0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch @@ -0,0 +1,30 @@ +From d3506e73971e681c061edd3fb7c693ccd405c77c Mon Sep 17 00:00:00 2001 +From: Dmitry Kazakov +Date: Sun, 10 Mar 2019 14:51:28 +0300 +Subject: [PATCH 3/3] Add an ID for recognition of UGEE tablets + +Change-Id: I2228ee9d53aa23a2d2cd9970a363d8424e744093 +Reviewed-by: Frederik Gladhorn +Reviewed-by: Shawn Rutledge +--- + src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +index e4da207b00..bc09fe2f91 100644 +--- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp ++++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +@@ -240,6 +240,10 @@ void QXcbConnection::xi2SetupDevice(void *info, bool removeExisting) + } else if (name.contains("uc-logic") && isTablet) { + tabletData.pointerType = QTabletEvent::Pen; + dbgType = QLatin1String("pen"); ++ } else if (name.contains("ugee")) { ++ isTablet = true; ++ tabletData.pointerType = QTabletEvent::Pen; ++ dbgType = QLatin1String("pen"); + } else { + isTablet = false; + } +-- +2.21.0 + diff --git a/0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch b/0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch new file mode 100644 index 0000000..17fcb73 --- /dev/null +++ b/0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch @@ -0,0 +1,29 @@ +From debbdd25835318dc4848488da4dc0acfd27b3332 Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Thu, 6 Jun 2019 20:06:08 +0200 +Subject: [PATCH 3/3] Revert "Fix prl replacements if libdir is in + QMAKE_DEFAULT_LIBDIRS" + +This reverts commit d5071a4016ec663f8ec7c89ec7ebabea54b3260f. +--- + mkspecs/features/qt_common.prf | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf +index e51aa4766b..843916b3b1 100644 +--- a/mkspecs/features/qt_common.prf ++++ b/mkspecs/features/qt_common.prf +@@ -39,10 +39,6 @@ contains(TEMPLATE, .*lib) { + qt_libdir = $$[QT_INSTALL_LIBS] + } + contains(QMAKE_DEFAULT_LIBDIRS, $$qt_libdir) { +- lib_replace0.match = $$rplbase/lib/ +- lib_replace0.replace = $$qqt_libdir/ +- lib_replace0.CONFIG = path +- QMAKE_PRL_INSTALL_REPLACE += lib_replace0 + lib_replace.match = "[^ ']*$$rplbase/lib" + lib_replace.replace = + } else { +-- +2.21.0 + diff --git a/libqt5-qtbase.changes b/libqt5-qtbase.changes index a9e9d1e..952edc4 100644 --- a/libqt5-qtbase.changes +++ b/libqt5-qtbase.changes @@ -1,9 +1,85 @@ +------------------------------------------------------------------- +Wed Jun 26 12:20:32 UTC 2019 - Fabian Vogt + +- Add patch to restore compatibility with akonadi's PGSQL backend + (see https://bugs.archlinux.org/task/62997): + * 0001-Revert-Always-escape-the-table-names-when-creating-t.patch + +------------------------------------------------------------------- +Wed Jun 19 18:40:41 UTC 2019 - Fabian Vogt + +- Disable libzstd support again, it breaks various existing codebases (QTBUG-76521) + +------------------------------------------------------------------- +Wed Jun 19 11:19:21 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0: + * New bugfix release + * No changelog available + * For more details about Qt 5.13 please see: + * http://code.qt.io/cgit/qt/qtbase.git/plain/dist/changes-5.13.0/?h=5.13 +- Remove patches, now upstream: + * 0001-Add-quoting-to-deal-with-empty-CMAKE_CXX_STANDARD_LI.patch + +------------------------------------------------------------------- +Fri Jun 14 11:33:41 UTC 2019 - Fabian Vogt + +- Add patches to improve compatibility with Krita: + * 0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch + * 0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch + * 0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch + +------------------------------------------------------------------- +Fri Jun 7 11:32:21 UTC 2019 - Fabian Vogt + +- Revert yet another commit to fix linker errors: + * 0001-Revert-qmake-link-qt-libraries-by-full-path.patch + +------------------------------------------------------------------- +Thu Jun 6 18:19:42 UTC 2019 - Fabian Vogt + +- Enable libzstd support + +------------------------------------------------------------------- +Thu Jun 6 18:09:01 UTC 2019 - Fabian Vogt + +- Revert some commits in the hope of fixing some broken paths (QTBUG-76255): + * 0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch + * 0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch + * 0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch + +------------------------------------------------------------------- +Thu Jun 6 13:26:09 UTC 2019 - Fabian Vogt + +- Add patch to fix some cmake module config files (QTBUG-76244): + * 0001-Add-quoting-to-deal-with-empty-CMAKE_CXX_STANDARD_LI.patch + +------------------------------------------------------------------- +Tue Jun 4 07:24:16 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0-rc: + * New bugfix release + * No changelog available +- Remove patches, now upstream: + * 0001-Fix-page-breaking-with-large-images.patch + ------------------------------------------------------------------- Fri May 31 22:33:07 UTC 2019 - Fabian Vogt - Add patch to fix layouting of certain text documents (QTBUG-73730): * 0001-Fix-page-breaking-with-large-images.patch +------------------------------------------------------------------- +Mon Apr 29 09:16:09 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0-beta2: + * New bugfix release + * No changelog available +- Refresh Mesa multithreading whitelist revert: + * Add 0001-Revert-Blacklist-nouveau-and-llvmpipe-for-multithrea.patch + * Refresh 0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch + * Refresh 0003-Revert-White-list-more-recent-Mesa-version-for-multi.patch + ------------------------------------------------------------------- Thu Apr 25 07:37:27 UTC 2019 - Martin Liška @@ -23,6 +99,21 @@ Sat Apr 13 10:29:43 UTC 2019 - Christophe Giboudeaux - Add fix-fixqt4headers.patch to use the include path used by our Qt5 packages. +------------------------------------------------------------------- +Thu Mar 21 10:24:28 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0-beta1: + * New feature release + * For more details about Qt 5.13 please see: + * http://code.qt.io/cgit/qt/qtbase.git/plain/dist/changes-5.13.0/?h=5.13 +- Remove patches, now upstream: + * qapplication-emit-palettechanged.patch + * reproducible-qrc-time.patch +- Refresh Mesa multithreading whitelist revert: + * Drop 0001-Revert-Blacklist-nouveau-and-llvmpipe-for-multithrea.patch + * Refresh 0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch +- libQt5XcbQpa is not static, move it to libQt5Gui-private-headers-devel + ------------------------------------------------------------------- Thu Mar 14 08:47:45 UTC 2019 - fabian@ritter-vogt.de @@ -2138,3 +2229,4 @@ Fri Apr 13 13:22:38 UTC 2012 - stephan.binner@basyskom.com Thu Apr 5 09:56:15 UTC 2012 - dmueller@suse.com - Initial packaging (Qt 5.0 Alpha) + diff --git a/libqt5-qtbase.spec b/libqt5-qtbase.spec index 8f1a3e4..2e7b58a 100644 --- a/libqt5-qtbase.spec +++ b/libqt5-qtbase.spec @@ -36,17 +36,17 @@ %endif Name: libqt5-qtbase -Version: 5.12.3 +Version: 5.13.0 Release: 0 Summary: C++ Program Library, Core Components License: LGPL-2.1-with-Qt-Company-Qt-exception-1.1 or LGPL-3.0-only Group: System/Libraries Url: https://www.qt.io %define base_name libqt5 -%define real_version 5.12.3 -%define so_version 5.12.3 -%define tar_version qtbase-everywhere-src-5.12.3 -Source: https://download.qt.io/official_releases/qt/5.12/%{real_version}/submodules/%{tar_version}.tar.xz +%define real_version 5.13.0 +%define so_version 5.13.0 +%define tar_version qtbase-everywhere-src-5.13.0 +Source: https://download.qt.io/official_releases/qt/5.13/%{real_version}/submodules/%{tar_version}.tar.xz # to get mtime of file: Source1: libqt5-qtbase.changes Source2: macros.qt5 @@ -68,19 +68,25 @@ Patch13: 0001-Revert-QWidgetWindow-Immediately-forward-close-event.patch Patch17: 0001-Sanitize-QXcbScreen-s-pixelDensity-values.patch Patch18: 0002-xcb-Use-the-screen-s-physical-DPI-as-logical-DPI-unl.patch # PATCH-FIX-UPSTREAM -Patch19: qapplication-emit-palettechanged.patch -# PATCH-FIX-UPSTREAM Patch20: 0001-Fix-qfloat16-methods-definition-without-declaration-.patch # PATCH-FIX-OPENSUSE Patch21: 0001-Revert-Blacklist-nouveau-and-llvmpipe-for-multithrea.patch Patch22: 0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch Patch23: 0003-Revert-White-list-more-recent-Mesa-version-for-multi.patch Patch24: fix-fixqt4headers.patch -# patches 1000-2000 and above from upstream 5.12 branch # -Patch1000: 0001-Fix-page-breaking-with-large-images.patch -# patches 2000-3000 and above from upstream 5.13/dev branch # -Patch2000: reproducible-qrc-time.patch - +# Revert to restore compatibility with akonadi and possibly other applications +Patch30: 0001-Revert-Always-escape-the-table-names-when-creating-t.patch +# Reverting some commits in the hope to avoid QTBUG-76255 +Patch50: 0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch +Patch51: 0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch +Patch52: 0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch +Patch53: 0001-Revert-qmake-link-qt-libraries-by-full-path.patch +# patches 1000-2000 and above from upstream 5.13 branch # +Patch1000: 0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch +# patches 2000-3000 and above from upstream 5.14/dev branch # +Patch2000: 0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch +# Not accepted yet, https://codereview.qt-project.org/c/qt/qtbase/+/255384 +Patch2001: 0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch BuildRequires: alsa-devel BuildRequires: cups-devel BuildRequires: double-conversion-devel @@ -152,6 +158,8 @@ BuildRequires: pkgconfig(sm) BuildRequires: pkgconfig(xkbcommon) >= 0.4.1 BuildRequires: pkgconfig(xkbcommon-x11) >= 0.4.1 BuildRequires: pkgconfig(zlib) +# Breaks various existing codebases, see QTBUG-76521 +# BuildRequires: pkgconfig(libzstd) %if %journald BuildRequires: pkgconfig(libsystemd) %endif @@ -888,6 +896,7 @@ echo yes | ./configure \ -system-freetype \ -cups \ -system-zlib \ + -no-zstd \ -no-pch \ -glib \ -sctp \ @@ -1232,12 +1241,16 @@ chmod 644 %{buildroot}%{libqt5_docdir}/global/template/images/*.png %{libqt5_libdir}/libQt5EglFSDeviceIntegration.prl %{libqt5_libdir}/libQt5EglFsKmsSupport.prl %{libqt5_libdir}/libQt5EglFsKmsSupport.so +%{libqt5_libdir}/libQt5XcbQpa.so +%{libqt5_libdir}/libQt5XcbQpa.prl %{libqt5_libdir}/cmake/Qt5Gui/ %{libqt5_libdir}/pkgconfig/Qt5Gui.pc %{libqt5_includedir}/QtGui/ %{libqt5_includedir}/QtEglFSDeviceIntegration/ +%{libqt5_includedir}/QtXkbCommonSupport %exclude %{libqt5_includedir}/QtGui/%{so_version} %exclude %{libqt5_includedir}/QtEglFSDeviceIntegration/%{so_version} +%exclude %{libqt5_includedir}/QtXkbCommonSupport/%{so_version} %files devel %license LICENSE.* @@ -1302,8 +1315,8 @@ chmod 644 %{buildroot}%{libqt5_docdir}/global/template/images/*.png %files -n libQt5PlatformSupport-devel-static %license LICENSE.* %doc *.txt -%{libqt5_libdir}/libQt5XcbQpa.so -%{libqt5_libdir}/libQt5XcbQpa.prl +%{libqt5_libdir}/libQt5XkbCommonSupport.a +%{libqt5_libdir}/libQt5XkbCommonSupport.prl %{libqt5_libdir}/libQt5AccessibilitySupport.a %{libqt5_libdir}/libQt5AccessibilitySupport.prl %{libqt5_libdir}/libQt5DeviceDiscoverySupport.a @@ -1396,6 +1409,7 @@ chmod 644 %{buildroot}%{libqt5_docdir}/global/template/images/*.png %doc *.txt %{libqt5_includedir}/QtGui/%{so_version}/ %{libqt5_includedir}/QtEglFSDeviceIntegration/%{so_version} +%{libqt5_includedir}/QtXkbCommonSupport/%{so_version} %files -n libQt5KmsSupport-private-headers-devel %license LICENSE.* diff --git a/qapplication-emit-palettechanged.patch b/qapplication-emit-palettechanged.patch deleted file mode 100644 index 414c4de..0000000 --- a/qapplication-emit-palettechanged.patch +++ /dev/null @@ -1,31 +0,0 @@ -From edc101a8d8adf29dc62dd5b64becaef972a45830 Mon Sep 17 00:00:00 2001 -From: Kai Uwe Broulik -Date: Mon, 9 Jan 2017 15:17:54 +0100 -Subject: [PATCH] QApplication: Emit paletteChanged signal - -This signal was added to QGuiApplication and QGuiApplication::setPalette. -Since this function is static QApplication has its own distinct implementation -which never emitted this signal. This results in items, such as QtQuick -SystemPalette, which listen to paletteChanged to not update when using -a QApplication. - -Change-Id: I2b8108693743ec57934391025424ec9fee1c9c21 ---- - src/widgets/kernel/qapplication.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp -index ef046f3e..045d3f7 100644 ---- a/src/widgets/kernel/qapplication.cpp -+++ b/src/widgets/kernel/qapplication.cpp -@@ -1514,6 +1514,7 @@ void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char* - else - *QApplicationPrivate::set_pal = palette; - QCoreApplication::setAttribute(Qt::AA_SetPalette); -+ emit qApp->paletteChanged(*QApplicationPrivate::set_pal); - } - } - --- -2.7.4 - diff --git a/qtbase-everywhere-src-5.12.3.tar.xz b/qtbase-everywhere-src-5.12.3.tar.xz deleted file mode 100644 index 603b08f..0000000 --- a/qtbase-everywhere-src-5.12.3.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fddfd8852ef7503febeed67b876d1425160869ae2b1ae8e10b3fb0fedc5fe701 -size 48382148 diff --git a/qtbase-everywhere-src-5.13.0.tar.xz b/qtbase-everywhere-src-5.13.0.tar.xz new file mode 100644 index 0000000..7e126a3 --- /dev/null +++ b/qtbase-everywhere-src-5.13.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff6964b3b528cd3b1d21bcf3470006e8e5cbe69591923f982871d886ea0488fe +size 48640652 diff --git a/reproducible-qrc-time.patch b/reproducible-qrc-time.patch deleted file mode 100644 index 50115c2..0000000 --- a/reproducible-qrc-time.patch +++ /dev/null @@ -1,26 +0,0 @@ -commit aa0241031c93086737d82d5c3e917a8816a77fc4 -Author: Bernhard M. Wiedemann -Date: Wed Jul 11 10:05:55 2018 +0200 - - Use SOURCE_DATE_EPOCH - - Use the standard variable name in addition to the QT-specific one - to make builds reproducible out-of-the-box - - Change-Id: I401a2a9d258e751b83ae7b83f4100d9088b9ad71 - -diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp -index 1a7cab01df..26fc3efea2 100644 ---- a/src/tools/rcc/rcc.cpp -+++ b/src/tools/rcc/rcc.cpp -@@ -211,6 +211,9 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) - static const quint64 sourceDate = 1000 * qgetenv("QT_RCC_SOURCE_DATE_OVERRIDE").toULongLong(); - if (sourceDate != 0) - lastmod = sourceDate; -+ static const quint64 sourceDate2 = 1000 * qgetenv("SOURCE_DATE_EPOCH").toULongLong(); -+ if (sourceDate2 != 0) -+ lastmod = sourceDate2; - lib.writeNumber8(lastmod); - if (text || pass1) - lib.writeChar('\n'); -