From 41ad064f96e39e3ababb3e7db63c48cfb38ea522 Mon Sep 17 00:00:00 2001 From: wangrong Date: Thu, 21 May 2026 21:23:43 +0800 Subject: [PATCH] fix(disk): propagate SetPartionLabel errors to installer layer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make SetPartionLabel return bool and check its result in both QtX86Installer and QtMipsInstaller, so partition label failures no longer silently pass. Correctly calling the fatlabel command. 修改SetPartionLabel返回bool,在Installer层检查返回值, 分区标签设置失败时及时终止安装流程。正确调用fatlabel命令。 Log: 修复分区标签设置失败未上报的问题 PMS: BUG-361883 Influence: 分区标签设置失败时安装流程会正确报错终止,避免产生 标签异常的启动盘。 --- src/libdbm/installer/qtX86Installer.cpp | 7 ++- src/libdbm/installer/qtmipsinstaller.cpp | 7 ++- src/vendor/src/libxsys/Cmd/Cmd.cpp | 6 ++- src/vendor/src/libxsys/DiskUtil/DiskUtil.cpp | 45 +++++++++++--------- src/vendor/src/libxsys/DiskUtil/DiskUtil.h | 4 +- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/libdbm/installer/qtX86Installer.cpp b/src/libdbm/installer/qtX86Installer.cpp index 96ad50a2..bb3cd68b 100644 --- a/src/libdbm/installer/qtX86Installer.cpp +++ b/src/libdbm/installer/qtX86Installer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2020 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only @@ -47,7 +47,10 @@ bool QtX86Installer::installBootload() } qDebug() << "Setting partition label for image:" << m_strImage; - XSys::DiskUtil::SetPartionLabel(m_strPartionName, m_strImage); + if (!XSys::DiskUtil::SetPartionLabel(m_strPartionName, m_strImage)) { + qCritical() << "Failed to set partition label"; + return false; + } qInfo() << "Bootloader installation completed successfully"; return true; diff --git a/src/libdbm/installer/qtmipsinstaller.cpp b/src/libdbm/installer/qtmipsinstaller.cpp index 80b43a09..f356bbb0 100644 --- a/src/libdbm/installer/qtmipsinstaller.cpp +++ b/src/libdbm/installer/qtmipsinstaller.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2020 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only @@ -31,7 +31,10 @@ bool QtMipsInstaller::installBootload() } qDebug() << "Setting partition label for image:" << m_strImage; - XSys::DiskUtil::SetPartionLabel(m_strPartionName, m_strImage); + if (!XSys::DiskUtil::SetPartionLabel(m_strPartionName, m_strImage)) { + qCritical() << "Failed to set partition label"; + return false; + } qInfo() << "Bootloader installation completed successfully"; return true; diff --git a/src/vendor/src/libxsys/Cmd/Cmd.cpp b/src/vendor/src/libxsys/Cmd/Cmd.cpp index 06f4ca8e..bb491b9b 100644 --- a/src/vendor/src/libxsys/Cmd/Cmd.cpp +++ b/src/vendor/src/libxsys/Cmd/Cmd.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2015 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2015 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only @@ -63,6 +63,10 @@ Result SynExec(const QString &exec, const QString ¶m, const QString &execPip Result ret = runApp(exec, param, execPipeIn); qInfo() << "call:" << exec + " " + param << "with:" << execPipeIn ; qInfo() << "resut:" << ret.isSuccess(); + if (!ret.isSuccess()) { + qInfo() << "stdout:" << ret.result(); + qInfo() << "stderr:" << ret.errmsg(); + } return ret; } diff --git a/src/vendor/src/libxsys/DiskUtil/DiskUtil.cpp b/src/vendor/src/libxsys/DiskUtil/DiskUtil.cpp index 3956424c..ed5926c1 100644 --- a/src/vendor/src/libxsys/DiskUtil/DiskUtil.cpp +++ b/src/vendor/src/libxsys/DiskUtil/DiskUtil.cpp @@ -745,33 +745,38 @@ bool SetActivePartion(const QString& strDisk, const QString& strPartion) return ret.isSuccess(); } -void SetPartionLabel(const QString& strPartion, const QString& strImage) +bool SetPartionLabel(const QString& strPartion, const QString& strImage) { - /*QProcess cannot handle Chinese paths*/ - XSys::SynExec(XSys::FS::SearchBin("fsck"), QString("-y %1").arg(strPartion)); - QStringList args; - args << "-i" << strImage << "-d"; - XSys::Result ret3 = XSys::SynExec("isoinfo", args); + if (!XSys::SynExec(XSys::FS::SearchBin("fsck"), QStringList{"-y", strPartion}).isSuccess()) { + qWarning() << "fsck failed on" << strPartion << ", continuing anyway"; + } - if (!ret3.isSuccess()) { - qWarning() << "call isoinfo failed" << ret3.result(); - return; + XSys::Result isoResult = XSys::SynExec("isoinfo", QStringList{"-i", strImage, "-d"}); + if (!isoResult.isSuccess()) { + qWarning() << "call isoinfo failed:" << isoResult.result(); + return false; } - QStringList volume = ret3.result().split("\n").filter("Volume id"); - QString tem = volume.takeAt(0); - QStringList strValues = tem.split(":"); - QString strName = QString("UNKNOWN"); - QString strTemp; + // Volume id 格式: "Volume id: DEEPIN" 或 "Volume id: UOS" + QString volumeId; + for (const QString &line : isoResult.result().split("\n")) { + if (line.startsWith("Volume id:")) { + volumeId = line.split(":").last().trimmed(); + break; + } + } - if (2 <= strValues.size()) { - strTemp = strValues.at(1); - strTemp = strTemp.trimmed(); + if (volumeId.isEmpty()) { + qWarning() << "No volume id found in isoinfo output"; + return false; } - //标签名最长长度为十一位 - strName = strTemp.isEmpty()?strName:(strTemp.length() > 11)?strTemp.left(11):strTemp; - XSys::SynExec(XSys::FS::SearchBin("fatlabel"), QString(" %1 \"%2\"").arg(strPartion).arg(strName)); + // FAT32 卷标最长 11 字符 + QString label = volumeId.left(11); + if (volumeId.length() > 11) { + qWarning() << "Volume id truncated:" << volumeId << "->" << label; + } + return XSys::SynExec(XSys::FS::SearchBin("fatlabel"), QStringList{strPartion, label}).isSuccess(); } QString getPartitionUUID(const QString& strPartition) diff --git a/src/vendor/src/libxsys/DiskUtil/DiskUtil.h b/src/vendor/src/libxsys/DiskUtil/DiskUtil.h index 0b289bd0..fe51e990 100644 --- a/src/vendor/src/libxsys/DiskUtil/DiskUtil.h +++ b/src/vendor/src/libxsys/DiskUtil/DiskUtil.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2015 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2015 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only @@ -34,7 +34,7 @@ bool FormatPartion(const QString& targetDev); bool CreatePartition(const QString& diskDev); QStringList GetPartionOfDisk(const QString& strDisk); bool SetActivePartion(const QString& strDisk, const QString& strPartion); -void SetPartionLabel(const QString& strPartion, const QString& strImage); +bool SetPartionLabel(const QString& strPartion, const QString& strImage); QString getPartitionUUID(const QString& strPartition); }