New upstream version 5.2.2.3
authorJoshua Peisach <itzswirlz2020@outlook.com>
Mon, 10 Aug 2020 12:34:54 +0000 (08:34 -0400)
committerJoshua Peisach <itzswirlz2020@outlook.com>
Mon, 10 Aug 2020 12:34:54 +0000 (08:34 -0400)
src/dsysinfo.cpp
src/dsysinfo.h
src/dtk_translation.prf
tests/dutils/dutiltester.cpp
tests/dutils/dutiltester.h
tools/deepin-os-release/main.cpp
tools/script/dtk-license.py
tools/script/dtk-translate.py

index 030ddb91846a20cf597727201ddf2256009c92b2..a364f4ca520a3841841784528bb64a46aaff9fda 100644 (file)
@@ -47,6 +47,7 @@ public:
 
 #ifdef Q_OS_LINUX
     void ensureDeepinInfo();
+    bool ensureOsVersion();
 #endif
     void ensureReleaseInfo();
     void ensureComputerInfo();
@@ -58,6 +59,22 @@ public:
     QString deepinVersion;
     QString deepinEdition;
     QString deepinCopyright;
+
+    QString majorVersion;
+    QString minorVersion;
+    struct MinVersion {
+        MinVersion():A(0), BC(0), D(0){
+        }
+        uint A, BC, D; // A-BC-D
+    };
+    struct OSBuild {
+        OSBuild():A(0), B(0), C(0), D(0), xyz(100){
+        }
+        uint A, B, C, D, E, xyz; // ABCDE.xyz
+    };
+
+    MinVersion minVersion;
+    OSBuild osBuild;
 #endif
 
     QScopedPointer<DDesktopEntry> distributionInfo;
@@ -82,7 +99,7 @@ DSysInfoPrivate::DSysInfoPrivate()
 #ifdef Q_OS_LINUX
 void DSysInfoPrivate::ensureDeepinInfo()
 {
-    if (deepinType >= 0)
+    if (static_cast<int>(deepinType) >= 0)
         return;
 
     QFile file("/etc/deepin-version");
@@ -158,6 +175,54 @@ void DSysInfoPrivate::ensureDeepinInfo()
     QSettings distributionInfo(distributionInfoFile, QSettings::IniFormat); // TODO: treat as `.desktop` format instead of `.ini`
 }
 
+bool DSysInfoPrivate::ensureOsVersion()
+{
+    if (minVersion.A > 0)
+        return true;
+
+    DDesktopEntry entry("/etc/os-version");
+    majorVersion = entry.stringValue("MajorVersion", "Version");
+    minorVersion = entry.stringValue("MinorVersion", "Version");
+    Q_ASSERT(minorVersion.length() == 4);
+
+    // A-BC-D
+    bool ok = false;
+    uint minv = minorVersion.toUInt(&ok);
+    if (ok) {
+        minVersion.D = minv % 10;
+    } else if (minorVersion.length() > 0) {
+        // 0-9...A-Z
+        minVersion.D = 10 + static_cast<uint>(minorVersion.right(1).data()->toLatin1() - 'A');
+    }
+    uint minVer = minorVersion.left(3).toUInt();
+    minVersion.BC = minVer % 100;
+    minVer /= 100;
+    minVersion.A = minVer % 10;
+
+    // ABCDE.xyz
+    QString osb = entry.stringValue("OsBuild", "Version");
+    QStringList osbs = osb.split(".");
+    Q_ASSERT(osbs.size() == 2 && osbs.value(0).size() == 5);
+    uint left = osbs.value(0).trimmed().toUInt(&ok);
+    Q_ASSERT(ok);
+    if (ok) {
+        osBuild.E = left % 10;
+        left /= 10;
+        osBuild.D = left % 10;
+        left /= 10;
+        osBuild.C = left % 10; // default C is 0
+        left /= 10;
+        osBuild.B = left % 10;
+        left /= 10;
+        osBuild.A = left % 10;
+    }
+
+    // xyz
+    osBuild.xyz = osbs.value(1).trimmed().toUInt(&ok);
+
+    return ok;
+}
+
 static QString unquote(const QByteArray &value)
 {
     if (value.at(0) == '"' || value.at(0) == '\'') {
@@ -290,7 +355,7 @@ void DSysInfoPrivate::ensureReleaseInfo()
         case 'U':
             if (productTypeString.compare("ubuntu", Qt::CaseInsensitive) == 0) {
                 productType = DSysInfo::Ubuntu;
-            } else if (productTypeString.compare("uos", Qt::CaseInsensitive) == 0) {
+            } else if (productTypeString.compare("uos", Qt::CaseInsensitive) == 0 || productTypeString.compare("UnionTech OS", Qt::CaseInsensitive) == 0) {
                 productType = DSysInfo::Uos;
             }
             break;
@@ -474,6 +539,161 @@ QString DSysInfo::deepinCopyright()
 
     return siGlobal->deepinCopyright;
 }
+
+/*!
+ * \~chinese \brief DSysInfo::osType 系统类型
+ * \~chinese \row 显示系统类型【1:桌面】【2:服务器】【3:专用设备】
+ * \~chinese \note 根据 osBuild.B 判断
+ */
+DSysInfo::UosType DSysInfo::uosType()
+{
+    siGlobal->ensureOsVersion();
+
+    UosType ost = UosTypeUnknown;
+    if ((siGlobal->osBuild.B > UosTypeUnknown && siGlobal->osBuild.B < UosTypeCount)) {
+        ost = static_cast<UosType>(siGlobal->osBuild.B);
+    }
+
+    return ost;
+}
+
+/*!
+ * \~chinese \brief DSysInfo::osEditionType 版本类型
+ * \~chinese \row 显示版本类型 专业版/个人版/社区版...
+ * \~chinese \note 根据 osBuild.B && osBuild.D
+ */
+DSysInfo::UosEdition DSysInfo::uosEditionType()
+{
+    siGlobal->ensureOsVersion();
+    UosEdition ospt = UosEditionUnknown;
+
+    if (siGlobal->osBuild.B == UosDesktop) {
+        ospt = static_cast<UosEdition>(siGlobal->osBuild.D);
+    } else if (siGlobal->osBuild.B == UosServer) {
+        ospt = static_cast<UosEdition>(siGlobal->osBuild.D + UosMilitary);
+    } else if (siGlobal->osBuild.B == UosDevice){
+        ospt = UosProfessional;
+    }
+
+    return ospt;
+}
+
+/*!
+ * \~chinese \brief DSysInfo::osArch 架构信息(使用一个字节的二进制位,从低位到高位)
+ * \~chinese \row 【0x8 sw64】【0x4 mips64】【0x2 arm64】【0x1 amd64】
+ */
+DSysInfo::UosArch DSysInfo::uosArch()
+{
+    siGlobal->ensureOsVersion();
+
+    return static_cast<UosArch>(siGlobal->osBuild.E);
+}
+
+static QString getUosVersionValue(const QString &key, const QLocale &locale)
+{
+    DDesktopEntry entry("/etc/os-version");
+    QString localKey = QString("%1[%2]").arg(key, locale.name());
+
+    return entry.stringValue(localKey, "Version", entry.stringValue(key, "Version"));
+}
+
+/*!
+ * \~chinese \brief DSysInfo::osProductTypeName 版本名称
+ * \~chinese \row ProductType[xx] 项对应的值, 如果找不到对应语言的默认使用 ProductType的值(Desktop/Server/Device)
+ * \~chinese \param locale 当前系统语言
+ */
+QString DSysInfo::uosProductTypeName(const QLocale &locale)
+{
+    return getUosVersionValue("ProductType", locale);
+}
+
+/*!
+ * \~chinese \brief DSysInfo::osSystemName 版本名称
+ * \~chinese \row SystemName[xx] 项对应的值, 如果找不到对应语言的默认使用 SystemName 的值 Uniontech OS
+ * \~chinese \param locale 当前系统语言
+ */
+QString DSysInfo::uosSystemName(const QLocale &locale)
+{
+    return getUosVersionValue("SystemName", locale);
+}
+
+/*!
+ * \~chinese \brief DSysInfo::osEditionName 版本名称
+ * \~chinese \row EditionName[xx] 项对应的值, 如果找不到对应语言的默认使用 EditionName 的值(Professional/Home/Community...)
+ * \~chinese \param locale 当前系统语言
+ */
+QString DSysInfo::uosEditionName(const QLocale &locale)
+{
+    return getUosVersionValue("EditionName", locale);
+}
+
+/*!
+ * \~chinese \brief DSysInfo::spVersion 阶段版本名称
+ * \~chinese \row 小版本号 A-BC-D 中 BC, 返回 SP1-SPxx, 如果正式版返回空
+ * \~chinese \note minVersion.BC == 00:正式版本    minVersion.BC == 01-99:SP1….SP99
+ */
+QString DSysInfo::spVersion()
+{
+    siGlobal->ensureOsVersion();
+    if (siGlobal->minVersion.BC > 0) {
+        return QString("SP%1").arg(siGlobal->minVersion.BC);
+    } else {
+        return QString(); // 00 正式版
+    }
+}
+
+/*!
+ * \~chinese \brief DSysInfo::udpateVersion 更新版本名称
+ * \~chinese \row 小版本号 A-BC-D 中 D, 返回 update1… update9, 如果正式版返回空
+ * \~chinese \note minVersion.D == 0:正式版本    minVersion.D == 1-9:update1… update9,updateA...updateZ
+ */
+QString DSysInfo::udpateVersion()
+{
+    siGlobal->ensureOsVersion();
+    if (siGlobal->minVersion.D > 0) {
+        uint uv = siGlobal->minVersion.D;
+        if (uv < 10) {
+            return QString("update%1").arg(uv);
+        } else {
+            return QString("update").append(QChar(uv - 10 + 'A'));
+        }
+    } else {
+        return QString(); // 0 正式版
+    }
+}
+
+/*!
+ * \~chinese \brief DSysInfo::majorVersion 主版本号
+ * \~chinese \row 主版本号 【20】【23】【25】【26】【29】【30】
+ * \~chinese \note 返回 MajorVersion 的值
+ */
+QString DSysInfo::majorVersion()
+{
+    siGlobal->ensureOsVersion();
+    return siGlobal->majorVersion;
+}
+
+/*!
+ * \~chinese \brief DSysInfo::minorVersion 小版本号
+ * \~chinese \row 【ABCD】 ·[0-9]{4}
+ * \~chinese \note 返回 MinorVersion 的值
+ */
+QString DSysInfo::minorVersion()
+{
+    siGlobal->ensureOsVersion();
+    return siGlobal->minorVersion;
+}
+
+/*!
+ * \~chinese \brief DSysInfo::buildVersion 小版本号
+ * \~chinese \row 系统镜像批次号,按时间顺序(不可回退)从100-999递增
+ * \~chinese \note 返回 osBuild.xyz 的值
+ */
+QString DSysInfo::buildVersion()
+{
+    siGlobal->ensureOsVersion();
+    return QString::number(siGlobal->osBuild.xyz);
+}
 #endif
 
 QString DSysInfo::deepinDistributionInfoPath()
index 4fd17a1387accc953f0dfb9c8c8ce79fb7766e7d..9c41c497f74023b62dfc689c3cd20c2905fb9f9a 100644 (file)
@@ -67,6 +67,38 @@ public:
         Manufacturer //!< manufacturer of the current distribution or device
     };
 
+    enum UosType {
+        UosTypeUnknown,
+        UosDesktop,
+        UosServer,
+        UosDevice,
+
+        UosTypeCount // must at last
+    };
+
+    enum UosEdition {
+        UosEditionUnknown,
+        UosProfessional,
+        UosHome,
+        UosCommunity,
+        UosMilitary,
+        UosEnterprise,
+        UosEnterpriseC,
+        UosEuler,
+        UosMilitaryS, // for Server
+
+        UosEditionCount // must at last
+    };
+
+    // 注意:此处架构是从OsBuild获取的系统版本的Arch信息,并不是指硬件的Arch信息
+    enum UosArch {
+        UosArchUnknown,
+        UosAMD64 = 1 << 0,
+        UosARM64 = 1 << 1,
+        UosMIPS64 = 1 << 2,
+        UosSW64 = 1 << 3
+    };
+
 #ifdef Q_OS_LINUX
     static bool isDeepin();
     static bool isDDE();
@@ -75,6 +107,20 @@ public:
     static QString deepinVersion();
     static QString deepinEdition();
     static QString deepinCopyright();
+
+    // uos version interface
+    static UosType uosType();
+    static UosEdition uosEditionType();
+    static UosArch uosArch();
+    static QString uosProductTypeName(const QLocale &locale = QLocale::system());
+    static QString uosSystemName(const QLocale &locale = QLocale::system());
+    static QString uosEditionName(const QLocale &locale = QLocale::system());
+
+    static QString spVersion(); // SP1...SP99
+    static QString udpateVersion(); // update1...update9
+    static QString majorVersion();
+    static QString minorVersion();
+    static QString buildVersion(); // xyz
 #endif
 
     Q_DECL_DEPRECATED_X("Use distributionInfoPath() instead") static QString deepinDistributionInfoPath();
index 76a75dccdbc54f46b9d09ebb70b08589881d6ec6..352c0226122abda7e0b6b16edaa77023086d2179 100644 (file)
@@ -1,6 +1,6 @@
 message ("Process dtk translation")
-message ("Add DTK_NO_TRANSLATION=YES to qmake arguments skip this")
-message ("Add DTK_STATIC_TRANSLATION=YES to add support static translations")
+message ("Add DTK_NO_TRANSLATION=YES to qmake arguments to skip this")
+message ("Add DTK_STATIC_TRANSLATION=YES to add support for static translations")
 
 # TODO: check lrelease/lupdate exist
 
index b50ca9a6b6c48b2e03ebbf8fa3b076b1e89964db..a5326ab531c730933d3269c6dd42c9618d3a2539 100644 (file)
@@ -33,6 +33,7 @@
 #include "settings/dsettings.h"
 #include "settings/dsettingsgroup.h"
 #include "settings/dsettingsoption.h"
+#include "dsysinfo.h"
 
 DCORE_USE_NAMESPACE
 
@@ -225,3 +226,18 @@ void TestDUtil::testGroups()
     qDebug() << settings->group("shortcuts.ternimal");
     qDebug() << settings->group("shortcuts.ternimal")->options();
 }
+
+void TestDUtil::testSysInfo()
+{
+    qDebug() << DSysInfo::uosType() <<
+                DSysInfo::uosEditionType() <<
+                DSysInfo::uosArch() <<
+                DSysInfo::uosProductTypeName() <<
+                DSysInfo::uosSystemName() <<
+                DSysInfo::uosEditionName() <<
+                DSysInfo::spVersion() <<
+                DSysInfo::udpateVersion() <<
+                DSysInfo::majorVersion() <<
+                DSysInfo::minorVersion() <<
+                DSysInfo::buildVersion() ;
+}
index be9beac5d4b6396aaf78c03813a73956271dbcf9..f53ea34deee21cd379904d71d4523c95fe9e08a8 100644 (file)
@@ -35,6 +35,7 @@ private Q_SLOTS:
     void testDBusSender();
 
     void testGroups();
+    void testSysInfo();
 };
 
 
index cdd5ec62a652e93e667194dcf3c9946a9ea8e9a3..e98aa9d7bc14ccd6f3d1e59805736bc044efc6af 100644 (file)
@@ -92,15 +92,24 @@ int main(int argc, char *argv[])
         printf("Product Type: %s\n", qPrintable(DSysInfo::productTypeString()));
         printf("Product Version: %s\n", qPrintable(DSysInfo::productVersion()));
 
+        printf("Uos Product Name: %s\n", qPrintable(DSysInfo::uosProductTypeName()));
+        printf("Uos SystemName Name: %s\n", qPrintable(DSysInfo::uosSystemName()));
+        printf("Uos Product Name: %s\n", qPrintable(DSysInfo::uosEditionName()));
+        printf("Uos SP Version: %s\n", qPrintable(DSysInfo::spVersion()));
+        printf("Uos update Version: %s\n", qPrintable(DSysInfo::udpateVersion()));
+        printf("Uos major Version: %s\n", qPrintable(DSysInfo::majorVersion()));
+        printf("Uos minor Version: %s\n", qPrintable(DSysInfo::minorVersion()));
+        printf("Uos build Version: %s\n", qPrintable(DSysInfo::buildVersion()));
+
         if (distributionInfoValid()) {
             printDistributionOrgInfo(DSysInfo::Distribution);
             printDistributionOrgInfo(DSysInfo::Distributor);
         }
     } else {
         if (parser.isSet(option_deepin_type))
-            printf("%s", qPrintable(DSysInfo::deepinTypeDisplayName(QLocale::c())));
+            printf("%s", qPrintable(DSysInfo::uosEditionName(QLocale::c())));
         else if (parser.isSet(option_deepin_version))
-            printf("%s", qPrintable(DSysInfo::deepinVersion()));
+            printf("%s", qPrintable(DSysInfo::majorVersion()));
         else if (parser.isSet(option_deepin_edition))
             printf("%s", qPrintable(DSysInfo::deepinEdition()));
         else if (parser.isSet(option_deepin_copyright))
index bc3a0717918a7126942f6fe4c8b1d49f875401b0..cf49e8138d5c7b11617134aea073be39c1cbdd67 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 import fnmatch
 import os
index 9cb06f8157d33a18b4782f2fdf619b26b797f94d..97bb7e615db16da5033d18fd97ce92f3841168b0 100644 (file)
@@ -1,4 +1,4 @@
-#!env python
+#!/usr/bin/env python3
 
 import sys,os,fnmatch
 from subprocess import call