{ ... }:

{
  # Enable GIT.
  programs.git = {
    enable = true;

    aliases = {
      # List aliases
      aliases = "config --get-regexp alias";

      # List all the contributors with commit amount
      contributors = "shortlog --summary --numbered";

      # Output verbose info about branches and tags
      branches = "branch -avv";

      # List all tags
      tags = "tag -l";

      # Pretty logs
      plog = "log --graph --decorate --all";

      # Pretty grep
      gcommit = "log --graph --decorate --grep";
    };

    extraConfig = {
      core = {
        # Set the editor to be used by GIT
        editor = "nvim";

        # Custom .gitignore
        excludesfile = "~/.gitignore";

        # Treat trailing whitespaces and spaces before tabs as an error
        whitespace = "space-before-tab,-indent-with-non-tab,trailing-space";
      };

      color = {
        # Use colors in GIT commmands.
        ui = "auto";
      };

      commit = {
        # https://help.github.com/articles/signing-commits-using-gpg/
        gpgsign = true;
      };

      tag = {
        gpgsign = true;
      };

      difftool = {
        prompt = true;
      };

      mergetool = {
        # https://www.git-scm.com/docs/git-mergetool#Documentation/git-mergetool.txt---no-prompt
        prompt = false;
      };

      merge = {
        # https://git-scm.com/docs/git-merge#_how_conflicts_are_presented
        conflictstyle = "diff3";
      };

      push = {
        # https://stackoverflow.com/questions/21839651/git-what-is-the-difference-between-push-default-matching-and-simple
        default = "simple";

        # git-push pushes relevant annotated tags when pushing branches out
        followTags = true;
      };

      user = {
        name = "Alexandre Cavalheiro S. Tiago da Silva";
        email = "contact@thewizard.link";
        signingkey = "A1D3A2B4E14BD7C0445BB749A5767B54367CFBDF";
      };

      pull = {
        ff = "only";
      };

      init = {
        defaultBranch = "main";
      };

      credential = {
        helper = "/usr/libexec/git-core/git-credential-libsecret";
      };
    };
  };
}