summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNika Layzell <nika@thelayzells.com>2018-03-17 18:15:41 -0400
committerNika Layzell <nika@thelayzells.com>2018-06-14 22:43:27 -0700
commit983b8c2df818c92afa9b15041d3480b671b59a14 (patch)
tree9a69bc6e9fbeb02951a86dc80eab0485a4e90090
parente3dcaca579ba344ccdacfe4835dcc7bf52c5ba57 (diff)
downloadlibgit2-983b8c2df818c92afa9b15041d3480b671b59a14.tar.gz
mailmap: Add a bunch of tests for the new mailmap functionality
-rw-r--r--tests/mailmap/blame.c70
-rw-r--r--tests/mailmap/mailmap_helpers.h52
-rw-r--r--tests/mailmap/parsing.c123
-rw-r--r--tests/resources/mailmap/.gitted/COMMIT_EDITMSG1
-rw-r--r--tests/resources/mailmap/.gitted/HEAD1
-rw-r--r--tests/resources/mailmap/.gitted/config5
-rw-r--r--tests/resources/mailmap/.gitted/description1
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/applypatch-msg.sample15
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/commit-msg.sample24
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/post-update.sample8
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/pre-applypatch.sample14
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/pre-commit.sample49
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/pre-push.sample53
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/pre-rebase.sample169
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/pre-receive.sample24
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/prepare-commit-msg.sample36
-rwxr-xr-xtests/resources/mailmap/.gitted/hooks/update.sample128
-rw-r--r--tests/resources/mailmap/.gitted/indexbin0 -> 209 bytes
-rw-r--r--tests/resources/mailmap/.gitted/info/exclude6
-rw-r--r--tests/resources/mailmap/.gitted/logs/HEAD11
-rw-r--r--tests/resources/mailmap/.gitted/logs/refs/heads/master11
-rw-r--r--tests/resources/mailmap/.gitted/objects/00/1387531bed84262f137837125d4d998a9ba65dbin0 -> 70 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/02/7b2816ae0d7a08ba656d0417c09b4eac18cf00bin0 -> 85 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/09/20975110511365e56aec2263082d0c3d56d1fabin0 -> 113 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/0c/d99501dfbec781a22ff7b84426b7bb308e709abin0 -> 53 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/1e/1212e7674820c17f7b8797aee7bf38ece0e8382
-rw-r--r--tests/resources/mailmap/.gitted/objects/36/370b71f5aad1dd46bec5e14145280a843c9f49bin0 -> 53 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/3a/1295dbc9234c0c5947c72803618c7112a014472
-rw-r--r--tests/resources/mailmap/.gitted/objects/3f/134546ae8fbe95a39dd20ea8c12b5fb0f48afb3
-rw-r--r--tests/resources/mailmap/.gitted/objects/43/179dc93939196f59b25387b5e44e9e8794f84c2
-rw-r--r--tests/resources/mailmap/.gitted/objects/46/b5bb908c78b575cac9f9e6e42ff9ba3f769a46bin0 -> 53 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/4b/4d2010ba256ef339c1d1854d20249da7478f01bin0 -> 54 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904bin0 -> 15 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/4d/61d588546529ad27b2d77a3d6b05460ecb4be0bin0 -> 79 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/50/d69f4e64be2cff2cedde8f9b7f970257caf4dd1
-rw-r--r--tests/resources/mailmap/.gitted/objects/61/293f4c3d7500d227a755a7a8258e28e53449b2bin0 -> 52 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/62/7f0bd2f4fb5e949b79ba450d84676fa876b1c8bin0 -> 53 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/68/dfd5e5cb6138488680246d134f47ce559f4cf1bin0 -> 149 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/6c/dec08ab9bfcd5a3d889f27bbed650317e3ec13bin0 -> 76 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/71/00e631fb4d5deba31fdc8acc98f4fb5c1573fdbin0 -> 178 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/7e/cbb98d860b304f622b38ce9ab8f08d14d981a8bin0 -> 198 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/7e/e7b9a4a2a1eda925f6260338c063d8211d5ad52
-rw-r--r--tests/resources/mailmap/.gitted/objects/83/714a9223f3e072b85f0d4301cd2081fff3acf2bin0 -> 52 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/87/ce8d4920a30ddb9547334e7c65806518863ff12
-rw-r--r--tests/resources/mailmap/.gitted/objects/8c/f0547fcb649b44ebaf39b8104982bb0abb4e69bin0 -> 121 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/94/7ff75c33ac7941a32fe9900118b6ba85ab2be9bin0 -> 49 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/95/d03c49d94de67d5a05553a1bb22e78f7cdf5ca1
-rw-r--r--tests/resources/mailmap/.gitted/objects/96/78a4325710507f7bf598a0fde5ebbd88148614bin0 -> 132 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/a1/6db1cbb8817dddcf199c12d3c81221cf8eefc41
-rw-r--r--tests/resources/mailmap/.gitted/objects/a7/054a4b356b3ecdec60cee66e50beaa5b8637553
-rw-r--r--tests/resources/mailmap/.gitted/objects/a7/eb40274887baeb01a958ead80d106b5977312cbin0 -> 52 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/c9/e5462de8ec453e94d85f26f64b80ea76fda6d4bin0 -> 53 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/d3/e5e624cc7bfb09ac1960ebb6c458021b098f87bin0 -> 97 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/fe/dd34e8baffdb2acfe9a6860bf339287ca942bcbin0 -> 53 bytes
-rw-r--r--tests/resources/mailmap/.gitted/objects/fe/ef8f2135df4835496e4d576b1f1bd23510e1c51
-rw-r--r--tests/resources/mailmap/.gitted/refs/heads/master1
-rw-r--r--tests/resources/mailmap/.mailmap9
-rw-r--r--tests/resources/mailmap/file.txt10
58 files changed, 841 insertions, 0 deletions
diff --git a/tests/mailmap/blame.c b/tests/mailmap/blame.c
new file mode 100644
index 000000000..2dd309588
--- /dev/null
+++ b/tests/mailmap/blame.c
@@ -0,0 +1,70 @@
+#include "clar_libgit2.h"
+#include "git2/repository.h"
+#include "git2/blame.h"
+#include "git2/mailmap.h"
+#include "mailmap_helpers.h"
+
+static git_repository *g_repo;
+static git_blame *g_blame;
+static git_mailmap *g_mailmap;
+
+void test_mailmap_blame__initialize(void)
+{
+ g_repo = NULL;
+ g_blame = NULL;
+}
+
+void test_mailmap_blame__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+ g_repo = NULL;
+
+ git_blame_free(g_blame);
+ g_blame = NULL;
+}
+
+void test_mailmap_blame__hunks(void)
+{
+ size_t idx = 0;
+ const git_blame_hunk *hunk = NULL;
+ git_blame_options opts = GIT_BLAME_OPTIONS_INIT;
+
+ g_repo = cl_git_sandbox_init("mailmap");
+
+ opts.flags |= GIT_BLAME_USE_MAILMAP;
+
+ cl_check_pass(git_blame_file(&g_blame, g_repo, "file.txt", &opts));
+ if (!g_blame)
+ return;
+
+ for (idx = 0; idx < ARRAY_SIZE(resolved); ++idx) {
+ hunk = git_blame_get_hunk_byline(g_blame, idx + 1);
+
+ cl_assert(hunk->final_signature != NULL);
+ cl_assert(hunk->orig_signature != NULL);
+ cl_assert_equal_s(hunk->final_signature->name, resolved[idx].real_name);
+ cl_assert_equal_s(hunk->final_signature->email, resolved[idx].real_email);
+ }
+}
+
+void test_mailmap_blame__hunks_no_mailmap(void)
+{
+ size_t idx = 0;
+ const git_blame_hunk *hunk = NULL;
+ git_blame_options opts = GIT_BLAME_OPTIONS_INIT;
+
+ g_repo = cl_git_sandbox_init("mailmap");
+
+ cl_check_pass(git_blame_file(&g_blame, g_repo, "file.txt", &opts));
+ if (!g_blame)
+ return;
+
+ for (idx = 0; idx < ARRAY_SIZE(resolved); ++idx) {
+ hunk = git_blame_get_hunk_byline(g_blame, idx + 1);
+
+ cl_assert(hunk->final_signature != NULL);
+ cl_assert(hunk->orig_signature != NULL);
+ cl_assert_equal_s(hunk->final_signature->name, resolved[idx].replace_name);
+ cl_assert_equal_s(hunk->final_signature->email, resolved[idx].replace_email);
+ }
+}
diff --git a/tests/mailmap/mailmap_helpers.h b/tests/mailmap/mailmap_helpers.h
new file mode 100644
index 000000000..49df55fb1
--- /dev/null
+++ b/tests/mailmap/mailmap_helpers.h
@@ -0,0 +1,52 @@
+#include "git2/mailmap.h"
+
+typedef struct mailmap_entry {
+ const char *real_name;
+ const char *real_email;
+ const char *replace_name;
+ const char *replace_email;
+} mailmap_entry;
+
+static const char string_mailmap[] =
+ "# Simple Comment line\n"
+ "<cto@company.xx> <cto@coompany.xx>\n"
+ "Some Dude <some@dude.xx> nick1 <bugs@company.xx>\n"
+ "Other Author <other@author.xx> nick2 <bugs@company.xx>\n"
+ "Other Author <other@author.xx> <nick2@company.xx>\n"
+ "Phil Hill <phil@company.xx> # Comment at end of line\n"
+ "<joseph@company.xx> Joseph <bugs@company.xx>\n"
+ "Santa Claus <santa.claus@northpole.xx> <me@company.xx>\n"
+ "Untracked <untracked@company.xx>";
+
+static const mailmap_entry entries[] = {
+ { NULL, "cto@company.xx", NULL, "cto@coompany.xx" },
+ { "Some Dude", "some@dude.xx", "nick1", "bugs@company.xx" },
+ { "Other Author", "other@author.xx", "nick2", "bugs@company.xx" },
+ { "Other Author", "other@author.xx", NULL, "nick2@company.xx" },
+ { "Phil Hill", NULL, NULL, "phil@company.xx" },
+ { NULL, "joseph@company.xx", "Joseph", "bugs@company.xx" },
+ { "Santa Claus", "santa.claus@northpole.xx", NULL, "me@company.xx" },
+ /* This entry isn't in the bare repository */
+ { "Untracked", NULL, NULL, "untracked@company.xx" }
+};
+
+static const mailmap_entry resolved[] = {
+ { "Brad", "cto@company.xx", "Brad", "cto@coompany.xx" },
+ { "Brad L", "cto@company.xx", "Brad L", "cto@coompany.xx" },
+ { "Some Dude", "some@dude.xx", "nick1", "bugs@company.xx" },
+ { "Other Author", "other@author.xx", "nick2", "bugs@company.xx" },
+ { "nick3", "bugs@company.xx", "nick3", "bugs@company.xx" },
+ { "Other Author", "other@author.xx", "Some Garbage", "nick2@company.xx" },
+ { "Phil Hill", "phil@company.xx", "unknown", "phil@company.xx" },
+ { "Joseph", "joseph@company.xx", "Joseph", "bugs@company.xx" },
+ { "Santa Claus", "santa.claus@northpole.xx", "Clause", "me@company.xx" },
+ { "Charles", "charles@charles.xx", "Charles", "charles@charles.xx" }
+};
+
+static const mailmap_entry resolved_bare[] = {
+ { "xx", "untracked@company.xx", "xx", "untracked@company.xx" }
+};
+
+static const mailmap_entry resolved_untracked[] = {
+ { "Untracked", "untracked@company.xx", "xx", "untracked@company.xx" }
+};
diff --git a/tests/mailmap/parsing.c b/tests/mailmap/parsing.c
new file mode 100644
index 000000000..3fda25ff7
--- /dev/null
+++ b/tests/mailmap/parsing.c
@@ -0,0 +1,123 @@
+#include "clar_libgit2.h"
+#include "repository.h"
+#include "git2/sys/repository.h"
+#include "mailmap_helpers.h"
+
+static git_repository *g_repo;
+static git_mailmap *g_mailmap;
+
+void test_mailmap_parsing__initialize(void)
+{
+ g_repo = NULL;
+ g_mailmap = NULL;
+}
+
+void test_mailmap_parsing__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+ g_repo = NULL;
+
+ git_mailmap_free(g_mailmap);
+ g_mailmap = NULL;
+}
+
+static void check_mailmap_entries(
+ const git_mailmap *mailmap, const mailmap_entry *entries, size_t entries_size)
+{
+ const mailmap_entry *parsed = NULL;
+ size_t idx = 0;
+
+ /* Check that the parsed entries match */
+ cl_assert_equal_sz(entries_size, git_mailmap_entry_count(mailmap));
+ for (idx = 0; idx < entries_size; ++idx) {
+ parsed = git_mailmap_entry_byindex(mailmap, idx);
+ cl_assert_equal_s(parsed->real_name, entries[idx].real_name);
+ cl_assert_equal_s(parsed->real_email, entries[idx].real_email);
+ cl_assert_equal_s(parsed->replace_name, entries[idx].replace_name);
+ cl_assert_equal_s(parsed->replace_email, entries[idx].replace_email);
+ }
+}
+
+static void check_mailmap_resolve(
+ const git_mailmap *mailmap, const mailmap_entry *resolved, size_t resolved_size)
+{
+ const char *resolved_name = NULL;
+ const char *resolved_email = NULL;
+ size_t idx = 0;
+
+ /* Check that the resolver behaves correctly */
+ for (idx = 0; idx < resolved_size; ++idx) {
+ git_mailmap_resolve(
+ &resolved_name,
+ &resolved_email,
+ mailmap,
+ resolved[idx].replace_name,
+ resolved[idx].replace_email);
+ cl_assert_equal_s(resolved_name, resolved[idx].real_name);
+ cl_assert_equal_s(resolved_email, resolved[idx].real_email);
+ }
+}
+
+void test_mailmap_parsing__string(void)
+{
+ cl_check_pass(git_mailmap_parse(
+ &g_mailmap,
+ string_mailmap,
+ strlen(string_mailmap)));
+
+ /* We should have parsed all of the entries */
+ check_mailmap_entries(
+ g_mailmap,
+ entries, ARRAY_SIZE(entries));
+
+ /* Check that resolving the entries works */
+ check_mailmap_resolve(
+ g_mailmap,
+ resolved, ARRAY_SIZE(resolved));
+ check_mailmap_resolve(
+ g_mailmap,
+ resolved_untracked, ARRAY_SIZE(resolved_untracked));
+}
+
+void test_mailmap_parsing__fromrepo(void)
+{
+ g_repo = cl_git_sandbox_init("mailmap");
+ cl_check(!git_repository_is_bare(g_repo));
+
+ cl_check_pass(git_mailmap_from_repo(&g_mailmap, g_repo));
+
+ /* We should have parsed all of the entries */
+ check_mailmap_entries(
+ g_mailmap,
+ entries, ARRAY_SIZE(entries));
+
+ /* Check that resolving the entries works */
+ check_mailmap_resolve(
+ g_mailmap,
+ resolved, ARRAY_SIZE(resolved));
+ check_mailmap_resolve(
+ g_mailmap,
+ resolved_untracked, ARRAY_SIZE(resolved_untracked));
+}
+
+void test_mailmap_parsing__frombare(void)
+{
+ g_repo = cl_git_sandbox_init("mailmap/.gitted");
+ cl_check_pass(git_repository_set_bare(g_repo));
+ cl_check(git_repository_is_bare(g_repo));
+
+ cl_check_pass(git_mailmap_from_repo(&g_mailmap, g_repo));
+
+ /* We should have parsed all of the entries, except for the untracked one */
+ check_mailmap_entries(
+ g_mailmap,
+ entries, ARRAY_SIZE(entries) - 1);
+
+ /* Check that resolving the entries works */
+ check_mailmap_resolve(
+ g_mailmap,
+ resolved, ARRAY_SIZE(resolved));
+ check_mailmap_resolve(
+ g_mailmap,
+ resolved_bare, ARRAY_SIZE(resolved_bare));
+}
diff --git a/tests/resources/mailmap/.gitted/COMMIT_EDITMSG b/tests/resources/mailmap/.gitted/COMMIT_EDITMSG
new file mode 100644
index 000000000..14bee00c0
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/COMMIT_EDITMSG
@@ -0,0 +1 @@
++.mailmap
diff --git a/tests/resources/mailmap/.gitted/HEAD b/tests/resources/mailmap/.gitted/HEAD
new file mode 100644
index 000000000..cb089cd89
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/tests/resources/mailmap/.gitted/config b/tests/resources/mailmap/.gitted/config
new file mode 100644
index 000000000..515f48362
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/config
@@ -0,0 +1,5 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
diff --git a/tests/resources/mailmap/.gitted/description b/tests/resources/mailmap/.gitted/description
new file mode 100644
index 000000000..498b267a8
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/tests/resources/mailmap/.gitted/hooks/applypatch-msg.sample b/tests/resources/mailmap/.gitted/hooks/applypatch-msg.sample
new file mode 100755
index 000000000..a5d7b84a6
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/applypatch-msg.sample
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit. The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "applypatch-msg".
+
+. git-sh-setup
+commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
+test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
+:
diff --git a/tests/resources/mailmap/.gitted/hooks/commit-msg.sample b/tests/resources/mailmap/.gitted/hooks/commit-msg.sample
new file mode 100755
index 000000000..b58d1184a
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/commit-msg.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by "git commit" with one argument, the name of the file
+# that has the commit message. The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit. The hook is allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "commit-msg".
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
+# hook is more suited to it.
+#
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
+ echo >&2 Duplicate Signed-off-by lines.
+ exit 1
+}
diff --git a/tests/resources/mailmap/.gitted/hooks/post-update.sample b/tests/resources/mailmap/.gitted/hooks/post-update.sample
new file mode 100755
index 000000000..ec17ec193
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/post-update.sample
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, rename this file to "post-update".
+
+exec git update-server-info
diff --git a/tests/resources/mailmap/.gitted/hooks/pre-applypatch.sample b/tests/resources/mailmap/.gitted/hooks/pre-applypatch.sample
new file mode 100755
index 000000000..4142082bc
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/pre-applypatch.sample
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-applypatch".
+
+. git-sh-setup
+precommit="$(git rev-parse --git-path hooks/pre-commit)"
+test -x "$precommit" && exec "$precommit" ${1+"$@"}
+:
diff --git a/tests/resources/mailmap/.gitted/hooks/pre-commit.sample b/tests/resources/mailmap/.gitted/hooks/pre-commit.sample
new file mode 100755
index 000000000..68d62d544
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/pre-commit.sample
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+ against=HEAD
+else
+ # Initial commit: diff against an empty tree object
+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+# If you want to allow non-ASCII filenames set this variable to true.
+allownonascii=$(git config --bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ASCII filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+ # Note that the use of brackets around a tr range is ok here, (it's
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
+ # the square bracket bytes happen to fall in the designated range.
+ test $(git diff --cached --name-only --diff-filter=A -z $against |
+ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+ cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+ git config hooks.allownonascii true
+EOF
+ exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+exec git diff-index --check --cached $against --
diff --git a/tests/resources/mailmap/.gitted/hooks/pre-push.sample b/tests/resources/mailmap/.gitted/hooks/pre-push.sample
new file mode 100755
index 000000000..6187dbf43
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/pre-push.sample
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# An example hook script to verify what is about to be pushed. Called by "git
+# push" after it has checked the remote status, but before anything has been
+# pushed. If this script exits with a non-zero status nothing will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+# <local ref> <local sha1> <remote ref> <remote sha1>
+#
+# This sample shows how to prevent push of commits where the log message starts
+# with "WIP" (work in progress).
+
+remote="$1"
+url="$2"
+
+z40=0000000000000000000000000000000000000000
+
+while read local_ref local_sha remote_ref remote_sha
+do
+ if [ "$local_sha" = $z40 ]
+ then
+ # Handle delete
+ :
+ else
+ if [ "$remote_sha" = $z40 ]
+ then
+ # New branch, examine all commits
+ range="$local_sha"
+ else
+ # Update to existing branch, examine new commits
+ range="$remote_sha..$local_sha"
+ fi
+
+ # Check for WIP commit
+ commit=`git rev-list -n 1 --grep '^WIP' "$range"`
+ if [ -n "$commit" ]
+ then
+ echo >&2 "Found WIP commit in $local_ref, not pushing"
+ exit 1
+ fi
+ fi
+done
+
+exit 0
diff --git a/tests/resources/mailmap/.gitted/hooks/pre-rebase.sample b/tests/resources/mailmap/.gitted/hooks/pre-rebase.sample
new file mode 100755
index 000000000..33730ca64
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/pre-rebase.sample
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, 2008 Junio C Hamano
+#
+# The "pre-rebase" hook is run just before "git rebase" starts doing
+# its job, and can prevent the command from running by exiting with
+# non-zero status.
+#
+# The hook is called with the following parameters:
+#
+# $1 -- the upstream the series was forked from.
+# $2 -- the branch being rebased (or empty when rebasing the current branch).
+#
+# This sample shows how to prevent topic branches that are already
+# merged to 'next' branch from getting rebased, because allowing it
+# would result in rebasing already published history.
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+ topic="refs/heads/$2"
+else
+ topic=`git symbolic-ref HEAD` ||
+ exit 0 ;# we do not interrupt rebasing detached HEAD
+fi
+
+case "$topic" in
+refs/heads/??/*)
+ ;;
+*)
+ exit 0 ;# we do not interrupt others.
+ ;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master. Is it OK to rebase it?
+
+# Does the topic really exist?
+git show-ref -q "$topic" || {
+ echo >&2 "No such branch $topic"
+ exit 1
+}
+
+# Is topic fully merged to master?
+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+ echo >&2 "$topic is fully merged to master; better remove it."
+ exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next? If so you should not be rebasing it.
+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git rev-list ^master ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+ not_in_topic=`git rev-list "^$topic" master`
+ if test -z "$not_in_topic"
+ then
+ echo >&2 "$topic is already up-to-date with master"
+ exit 1 ;# we could allow it, but there is no point.
+ else
+ exit 0
+ fi
+else
+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
+ /usr/bin/perl -e '
+ my $topic = $ARGV[0];
+ my $msg = "* $topic has commits already merged to public branch:\n";
+ my (%not_in_next) = map {
+ /^([0-9a-f]+) /;
+ ($1 => 1);
+ } split(/\n/, $ARGV[1]);
+ for my $elem (map {
+ /^([0-9a-f]+) (.*)$/;
+ [$1 => $2];
+ } split(/\n/, $ARGV[2])) {
+ if (!exists $not_in_next{$elem->[0]}) {
+ if ($msg) {
+ print STDERR $msg;
+ undef $msg;
+ }
+ print STDERR " $elem->[1]\n";
+ }
+ }
+ ' "$topic" "$not_in_next" "$not_in_master"
+ exit 1
+fi
+
+<<\DOC_END
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+ merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+ it is deleted. If you need to build on top of it to correct
+ earlier mistakes, a new topic branch is created by forking at
+ the tip of the "master". This is not strictly necessary, but
+ it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+ branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next". Young
+ topic branches can have stupid mistakes you would rather
+ clean up before publishing, and things that have not been
+ merged into other branches can be easily rebased without
+ affecting other people. But once it is published, you would
+ not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+ Then you can delete it. More importantly, you should not
+ build on top of it -- other people may already want to
+ change things related to the topic as patches against your
+ "master", so if you need further changes, it is better to
+ fork the topic (perhaps with the same name) afresh from the
+ tip of "master".
+
+Let's look at this example:
+
+ o---o---o---o---o---o---o---o---o---o "next"
+ / / / /
+ / a---a---b A / /
+ / / / /
+ / / c---c---c---c B /
+ / / / \ /
+ / / / b---b C \ /
+ / / / / \ /
+ ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished. It has been fully merged up to "master" and "next",
+ and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+ git rev-list ^master ^topic next
+ git rev-list ^master next
+
+ if these match, topic has not merged in next at all.
+
+To compute (2):
+
+ git rev-list master..topic
+
+ if this is empty, it is fully merged to "master".
+
+DOC_END
diff --git a/tests/resources/mailmap/.gitted/hooks/pre-receive.sample b/tests/resources/mailmap/.gitted/hooks/pre-receive.sample
new file mode 100755
index 000000000..a1fd29ec1
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/pre-receive.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to make use of push options.
+# The example simply echoes all push options that start with 'echoback='
+# and rejects all pushes when the "reject" push option is used.
+#
+# To enable this hook, rename this file to "pre-receive".
+
+if test -n "$GIT_PUSH_OPTION_COUNT"
+then
+ i=0
+ while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
+ do
+ eval "value=\$GIT_PUSH_OPTION_$i"
+ case "$value" in
+ echoback=*)
+ echo "echo from the pre-receive-hook: ${value#*=}" >&2
+ ;;
+ reject)
+ exit 1
+ esac
+ i=$((i + 1))
+ done
+fi
diff --git a/tests/resources/mailmap/.gitted/hooks/prepare-commit-msg.sample b/tests/resources/mailmap/.gitted/hooks/prepare-commit-msg.sample
new file mode 100755
index 000000000..f093a02ec
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/prepare-commit-msg.sample
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# An example hook script to prepare the commit log message.
+# Called by "git commit" with the name of the file that has the
+# commit message, followed by the description of the commit
+# message's source. The hook's purpose is to edit the commit
+# message file. If the hook fails with a non-zero status,
+# the commit is aborted.
+#
+# To enable this hook, rename this file to "prepare-commit-msg".
+
+# This hook includes three examples. The first comments out the
+# "Conflicts:" part of a merge commit.
+#
+# The second includes the output of "git diff --name-status -r"
+# into the message, just before the "git status" output. It is
+# commented because it doesn't cope with --amend or with squashed
+# commits.
+#
+# The third example adds a Signed-off-by line to the message, that can
+# still be edited. This is rarely a good idea.
+
+case "$2,$3" in
+ merge,)
+ /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
+
+# ,|template,)
+# /usr/bin/perl -i.bak -pe '
+# print "\n" . `git diff --cached --name-status -r`
+# if /^#/ && $first++ == 0' "$1" ;;
+
+ *) ;;
+esac
+
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
diff --git a/tests/resources/mailmap/.gitted/hooks/update.sample b/tests/resources/mailmap/.gitted/hooks/update.sample
new file mode 100755
index 000000000..80ba94135
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/hooks/update.sample
@@ -0,0 +1,128 @@
+#!/bin/sh
+#
+# An example hook script to block unannotated tags from entering.
+# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
+#
+# To enable this hook, rename this file to "update".
+#
+# Config
+# ------
+# hooks.allowunannotated
+# This boolean sets whether unannotated tags will be allowed into the
+# repository. By default they won't be.
+# hooks.allowdeletetag
+# This boolean sets whether deleting tags will be allowed in the
+# repository. By default they won't be.
+# hooks.allowmodifytag
+# This boolean sets whether a tag may be modified after creation. By default
+# it won't be.
+# hooks.allowdeletebranch
+# This boolean sets whether deleting branches will be allowed in the
+# repository. By default they won't be.
+# hooks.denycreatebranch
+# This boolean sets whether remotely creating branches will be denied
+# in the repository. By default this is allowed.
+#
+
+# --- Command line
+refname="$1"
+oldrev="$2"
+newrev="$3"
+
+# --- Safety check
+if [ -z "$GIT_DIR" ]; then
+ echo "Don't run this script from the command line." >&2
+ echo " (if you want, you could supply GIT_DIR then run" >&2
+ echo " $0 <ref> <oldrev> <newrev>)" >&2
+ exit 1
+fi
+
+if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
+ echo "usage: $0 <ref> <oldrev> <newrev>" >&2
+ exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --bool hooks.allowunannotated)
+allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --bool hooks.denycreatebranch)
+allowdeletetag=$(git config --bool hooks.allowdeletetag)
+allowmodifytag=$(git config --bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+ echo "*** Project description file hasn't been set" >&2
+ exit 1
+ ;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero="0000000000000000000000000000000000000000"
+if [ "$newrev" = "$zero" ]; then
+ newrev_type=delete
+else
+ newrev_type=$(git cat-file -t $newrev)
+fi
+
+case "$refname","$newrev_type" in
+ refs/tags/*,commit)
+ # un-annotated tag
+ short_refname=${refname##refs/tags/}
+ if [ "$allowunannotated" != "true" ]; then
+ echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,delete)
+ # delete tag
+ if [ "$allowdeletetag" != "true" ]; then
+ echo "*** Deleting a tag is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,tag)
+ # annotated tag
+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+ then
+ echo "*** Tag '$refname' already exists." >&2
+ echo "*** Modifying a tag is not allowed in this repository." >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,commit)
+ # branch
+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+ echo "*** Creating a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,delete)
+ # delete branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/remotes/*,commit)
+ # tracking branch
+ ;;
+ refs/remotes/*,delete)
+ # delete tracking branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ *)
+ # Anything else (is there anything else?)
+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+ exit 1
+ ;;
+esac
+
+# --- Finished
+exit 0
diff --git a/tests/resources/mailmap/.gitted/index b/tests/resources/mailmap/.gitted/index
new file mode 100644
index 000000000..c46a1b440
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/index
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/info/exclude b/tests/resources/mailmap/.gitted/info/exclude
new file mode 100644
index 000000000..a5196d1be
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/tests/resources/mailmap/.gitted/logs/HEAD b/tests/resources/mailmap/.gitted/logs/HEAD
new file mode 100644
index 000000000..53945f715
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/logs/HEAD
@@ -0,0 +1,11 @@
+0000000000000000000000000000000000000000 43179dc93939196f59b25387b5e44e9e8794f84c Nika Layzell <nika@thelayzells.com> 1521306034 -0400 commit (initial): Brad <cto@company.xx>
+43179dc93939196f59b25387b5e44e9e8794f84c 3a1295dbc9234c0c5947c72803618c7112a01447 Nika Layzell <nika@thelayzells.com> 1521306086 -0400 commit: Brad L. <cto@company.xx>
+3a1295dbc9234c0c5947c72803618c7112a01447 a7054a4b356b3ecdec60cee66e50beaa5b863755 Nika Layzell <nika@thelayzells.com> 1521306181 -0400 commit: Some Dude <some@dude.xx>
+a7054a4b356b3ecdec60cee66e50beaa5b863755 95d03c49d94de67d5a05553a1bb22e78f7cdf5ca Nika Layzell <nika@thelayzells.com> 1521306222 -0400 commit: Other Author <other@author.xx>
+95d03c49d94de67d5a05553a1bb22e78f7cdf5ca 1e1212e7674820c17f7b8797aee7bf38ece0e838 Nika Layzell <nika@thelayzells.com> 1521306263 -0400 commit: nick3 <bugs@company.xx>
+1e1212e7674820c17f7b8797aee7bf38ece0e838 3f134546ae8fbe95a39dd20ea8c12b5fb0f48afb Nika Layzell <nika@thelayzells.com> 1521306341 -0400 commit: Other Author <other@author.xx>
+3f134546ae8fbe95a39dd20ea8c12b5fb0f48afb 50d69f4e64be2cff2cedde8f9b7f970257caf4dd Nika Layzell <nika@thelayzells.com> 1521306417 -0400 commit: Phil Hill <phil@company.xx>
+50d69f4e64be2cff2cedde8f9b7f970257caf4dd feef8f2135df4835496e4d576b1f1bd23510e1c5 Nika Layzell <nika@thelayzells.com> 1521306468 -0400 commit: Joseph <joseph@company.xx>
+feef8f2135df4835496e4d576b1f1bd23510e1c5 7ecbb98d860b304f622b38ce9ab8f08d14d981a8 Nika Layzell <nika@thelayzells.com> 1521306510 -0400 commit: Santa Claus <santa.claus@northpole.xx>
+7ecbb98d860b304f622b38ce9ab8f08d14d981a8 87ce8d4920a30ddb9547334e7c65806518863ff1 Nika Layzell <nika@thelayzells.com> 1521306549 -0400 commit: Charles <charles@charles.xx>
+87ce8d4920a30ddb9547334e7c65806518863ff1 7100e631fb4d5deba31fdc8acc98f4fb5c1573fd Nika Layzell <nika@thelayzells.com> 1521306767 -0400 commit: +.mailmap
diff --git a/tests/resources/mailmap/.gitted/logs/refs/heads/master b/tests/resources/mailmap/.gitted/logs/refs/heads/master
new file mode 100644
index 000000000..53945f715
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/logs/refs/heads/master
@@ -0,0 +1,11 @@
+0000000000000000000000000000000000000000 43179dc93939196f59b25387b5e44e9e8794f84c Nika Layzell <nika@thelayzells.com> 1521306034 -0400 commit (initial): Brad <cto@company.xx>
+43179dc93939196f59b25387b5e44e9e8794f84c 3a1295dbc9234c0c5947c72803618c7112a01447 Nika Layzell <nika@thelayzells.com> 1521306086 -0400 commit: Brad L. <cto@company.xx>
+3a1295dbc9234c0c5947c72803618c7112a01447 a7054a4b356b3ecdec60cee66e50beaa5b863755 Nika Layzell <nika@thelayzells.com> 1521306181 -0400 commit: Some Dude <some@dude.xx>
+a7054a4b356b3ecdec60cee66e50beaa5b863755 95d03c49d94de67d5a05553a1bb22e78f7cdf5ca Nika Layzell <nika@thelayzells.com> 1521306222 -0400 commit: Other Author <other@author.xx>
+95d03c49d94de67d5a05553a1bb22e78f7cdf5ca 1e1212e7674820c17f7b8797aee7bf38ece0e838 Nika Layzell <nika@thelayzells.com> 1521306263 -0400 commit: nick3 <bugs@company.xx>
+1e1212e7674820c17f7b8797aee7bf38ece0e838 3f134546ae8fbe95a39dd20ea8c12b5fb0f48afb Nika Layzell <nika@thelayzells.com> 1521306341 -0400 commit: Other Author <other@author.xx>
+3f134546ae8fbe95a39dd20ea8c12b5fb0f48afb 50d69f4e64be2cff2cedde8f9b7f970257caf4dd Nika Layzell <nika@thelayzells.com> 1521306417 -0400 commit: Phil Hill <phil@company.xx>
+50d69f4e64be2cff2cedde8f9b7f970257caf4dd feef8f2135df4835496e4d576b1f1bd23510e1c5 Nika Layzell <nika@thelayzells.com> 1521306468 -0400 commit: Joseph <joseph@company.xx>
+feef8f2135df4835496e4d576b1f1bd23510e1c5 7ecbb98d860b304f622b38ce9ab8f08d14d981a8 Nika Layzell <nika@thelayzells.com> 1521306510 -0400 commit: Santa Claus <santa.claus@northpole.xx>
+7ecbb98d860b304f622b38ce9ab8f08d14d981a8 87ce8d4920a30ddb9547334e7c65806518863ff1 Nika Layzell <nika@thelayzells.com> 1521306549 -0400 commit: Charles <charles@charles.xx>
+87ce8d4920a30ddb9547334e7c65806518863ff1 7100e631fb4d5deba31fdc8acc98f4fb5c1573fd Nika Layzell <nika@thelayzells.com> 1521306767 -0400 commit: +.mailmap
diff --git a/tests/resources/mailmap/.gitted/objects/00/1387531bed84262f137837125d4d998a9ba65d b/tests/resources/mailmap/.gitted/objects/00/1387531bed84262f137837125d4d998a9ba65d
new file mode 100644
index 000000000..1c564909a
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/00/1387531bed84262f137837125d4d998a9ba65d
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/02/7b2816ae0d7a08ba656d0417c09b4eac18cf00 b/tests/resources/mailmap/.gitted/objects/02/7b2816ae0d7a08ba656d0417c09b4eac18cf00
new file mode 100644
index 000000000..a4e8249af
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/02/7b2816ae0d7a08ba656d0417c09b4eac18cf00
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/09/20975110511365e56aec2263082d0c3d56d1fa b/tests/resources/mailmap/.gitted/objects/09/20975110511365e56aec2263082d0c3d56d1fa
new file mode 100644
index 000000000..49bceea46
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/09/20975110511365e56aec2263082d0c3d56d1fa
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/0c/d99501dfbec781a22ff7b84426b7bb308e709a b/tests/resources/mailmap/.gitted/objects/0c/d99501dfbec781a22ff7b84426b7bb308e709a
new file mode 100644
index 000000000..23149a4ee
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/0c/d99501dfbec781a22ff7b84426b7bb308e709a
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/1e/1212e7674820c17f7b8797aee7bf38ece0e838 b/tests/resources/mailmap/.gitted/objects/1e/1212e7674820c17f7b8797aee7bf38ece0e838
new file mode 100644
index 000000000..89a859807
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/1e/1212e7674820c17f7b8797aee7bf38ece0e838
@@ -0,0 +1,2 @@
+xu]
+0})f7iZ(;l#5zz |LDZ/@B:i8bc163,:h|BIKZ,49Ĕ}#rxeh~x{>`=YƊ*-:D뱢 Q^ohUEq߭3d>I \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/36/370b71f5aad1dd46bec5e14145280a843c9f49 b/tests/resources/mailmap/.gitted/objects/36/370b71f5aad1dd46bec5e14145280a843c9f49
new file mode 100644
index 000000000..5e8e3e596
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/36/370b71f5aad1dd46bec5e14145280a843c9f49
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/3a/1295dbc9234c0c5947c72803618c7112a01447 b/tests/resources/mailmap/.gitted/objects/3a/1295dbc9234c0c5947c72803618c7112a01447
new file mode 100644
index 000000000..347828cb6
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/3a/1295dbc9234c0c5947c72803618c7112a01447
@@ -0,0 +1,2 @@
+xmA
+0D]$m(";$??(-dV34*(V0.>H #TQEeNd+"t]j]P}hvl{g5$s]0P[yVRY?<0̋#,?s!5_ԏ$^H \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/3f/134546ae8fbe95a39dd20ea8c12b5fb0f48afb b/tests/resources/mailmap/.gitted/objects/3f/134546ae8fbe95a39dd20ea8c12b5fb0f48afb
new file mode 100644
index 000000000..489c6104d
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/3f/134546ae8fbe95a39dd20ea8c12b5fb0f48afb
@@ -0,0 +1,3 @@
+xmMn0) {lbGB(Teqcd\ zze^H<@s("6<{5G[t6PkqK
+mq(zg[K̶"Kv -; ʞ~FBﴼ 6
+vH)jX5iZёri3Zp֏iUeoO \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/43/179dc93939196f59b25387b5e44e9e8794f84c b/tests/resources/mailmap/.gitted/objects/43/179dc93939196f59b25387b5e44e9e8794f84c
new file mode 100644
index 000000000..2f3693aa6
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/43/179dc93939196f59b25387b5e44e9e8794f84c
@@ -0,0 +1,2 @@
+xmA
+0P9\4"ŵx1bHzzp?l aP6.'f-+ԕcU-:|ƋLCA<D:coc 7bYP5^¾ D듧 yK}xb_ˈA: \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/46/b5bb908c78b575cac9f9e6e42ff9ba3f769a46 b/tests/resources/mailmap/.gitted/objects/46/b5bb908c78b575cac9f9e6e42ff9ba3f769a46
new file mode 100644
index 000000000..62c9db041
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/46/b5bb908c78b575cac9f9e6e42ff9ba3f769a46
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/4b/4d2010ba256ef339c1d1854d20249da7478f01 b/tests/resources/mailmap/.gitted/objects/4b/4d2010ba256ef339c1d1854d20249da7478f01
new file mode 100644
index 000000000..169c7e7b4
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/4b/4d2010ba256ef339c1d1854d20249da7478f01
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/tests/resources/mailmap/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
new file mode 100644
index 000000000..adf64119a
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/4d/61d588546529ad27b2d77a3d6b05460ecb4be0 b/tests/resources/mailmap/.gitted/objects/4d/61d588546529ad27b2d77a3d6b05460ecb4be0
new file mode 100644
index 000000000..dabbf4ef3
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/4d/61d588546529ad27b2d77a3d6b05460ecb4be0
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/50/d69f4e64be2cff2cedde8f9b7f970257caf4dd b/tests/resources/mailmap/.gitted/objects/50/d69f4e64be2cff2cedde8f9b7f970257caf4dd
new file mode 100644
index 000000000..e6b337e1e
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/50/d69f4e64be2cff2cedde8f9b7f970257caf4dd
@@ -0,0 +1 @@
+xmMj0) HcBY+6e(Qt~>y m>&&ޓ=gOĞR Bֹ6Zy\&c%(-mp FJQ'8Eŷ2,%/ uS+8!4V7xiaVdϗLrU2k\z`KN \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/61/293f4c3d7500d227a755a7a8258e28e53449b2 b/tests/resources/mailmap/.gitted/objects/61/293f4c3d7500d227a755a7a8258e28e53449b2
new file mode 100644
index 000000000..409e6fd74
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/61/293f4c3d7500d227a755a7a8258e28e53449b2
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/62/7f0bd2f4fb5e949b79ba450d84676fa876b1c8 b/tests/resources/mailmap/.gitted/objects/62/7f0bd2f4fb5e949b79ba450d84676fa876b1c8
new file mode 100644
index 000000000..6009c30cd
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/62/7f0bd2f4fb5e949b79ba450d84676fa876b1c8
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/68/dfd5e5cb6138488680246d134f47ce559f4cf1 b/tests/resources/mailmap/.gitted/objects/68/dfd5e5cb6138488680246d134f47ce559f4cf1
new file mode 100644
index 000000000..ac5229f73
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/68/dfd5e5cb6138488680246d134f47ce559f4cf1
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/6c/dec08ab9bfcd5a3d889f27bbed650317e3ec13 b/tests/resources/mailmap/.gitted/objects/6c/dec08ab9bfcd5a3d889f27bbed650317e3ec13
new file mode 100644
index 000000000..856ba31f0
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/6c/dec08ab9bfcd5a3d889f27bbed650317e3ec13
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/71/00e631fb4d5deba31fdc8acc98f4fb5c1573fd b/tests/resources/mailmap/.gitted/objects/71/00e631fb4d5deba31fdc8acc98f4fb5c1573fd
new file mode 100644
index 000000000..3b20e6df2
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/71/00e631fb4d5deba31fdc8acc98f4fb5c1573fd
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/7e/cbb98d860b304f622b38ce9ab8f08d14d981a8 b/tests/resources/mailmap/.gitted/objects/7e/cbb98d860b304f622b38ce9ab8f08d14d981a8
new file mode 100644
index 000000000..53e775ee4
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/7e/cbb98d860b304f622b38ce9ab8f08d14d981a8
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/7e/e7b9a4a2a1eda925f6260338c063d8211d5ad5 b/tests/resources/mailmap/.gitted/objects/7e/e7b9a4a2a1eda925f6260338c063d8211d5ad5
new file mode 100644
index 000000000..0d4e94b29
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/7e/e7b9a4a2a1eda925f6260338c063d8211d5ad5
@@ -0,0 +1,2 @@
+x
+0D=+z* =~AFMMA޴m'sag+ XgEB[o$dtF;0(d=wb\R8k̫('8-Xޚk: 9ʋGm r</ ]hHS?9.p o3KљQ'" \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/83/714a9223f3e072b85f0d4301cd2081fff3acf2 b/tests/resources/mailmap/.gitted/objects/83/714a9223f3e072b85f0d4301cd2081fff3acf2
new file mode 100644
index 000000000..a50f87e48
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/83/714a9223f3e072b85f0d4301cd2081fff3acf2
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/87/ce8d4920a30ddb9547334e7c65806518863ff1 b/tests/resources/mailmap/.gitted/objects/87/ce8d4920a30ddb9547334e7c65806518863ff1
new file mode 100644
index 000000000..b8c480805
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/87/ce8d4920a30ddb9547334e7c65806518863ff1
@@ -0,0 +1,2 @@
+x}NKjC1 ڧd?=[PݖAe^KRt5f)0 >n1ZCeʚ
+XbM8E݇t; HVT3WR!Ų(7fN>rH_ _^'3e !nXûܾl]awXl}=GW=MV \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/8c/f0547fcb649b44ebaf39b8104982bb0abb4e69 b/tests/resources/mailmap/.gitted/objects/8c/f0547fcb649b44ebaf39b8104982bb0abb4e69
new file mode 100644
index 000000000..402a48e79
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/8c/f0547fcb649b44ebaf39b8104982bb0abb4e69
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/94/7ff75c33ac7941a32fe9900118b6ba85ab2be9 b/tests/resources/mailmap/.gitted/objects/94/7ff75c33ac7941a32fe9900118b6ba85ab2be9
new file mode 100644
index 000000000..8b23320fd
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/94/7ff75c33ac7941a32fe9900118b6ba85ab2be9
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/95/d03c49d94de67d5a05553a1bb22e78f7cdf5ca b/tests/resources/mailmap/.gitted/objects/95/d03c49d94de67d5a05553a1bb22e78f7cdf5ca
new file mode 100644
index 000000000..cd91a3f8c
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/95/d03c49d94de67d5a05553a1bb22e78f7cdf5ca
@@ -0,0 +1 @@
+xmKn0 D)x$R`h@tcğ@Qo7۲L/B Ad;s7I؏2.Vh1p$^fYHъ2t#[=m)ry[.>%`ia;Vtfǯ3kSC=CxWs|L \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/96/78a4325710507f7bf598a0fde5ebbd88148614 b/tests/resources/mailmap/.gitted/objects/96/78a4325710507f7bf598a0fde5ebbd88148614
new file mode 100644
index 000000000..887436602
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/96/78a4325710507f7bf598a0fde5ebbd88148614
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/a1/6db1cbb8817dddcf199c12d3c81221cf8eefc4 b/tests/resources/mailmap/.gitted/objects/a1/6db1cbb8817dddcf199c12d3c81221cf8eefc4
new file mode 100644
index 000000000..d23d8cc5f
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/a1/6db1cbb8817dddcf199c12d3c81221cf8eefc4
@@ -0,0 +1 @@
+x+)JMU06c040031QHI+(aUإV_+ \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/a7/054a4b356b3ecdec60cee66e50beaa5b863755 b/tests/resources/mailmap/.gitted/objects/a7/054a4b356b3ecdec60cee66e50beaa5b863755
new file mode 100644
index 000000000..06a3abc4f
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/a7/054a4b356b3ecdec60cee66e50beaa5b863755
@@ -0,0 +1,3 @@
+xmNKj0Z 4I`]lz44&[Jٽ/e
+G]E$|bIH]. 1!ՍW+&]I9jc3f^4G
+iF+eYaKe8' `|ETlǪp qnn_vh7uL_{zPG \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/objects/a7/eb40274887baeb01a958ead80d106b5977312c b/tests/resources/mailmap/.gitted/objects/a7/eb40274887baeb01a958ead80d106b5977312c
new file mode 100644
index 000000000..39f70c203
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/a7/eb40274887baeb01a958ead80d106b5977312c
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/c9/e5462de8ec453e94d85f26f64b80ea76fda6d4 b/tests/resources/mailmap/.gitted/objects/c9/e5462de8ec453e94d85f26f64b80ea76fda6d4
new file mode 100644
index 000000000..dbf952372
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/c9/e5462de8ec453e94d85f26f64b80ea76fda6d4
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/d3/e5e624cc7bfb09ac1960ebb6c458021b098f87 b/tests/resources/mailmap/.gitted/objects/d3/e5e624cc7bfb09ac1960ebb6c458021b098f87
new file mode 100644
index 000000000..c69ebe842
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/d3/e5e624cc7bfb09ac1960ebb6c458021b098f87
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/fe/dd34e8baffdb2acfe9a6860bf339287ca942bc b/tests/resources/mailmap/.gitted/objects/fe/dd34e8baffdb2acfe9a6860bf339287ca942bc
new file mode 100644
index 000000000..a13b83df8
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/fe/dd34e8baffdb2acfe9a6860bf339287ca942bc
Binary files differ
diff --git a/tests/resources/mailmap/.gitted/objects/fe/ef8f2135df4835496e4d576b1f1bd23510e1c5 b/tests/resources/mailmap/.gitted/objects/fe/ef8f2135df4835496e4d576b1f1bd23510e1c5
new file mode 100644
index 000000000..31f979bc1
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/objects/fe/ef8f2135df4835496e4d576b1f1bd23510e1c5
@@ -0,0 +1 @@
+xmK1]u%J 22/#7(4 ,`2x-QR) -+Thu#Aیi᱀U똳7 >^j#eLIЭti幃}}8 3jeCVYΗ=:j%]Ŀ,pK \ No newline at end of file
diff --git a/tests/resources/mailmap/.gitted/refs/heads/master b/tests/resources/mailmap/.gitted/refs/heads/master
new file mode 100644
index 000000000..0daf56a2e
--- /dev/null
+++ b/tests/resources/mailmap/.gitted/refs/heads/master
@@ -0,0 +1 @@
+7100e631fb4d5deba31fdc8acc98f4fb5c1573fd
diff --git a/tests/resources/mailmap/.mailmap b/tests/resources/mailmap/.mailmap
new file mode 100644
index 000000000..7da2ed605
--- /dev/null
+++ b/tests/resources/mailmap/.mailmap
@@ -0,0 +1,9 @@
+# Simple Comment line
+<cto@company.xx> <cto@coompany.xx>
+Some Dude <some@dude.xx> nick1 <bugs@company.xx>
+Other Author <other@author.xx> nick2 <bugs@company.xx>
+Other Author <other@author.xx> <nick2@company.xx>
+Phil Hill <phil@company.xx> # Comment at end of line
+<joseph@company.xx> Joseph <bugs@company.xx>
+Santa Claus <santa.claus@northpole.xx> <me@company.xx>
+Untracked <untracked@company.xx>
diff --git a/tests/resources/mailmap/file.txt b/tests/resources/mailmap/file.txt
new file mode 100644
index 000000000..68dfd5e5c
--- /dev/null
+++ b/tests/resources/mailmap/file.txt
@@ -0,0 +1,10 @@
+Added by Brad <cto@coompany.xx>
+Added by Brad L. <cto@coompany.xx>
+Added by nick1 <bugs@company.xx>
+Added by nick2 <bugs@company.xx>
+Added by nick3 <bugs@company.xx>
+Added by Some Garbage <nick2@company.xx>
+Added by unknown <phil@company.xx>
+Added by Joseph <bugs@company.xx>
+Added by Clause <me@company.xx>
+Added by Charles <charles@charles.xx>