| 124 | } |
| 125 | |
| 126 | QString pacmanBuildDate(const QString &package, const QString &version) { |
| 127 | static const QRegularExpression kPkgRe("^[a-zA-Z0-9_.+@-]+$"); |
| 128 | if (version.isEmpty() |
| 129 | || !kPkgRe.match(package).hasMatch() |
| 130 | || !kPkgRe.match(version).hasMatch()) |
| 131 | return {}; |
| 132 | QString dirPath = QStringLiteral("/var/lib/pacman/local/%1-%2") |
| 133 | .arg(package, version); |
| 134 | QFile f(dirPath + "/desc"); |
| 135 | if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) |
| 136 | return {}; |
| 137 | QString content = QString::fromUtf8(f.read(65536)); |
| 138 | int idx = content.indexOf("%BUILDDATE%"); |
| 139 | if (idx < 0) |
| 140 | return {}; |
| 141 | int nl = content.indexOf('\n', idx); |
| 142 | if (nl < 0) |
| 143 | return {}; |
| 144 | QString tsLine = content.mid(nl + 1, |
| 145 | content.indexOf('\n', nl + 1) - nl - 1) |
| 146 | .trimmed(); |
| 147 | bool ok = false; |
| 148 | qint64 ts = tsLine.toLongLong(&ok); |
| 149 | if (!ok) |
| 150 | return {}; |
| 151 | return formatDate(QDateTime::fromSecsSinceEpoch(ts)); |
| 152 | } |
| 153 | |
| 154 | QString knownVersionDate(const QString &version) { |
| 155 | auto it = knownDriverDates().constFind(version); |
no test coverage detected