commit:     e65b89b6e937ac0a2b3a37e07b08407511b6a692
Author:     Andreas K. Hüttel <dilfridge <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 10 17:39:33 2020 +0000
Commit:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
CommitDate: Thu Sep 30 10:55:51 2021 +0000
URL:        https://gitweb.gentoo.org/proj/qt.git/commit/?id=e65b89b6

dev-qt/qtcore: Revert timezone handling to 5.14 state

This is an obvious workaround, until we and upstream have
decided what to do...

(sync with Gentoo ebuild repository)

Package-Manager: Portage-3.0.4, Repoman-3.0.1
Signed-off-by: Andreas K. Hüttel <dilfridge <AT> gentoo.org>
Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org>

 dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch | 271 +++++++++++++++++++++
 dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch |  47 ++++
 dev-qt/qtcore/qtcore-5.15.2.9999.ebuild            |   5 +-
 3 files changed, 322 insertions(+), 1 deletion(-)

diff --git a/dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch 
b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch
new file mode 100644
index 00000000..1c8f1e89
--- /dev/null
+++ b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch
@@ -0,0 +1,271 @@
+From c337f6fae51b987ce7dbed1fd9bea41e6073efbb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfri...@gentoo.org>
+Date: Sat, 10 Oct 2020 19:26:13 +0200
+Subject: [PATCH 1/2] Revert "Cache system zone ID when fetched from the
+ file-system"
+
+This reverts commit c70ce3d042025c858faffe661f85d2482a2a0d8c.
+---
+ src/corelib/time/qtimezoneprivate_tz.cpp | 205 +++++++----------------
+ 1 file changed, 64 insertions(+), 141 deletions(-)
+
+diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp 
b/src/corelib/time/qtimezoneprivate_tz.cpp
+index c5c70b7364..01f9a6cce0 100644
+--- a/src/corelib/time/qtimezoneprivate_tz.cpp
++++ b/src/corelib/time/qtimezoneprivate_tz.cpp
+@@ -1,6 +1,5 @@
+ /****************************************************************************
+ **
+-** Copyright (C) 2020 The Qt Company Ltd.
+ ** Copyright (C) 2019 Crimson AS <i...@crimson.no>
+ ** Copyright (C) 2013 John Layt <jl...@kde.org>
+ ** Contact: https://www.qt.io/licensing/
+@@ -43,19 +42,18 @@
+ #include "qtimezoneprivate_p.h"
+ #include "private/qlocale_tools_p.h"
+ 
+-#include <QtCore/QDataStream>
+-#include <QtCore/QDateTime>
+ #include <QtCore/QFile>
+-#include <QtCore/QHash>
+ #include <QtCore/QMutex>
++#include <QtCore/QHash>
++#include <QtCore/QDataStream>
++#include <QtCore/QDateTime>
+ 
+ #include <qdebug.h>
+-#include <qplatformdefs.h>
+ 
+ #include <algorithm>
+ #include <errno.h>
+ #include <limits.h>
+-#ifndef Q_OS_INTEGRITY
++#if !defined(Q_OS_INTEGRITY)
+ #include <sys/param.h> // to use MAXSYMLINKS constant
+ #endif
+ #include <unistd.h>    // to use _SC_SYMLOOP_MAX constant
+@@ -1102,146 +1100,28 @@ QTimeZonePrivate::Data 
QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs
+     return last > tranCache().cbegin() ? dataForTzTransition(*--last) : 
invalidData();
+ }
+ 
+-bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
+-{
+-    return tzZones->contains(ianaId);
+-}
+-
+-QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const
+-{
+-    QList<QByteArray> result = tzZones->keys();
+-    std::sort(result.begin(), result.end());
+-    return result;
+-}
+-
+-QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Country 
country) const
++static long getSymloopMax()
+ {
+-    // TODO AnyCountry
+-    QList<QByteArray> result;
+-    for (auto it = tzZones->cbegin(), end = tzZones->cend(); it != end; ++it) 
{
+-        if (it.value().country == country)
+-            result << it.key();
+-    }
+-    std::sort(result.begin(), result.end());
+-    return result;
+-}
+-
+-// Getting the system zone's ID:
+-
+-namespace {
+-class ZoneNameReader : public QObject
+-{
+-public:
+-    QByteArray name()
+-    {
+-        /* Assumptions:
+-           a) Systems don't change which of localtime and TZ they use without 
a
+-              reboot.
+-           b) When they change, they use atomic renames, hence a new device 
and
+-              inode for the new file.
+-           c) If we change which *name* is used for a zone, while referencing
+-              the same final zoneinfo file, we don't care about the change of
+-              name (e.g. if Europe/Oslo and Europe/Berlin are both symlinks to
+-              the same CET file, continuing to use the old name, after
+-              /etc/localtime changes which of the two it points to, is
+-              harmless).
+-
+-           The alternative would be to use a file-system watcher, but they 
are a
+-           scarce resource.
+-         */
+-        const StatIdent local = identify("/etc/localtime");
+-        const StatIdent tz = identify("/etc/TZ");
+-        if (!m_name.isEmpty() && m_last.isValid() && (m_last == local || 
m_last == tz))
+-            return m_name;
+-
+-        m_name = etcLocalTime();
+-        if (!m_name.isEmpty()) {
+-            m_last = local;
+-            return m_name;
+-        }
+-
+-        m_name = etcTZ();
+-        m_last = m_name.isEmpty() ? StatIdent() : tz;
+-        return m_name;
+-    }
+-
+-
+-private:
+-    QByteArray m_name;
+-    struct StatIdent
+-    {
+-        static constexpr unsigned long bad = ~0ul;
+-        unsigned long m_dev, m_ino;
+-        StatIdent() : m_dev(bad), m_ino(bad) {}
+-        StatIdent(const QT_STATBUF &data) : m_dev(data.st_dev), 
m_ino(data.st_ino) {}
+-        bool isValid() { return m_dev != bad || m_ino != bad; }
+-        bool operator==(const StatIdent &other)
+-        { return other.m_dev == m_dev && other.m_ino == m_ino; }
+-    };
+-    StatIdent m_last;
+-
+-    static StatIdent identify(const char *path)
+-    {
+-        QT_STATBUF data;
+-        return QT_STAT(path, &data) == -1 ? StatIdent() : StatIdent(data);
+-    }
+-
+-    static QByteArray etcLocalTime()
+-    {
+-        // On most distros /etc/localtime is a symlink to a real file so 
extract
+-        // name from the path
+-        const QLatin1String zoneinfo("/zoneinfo/");
+-        QString path = QStringLiteral("/etc/localtime");
+-        long iteration = getSymloopMax();
+-        // Symlink may point to another symlink etc. before being under 
zoneinfo/
+-        // We stop on the first path under /zoneinfo/, even if it is itself a
+-        // symlink, like America/Montreal pointing to America/Toronto
+-        do {
+-            path = QFile::symLinkTarget(path);
+-            int index = path.indexOf(zoneinfo);
+-            if (index >= 0) // Found zoneinfo file; extract zone name from 
path:
+-                return path.midRef(index + zoneinfo.size()).toUtf8();
+-        } while (!path.isEmpty() && --iteration > 0);
+-
+-        return QByteArray();
+-    }
+-
+-    static QByteArray etcTZ()
+-    {
+-        // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
+-        const QString path = QStringLiteral("/etc/TZ");
+-        QFile zone(path);
+-        if (zone.open(QIODevice::ReadOnly))
+-            return zone.readAll().trimmed();
+-
+-        return QByteArray();
+-    }
+-
+-    // Any chain of symlinks longer than this is assumed to be a loop:
+-    static long getSymloopMax()
+-    {
+-#ifdef SYMLOOP_MAX
+-        // If defined, at runtime it can only be greater than this, so this 
is a safe bet:
+-        return SYMLOOP_MAX;
++#if defined(SYMLOOP_MAX)
++    return SYMLOOP_MAX; // if defined, at runtime it can only be greater than 
this, so this is a safe bet
+ #else
+-        errno = 0;
+-        long result = sysconf(_SC_SYMLOOP_MAX);
+-        if (result >= 0)
+-            return result;
+-        // result is -1, meaning either error or no limit
+-        Q_ASSERT(!errno); // ... but it can't be an error, POSIX mandates 
_SC_SYMLOOP_MAX
+-
+-        // therefore we can make up our own limit
+-#  ifdef MAXSYMLINKS
+-        return MAXSYMLINKS;
++    errno = 0;
++    long result = sysconf(_SC_SYMLOOP_MAX);
++    if (result >= 0)
++        return result;
++    // result is -1, meaning either error or no limit
++    Q_ASSERT(!errno); // ... but it can't be an error, POSIX mandates 
_SC_SYMLOOP_MAX
++
++    // therefore we can make up our own limit
++#  if defined(MAXSYMLINKS)
++    return MAXSYMLINKS;
+ #  else
+-        return 8;
++    return 8;
+ #  endif
+ #endif
+-    }
+-};
+ }
+ 
++// TODO Could cache the value and monitor the required files for any changes
+ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+ {
+     // Check TZ env var first, if not populated try find it
+@@ -1256,9 +1136,28 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+     else if (ianaId.startsWith(':'))
+         ianaId = ianaId.mid(1);
+ 
++    // On most distros /etc/localtime is a symlink to a real file so extract 
name from the path
++    if (ianaId.isEmpty()) {
++        const QLatin1String zoneinfo("/zoneinfo/");
++        QString path = QFile::symLinkTarget(QStringLiteral("/etc/localtime"));
++        int index = -1;
++        long iteration = getSymloopMax();
++        // Symlink may point to another symlink etc. before being under 
zoneinfo/
++        // We stop on the first path under /zoneinfo/, even if it is itself a
++        // symlink, like America/Montreal pointing to America/Toronto
++        while (iteration-- > 0 && !path.isEmpty() && (index = 
path.indexOf(zoneinfo)) < 0)
++            path = QFile::symLinkTarget(path);
++        if (index >= 0) {
++            // /etc/localtime is a symlink to the current TZ file, so extract 
from path
++            ianaId = path.midRef(index + zoneinfo.size()).toUtf8();
++        }
++    }
++
++    // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
+     if (ianaId.isEmpty()) {
+-        thread_local static ZoneNameReader reader;
+-        ianaId = reader.name();
++        QFile zone(QStringLiteral("/etc/TZ"));
++        if (zone.open(QIODevice::ReadOnly))
++            ianaId = zone.readAll().trimmed();
+     }
+ 
+     // Give up for now and return UTC
+@@ -1268,4 +1167,28 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+     return ianaId;
+ }
+ 
++bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
++{
++    return tzZones->contains(ianaId);
++}
++
++QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const
++{
++    QList<QByteArray> result = tzZones->keys();
++    std::sort(result.begin(), result.end());
++    return result;
++}
++
++QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Country 
country) const
++{
++    // TODO AnyCountry
++    QList<QByteArray> result;
++    for (auto it = tzZones->cbegin(), end = tzZones->cend(); it != end; ++it) 
{
++        if (it.value().country == country)
++            result << it.key();
++    }
++    std::sort(result.begin(), result.end());
++    return result;
++}
++
+ QT_END_NAMESPACE
+-- 
+2.28.0
+

diff --git a/dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch 
b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch
new file mode 100644
index 00000000..611c979a
--- /dev/null
+++ b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch
@@ -0,0 +1,47 @@
+From ffc9093a199a542791920b30d1835c3248920aa0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfri...@gentoo.org>
+Date: Sat, 10 Oct 2020 19:26:35 +0200
+Subject: [PATCH 2/2] Revert "Purge two old time-zone lookup fallbacks"
+
+This reverts commit b0383cbd388336f698ceeac11a4f50cdff931dd9.
+---
+ src/corelib/time/qtimezoneprivate_tz.cpp | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp 
b/src/corelib/time/qtimezoneprivate_tz.cpp
+index 01f9a6cce0..eea6f5e962 100644
+--- a/src/corelib/time/qtimezoneprivate_tz.cpp
++++ b/src/corelib/time/qtimezoneprivate_tz.cpp
+@@ -1153,6 +1153,29 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+         }
+     }
+ 
++    // On Debian Etch up to Jessie, /etc/localtime is a copy of the relevant
++    // zoneinfo file, whose name is recorded in /etc/timezone:
++    if (ianaId.isEmpty()) {
++        QFile tzif(QStringLiteral("/etc/timezone"));
++        if (tzif.open(QIODevice::ReadOnly))
++            ianaId = tzif.readAll().trimmed();
++    }
++
++    // On some Red Hat distros /etc/localtime is real file with name held in 
/etc/sysconfig/clock
++    // in a line like ZONE="Europe/Oslo" or TIMEZONE="Europe/Oslo"
++    if (ianaId.isEmpty()) {
++        QFile tzif(QStringLiteral("/etc/sysconfig/clock"));
++        if (tzif.open(QIODevice::ReadOnly)) {
++            while (ianaId.isEmpty() && !tzif.atEnd()) {
++                const QByteArray line(tzif.readLine().trimmed());
++                if (line.startsWith("ZONE="))
++                    ianaId = line.mid(6, line.length() - 7);
++                else if (line.startsWith("TIMEZONE="))
++                    ianaId = line.mid(10, line.length() - 11);
++            }
++        }
++    }
++
+     // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
+     if (ianaId.isEmpty()) {
+         QFile zone(QStringLiteral("/etc/TZ"));
+-- 
+2.28.0
+

diff --git a/dev-qt/qtcore/qtcore-5.15.2.9999.ebuild 
b/dev-qt/qtcore/qtcore-5.15.2.9999.ebuild
index f5dae178..23956275 100644
--- a/dev-qt/qtcore/qtcore-5.15.2.9999.ebuild
+++ b/dev-qt/qtcore/qtcore-5.15.2.9999.ebuild
@@ -42,7 +42,10 @@ QT5_GENTOO_PRIVATE_CONFIG=(
        !:xml
 )
 
-PATCHES=( "${FILESDIR}/${PN}-5.14.1-cmake-macro-backward-compat.patch" ) # bug 
703306
+PATCHES=(
+       "${FILESDIR}"/${PN}-5.14.1-cmake-macro-backward-compat.patch # bug 
703306
+       "${FILESDIR}"/${PN}-5.15.1-timezone-{1,2}.patch # bug 737914
+)
 
 pkg_pretend() {
        use kernel_linux || return

Reply via email to