summaryrefslogtreecommitdiffstats
path: root/asyncgit/src/sync/commits_info.rs
diff options
context:
space:
mode:
Diffstat (limited to 'asyncgit/src/sync/commits_info.rs')
-rw-r--r--asyncgit/src/sync/commits_info.rs328
1 files changed, 164 insertions, 164 deletions
diff --git a/asyncgit/src/sync/commits_info.rs b/asyncgit/src/sync/commits_info.rs
index c1058715..c9e3a54a 100644
--- a/asyncgit/src/sync/commits_info.rs
+++ b/asyncgit/src/sync/commits_info.rs
@@ -6,211 +6,211 @@ use unicode_truncate::UnicodeTruncateStr;
/// identifies a single commit
#[derive(
- Debug, Copy, Clone, PartialEq, Eq, Hash, Ord, PartialOrd,
+ Debug, Copy, Clone, PartialEq, Eq, Hash, Ord, PartialOrd,
)]
pub struct CommitId(Oid);
impl CommitId {
- /// create new `CommitId`
- pub const fn new(id: Oid) -> Self {
- Self(id)
- }
-
- ///
- pub(crate) const fn get_oid(self) -> Oid {
- self.0
- }
-
- /// 7 chars short hash
- pub fn get_short_string(&self) -> String {
- self.to_string().chars().take(7).collect()
- }
+ /// create new `CommitId`
+ pub const fn new(id: Oid) -> Self {
+ Self(id)
+ }
+
+ ///
+ pub(crate) const fn get_oid(self) -> Oid {
+ self.0
+ }
+
+ /// 7 chars short hash
+ pub fn get_short_string(&self) -> String {
+ self.to_string().chars().take(7).collect()
+ }
}
//TODO: remove once clippy fixed: https://github.com/rust-lang/rust-clippy/issues/6983
#[allow(clippy::wrong_self_convention)]
impl ToString for CommitId {
- fn to_string(&self) -> String {
- self.0.to_string()
- }
+ fn to_string(&self) -> String {
+ self.0.to_string()
+ }
}
impl From<CommitId> for Oid {
- fn from(id: CommitId) -> Self {
- id.0
- }
+ fn from(id: CommitId) -> Self {
+ id.0
+ }
}
impl From<Oid> for CommitId {
- fn from(id: Oid) -> Self {
- Self::new(id)
- }
+ fn from(id: Oid) -> Self {
+ Self::new(id)
+ }
}
///
#[derive(Debug)]
pub struct CommitInfo {
- ///
- pub message: String,
- ///
- pub time: i64,
- ///
- pub author: String,
- ///
- pub id: CommitId,
+ ///
+ pub message: String,
+ ///
+ pub time: i64,
+ ///
+ pub author: String,
+ ///
+ pub id: CommitId,
}
///
pub fn get_commits_info(
- repo_path: &str,
- ids: &[CommitId],
- message_length_limit: usize,
+ repo_path: &str,
+ ids: &[CommitId],
+ message_length_limit: usize,
) -> Result<Vec<CommitInfo>> {
- scope_time!("get_commits_info");
-
- let repo = repo(repo_path)?;
-
- let commits = ids
- .iter()
- .map(|id| repo.find_commit((*id).into()))
- .collect::<std::result::Result<Vec<Commit>, Error>>()?
- .into_iter();
-
- let res = commits
- .map(|c: Commit| {
- let message = get_message(&c, Some(message_length_limit));
- let author = c.author().name().map_or_else(
- || String::from("<unknown>"),
- String::from,
- );
- CommitInfo {
- message,
- author,
- time: c.time().seconds(),
- id: CommitId(c.id()),
- }
- })
- .collect::<Vec<_>>();
-
- Ok(res)
+ scope_time!("get_commits_info");
+
+ let repo = repo(repo_path)?;
+
+ let commits = ids
+ .iter()
+ .map(|id| repo.find_commit((*id).into()))
+ .collect::<std::result::Result<Vec<Commit>, Error>>()?
+ .into_iter();
+
+ let res = commits
+ .map(|c: Commit| {
+ let message = get_message(&c, Some(message_length_limit));
+ let author = c.author().name().map_or_else(
+ || String::from("<unknown>"),
+ String::from,
+ );
+ CommitInfo {
+ message,
+ author,
+ time: c.time().seconds(),
+ id: CommitId(c.id()),
+ }
+ })
+ .collect::<Vec<_>>();
+
+ Ok(res)
}
///
pub fn get_commit_info(
- repo_path: &str,
- commit_id: &CommitId,
+ repo_path: &str,
+ commit_id: &CommitId,
) -> Result<CommitInfo> {
- scope_time!("get_commit_info");
+ scope_time!("get_commit_info");
- let repo = repo(repo_path)?;
+ let repo = repo(repo_path)?;
- let commit = repo.find_commit((*commit_id).into())?;
- let author = commit.author();
+ let commit = repo.find_commit((*commit_id).into())?;
+ let author = commit.author();
- Ok(CommitInfo {
- message: commit.message().unwrap_or("").into(),
- author: author.name().unwrap_or("<unknown>").into(),
- time: commit.time().seconds(),
- id: CommitId(commit.id()),
- })
+ Ok(CommitInfo {
+ message: commit.message().unwrap_or("").into(),
+ author: author.name().unwrap_or("<unknown>").into(),
+ time: commit.time().seconds(),
+ id: CommitId(commit.id()),
+ })
}
/// if `message_limit` is set the message will be
/// limited to the first line and truncated to fit
pub fn get_message(
- c: &Commit,
- message_limit: Option<usize>,
+ c: &Commit,
+ message_limit: Option<usize>,
) -> String {
- let msg = String::from_utf8_lossy(c.message_bytes());
- let msg = msg.trim();
-
- message_limit.map_or_else(
- || msg.to_string(),
- |limit| {
- let msg = msg.lines().next().unwrap_or_default();
- msg.unicode_truncate(limit).0.to_string()
- },
- )
+ let msg = String::from_utf8_lossy(c.message_bytes());
+ let msg = msg.trim();
+
+ message_limit.map_or_else(
+ || msg.to_string(),
+ |limit| {
+ let msg = msg.lines().next().unwrap_or_default();
+ msg.unicode_truncate(limit).0.to_string()
+ },
+ )
}
#[cfg(test)]
mod tests {
- use super::get_commits_info;
- use crate::error::Result;
- use crate::sync::{
- commit, stage_add_file, tests::repo_init_empty,
- utils::get_head_repo,
- };
- use std::{fs::File, io::Write, path::Path};
-
- #[test]
- fn test_log() -> Result<()> {
- let file_path = Path::new("foo");
- let (_td, repo) = repo_init_empty().unwrap();
- let root = repo.path().parent().unwrap();
- let repo_path = root.as_os_str().to_str().unwrap();
-
- File::create(&root.join(file_path))?.write_all(b"a")?;
- stage_add_file(repo_path, file_path).unwrap();
- let c1 = commit(repo_path, "commit1").unwrap();
- File::create(&root.join(file_path))?.write_all(b"a")?;
- stage_add_file(repo_path, file_path).unwrap();
- let c2 = commit(repo_path, "commit2").unwrap();
-
- let res =
- get_commits_info(repo_path, &vec![c2, c1], 50).unwrap();
-
- assert_eq!(res.len(), 2);
- assert_eq!(res[0].message.as_str(), "commit2");
- assert_eq!(res[0].author.as_str(), "name");
- assert_eq!(res[1].message.as_str(), "commit1");
-
- Ok(())
- }
-
- #[test]
- fn test_log_first_msg_line() -> Result<()> {
- let file_path = Path::new("foo");
- let (_td, repo) = repo_init_empty().unwrap();
- let root = repo.path().parent().unwrap();
- let repo_path = root.as_os_str().to_str().unwrap();
-
- File::create(&root.join(file_path))?.write_all(b"a")?;
- stage_add_file(repo_path, file_path).unwrap();
- let c1 = commit(repo_path, "subject\nbody").unwrap();
-
- let res = get_commits_info(repo_path, &vec![c1], 50).unwrap();
-
- assert_eq!(res.len(), 1);
- assert_eq!(res[0].message.as_str(), "subject");
-
- Ok(())
- }
-
- #[test]
- fn test_invalid_utf8() -> Result<()> {
- let file_path = Path::new("foo");
- let (_td, repo) = repo_init_empty().unwrap();
- let root = repo.path().parent().unwrap();
- let repo_path = root.as_os_str().to_str().unwrap();
-
- File::create(&root.join(file_path))?.write_all(b"a")?;
- stage_add_file(repo_path, file_path).unwrap();
-
- let msg = invalidstring::invalid_utf8("test msg");
- commit(repo_path, msg.as_str()).unwrap();
-
- let res = get_commits_info(
- repo_path,
- &vec![get_head_repo(&repo).unwrap().into()],
- 50,
- )
- .unwrap();
-
- assert_eq!(res.len(), 1);
- dbg!(&res[0].message);
- assert_eq!(res[0].message.starts_with("test msg"), true);
-
- Ok(())
- }
+ use super::get_commits_info;
+ use crate::error::Result;
+ use crate::sync::{
+ commit, stage_add_file, tests::repo_init_empty,
+ utils::get_head_repo,
+ };
+ use std::{fs::File, io::Write, path::Path};
+
+ #[test]
+ fn test_log() -> Result<()> {
+ let file_path = Path::new("foo");
+ let (_td, repo) = repo_init_empty().unwrap();
+ let root = repo.path().parent().unwrap();
+ let repo_path = root.as_os_str().to_str().unwrap();
+
+ File::create(&root.join(file_path))?.write_all(b"a")?;
+ stage_add_file(repo_path, file_path).unwrap();
+ let c1 = commit(repo_path, "commit1").unwrap();
+ File::create(&root.join(file_path))?.write_all(b"a")?;
+ stage_add_file(repo_path, file_path).unwrap();
+ let c2 = commit(repo_path, "commit2").unwrap();
+
+ let res =
+ get_commits_info(repo_path, &vec![c2, c1], 50).unwrap();
+
+ assert_eq!(res.len(), 2);
+ assert_eq!(res[0].message.as_str(), "commit2");
+ assert_eq!(res[0].author.as_str(), "name");
+ assert_eq!(res[1].message.as_str(), "commit1");
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_log_first_msg_line() -> Result<()> {
+ let file_path = Path::new("foo");
+ let (_td, repo) = repo_init_empty().unwrap();
+ let root = repo.path().parent().unwrap();
+ let repo_path = root.as_os_str().to_str().unwrap();
+
+ File::create(&root.join(file_path))?.write_all(b"a")?;
+ stage_add_file(repo_path, file_path).unwrap();
+ let c1 = commit(repo_path, "subject\nbody").unwrap();
+
+ let res = get_commits_info(repo_path, &vec![c1], 50).unwrap();
+
+ assert_eq!(res.len(), 1);
+ assert_eq!(res[0].message.as_str(), "subject");
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_invalid_utf8() -> Result<()> {
+ let file_path = Path::new("foo");
+ let (_td, repo) = repo_init_empty().unwrap();
+ let root = repo.path().parent().unwrap();
+ let repo_path = root.as_os_str().to_str().unwrap();
+
+ File::create(&root.join(file_path))?.write_all(b"a")?;
+ stage_add_file(repo_path, file_path).unwrap();
+
+ let msg = invalidstring::invalid_utf8("test msg");
+ commit(repo_path, msg.as_str()).unwrap();
+
+ let res = get_commits_info(
+ repo_path,
+ &vec![get_head_repo(&repo).unwrap().into()],
+ 50,
+ )
+ .unwrap();
+
+ assert_eq!(res.len(), 1);
+ dbg!(&res[0].message);
+ assert_eq!(res[0].message.starts_with("test msg"), true);
+
+ Ok(())
+ }
}