Skip to content

enhance: support tools installed via flatpak #1517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
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
62 changes: 51 additions & 11 deletions src/Native/Linux.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ namespace SourceGit.Native
[SupportedOSPlatform("linux")]
internal class Linux : OS.IBackend
{
private static readonly string LOCAL_APP_DATA_DIR = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

public void SetupApp(AppBuilder builder)
{
builder.With(new X11PlatformOptions() { EnableIme = true });
Expand Down Expand Up @@ -48,16 +50,16 @@ public string FindTerminal(Models.ShellOrTerminal shell)

public List<Models.ExternalTool> FindExternalTools()
{
var localAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var finder = new Models.ExternalToolsFinder();
finder.VSCode(() => FindExecutable("code"));
finder.VSCodeInsiders(() => FindExecutable("code-insiders"));
finder.VSCodium(() => FindExecutable("codium"));
finder.VSCode(() => FindExecutable("code", "com.visualstudio.code"));
finder.VSCodeInsiders(() => FindExecutable("code-insiders", "com.vscodium.codium-insiders"));
finder.VSCodium(() => FindExecutable("codium", "com.vscodium.codium"));
finder.Cursor(() => FindExecutable("cursor"));
finder.Fleet(() => FindJetBrainsFleet(localAppDataDir));
finder.FindJetBrainsFromToolbox(() => Path.Combine(localAppDataDir, "JetBrains/Toolbox"));
finder.SublimeText(() => FindExecutable("subl"));
finder.Zed(() => FindExecutable("zeditor"));
finder.Fleet(FindJetBrainsFleet);
finder.FindJetBrainsFromToolbox(() => Path.Combine(LOCAL_APP_DATA_DIR, "JetBrains/Toolbox"));
FindJetBrainsFromFlatpak(finder);
finder.SublimeText(() => FindExecutable("subl", "com.sublimetext.three"));
finder.Zed(() => FindExecutable("zeditor", "dev.zed.Zed"));
return finder.Tools;
}

Expand Down Expand Up @@ -119,7 +121,7 @@ public void OpenWithDefaultEditor(string file)
}
}

private string FindExecutable(string filename)
private static string FindExecutable(string filename, string flatpakAppId = null)
{
var pathVariable = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
var paths = pathVariable.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries);
Expand All @@ -130,13 +132,51 @@ private string FindExecutable(string filename)
return test;
}

if (flatpakAppId != null)
{
foreach (var path in new[] { "/var/lib", LOCAL_APP_DATA_DIR })
{
var test = Path.Combine(path, "flatpak/exports/bin", flatpakAppId);
if (File.Exists(test))
return test;
}
}

return string.Empty;
}

private string FindJetBrainsFleet(string localAppDataDir)
private static string FindJetBrainsFleet()
{
var path = Path.Combine(localAppDataDir, "JetBrains/Toolbox/apps/fleet/bin/Fleet");
var path = Path.Combine(LOCAL_APP_DATA_DIR, "JetBrains/Toolbox/apps/fleet/bin/Fleet");
return File.Exists(path) ? path : FindExecutable("fleet");
}

private static void FindJetBrainsFromFlatpak(Models.ExternalToolsFinder finder)
{
foreach (var basePath in new[] { "/var/lib", LOCAL_APP_DATA_DIR })
{
var binPath = Path.Combine(basePath, "flatpak/exports/bin");
if (Directory.Exists(binPath))
{
foreach (var file in Directory.GetFiles(binPath, "com.jetbrains.*"))
{
var fileName = Path.GetFileName(file);
var appName = fileName[14..].Replace("-", " ");
var icon = new string(Array.FindAll(fileName.ToCharArray(), char.IsUpper));
if (icon.Length > 2)
icon = icon[..2];
icon = icon switch
{
"DG" => "DB", // DataGrip
"GL" => "GO", // GoLand
"IJ" => "JB", // IntelliJ
"R" => "RD", // Rider
_ => icon
};
finder.Tools.Add(new Models.ExternalTool(appName, "JetBrains/" + icon, file));
}
}
}
}
}
}