Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/UniGetUI.Avalonia.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,12 @@
<Platform Solution="*|x64" Project="x64" />
</Project>
</Folder>
<Folder Name="/UniGetUI.PackageEngine.Managers.Flatpak/">
<Project Path="UniGetUI.PackageEngine.Managers.Flatpak/UniGetUI.PackageEngine.Managers.Flatpak.csproj">
<Platform Solution="*|arm64" Project="arm64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
</Folder>
<Folder Name="/UniGetUI.PackageEngine.Managers.Vcpkg/">
<Project Path="UniGetUI.PackageEngine.Managers.Vcpkg/UniGetUI.PackageEngine.Managers.Vcpkg.csproj">
<Platform Solution="*|arm64" Project="arm64" />
Expand Down
1 change: 1 addition & 0 deletions src/UniGetUI.Interface.Enums/Enums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ public enum IconType
Dnf = '\uE945',
Pacman = '\uE946',
Snap = '\uE947',
Flatpak = '\uE948',
}

public class NotificationArguments
Expand Down
224 changes: 224 additions & 0 deletions src/UniGetUI.PackageEngine.Managers.Flatpak/Flatpak.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
using System.Diagnostics;
using UniGetUI.Core.Tools;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Classes.Manager;
using UniGetUI.PackageEngine.Enums;
using UniGetUI.PackageEngine.ManagerClasses.Classes;
using UniGetUI.PackageEngine.ManagerClasses.Manager;
using UniGetUI.PackageEngine.PackageClasses;

namespace UniGetUI.PackageEngine.Managers.FlatpakManager;

public partial class Flatpak : PackageManager
{
private static readonly string[] FLATPAK_PATHS =
[
"/usr/bin/flatpak",
"/usr/local/bin/flatpak",
];

public Flatpak()
{
Dependencies = [];

var flathubSource = new ManagerSource(this, "flathub", new Uri("https://dl.flathub.org/repo/"));

Capabilities = new ManagerCapabilities
{
CanRunAsAdmin = true,
CanSkipIntegrityChecks = true,
SupportsCustomSources = true,
Sources = new SourceCapabilities
{
KnowsPackageCount = false,
KnowsUpdateDate = false,
},
SupportsProxy = ProxySupport.No,
SupportsProxyAuth = false,
};

Properties = new ManagerProperties
{
Name = "Flatpak",
Description = CoreTools.Translate(
"The universal Linux package manager for desktop applications.<br>Contains: <b>Flatpak applications from configured remotes</b>"
),
IconId = IconType.Flatpak,
ColorIconId = "flatpak",
ExecutableFriendlyName = "flatpak",
InstallVerb = "install",
UpdateVerb = "update",
UninstallVerb = "uninstall",
DefaultSource = flathubSource,
KnownSources = [flathubSource],
};

SourcesHelper = new FlatpakSourceHelper(this);
DetailsHelper = new FlatpakPkgDetailsHelper(this);
OperationHelper = new FlatpakPkgOperationHelper(this);
}

public override IReadOnlyList<string> FindCandidateExecutableFiles()
{
var candidates = new List<string>(CoreTools.WhichMultiple("flatpak"));
foreach (var path in FLATPAK_PATHS)
{
if (File.Exists(path) && !candidates.Contains(path))
candidates.Add(path);
}
return candidates;
}

protected override void _loadManagerExecutableFile(
out bool found,
out string path,
out string callArguments)
{
(found, path) = GetExecutableFile();
callArguments = "";
}

protected override void _loadManagerVersion(out string version)
{
using var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = Status.ExecutablePath,
Arguments = "--version",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
},
};
p.Start();
var line = p.StandardOutput.ReadLine()?.Trim() ?? "";
version = line.Replace("Flatpak ", "").Trim();
p.StandardError.ReadToEnd();
p.WaitForExit();
}

public override void RefreshPackageIndexes()
{
using var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = Status.ExecutablePath,
Arguments = "update --appstream",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
},
};
IProcessTaskLogger logger = TaskLogger.CreateNew(LoggableTaskType.RefreshIndexes, p);
p.Start();
logger.AddToStdOut(p.StandardOutput.ReadToEnd());
logger.AddToStdErr(p.StandardError.ReadToEnd());
p.WaitForExit();
logger.Close(p.ExitCode);
}

protected override IReadOnlyList<Package> FindPackages_UnSafe(string query)
{
using var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = Status.ExecutablePath,
Arguments = $"search {CoreTools.EnsureSafeQueryString(query)}",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
},
};
p.StartInfo.Environment["LANG"] = "C";
p.StartInfo.Environment["LC_ALL"] = "C";
IProcessTaskLogger logger = TaskLogger.CreateNew(LoggableTaskType.FindPackages, p);
p.Start();

List<string> outputLines = [];
while (p.StandardOutput.ReadLine() is { } line)
{
logger.AddToStdOut(line);
outputLines.Add(line);
}

logger.AddToStdErr(p.StandardError.ReadToEnd());
p.WaitForExit();
logger.Close(p.ExitCode);

return ParseSearchResults(outputLines, DefaultSource, this);
}

protected override IReadOnlyList<Package> GetInstalledPackages_UnSafe()
{
using var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = Status.ExecutablePath,
Arguments = "list --app --columns=application,version,branch,origin,name",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
},
};
p.StartInfo.Environment["LANG"] = "C";
p.StartInfo.Environment["LC_ALL"] = "C";
IProcessTaskLogger logger = TaskLogger.CreateNew(LoggableTaskType.ListInstalledPackages, p);
p.Start();

List<string> outputLines = [];
while (p.StandardOutput.ReadLine() is { } line)
{
logger.AddToStdOut(line);
outputLines.Add(line);
}

logger.AddToStdErr(p.StandardError.ReadToEnd());
p.WaitForExit();
logger.Close(p.ExitCode);

return ParseInstalledPackages(outputLines, DefaultSource, this);
}

protected override IReadOnlyList<Package> GetAvailableUpdates_UnSafe()
{
using var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = Status.ExecutablePath,
Arguments = "remote-ls --updates --columns=application,version,branch,origin,name",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
},
};

p.StartInfo.Environment["LANG"] = "C";
p.StartInfo.Environment["LC_ALL"] = "C";
IProcessTaskLogger logger = TaskLogger.CreateNew(LoggableTaskType.ListUpdates, p);

p.Start();

List<string> outputLines = [];
while (p.StandardOutput.ReadLine() is { } line)
{
logger.AddToStdOut(line);
outputLines.Add(line);
}

logger.AddToStdErr(p.StandardError.ReadToEnd());
p.WaitForExit();
logger.Close(p.ExitCode);

return ParseAvailableUpdates(outputLines, DefaultSource, this, GetInstalledPackages_UnSafe());
}
}
Loading
Loading