% gitlog.sty
% Copyright 2015 Brent Longborough
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% The Current Maintainer of this work is Brent Longborough.
% -----------------------------------------------------
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gitlog}[2015/11/22 0.0.beta typeset git change log]
\RequirePackage{etoolbox}
\RequirePackage{kvoptions}
\RequirePackage[%	
    datamodel=gitlog,
	bibstyle=gitlog,
	sorting=none,
	date=iso8601,
	firstinits=true,
    defernumbers=true,
    backend=biber,
]{biblatex}

\SetupKeyvalOptions{family=gitlog,prefix=gitLog@}
\DeclareBoolOption[false]{date}
\DeclareComplementaryOption{nodate}{date}
\DeclareStringOption[Change Log]{title}
% write:
\DeclareBoolOption[true]{write}
\AddToKeyvalOption{gitlog}{write}{\def\gitLog@writeset{true}}
% nowrite:
\DeclareComplementaryOption{nowrite}{write}
\AddToKeyvalOption{gitlog}{nowrite}{\def\gitLog@writeset{true}}
% bibfile:
\DeclareStringOption{bibfile}
% set up github option depending on hyperref
\@ifpackageloaded{hyperref}{%
    \DeclareStringOption[]{github}
    \DeclareStringOption[]{bitbucket}
}{%
    \DeclareVoidOption{github}{%
        \PackageError{gitlog}{I can't generate GitHub links unless you load hyperref.}
    }
    \DeclareVoidOption{bitbucket}{%
        \PackageError{gitlog}{I can't generate Bitbucket links unless you load hyperref.}
    }
}
% process options:
\ProcessKeyvalOptions{gitlog}
% check if write/nowrite has been set:
\ifdef\gitLog@writeset
  {}
  {% write/nowrite option has not been set,
   % set boolean depending on value of \gitLog@bibfile:
    \ifdefempty\gitLog@bibfile
      {\booltrue{gitLog@write}}
      {\boolfalse{gitLog@write}}%
  }
% set default for bibfile if necessary
\ifdefempty\gitLog@bibfile
  {\def\gitLog@bibfile{\jobname.gitlog.bib}}{}
% make entrykey a link if github link requested
\DeclareFieldFormat{entrykey}{\ttfamily[#1]}
\@ifpackageloaded{hyperref}{%
    \ifdefempty\gitLog@github{}{%
        \DeclareFieldFormat{entrykey}{%
            \href{https://github.com/\gitLog@github/commit/\thefield{commithash}}{\ttfamily[#1]}%
        }
    }
    \ifdefempty\gitLog@bitbucket{}{%
        \DeclareFieldFormat{entrykey}{%
            \href{https://bitbucket.org/\gitLog@bitbucket/commits/\thefield{commithash}}{\ttfamily[#1]}%
        }
    }
}{}
\newcommand{\printGitLog}{%
    \nocite{*}
    \raggedright
    \printbibliography[title={\gitLog@title},type=gitcommit]
}
\ifgitLog@date
    \newbibmacro*{date+author}{%
        \printtext{\\}%
        \usebibmacro{date}%
        \setunit*{, }%
        \usebibmacro{author}%
    }
\else
    \newbibmacro*{date+author}{%
        \relax
    }
\fi
\ifgitLog@write
    {\catcode`\%=12
    \immediate\write18{
     git --no-pager log --reverse --pretty="format:@gitcommit{%h,%n 
     author = {%an},%n 
     date = {%ad},%n 
     title = {%B},%n
     commithash = {%H} 
     }" --date=short > \gitLog@bibfile}
    }
\else
    \relax
\fi
\addbibresource{\gitLog@bibfile}
