git: Rewrap commit messages just before committing instead of interactively (#32114)
Closes #27508 Release Notes: - Fixed unintuitive wrapping behavior when editing Git commit messages.
This commit is contained in:
parent
28da99cc06
commit
783b33b5c9
2 changed files with 44 additions and 10 deletions
|
@ -1457,7 +1457,9 @@
|
||||||
"language_servers": ["erlang-ls", "!elp", "..."]
|
"language_servers": ["erlang-ls", "!elp", "..."]
|
||||||
},
|
},
|
||||||
"Git Commit": {
|
"Git Commit": {
|
||||||
"allow_rewrap": "anywhere"
|
"allow_rewrap": "anywhere",
|
||||||
|
"soft_wrap": "editor_width",
|
||||||
|
"preferred_line_length": 72
|
||||||
},
|
},
|
||||||
"Go": {
|
"Go": {
|
||||||
"code_actions_on_format": {
|
"code_actions_on_format": {
|
||||||
|
|
|
@ -383,7 +383,6 @@ pub(crate) fn commit_message_editor(
|
||||||
commit_editor.set_show_gutter(false, cx);
|
commit_editor.set_show_gutter(false, cx);
|
||||||
commit_editor.set_show_wrap_guides(false, cx);
|
commit_editor.set_show_wrap_guides(false, cx);
|
||||||
commit_editor.set_show_indent_guides(false, cx);
|
commit_editor.set_show_indent_guides(false, cx);
|
||||||
commit_editor.set_hard_wrap(Some(72), cx);
|
|
||||||
let placeholder = placeholder.unwrap_or("Enter commit message".into());
|
let placeholder = placeholder.unwrap_or("Enter commit message".into());
|
||||||
commit_editor.set_placeholder_text(placeholder, cx);
|
commit_editor.set_placeholder_text(placeholder, cx);
|
||||||
commit_editor
|
commit_editor
|
||||||
|
@ -1483,15 +1482,48 @@ impl GitPanel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn custom_or_suggested_commit_message(&self, cx: &mut Context<Self>) -> Option<String> {
|
fn custom_or_suggested_commit_message(
|
||||||
|
&self,
|
||||||
|
window: &mut Window,
|
||||||
|
cx: &mut Context<Self>,
|
||||||
|
) -> Option<String> {
|
||||||
|
let git_commit_language = self.commit_editor.read(cx).language_at(0, cx);
|
||||||
let message = self.commit_editor.read(cx).text(cx);
|
let message = self.commit_editor.read(cx).text(cx);
|
||||||
|
if message.is_empty() {
|
||||||
if !message.trim().is_empty() {
|
return self
|
||||||
return Some(message);
|
.suggest_commit_message(cx)
|
||||||
|
.filter(|message| !message.trim().is_empty());
|
||||||
|
} else if message.trim().is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let buffer = cx.new(|cx| {
|
||||||
|
let mut buffer = Buffer::local(message, cx);
|
||||||
|
buffer.set_language(git_commit_language, cx);
|
||||||
|
buffer
|
||||||
|
});
|
||||||
|
let editor = cx.new(|cx| Editor::for_buffer(buffer, None, window, cx));
|
||||||
|
let wrapped_message = editor.update(cx, |editor, cx| {
|
||||||
|
editor.select_all(&Default::default(), window, cx);
|
||||||
|
editor.rewrap(&Default::default(), window, cx);
|
||||||
|
editor.text(cx)
|
||||||
|
});
|
||||||
|
if wrapped_message.trim().is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
Some(wrapped_message)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.suggest_commit_message(cx)
|
fn has_commit_message(&self, cx: &mut Context<Self>) -> bool {
|
||||||
.filter(|message| !message.trim().is_empty())
|
let text = self.commit_editor.read(cx).text(cx);
|
||||||
|
if !text.trim().is_empty() {
|
||||||
|
return true;
|
||||||
|
} else if text.is_empty() {
|
||||||
|
return self
|
||||||
|
.suggest_commit_message(cx)
|
||||||
|
.is_some_and(|text| !text.trim().is_empty());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn commit_changes(
|
pub(crate) fn commit_changes(
|
||||||
|
@ -1520,7 +1552,7 @@ impl GitPanel {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let commit_message = self.custom_or_suggested_commit_message(cx);
|
let commit_message = self.custom_or_suggested_commit_message(window, cx);
|
||||||
|
|
||||||
let Some(mut message) = commit_message else {
|
let Some(mut message) = commit_message else {
|
||||||
self.commit_editor.read(cx).focus_handle(cx).focus(window);
|
self.commit_editor.read(cx).focus_handle(cx).focus(window);
|
||||||
|
@ -2832,7 +2864,7 @@ impl GitPanel {
|
||||||
(false, "No changes to commit")
|
(false, "No changes to commit")
|
||||||
} else if self.pending_commit.is_some() {
|
} else if self.pending_commit.is_some() {
|
||||||
(false, "Commit in progress")
|
(false, "Commit in progress")
|
||||||
} else if self.custom_or_suggested_commit_message(cx).is_none() {
|
} else if !self.has_commit_message(cx) {
|
||||||
(false, "No commit message")
|
(false, "No commit message")
|
||||||
} else if !self.has_write_access(cx) {
|
} else if !self.has_write_access(cx) {
|
||||||
(false, "You do not have write access to this project")
|
(false, "You do not have write access to this project")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue