GitMailmap

Parse, resolve, and serialize Git .mailmap files in pure Elixir. The package supports Elixir 1.14 or newer and has no runtime dependencies.

Installation

Add git_mailmap to your dependencies:

def deps do
[
{:git_mailmap, "~> 1.0"}
]
end

Usage

entries =
GitMailmap.parse("""
Joe R. Developer <joe@example.com>
Jane Doe <jane@example.com> <jane@desktop.(none)>
""")
GitMailmap.resolve(entries, "Jane D.", "jane@desktop.(none)")
#=> %{name: "Jane Doe", email: "jane@example.com"}
GitMailmap.serialize(entries)
#=> "Joe R. Developer <joe@example.com>\n..."

Entry format

GitMailmap.parse/1 returns a list of entry maps:

%{
new_name: String.t() | nil,
new_email: String.t() | nil,
old_email: String.t(),
old_name: String.t() | nil
}

The parser accepts the Git-compatible forms below:

Proper Name <commit@email>
<proper@email> <commit@email>
Proper Name <proper@email> <commit@email>
Proper Name <proper@email> Commit Name <commit@email>
<proper@email> Commit Name <commit@email>

Only a # in the first column starts a comment. Matching of names and emails uses ASCII case-insensitive comparison, as Git does.

API

GitMailmap.parse/1

Parses .mailmap content into entries in file order. Invalid lines are silently ignored, matching Git. Emails used for matching are normalized to lowercase ASCII.

GitMailmap.resolve/3

Returns the canonical %{name: name, email: email} identity. Email and name matching use ASCII case-insensitive comparison. A matching name-and-email entry takes priority over a general email entry. Repeated general entries update only the fields they specify, matching Git's cumulative behavior.

GitMailmap.serialize/1

Serializes entries to canonical .mailmap lines with a trailing newline. Programmatically constructed entries that cannot be represented in the format raise ArgumentError.

Scope

The package handles strings only. Reading .mailmap files, Git configuration, Git blobs, and command-line integration are intentionally left to consumers.

Roadmap

See ROADMAP.md for planned compatibility, testing, and performance work.

License

MIT. See THIRD_PARTY_NOTICES.md for compatibility research provenance.