From fa051eff5aadb333b28fa0f80e0d79b3e43e2815 Mon Sep 17 00:00:00 2001 From: Sainath Singineedi <44405294+sainad2222@users.noreply.github.com> Date: Wed, 21 Feb 2024 04:39:53 +0530 Subject: [PATCH] feat: add branch name validation on renaming (#2081) Closes #2062 --------- Co-authored-by: extrawurst <776816+extrawurst@users.noreply.github.com> --- CHANGELOG.md | 1 + src/popups/rename_branch.rs | 43 ++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a9c6ade06..9a0646d2cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ These defaults require some adoption from existing users but feel more natural t * support `prepare-commit-msg` hook ([#1873](https://github.com/extrawurst/gitui/issues/1873)) * new style `block_title_focused` to allow customizing title text of focused frame/block ([#2052](https://github.com/extrawurst/gitui/issues/2052)). * allow `fetch` command in both tabs of branchlist popup ([#2067](https://github.com/extrawurst/gitui/issues/2067)) +* check branch name validity while typing [[@sainad2222](https://github.com/sainad2222)] ([#2062](https://github.com/extrawurst/gitui/issues/2062)) ### Changed * do not allow tagging when `tag.gpgsign` enabled until gpg-signing is [supported](https://github.com/extrawurst/gitui/issues/97) [[@TeFiLeDo](https://github.com/TeFiLeDo)] ([#1915](https://github.com/extrawurst/gitui/pull/1915)) diff --git a/src/popups/rename_branch.rs b/src/popups/rename_branch.rs index d82434173d..bf8e7974f0 100644 --- a/src/popups/rename_branch.rs +++ b/src/popups/rename_branch.rs @@ -2,6 +2,7 @@ use crate::components::{ visibility_blocking, CommandBlocking, CommandInfo, Component, DrawableComponent, EventState, InputType, TextInputComponent, }; +use crate::ui::style::SharedTheme; use crate::{ app::Environment, keys::{key_match, SharedKeyConfig}, @@ -11,7 +12,8 @@ use crate::{ use anyhow::Result; use asyncgit::sync::{self, RepoPathRef}; use crossterm::event::Event; -use ratatui::{layout::Rect, Frame}; +use easy_cast::Cast; +use ratatui::{layout::Rect, widgets::Paragraph, Frame}; pub struct RenameBranchPopup { repo: RepoPathRef, @@ -19,12 +21,15 @@ pub struct RenameBranchPopup { branch_ref: Option, queue: Queue, key_config: SharedKeyConfig, + theme: SharedTheme, } impl DrawableComponent for RenameBranchPopup { fn draw(&self, f: &mut Frame, rect: Rect) -> Result<()> { - self.input.draw(f, rect)?; - + if self.is_visible() { + self.input.draw(f, rect)?; + self.draw_warnings(f); + } Ok(()) } } @@ -97,6 +102,7 @@ impl RenameBranchPopup { .with_input_type(InputType::Singleline), branch_ref: None, key_config: env.key_config.clone(), + theme: env.theme.clone(), } } @@ -148,4 +154,35 @@ impl RenameBranchPopup { self.input.clear(); } + + fn draw_warnings(&self, f: &mut Frame) { + let current_text = self.input.get_text(); + + if !current_text.is_empty() { + let valid = sync::validate_branch_name(current_text) + .unwrap_or_default(); + + if !valid { + let msg = strings::branch_name_invalid(); + let msg_length: u16 = msg.len().cast(); + let w = Paragraph::new(msg) + .style(self.theme.text_danger()); + + let rect = { + let mut rect = self.input.get_area(); + rect.y += rect.height.saturating_sub(1); + rect.height = 1; + let offset = + rect.width.saturating_sub(msg_length + 1); + rect.width = + rect.width.saturating_sub(offset + 1); + rect.x += offset; + + rect + }; + + f.render_widget(w, rect); + } + } + } }