fix: parse linux distro metadata

This commit is contained in:
Edison Jwa
2026-05-25 16:02:01 +09:00
parent 4a2a05ef83
commit 862f83b297
2 changed files with 41 additions and 9 deletions
@@ -233,24 +233,37 @@ Future<_LinuxDistro> _detectLinuxDistro() async {
return _LinuxDistro.other;
}
final lower = content.toLowerCase();
if (lower.contains('id=fedora') ||
lower.contains('id_like="fedora"') ||
lower.contains('id_like=fedora')) {
final fields = _parseOsRelease(content);
final id = fields['id'] ?? '';
final idLike = (fields['id_like'] ?? '').split(RegExp(r'\s+'));
final ids = {id, ...idLike};
if (ids.contains('fedora')) {
return _LinuxDistro.fedora;
}
if (lower.contains('id=ubuntu') ||
lower.contains('id=debian') ||
lower.contains('id_like=debian') ||
lower.contains('id_like="ubuntu debian"')) {
if (ids.contains('ubuntu') || ids.contains('debian')) {
return _LinuxDistro.debian;
}
if (lower.contains('id=arch') || lower.contains('id_like=arch')) {
if (ids.contains('arch')) {
return _LinuxDistro.arch;
}
return _LinuxDistro.other;
}
Map<String, String> _parseOsRelease(String content) {
final fields = <String, String>{};
for (final line in content.split('\n')) {
final separator = line.indexOf('=');
if (separator <= 0) continue;
final key = line.substring(0, separator).trim().toLowerCase();
var value = line.substring(separator + 1).trim().toLowerCase();
if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) {
value = value.substring(1, value.length - 1);
}
fields[key] = value;
}
return fields;
}
_LinuxArch _detectLinuxArch() {
return switch (_currentAbiProvider()) {
Abi.linuxX64 => _LinuxArch.x64,