Skip to content

Commit 1028a51

Browse files
author
Stephan Dilly
committed
fix invalid utf8 in commit msg also for commit details (see #150)
1 parent fab5b6e commit 1028a51

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

Diff for: asyncgit/src/sync/commit_details.rs

+44-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{utils::repo, CommitId};
1+
use super::{commits_info::get_message, utils::repo, CommitId};
22
use crate::error::Result;
33
use git2::Signature;
44
use scopetime::scope_time;
@@ -95,14 +95,55 @@ pub fn get_commit_details(
9595
Some(committer)
9696
};
9797

98-
let message = commit.message().map(|m| CommitMessage::from(m));
98+
let msg =
99+
CommitMessage::from(get_message(&commit, None).as_str());
99100

100101
let details = CommitDetails {
101102
author,
102103
committer,
103-
message,
104+
message: Some(msg),
104105
hash: id.to_string(),
105106
};
106107

107108
Ok(details)
108109
}
110+
111+
#[cfg(test)]
112+
mod tests {
113+
114+
use super::get_commit_details;
115+
use crate::error::Result;
116+
use crate::sync::{
117+
commit, stage_add_file, tests::repo_init_empty, CommitId,
118+
};
119+
use std::{fs::File, io::Write, path::Path};
120+
121+
#[test]
122+
fn test_msg_invalid_utf8() -> Result<()> {
123+
let file_path = Path::new("foo");
124+
let (_td, repo) = repo_init_empty().unwrap();
125+
let root = repo.path().parent().unwrap();
126+
let repo_path = root.as_os_str().to_str().unwrap();
127+
128+
File::create(&root.join(file_path))?.write_all(b"a")?;
129+
stage_add_file(repo_path, file_path).unwrap();
130+
131+
let msg = invalidstring::invalid_utf8("test msg");
132+
let id = commit(repo_path, msg.as_str()).unwrap();
133+
134+
let res =
135+
get_commit_details(repo_path, CommitId::new(id)).unwrap();
136+
137+
dbg!(&res.message.as_ref().unwrap().subject);
138+
assert_eq!(
139+
res.message
140+
.as_ref()
141+
.unwrap()
142+
.subject
143+
.starts_with("test msg"),
144+
true
145+
);
146+
147+
Ok(())
148+
}
149+
}

Diff for: asyncgit/src/sync/commits_info.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub fn get_commits_info(
6363

6464
let res = commits
6565
.map(|c: Commit| {
66-
let message = get_message(&c, message_length_limit);
66+
let message = get_message(&c, Some(message_length_limit));
6767
let author = if let Some(name) = c.author().name() {
6868
String::from(name)
6969
} else {
@@ -81,11 +81,18 @@ pub fn get_commits_info(
8181
Ok(res)
8282
}
8383

84-
fn get_message(c: &Commit, message_length_limit: usize) -> String {
85-
limit_str(
86-
String::from_utf8_lossy(c.message_bytes()),
87-
message_length_limit,
88-
)
84+
///
85+
pub fn get_message(
86+
c: &Commit,
87+
message_length_limit: Option<usize>,
88+
) -> String {
89+
let msg = String::from_utf8_lossy(c.message_bytes());
90+
91+
if let Some(limit) = message_length_limit {
92+
limit_str(msg, limit)
93+
} else {
94+
msg.to_string()
95+
}
8996
}
9097

9198
fn limit_str(s: Cow<'_, str>, limit: usize) -> String {

0 commit comments

Comments
 (0)