支持显示本地apt源内容(但速度过慢)

This commit is contained in:
gfdgd xi 2024-05-09 22:59:48 +08:00
parent 1bd4bad1cd
commit a3c5b9fc87
4 changed files with 52 additions and 72 deletions

@ -2,6 +2,7 @@
#include <QFile> #include <QFile>
#include <QDir> #include <QDir>
#include <QDebug> #include <QDebug>
#include <QJsonObject>
AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option) AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
{ {
@ -12,7 +13,7 @@ AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
void AptPkgInfo::ReadAptData() void AptPkgInfo::ReadAptData()
{ {
this->aptData = ""; this->aptData = QJsonObject();
QDir dir("/var/lib/apt/lists/"); QDir dir("/var/lib/apt/lists/");
QStringList list = dir.entryList(); QStringList list = dir.entryList();
for(QString i: list) { for(QString i: list) {
@ -26,17 +27,19 @@ void AptPkgInfo::ReadAptData()
QFile file(dir.path() + "/" + i); QFile file(dir.path() + "/" + i);
file.open(QFile::ReadOnly); file.open(QFile::ReadOnly);
// 分析 // 分析
QString pkgData; QJsonObject pkgData;
pkgDataStatus status = pkgDataStatus::None; pkgDataStatus status = pkgDataStatus::None;
QString strTemp; // 因为直接 replace 会改变原来的值
while(!file.atEnd()) { while(!file.atEnd()) {
QByteArray line = file.readLine(); QByteArray line = file.readLine();
if(line.replace(" ", "").replace("\n", "") == "") { strTemp = line;
if(strTemp.replace(" ", "").replace("\n", "") == "") {
// 空行 // 空行
if(status == pkgDataStatus::IsContain) { if(status == pkgDataStatus::IsContain) {
aptData += pkgData + "\n"; aptData.insert(pkgData.value("Package").toString(), pkgData);
} }
status = pkgDataStatus::EmptyLine; status = pkgDataStatus::EmptyLine;
pkgData = ""; // 清空 pkgData = QJsonObject(); // 清空
continue; continue;
} }
// 如果已经被检测为非要寻找的包名,则 // 如果已经被检测为非要寻找的包名,则
@ -47,7 +50,8 @@ void AptPkgInfo::ReadAptData()
if(line.contains("Package: ")) { if(line.contains("Package: ")) {
// 如果为包名行,则进行分析 // 如果为包名行,则进行分析
// 是否含有要求关键字 // 是否含有要求关键字
QString pkgName = line.replace("Package: ", "").replace(" ", "").replace("\n", ""); strTemp = line;
QString pkgName = strTemp.replace("Package: ", "").replace(" ", "").replace("\n", "");
switch(this->pkgSearchOption) { switch(this->pkgSearchOption) {
case PkgSearchOption::Equal: case PkgSearchOption::Equal:
if(pkgName == this->pkgName) { if(pkgName == this->pkgName) {
@ -66,15 +70,18 @@ void AptPkgInfo::ReadAptData()
} }
break; break;
} }
pkgData += line + "\n"; // 解析为 QJsonObject
pkgData.insert("Package", pkgName);
continue; continue;
} }
// 处理 // 处理
pkgData += line + "\n"; int index = line.indexOf(":");
strTemp = line;
strTemp.replace("\n", "");
pkgData.insert(QString(strTemp.mid(0, index)), QString(strTemp.mid(index + 2)));
} }
file.close(); file.close();
} }
qDebug() << aptData;
} }
void AptPkgInfo::SetPkgName(QString pkgName) void AptPkgInfo::SetPkgName(QString pkgName)
@ -93,53 +100,34 @@ QString AptPkgInfo::GetPkgInfo(QString pkgName) const
return this->GetCommandResult("apt", QStringList() << "list" << pkgName, env); return this->GetCommandResult("apt", QStringList() << "list" << pkgName, env);
} }
QString AptPkgInfo::get_package() const QString AptPkgInfo::get_package(QString pkgName) const
{ {
QStringList list = pkgInfo.split("\n"); return this->aptData.value(pkgName).toObject().value("Package").toString();
for(QString i: list) {
if(i.contains("Package: ")) {
return i.replace("Package: ", "").replace(" ", "");
}
}
return NULL;
} }
QString AptPkgInfo::get_version() const QString AptPkgInfo::get_version(QString pkgName) const
{ {
QStringList list = pkgInfo.split("\n"); return this->aptData.value(pkgName).toObject().value("Version").toString();
for(QString i: list) {
if(i.contains("Maintainer: ")) {
return i.replace("Maintainer: ", "").replace(" ", "");
}
}
return NULL;
} }
QString AptPkgInfo::get_maintainer() const QString AptPkgInfo::get_maintainer(QString pkgName) const
{ {
QStringList list = pkgInfo.split("\n"); return this->aptData.value(pkgName).toObject().value("Maintainer").toString();
for(QString i: list) {
if(i.contains("Version: ")) {
return i.replace("Version: ", "").replace(" ", "");
}
}
return NULL;
} }
QStringList AptPkgInfo::GetAptPackageList(QString name) const QString AptPkgInfo::get_description(QString pkgName) const
{ {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); return this->aptData.value(pkgName).toObject().value("Description").toString();
env.insert("LANG", "en"); }
QString data = GetCommandResult("apt", QStringList() << "list" << name, env);
QStringList lineData = data.split("\n"); QString AptPkgInfo::get_architecture(QString pkgName) const
QStringList result = {}; {
for(QString i: lineData) { return this->aptData.value(pkgName).toObject().value("Architecture").toString();
if(i.contains("Listing...")) { }
continue;
} QStringList AptPkgInfo::GetAptPackageList() const
result.append(i.split("/").at(0)); {
} return this->aptData.keys();
return result;
} }
QByteArray AptPkgInfo::GetCommandResult(QString command, QStringList argv, QProcessEnvironment env) const QByteArray AptPkgInfo::GetCommandResult(QString command, QStringList argv, QProcessEnvironment env) const

@ -3,6 +3,7 @@
#include <QObject> #include <QObject>
#include <QProcess> #include <QProcess>
#include <QJsonObject>
class AptPkgInfo: QObject class AptPkgInfo: QObject
{ {
@ -16,21 +17,23 @@ public:
AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal); AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal);
void SetPkgName(QString pkgName); void SetPkgName(QString pkgName);
QStringList GetAptPackageList(QString name) const; QStringList GetAptPackageList() const;
QByteArray GetCommandResult(QString command, QStringList argv, QProcessEnvironment env = QProcessEnvironment::systemEnvironment()) const; QByteArray GetCommandResult(QString command, QStringList argv, QProcessEnvironment env = QProcessEnvironment::systemEnvironment()) const;
QString GetPkgInfo(QString pkgName=NULL) const; QString GetPkgInfo(QString pkgName=NULL) const;
QString get_package() const; QString get_package(QString pkgName) const;
QString get_version() const; QString get_version(QString pkgName) const;
QString get_maintainer() const; QString get_maintainer(QString pkgName) const;
QString get_description(QString pkgName) const;
QString get_architecture(QString pkgName) const;
private: private:
QString pkgName; QString pkgName;
QString pkgInfo; QString pkgInfo;
QString aptData; QJsonObject aptData;
PkgSearchOption pkgSearchOption = PkgSearchOption::Equal; PkgSearchOption pkgSearchOption = PkgSearchOption::Equal;
enum pkgDataStatus { enum pkgDataStatus {

@ -16,35 +16,21 @@ void KernelInformation::LoadInfo()
}*/ }*/
AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::Include); AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::Include);
QStringList list = info.GetAptPackageList();
QJsonArray array; QJsonArray array;
QStringList list = info.GetAptPackageList("linux-base");
for(QString i: list) { for(QString i: list) {
QJsonObject object; QJsonObject object;
info.SetPkgName(i); info.SetPkgName(i);
object.insert("Name", i); object.insert("Name", i);
object.insert("Author", info.get_maintainer()); object.insert("Author", info.get_maintainer(i));
object.insert("Des", info.get_maintainer(i));
object.insert("Arch", info.get_architecture(i));
array.append(object); array.append(object);
qDebug() << object;
} }
this->listData = array; this->listData = array;
emit loadFinished(NULL); emit loadFinished(NULL);
return;
// 从 Github 拉取信息
QUrl url(this->url);
QUrlQuery query;
query.addQueryItem("format", "j1");
url.setQuery(query.toString(QUrl::FullyEncoded));
qDebug() << url;
QNetworkRequest request(url);
QNetworkAccessManager *m_http = new QNetworkAccessManager(this);
QNetworkReply *reply = m_http->get(request);
connect(reply, &QNetworkReply::finished, this, [this, m_http](){
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
QByteArray data = reply->readAll();
qDebug() << data;
qDebug() << reply->error();
this->listData = QJsonDocument::fromJson(data).array();
emit loadFinished(reply);
});
} }
QJsonArray KernelInformation::get_listData() const QJsonArray KernelInformation::get_listData() const

@ -42,6 +42,9 @@ void MainWindow::RefreshKernelListView(KernelInformation *info, bool showLocalAr
if(i == arch) { if(i == arch) {
isLocalArch = true; isLocalArch = true;
} }
if(i == "all") {
isLocalArch = true;
}
kernelArch += i + " "; kernelArch += i + " ";
} }
if(showLocalArchOnly && !isLocalArch) { if(showLocalArchOnly && !isLocalArch) {
@ -50,7 +53,7 @@ void MainWindow::RefreshKernelListView(KernelInformation *info, bool showLocalAr
model->setItem(line, 0, new QStandardItem(QString::number(i))); model->setItem(line, 0, new QStandardItem(QString::number(i)));
model->setItem(line, 1, new QStandardItem(info->get_name(i))); model->setItem(line, 1, new QStandardItem(info->get_name(i)));
model->setItem(line, 2, new QStandardItem(info->get_author(i))); model->setItem(line, 2, new QStandardItem(info->get_author(i)));
//model->setItem(line, 3, new QStandardItem(kernelArch)); model->setItem(line, 3, new QStandardItem(kernelArch));
//model->setItem(line, 4, new QStandardItem((QStringList() << "" << "Y").at(info->get_installedAlready(i)))); //model->setItem(line, 4, new QStandardItem((QStringList() << "" << "Y").at(info->get_installedAlready(i))));
line++; line++;
} }