Repository: gitui-org/gitui (language: rust)

Issue:
validate branch re-name
#559 introduced branch name validation for the create-branch path. lets use the same validation method in the rename popup


Discussion / hints:
I would like to take a shot at this
@sainad2222 great! if you need help find me on mastodon: `@rusticorn@fosstodon.org`

Fix patch:
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<String>,
 	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);
+			}
+		}
+	}
 }


Test patch: