This commit is contained in:
Pierre Bouillon 2026-05-20 10:44:08 +02:00 committed by GitHub
commit cfaa7495f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 65 additions and 6 deletions

View file

@ -11,9 +11,10 @@ use crate::{
};
use anyhow::Result;
use asyncgit::sync::{self, RepoPathRef};
use crossterm::event::Event;
use crossterm::event::{Event, KeyCode, KeyEvent};
use easy_cast::Cast;
use ratatui::{layout::Rect, widgets::Paragraph, Frame};
use std::borrow::Cow;
pub struct CreateBranchPopup {
repo: RepoPathRef,
@ -57,11 +58,28 @@ impl Component for CreateBranchPopup {
fn event(&mut self, ev: &Event) -> Result<EventState> {
if self.is_visible() {
if self.input.event(ev)?.is_consumed() {
let ev = match ev {
Event::Key(KeyEvent {
code: KeyCode::Char(c),
modifiers,
kind,
state,
}) => Cow::Owned(Event::Key(KeyEvent {
code: KeyCode::Char(
strings::normalize_branch_name_char(*c),
),
modifiers: *modifiers,
kind: *kind,
state: *state,
})),
_ => Cow::Borrowed(ev),
};
if self.input.event(&ev)?.is_consumed() {
return Ok(EventState::Consumed);
}
if let Event::Key(e) = ev {
if let Event::Key(e) = ev.as_ref() {
if key_match(e, self.key_config.keys.enter) {
self.create_branch();
}

View file

@ -11,9 +11,10 @@ use crate::{
};
use anyhow::Result;
use asyncgit::sync::{self, RepoPathRef};
use crossterm::event::Event;
use crossterm::event::{Event, KeyCode, KeyEvent};
use easy_cast::Cast;
use ratatui::{layout::Rect, widgets::Paragraph, Frame};
use std::borrow::Cow;
pub struct RenameBranchPopup {
repo: RepoPathRef,
@ -57,11 +58,28 @@ impl Component for RenameBranchPopup {
fn event(&mut self, ev: &Event) -> Result<EventState> {
if self.is_visible() {
if self.input.event(ev)?.is_consumed() {
let ev = match ev {
Event::Key(KeyEvent {
code: KeyCode::Char(c),
modifiers,
kind,
state,
}) => Cow::Owned(Event::Key(KeyEvent {
code: KeyCode::Char(
strings::normalize_branch_name_char(*c),
),
modifiers: *modifiers,
kind: *kind,
state: *state,
})),
_ => Cow::Borrowed(ev),
};
if self.input.event(&ev)?.is_consumed() {
return Ok(EventState::Consumed);
}
if let Event::Key(e) = ev {
if let Event::Key(e) = ev.as_ref() {
if key_match(e, self.key_config.keys.enter) {
self.rename_branch();
}

View file

@ -438,6 +438,13 @@ pub fn ellipsis_trim_start(s: &str, width: usize) -> Cow<'_, str> {
}
}
pub const fn normalize_branch_name_char(c: char) -> char {
match c {
' ' => '-',
c => c,
}
}
#[derive(PartialEq, Eq, Clone, Copy)]
pub enum CheckoutOptions {
KeepLocalChanges,
@ -1934,3 +1941,19 @@ pub mod commands {
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_spaces_are_replaced_by_dashes_in_branch_name() {
let input = "feature/auto replace spaces in branch name";
let output: String =
input.chars().map(normalize_branch_name_char).collect();
assert_eq!(
output,
"feature/auto-replace-spaces-in-branch-name"
);
}
}