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
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src-tauri/config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,14 @@ updateEndpoint = "https://github.com/cst8t/gitmun/releases/latest/download/lates
# "Native" applies no overrides; uses full hardware acceleration.
linuxGraphicsMode = "Auto"

# Terminal emulator for Linux repository opens.
# Use "auto", "custom", or a known terminal ID such as "ghostty" or "gnome-terminal".
linuxTerminalEmulator = "auto"

# Custom Linux terminal command. Used only when linuxTerminalEmulator is "custom".
# Use {path} where the repository path should be inserted.
linuxTerminalCustomCommand = ""

# Behaviour when opening a repository.
# "Ask" prompts for which window to use.
# "ExistingWindow" opens the repository in the current window.
Expand Down
62 changes: 21 additions & 41 deletions src-tauri/src/commands/repo.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
#[cfg(target_os = "linux")]
use crate::git::types::LinuxTerminalEmulator;
use crate::git::types::{
CloneRequest, CommitDetails, CommitDetailsRequest, CommitFileItem, CommitFilesRequest,
CommitMarkers, CommitMessageRecovery, CommitRequest, DiffRequest, ExportCommitPatchRequest,
ExportPatchRequest,
ExternalDiffRequest, FetchRequest, FileDiff, FileRequest, GitIdentity, HunkStageRequest,
IdentityRequest, ImportPatchRequest, NumstatRequest, NumstatResult, OperationResult,
PullAnalysis, PullStrategyRequest, PushRequest, PushResult, RepoRequest, RepoStatus,
SetIdentityRequest, SshAllowedSignerStatus, StageFilesRequest, StashEntry, StashPushRequest,
StashRequest, SubmoduleActionRequest,
ExportPatchRequest, ExternalDiffRequest, FetchRequest, FileDiff, FileRequest, GitIdentity,
HunkStageRequest, IdentityRequest, ImportPatchRequest, NumstatRequest, NumstatResult,
OperationResult, PullAnalysis, PullStrategyRequest, PushRequest, PushResult, RepoRequest,
RepoStatus, SetIdentityRequest, SshAllowedSignerStatus, StageFilesRequest, StashEntry,
StashPushRequest, StashRequest, SubmoduleActionRequest,
};
#[cfg(target_os = "linux")]
use crate::git::types::{LINUX_TERMINAL_AUTO_ID, LINUX_TERMINAL_CUSTOM_ID};
use crate::{AppState, CloneCancelFlag, configure_command};
use serde::{Deserialize, Serialize};
use std::io::Read;
Expand Down Expand Up @@ -268,7 +267,7 @@ fn default_file_manager_label() -> &'static str {
fn default_terminal_label(settings: &crate::git::types::Settings) -> String {
#[cfg(target_os = "linux")]
{
return linux_terminal_label(settings).to_string();
return linux_terminal_label(settings);
}

#[cfg(not(target_os = "linux"))]
Expand Down Expand Up @@ -370,9 +369,10 @@ fn open_terminal_at_linux(
}

#[cfg(target_os = "linux")]
fn linux_terminal_label(settings: &crate::git::types::Settings) -> &'static str {
linux_terminal_launch::terminal_label(linux_terminal_preference(
settings.linux_terminal_emulator,
fn linux_terminal_label(settings: &crate::git::types::Settings) -> String {
let registry = linux_terminal_launch::TerminalRegistry::with_known_terminals();
registry.label_for_preference(&linux_terminal_preference(
settings.linux_terminal_emulator.as_str(),
))
}

Expand All @@ -383,40 +383,20 @@ fn linux_terminal_launcher(
) -> linux_terminal_launch::TerminalLauncher {
linux_terminal_launch::TerminalLauncher::new()
.working_dir(path)
.preference(linux_terminal_preference(settings.linux_terminal_emulator))
.registry(linux_terminal_launch::TerminalRegistry::with_known_terminals())
.preference(linux_terminal_preference(
settings.linux_terminal_emulator.as_str(),
))
.custom_command(settings.linux_terminal_custom_command.clone())
.detach_from_parent(true)
}

#[cfg(target_os = "linux")]
fn linux_terminal_preference(
emulator: LinuxTerminalEmulator,
) -> linux_terminal_launch::TerminalPreference {
use linux_terminal_launch::{KnownTerminal, TerminalPreference};

match emulator {
LinuxTerminalEmulator::Auto => TerminalPreference::Auto,
LinuxTerminalEmulator::Konsole => TerminalPreference::Known(KnownTerminal::Konsole),
LinuxTerminalEmulator::GnomeTerminal => {
TerminalPreference::Known(KnownTerminal::GnomeTerminal)
}
LinuxTerminalEmulator::GnomeConsole => {
TerminalPreference::Known(KnownTerminal::GnomeConsole)
}
LinuxTerminalEmulator::Xfce4Terminal => {
TerminalPreference::Known(KnownTerminal::Xfce4Terminal)
}
LinuxTerminalEmulator::MateTerminal => {
TerminalPreference::Known(KnownTerminal::MateTerminal)
}
LinuxTerminalEmulator::Lxterminal => TerminalPreference::Known(KnownTerminal::Lxterminal),
LinuxTerminalEmulator::Alacritty => TerminalPreference::Known(KnownTerminal::Alacritty),
LinuxTerminalEmulator::Ghostty => TerminalPreference::Known(KnownTerminal::Ghostty),
LinuxTerminalEmulator::Kitty => TerminalPreference::Known(KnownTerminal::Kitty),
LinuxTerminalEmulator::WezTerm => TerminalPreference::Known(KnownTerminal::WezTerm),
LinuxTerminalEmulator::Foot => TerminalPreference::Known(KnownTerminal::Foot),
LinuxTerminalEmulator::Xterm => TerminalPreference::Known(KnownTerminal::Xterm),
LinuxTerminalEmulator::Custom => TerminalPreference::Custom,
fn linux_terminal_preference(id: &str) -> linux_terminal_launch::TerminalPreference {
match id {
LINUX_TERMINAL_AUTO_ID => linux_terminal_launch::TerminalPreference::Auto,
LINUX_TERMINAL_CUSTOM_ID => linux_terminal_launch::TerminalPreference::Custom,
other => linux_terminal_launch::TerminalPreference::registered(other),
}
}

Expand Down
61 changes: 20 additions & 41 deletions src-tauri/src/commands/settings.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
use crate::git::types::{
AvatarProviderMode, BackendMode, CommitDateMode, CommitPrimaryAction, ExternalDiffTool,
LinuxGraphicsMode, LinuxTerminalEmulator, OperationResult, RepoOpenBehaviour, RowStriping,
Settings, ThemeMode,
LINUX_TERMINAL_AUTO_ID, LINUX_TERMINAL_CUSTOM_ID, LinuxGraphicsMode, LinuxTerminalId,
OperationResult, RepoOpenBehaviour, RowStriping, Settings, ThemeMode,
normalise_linux_terminal_id,
};
use crate::{AppState, configure_command, git_command};
use reqwest::header::{ACCEPT, HeaderValue, RANGE};
Expand Down Expand Up @@ -1130,8 +1131,8 @@ pub fn set_linux_graphics_mode(
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct LinuxTerminalOption {
pub emulator: LinuxTerminalEmulator,
pub label: &'static str,
pub id: LinuxTerminalId,
pub label: String,
}

#[tauri::command]
Expand All @@ -1141,74 +1142,52 @@ pub fn get_linux_terminal_options() -> Vec<LinuxTerminalOption> {

#[cfg(target_os = "linux")]
fn linux_terminal_options() -> Vec<LinuxTerminalOption> {
let registry = linux_terminal_launch::TerminalRegistry::with_known_terminals();
let mut options = vec![LinuxTerminalOption {
emulator: LinuxTerminalEmulator::Auto,
label: linux_terminal_launch::terminal_label(
linux_terminal_launch::TerminalPreference::Auto,
),
id: LINUX_TERMINAL_AUTO_ID.to_string(),
label: registry.label_for_preference(&linux_terminal_launch::TerminalPreference::Auto),
}];

options.extend(
linux_terminal_launch::known_terminals()
registry
.definitions()
.iter()
.map(|terminal| LinuxTerminalOption {
emulator: linux_terminal_emulator(terminal.terminal),
label: terminal.label,
id: terminal.id().to_string(),
label: terminal.label().to_string(),
}),
);

options.push(LinuxTerminalOption {
emulator: LinuxTerminalEmulator::Custom,
label: linux_terminal_launch::terminal_label(
linux_terminal_launch::TerminalPreference::Custom,
),
id: LINUX_TERMINAL_CUSTOM_ID.to_string(),
label: registry.label_for_preference(&linux_terminal_launch::TerminalPreference::Custom),
});

options
}

#[cfg(target_os = "linux")]
fn linux_terminal_emulator(
terminal: linux_terminal_launch::KnownTerminal,
) -> LinuxTerminalEmulator {
match terminal {
linux_terminal_launch::KnownTerminal::Konsole => LinuxTerminalEmulator::Konsole,
linux_terminal_launch::KnownTerminal::GnomeTerminal => LinuxTerminalEmulator::GnomeTerminal,
linux_terminal_launch::KnownTerminal::GnomeConsole => LinuxTerminalEmulator::GnomeConsole,
linux_terminal_launch::KnownTerminal::Xfce4Terminal => LinuxTerminalEmulator::Xfce4Terminal,
linux_terminal_launch::KnownTerminal::MateTerminal => LinuxTerminalEmulator::MateTerminal,
linux_terminal_launch::KnownTerminal::Lxterminal => LinuxTerminalEmulator::Lxterminal,
linux_terminal_launch::KnownTerminal::Alacritty => LinuxTerminalEmulator::Alacritty,
linux_terminal_launch::KnownTerminal::Ghostty => LinuxTerminalEmulator::Ghostty,
linux_terminal_launch::KnownTerminal::Kitty => LinuxTerminalEmulator::Kitty,
linux_terminal_launch::KnownTerminal::WezTerm => LinuxTerminalEmulator::WezTerm,
linux_terminal_launch::KnownTerminal::Foot => LinuxTerminalEmulator::Foot,
linux_terminal_launch::KnownTerminal::Xterm => LinuxTerminalEmulator::Xterm,
}
}

#[cfg(not(target_os = "linux"))]
fn linux_terminal_options() -> Vec<LinuxTerminalOption> {
vec![
LinuxTerminalOption {
emulator: LinuxTerminalEmulator::Auto,
label: "Terminal",
id: LINUX_TERMINAL_AUTO_ID.to_string(),
label: "Terminal".to_string(),
},
LinuxTerminalOption {
emulator: LinuxTerminalEmulator::Custom,
label: "Terminal",
id: LINUX_TERMINAL_CUSTOM_ID.to_string(),
label: "Terminal".to_string(),
},
]
}

#[tauri::command]
pub fn set_linux_terminal_emulator(
linux_terminal_emulator: LinuxTerminalEmulator,
linux_terminal_emulator: LinuxTerminalId,
state: tauri::State<'_, AppState>,
) -> Settings {
state
.git_service
.set_linux_terminal_emulator(linux_terminal_emulator)
.set_linux_terminal_emulator(normalise_linux_terminal_id(&linux_terminal_emulator))
}

#[tauri::command]
Expand Down
27 changes: 27 additions & 0 deletions src-tauri/src/config_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,33 @@ mod tests {
assert_eq!(settings.ui_text_scale, 1.2);
}

#[test]
fn load_toml_normalises_old_linux_terminal_values() {
let dir = TempDir::new().unwrap();
let toml_path = dir.path().join("config.toml");
let json_path = dir.path().join("config.json");

write_file(&toml_path, "linuxTerminalEmulator = \"GnomeTerminal\"\n");

let (settings, should_persist) = load_or_migrate(&toml_path, &json_path);
assert!(!should_persist);
assert_eq!(settings.linux_terminal_emulator, "gnome-terminal");
}

#[test]
fn load_toml_defaults_empty_linux_terminal_value() {
let settings: Settings = toml::from_str("linuxTerminalEmulator = \"\"\n").unwrap();

assert_eq!(settings.linux_terminal_emulator, "auto");
}

#[test]
fn load_toml_preserves_unknown_linux_terminal_id() {
let settings: Settings = toml::from_str("linuxTerminalEmulator = \"coolterm\"\n").unwrap();

assert_eq!(settings.linux_terminal_emulator, "coolterm");
}

#[test]
fn load_toml_ignores_old_ms_store_update_flow_config() {
let dir = TempDir::new().unwrap();
Expand Down
4 changes: 3 additions & 1 deletion src-tauri/src/git/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2907,11 +2907,13 @@ impl GitOperationHandler for CliGitHandler {
"--date=iso-strict",
pretty.as_str(),
];
if request.topo_order || request.scope == CommitLogScope::AllRefs {
args.push("--topo-order");
}
if request.scope == CommitLogScope::AllRefs {
args.push("--branches");
args.push("--tags");
args.push("--remotes");
args.push("--topo-order");
}

let output = match Self::run_git(args.as_slice(), Some(&repo_path)) {
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/src/git/gix_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1156,7 +1156,7 @@ impl GitOperationHandler for GixGitHandler {
&self,
request: &CommitHistoryRequest,
) -> GitResult<Vec<CommitHistoryItem>> {
if request.scope == CommitLogScope::AllRefs {
if request.topo_order || request.scope == CommitLogScope::AllRefs {
return self.cli_fallback.get_commit_history(request);
}

Expand Down
7 changes: 2 additions & 5 deletions src-tauri/src/git/handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -352,12 +352,9 @@ impl GitService {
})
}

pub fn set_linux_terminal_emulator(
&self,
emulator: super::types::LinuxTerminalEmulator,
) -> Settings {
pub fn set_linux_terminal_emulator(&self, id: super::types::LinuxTerminalId) -> Settings {
self.update_settings(|settings| {
settings.linux_terminal_emulator = emulator;
settings.linux_terminal_emulator = id;
})
}

Expand Down
Loading