{"record":{"id":"3d549db5a6f0c74c","repo":"Devolutions/UniGetUI","slug":"dnf-does-not-support-installing-arbitrary-versions","errorCode":null,"errorMessage":"DNF does not support installing arbitrary versions","messagePattern":"DNF does not support installing arbitrary versions","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"warning","filePath":"src/UniGetUI.PackageEngine.Managers.Dnf/Helpers/DnfPkgDetailsHelper.cs","lineNumber":142,"sourceCode":"        // Must drain all stdout before WaitForExit — packages like glibc have thousands\n        // of file entries and will fill the pipe buffer, causing a deadlock.\n        string? result = null;\n        string? line;\n        while ((line = p.StandardOutput.ReadLine()) is not null)\n        {\n            if (result is not null) continue;\n            var path = line.Trim();\n            if (Directory.Exists(path))\n                result = path;\n        }\n\n        p.StandardError.ReadToEnd();\n        p.WaitForExit();\n        return result;\n    }\n\n    protected override IReadOnlyList<string> GetInstallableVersions_UnSafe(IPackage package)\n        => throw new InvalidOperationException(\"DNF does not support installing arbitrary versions\");\n\n    private static long ParseDnfSize(string value)\n    {\n        // Format: \"1.5 M\", \"234 k\", \"56 G\"\n        var parts = value.Split(' ', StringSplitOptions.RemoveEmptyEntries);\n        if (parts.Length < 2 || !double.TryParse(parts[0],\n                System.Globalization.NumberStyles.Any,\n                System.Globalization.CultureInfo.InvariantCulture, out var num))\n            return 0;\n\n        return parts[1].ToUpperInvariant() switch\n        {\n            \"K\" => (long)(num * 1024),\n            \"M\" => (long)(num * 1024 * 1024),\n            \"G\" => (long)(num * 1024 * 1024 * 1024),\n            _ => (long)num,\n        };\n    }","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/Devolutions/UniGetUI/blob/9b1d7d0eab91620fc15c86b36676532095936ae3/src/UniGetUI.PackageEngine.Managers.Dnf/Helpers/DnfPkgDetailsHelper.cs#L124-L160","documentation":"DNF's GetInstallableVersions_UnSafe unconditionally throws InvalidOperationException. DNF (Fedora/RHEL RPM) resolves versions from enabled repositories and does not expose an arbitrary-version install list, so the operation is unsupported.","triggerScenarios":"Any code path requesting installable versions for a DNF package: details page version picker, or pre-install version resolution.","commonSituations":"UI version dropdown populated for a DNF package; automation expecting a version list.","solutions":["Gate version requests on the manager capability flag (DNF reports no arbitrary-version support).","Install via the repository default version and hide the version picker for DNF.","Catch InvalidOperationException around version fetching and use the installed/available version string."],"exampleFix":"// before\nvar versions = await pkg.GetInstallableVersionsAsync(); // throws for dnf\n// after\nif (pkg.Manager.Capabilities.SupportsArbitraryVersions)\n    versions = await pkg.GetInstallableVersionsAsync();\nelse\n    versions = [pkg.Version];","handlingStrategy":"validation","validationCode":"if (package.Manager.Capabilities.SupportsArbitraryVersions)\n    versions = package.GetInstallableVersionsAsync();\nelse\n    versions = new[] { package.Version };","typeGuard":"static bool CanListVersions(IPackage pkg) =>\n    pkg.Manager.Capabilities.SupportsArbitraryVersions;","tryCatchPattern":null,"preventionTips":["Gate version requests on the capability flag for DNF.","Install via the repository default version.","Hide the version picker for RPM/DNF packages."],"tags":["dnf","rpm","capability-not-supported","versions","package-manager"],"backgroundTag":null,"analyzedSha":"9b1d7d0eab91620fc15c86b36676532095936ae3","analyzedAt":"2026-08-13T12:19:18.278Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}