修复下载软件失败导致的崩溃,更改APT源更新逻辑

下载失败会导致发射的progress信号已接受数和总数均为0,导致计算进度时被零除;
APT源更新逻辑代码重构,将需要复用的值单独创建变量,重新格式化代码,以及加入了已经废弃的星火源降低优先级代码
This commit is contained in:
RigoLigoRLC 2020-10-02 12:03:40 +08:00
parent f0bf0e5aec
commit eff8878e8b

View File

@ -574,7 +574,8 @@ int Widget::loadappinfo(QUrl arg1)
label_screen[3]=ui->screen_3; label_screen[3]=ui->screen_3;
label_screen[4]=ui->screen_4; label_screen[4]=ui->screen_4;
for (int i=0;i<5;i++) { for (int i=0;i<5;i++) {
get_json.start("curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png"); QString cmd = "curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png";
get_json.start(cmd);
get_json.waitForFinished(); get_json.waitForFinished();
if(screen[i].load("screen_"+QString::number(i+1)+".png")){ if(screen[i].load("screen_"+QString::number(i+1)+".png")){
label_screen[i]->setImage(screen[i]); label_screen[i]->setImage(screen[i]);
@ -673,6 +674,7 @@ void Widget::httpReadyRead()
void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{ {
if(totalBytes <= 0) return;
download_list[nowDownload-1].setMax(10000); // 最大值 download_list[nowDownload-1].setMax(10000); // 最大值
download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值 download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值
download_size=bytesRead; download_size=bytesRead;
@ -778,38 +780,65 @@ void Widget::on_pushButton_updateApt_clicked()
QtConcurrent::run([=](){ QtConcurrent::run([=](){
ui->pushButton_updateApt->setEnabled(false); ui->pushButton_updateApt->setEnabled(false);
ui->label_aptserver->setText(tr("Updating, please wait...")); ui->label_aptserver->setText(tr("Updating, please wait..."));
std::fstream sourcesList;
std::fstream sourcesList, policy, update;
QDir tmpdir("/tmp"); QDir tmpdir("/tmp");
auto tmpPath = QString::fromUtf8(TMP_PATH).toStdString();
bool unknownError = true;
tmpdir.mkpath("spark-store"); tmpdir.mkpath("spark-store");
sourcesList.open(QString::fromUtf8(TMP_PATH).toStdString()+"/sparkstore.list",std::ios::out); sourcesList.open(tmpPath + "/sparkstore.list", std::ios::out);
if(sourcesList){ //policy.open(tmpPath + "/sparkstore", std::ios::out);
sourcesList<<"deb [by-hash=force] "; // 商店已经下架会替换系统库的包优先级policy弃用
sourcesList<<QString::fromUtf8(ui->comboBox_server->currentText().toUtf8()).toStdString();
sourcesList<<" /"; if(sourcesList /*&& policy*/) {
std::fstream update; auto serverAddr = ui->comboBox_server->currentText();
update.open(QString::fromUtf8(TMP_PATH).toStdString()+"/update.sh",std::ios::out);
update<<"#!/bin/sh\n"; sourcesList << "deb [by-hash=force] ";
update<<"mv "+QString::fromUtf8(TMP_PATH).toStdString()+"/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && apt update"; sourcesList << serverAddr.toUtf8().toStdString();
update.close(); sourcesList << " /";
system("chmod +x "+QString::fromUtf8(TMP_PATH).toUtf8()+"/update.sh"); sourcesList.close();
QProcess runupdate;
runupdate.start("pkexec "+QString::fromUtf8(TMP_PATH)+"/update.sh"); /*
runupdate.waitForFinished(); policy << "Package: *\n"
QString error=QString::fromStdString(runupdate.readAllStandardError().toStdString()); "Pin: origin *" << serverAddr.mid(serverAddr.indexOf('.')).toUtf8().toStdString() << "\n"
QStringList everyError=error.split("\n"); "Pin-Priority: 90"; // 降低星火源的优先级,防止从星火安装已存在的系统包,破坏依赖
bool haveError=false; policy.close();
for (int i=0;i<everyError.size();i++) { */
if(everyError[i].left(2)=="E:"){
haveError=true; update.open(tmpPath + "/update.sh",std::ios::out);
if(update) {
unknownError = false;
update << "#!/bin/sh\n"
"mv " + tmpPath + "/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && "
// "mv " + tmpPath + "/sparkstore /etc/apt/preferences.d/sparkstore && "
"apt update";
update.close();
system(("chmod +x " + tmpPath + "/update.sh").c_str());
QProcess runupdate;
runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh"));
runupdate.waitForFinished();
QString error = runupdate.readAllStandardError();
QStringList everyError = error.split("\n");
bool haveError = false;
for (int i=0; i < everyError.size(); i++) {
if(everyError[i].left(2) == "E:") {
haveError = true;
}
}
if(!haveError) {
ui->label_aptserver->setText("deb [by-hash=force] " + ui->comboBox_server->currentText().toUtf8() + " /");
} else {
ui->label_aptserver->setText(tr("Apt has reported an error. Please use apt update in terminal to locate the problem."));
} }
} }
if(!haveError){ }
ui->label_aptserver->setText("deb [by-hash=force] "+ui->comboBox_server->currentText().toUtf8()+" /");
}else { if(unknownError) {
ui->label_aptserver->setText(tr("Apt has reported an error. Please use apt update in terminal to locate the problem.")); ui->label_aptserver->setText(tr("Unknown error!"));
}
}else {
ui->label_aptserver->setText(tr("Unknown server error!"));
} }
ui->pushButton_updateApt->setEnabled(true); ui->pushButton_updateApt->setEnabled(true);