From 4d70ed327e49ff2ecdbe0733b7ca1f606b327810 Mon Sep 17 00:00:00 2001 From: Amey Pawar Date: Tue, 26 May 2026 13:07:10 +0530 Subject: [PATCH] add tests for Repository::open_mailmap and open_mailmap_into Covers two of the four mailmap source paths documented on open_mailmap_into: the no-source case (empty snapshot, no error) via the existing make_basic_repo.sh fixture, and the worktree .mailmap case via a new make_mailmap_repo.sh fixture. The remaining sources (mailmap.blob, mailmap.file, bare repo HEAD:.mailmap) are intentionally deferred to a follow-up to keep this change small. Also removes the two // TODO: tests markers in gix/src/repository/mailmap.rs. --- gix/src/repository/mailmap.rs | 2 - .../generated-archives/make_mailmap_repo.tar | Bin 0 -> 63488 bytes .../make_mailmap_repo_sha256.tar | Bin 0 -> 63488 bytes gix/tests/fixtures/make_mailmap_repo.sh | 19 ++++++ gix/tests/gix/repository/mailmap.rs | 55 ++++++++++++++++++ gix/tests/gix/repository/mod.rs | 2 + 6 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 gix/tests/fixtures/generated-archives/make_mailmap_repo.tar create mode 100644 gix/tests/fixtures/generated-archives/make_mailmap_repo_sha256.tar create mode 100755 gix/tests/fixtures/make_mailmap_repo.sh create mode 100644 gix/tests/gix/repository/mailmap.rs diff --git a/gix/src/repository/mailmap.rs b/gix/src/repository/mailmap.rs index 02921ec142e..ae725216857 100644 --- a/gix/src/repository/mailmap.rs +++ b/gix/src/repository/mailmap.rs @@ -1,7 +1,6 @@ use crate::{Id, config::tree::Mailmap}; impl crate::Repository { - // TODO: tests /// Similar to [`open_mailmap_into()`][crate::Repository::open_mailmap_into()], but ignores all errors and returns at worst /// an empty mailmap, e.g. if there is no mailmap or if there were errors loading them. /// @@ -13,7 +12,6 @@ impl crate::Repository { out } - // TODO: tests /// Try to merge mailmaps from the following locations into `target`: /// /// - read the `.mailmap` file without following symlinks from the working tree, if present diff --git a/gix/tests/fixtures/generated-archives/make_mailmap_repo.tar b/gix/tests/fixtures/generated-archives/make_mailmap_repo.tar new file mode 100644 index 0000000000000000000000000000000000000000..ec9434becb89996bc81500c47188ffe2072e63c5 GIT binary patch literal 63488 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 rVsUi- +cat >.mailmap <<'EOF' +Proper Name +EOF + +touch a +git add a .mailmap +git commit -q -m "initial with mailmap" diff --git a/gix/tests/gix/repository/mailmap.rs b/gix/tests/gix/repository/mailmap.rs new file mode 100644 index 00000000000..4b22f931409 --- /dev/null +++ b/gix/tests/gix/repository/mailmap.rs @@ -0,0 +1,55 @@ +use gix_date::parse::TimeBuf; + +use crate::{Result, named_repo}; + +fn signature(name: &str, email: &str) -> gix_actor::Signature { + gix_actor::Signature { + name: name.into(), + email: email.into(), + time: gix_date::parse_header("42 +0800").expect("static input parses"), + } +} + +#[test] +fn empty_when_no_mailmap_present() -> Result { + let repo = named_repo("make_basic_repo.sh")?; + let snapshot = repo.open_mailmap(); + assert!( + snapshot.entries().is_empty(), + "a repo without any .mailmap or mailmap.* config yields an empty snapshot" + ); + + let mut into = gix_mailmap::Snapshot::default(); + repo.open_mailmap_into(&mut into) + .expect("with no mailmap sources, no IO error is collected"); + assert!( + into.entries().is_empty(), + "open_mailmap_into mirrors open_mailmap when there are no sources" + ); + Ok(()) +} + +#[test] +fn reads_mailmap_from_worktree_root() -> Result { + let repo = named_repo("make_mailmap_repo.sh")?; + let snapshot = repo.open_mailmap(); + assert_eq!( + snapshot.entries().len(), + 1, + "the single entry from the worktree .mailmap is loaded" + ); + + let mut buf = TimeBuf::default(); + let resolved = snapshot + .try_resolve(signature("Old Name", "proper@example.com").to_ref(&mut buf)) + .expect("the entry rewrites the display name when the email matches"); + assert_eq!( + resolved.name, "Proper Name", + "the mapped name from .mailmap replaces the original" + ); + assert_eq!( + resolved.email, "proper@example.com", + "the email is preserved (this entry only changes the name)" + ); + Ok(()) +} diff --git a/gix/tests/gix/repository/mod.rs b/gix/tests/gix/repository/mod.rs index f60ad9e4192..53d9fa9d455 100644 --- a/gix/tests/gix/repository/mod.rs +++ b/gix/tests/gix/repository/mod.rs @@ -11,6 +11,8 @@ mod config; mod excludes; #[cfg(feature = "attributes")] mod filter; +#[cfg(feature = "mailmap")] +mod mailmap; #[cfg(feature = "merge")] mod merge; mod object;