gpui: Fix utf8 slicing panic in `truncate_line` (#46914) (cherry-pick to preview) (#46916)

zed-zippy[bot] and Lukas Wirth created

Cherry-pick of #46914 to preview

----
Fixes https://github.com/zed-industries/zed/issues/46904

Release Notes:

- Fixed a panic in the git panel when utf8 multibyte character filenames
got truncated

Co-authored-by: Lukas Wirth <lukas@zed.dev>

Change summary

crates/gpui/src/text_system/line_wrapper.rs | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)

Detailed changes

crates/gpui/src/text_system/line_wrapper.rs 🔗

@@ -201,9 +201,10 @@ impl LineWrapper {
             self.should_truncate_line(&line, truncate_width, truncation_affix, truncate_from)
         {
             let result = match truncate_from {
-                TruncateFrom::Start => {
-                    SharedString::from(format!("{truncation_affix}{}", &line[truncate_ix + 1..]))
-                }
+                TruncateFrom::Start => SharedString::from(format!(
+                    "{truncation_affix}{}",
+                    &line[line.ceil_char_boundary(truncate_ix + 1)..]
+                )),
                 TruncateFrom::End => {
                     SharedString::from(format!("{}{truncation_affix}", &line[..truncate_ix]))
                 }
@@ -599,12 +600,19 @@ mod tests {
             "aa bbb cccc dddd......",
             "......",
         );
+        perform_test(
+            &mut wrapper,
+            "aa bbb cccc 🦀🦀🦀🦀🦀 eeee ffff gggg",
+            "aa bbb cccc 🦀🦀🦀🦀…",
+            "…",
+        );
     }
 
     #[test]
     fn test_truncate_line_start() {
         let mut wrapper = build_wrapper();
 
+        #[track_caller]
         fn perform_test(
             wrapper: &mut LineWrapper,
             text: &'static str,
@@ -642,6 +650,12 @@ mod tests {
             "......dddd eeee fff gg",
             "......",
         );
+        perform_test(
+            &mut wrapper,
+            "aaaa bbbb cccc 🦀🦀🦀🦀🦀 eeee fff gg",
+            "…🦀🦀🦀🦀 eeee fff gg",
+            "…",
+        );
     }
 
     #[test]