Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > a0995fd4c38add851d8e9994a3499e40 > files > 617

ghc-darcs-devel-2.4.4-3.fc14.x86_64.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>src/Darcs/Commands/Annotate.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%  Copyright (C) 2003 David Roundy
%
%  This program is free software; you can redistribute it and/or modify
%  it under the terms of the GNU General Public License as published by
%  the Free Software Foundation; either version 2, or (at your option)
%  any later version.
%
%  This program is distributed in the hope that it will be useful,
%  but WITHOUT ANY WARRANTY; without even the implied warranty of
%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%  GNU General Public License for more details.
%
%  You should have received a copy of the GNU General Public License
%  along with this program; see the file COPYING.  If not, write to
%  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
%  Boston, MA 02110-1301, USA.

\darcsCommand{annotate}
\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# OPTIONS_GHC -cpp #-}</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-cpp'>#include "gadts.h"</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Commands</span><span class='hs-varop'>.</span><span class='hs-conid'>Annotate</span> <span class='hs-layout'>(</span> <span class='hs-varid'>annotate</span><span class='hs-layout'>,</span> <span class='hs-varid'>createdAsXml</span> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span> <span class='hs-varid'>when</span> <span class='hs-layout'>)</span>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span> <span class='hs-varid'>sort</span> <span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Commands</span> <span class='hs-layout'>(</span> <span class='hs-conid'>DarcsCommand</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>nodefaults</span> <span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Arguments</span> <span class='hs-layout'>(</span> <span class='hs-conid'>DarcsFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>workingRepoDir</span><span class='hs-layout'>,</span>
<a name="line-13"></a>                         <span class='hs-varid'>summary</span><span class='hs-layout'>,</span> <span class='hs-varid'>unified</span><span class='hs-layout'>,</span> <span class='hs-varid'>humanReadable</span><span class='hs-layout'>,</span>
<a name="line-14"></a>                        <span class='hs-varid'>xmloutput</span><span class='hs-layout'>,</span> <span class='hs-varid'>creatorhash</span><span class='hs-layout'>,</span>
<a name="line-15"></a>                        <span class='hs-varid'>fixSubPaths</span><span class='hs-layout'>,</span>
<a name="line-16"></a>                        <span class='hs-varid'>listRegisteredFiles</span><span class='hs-layout'>,</span>
<a name="line-17"></a>                        <span class='hs-varid'>matchOne</span><span class='hs-layout'>,</span>
<a name="line-18"></a>                      <span class='hs-layout'>)</span>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Flags</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isUnified</span> <span class='hs-layout'>)</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Storage</span><span class='hs-varop'>.</span><span class='hs-conid'>Hashed</span><span class='hs-varop'>.</span><span class='hs-conid'>Plain</span><span class='hs-layout'>(</span> <span class='hs-varid'>readPlainTree</span> <span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Repository</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Repository</span><span class='hs-layout'>,</span> <span class='hs-conid'>PatchSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>amInRepository</span><span class='hs-layout'>,</span> <span class='hs-varid'>withRepository</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$-</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>read_repo</span><span class='hs-layout'>,</span>
<a name="line-22"></a>                          <span class='hs-varid'>getMarkedupFile</span> <span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span> <span class='hs-layout'>(</span> <span class='hs-conid'>RepoPatch</span><span class='hs-layout'>,</span> <span class='hs-conid'>Named</span><span class='hs-layout'>,</span> <span class='hs-conid'>LineMark</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>patch2patchinfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>xmlSummary</span> <span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span> <span class='hs-layout'>(</span> <span class='hs-varid'>summary</span> <span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Witnesses</span><span class='hs-varop'>.</span><span class='hs-conid'>Ordered</span> <span class='hs-layout'>(</span> <span class='hs-varid'>mapRL</span><span class='hs-layout'>,</span> <span class='hs-varid'>concatRL</span> <span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Char8</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>BC</span> <span class='hs-layout'>(</span> <span class='hs-varid'>unpack</span><span class='hs-layout'>,</span> <span class='hs-conid'>ByteString</span> <span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>PrintPatch</span> <span class='hs-layout'>(</span> <span class='hs-varid'>printPatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>contextualPrintPatch</span> <span class='hs-layout'>)</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-conid'>Info</span> <span class='hs-layout'>(</span> <span class='hs-conid'>PatchInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>human_friendly</span><span class='hs-layout'>,</span> <span class='hs-varid'>to_xml</span><span class='hs-layout'>,</span> <span class='hs-varid'>make_filename</span><span class='hs-layout'>,</span>
<a name="line-29"></a>                   <span class='hs-varid'>showPatchInfo</span> <span class='hs-layout'>)</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>PopulationData</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Population</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>PopTree</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>DirMark</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-31"></a>                        <span class='hs-varid'>nameI</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifiedByI</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifiedHowI</span><span class='hs-layout'>,</span>
<a name="line-32"></a>                        <span class='hs-varid'>createdByI</span><span class='hs-layout'>,</span> <span class='hs-varid'>creationNameI</span><span class='hs-layout'>,</span>
<a name="line-33"></a>                      <span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Population</span> <span class='hs-layout'>(</span> <span class='hs-varid'>getRepoPopVersion</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookup_pop</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookup_creation_pop</span><span class='hs-layout'>,</span>
<a name="line-35"></a>                    <span class='hs-varid'>modified_to_xml</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                  <span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Hopefully</span> <span class='hs-layout'>(</span> <span class='hs-varid'>info</span> <span class='hs-layout'>)</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>RepoPath</span> <span class='hs-layout'>(</span> <span class='hs-conid'>SubPath</span><span class='hs-layout'>,</span> <span class='hs-varid'>toFilePath</span> <span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Match</span> <span class='hs-layout'>(</span> <span class='hs-varid'>matchPatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>haveNonrangeMatch</span><span class='hs-layout'>,</span> <span class='hs-varid'>getFirstMatch</span> <span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Lock</span> <span class='hs-layout'>(</span> <span class='hs-varid'>withTempDir</span> <span class='hs-layout'>)</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Witnesses</span><span class='hs-varop'>.</span><span class='hs-conid'>Sealed</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Sealed2</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>unseal2</span> <span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Printer</span> <span class='hs-layout'>(</span> <span class='hs-varid'>putDocLn</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span><span class='hs-layout'>,</span> <span class='hs-varid'>errorDoc</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>prefix</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;+&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-43"></a>                 <span class='hs-conid'>Doc</span><span class='hs-layout'>,</span> <span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-varid'>vcat</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderString</span><span class='hs-layout'>,</span> <span class='hs-varid'>packedString</span> <span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-cpp'>#include "impossible.h"</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="annotateDescription"></a><span class='hs-definition'>annotateDescription</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>
<a name="line-47"></a><span class='hs-definition'>annotateDescription</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Display which patch last modified something."</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="annotateHelp"></a><span class='hs-definition'>annotateHelp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>
<a name="line-50"></a><span class='hs-definition'>annotateHelp</span> <span class='hs-keyglyph'>=</span>
<a name="line-51"></a> <span class='hs-str'>"The `darcs annotate' command provides two unrelated operations.  When\n"</span> <span class='hs-varop'>++</span>
<a name="line-52"></a> <span class='hs-str'>"called on a file, it will find the patch that last modified each line\n"</span> <span class='hs-varop'>++</span>
<a name="line-53"></a> <span class='hs-str'>"in that file.  When called on a patch (e.g. using --patch), it will\n"</span> <span class='hs-varop'>++</span>
<a name="line-54"></a> <span class='hs-str'>"print the internal representation of that patch.\n"</span> <span class='hs-varop'>++</span>
<a name="line-55"></a> <span class='hs-str'>"\n"</span> <span class='hs-varop'>++</span>
<a name="line-56"></a> <span class='hs-str'>"The --summary option will result in a summarized patch annotation,\n"</span> <span class='hs-varop'>++</span>
<a name="line-57"></a> <span class='hs-str'>"similar to `darcs whatsnew'.  It has no effect on file annotations.\n"</span> <span class='hs-varop'>++</span>
<a name="line-58"></a> <span class='hs-str'>"\n"</span> <span class='hs-varop'>++</span>
<a name="line-59"></a> <span class='hs-str'>"By default, output is in a human-readable format.  The --xml-output\n"</span> <span class='hs-varop'>++</span>
<a name="line-60"></a> <span class='hs-str'>"option can be used to generate output for machine postprocessing.\n"</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="annotate"></a><span class='hs-definition'>annotate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DarcsCommand</span>
<a name="line-63"></a><span class='hs-definition'>annotate</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DarcsCommand</span> <span class='hs-layout'>{</span><span class='hs-varid'>commandName</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"annotate"</span><span class='hs-layout'>,</span>
<a name="line-64"></a>                         <span class='hs-varid'>commandHelp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>annotateHelp</span><span class='hs-layout'>,</span>
<a name="line-65"></a>                         <span class='hs-varid'>commandDescription</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>annotateDescription</span><span class='hs-layout'>,</span>
<a name="line-66"></a>                         <span class='hs-varid'>commandExtraArgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>,</span>
<a name="line-67"></a>                         <span class='hs-varid'>commandExtraArgHelp</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"[FILE or DIRECTORY]..."</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-68"></a>                         <span class='hs-varid'>commandCommand</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>annotateCmd</span><span class='hs-layout'>,</span>
<a name="line-69"></a>                         <span class='hs-varid'>commandPrereq</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>amInRepository</span><span class='hs-layout'>,</span>
<a name="line-70"></a>                         <span class='hs-varid'>commandGetArgPossibilities</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>listRegisteredFiles</span><span class='hs-layout'>,</span>
<a name="line-71"></a>                         <span class='hs-varid'>commandArgdefaults</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nodefaults</span><span class='hs-layout'>,</span>
<a name="line-72"></a>                         <span class='hs-varid'>commandAdvancedOptions</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-73"></a>                         <span class='hs-varid'>commandBasicOptions</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>summary</span><span class='hs-layout'>,</span><span class='hs-varid'>unified</span><span class='hs-layout'>,</span>
<a name="line-74"></a>                                                 <span class='hs-varid'>humanReadable</span><span class='hs-layout'>,</span>
<a name="line-75"></a>                                                 <span class='hs-varid'>xmloutput</span><span class='hs-layout'>,</span>
<a name="line-76"></a>                                                 <span class='hs-varid'>matchOne</span><span class='hs-layout'>,</span> <span class='hs-varid'>creatorhash</span><span class='hs-layout'>,</span>
<a name="line-77"></a>                                                 <span class='hs-varid'>workingRepoDir</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>}</span>
<a name="line-78"></a>
</pre>\end{code}
%% FIXME: AFAICT -u does nothing.  Remove it from anno's options?
%% --twb, 2009-09-20
Giving the \verb!--unified! flag implies \verb!--human-readable!, and causes
the output to remain in a darcs-specific format that is similar to that produced
by \verb!diff --unified!.
\begin{code}
<pre><a name="line-1"></a><a name="annotateCmd"></a><span class='hs-definition'>annotateCmd</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-2"></a><span class='hs-definition'>annotateCmd</span> <span class='hs-varid'>opts</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRepository</span> <span class='hs-varid'>opts</span> <span class='hs-varop'>$-</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>repository</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>$</span> <span class='hs-varid'>haveNonrangeMatch</span> <span class='hs-varid'>opts</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-4"></a>      <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Annotate requires either a patch pattern or a "</span> <span class='hs-varop'>++</span>
<a name="line-5"></a>               <span class='hs-str'>"file or directory argument."</span>
<a name="line-6"></a>  <span class='hs-conid'>Sealed2</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>matchPatch</span> <span class='hs-varid'>opts</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>read_repo</span> <span class='hs-varid'>repository</span>
<a name="line-7"></a>  <span class='hs-keyword'>if</span> <span class='hs-conid'>Summary</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span>
<a name="line-8"></a>     <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>showpi</span> <span class='hs-varop'>$</span> <span class='hs-varid'>patch2patchinfo</span> <span class='hs-varid'>p</span>
<a name="line-9"></a>             <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>show_summary</span> <span class='hs-varid'>p</span>
<a name="line-10"></a>     <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isUnified</span> <span class='hs-varid'>opts</span>
<a name="line-11"></a>          <span class='hs-keyword'>then</span> <span class='hs-varid'>withTempDir</span> <span class='hs-str'>"context"</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-12"></a>               <span class='hs-keyword'>do</span> <span class='hs-varid'>getFirstMatch</span> <span class='hs-varid'>repository</span> <span class='hs-varid'>opts</span>
<a name="line-13"></a>                  <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPlainTree</span> <span class='hs-str'>"."</span>
<a name="line-14"></a>                  <span class='hs-varid'>contextualPrintPatch</span> <span class='hs-varid'>c</span> <span class='hs-varid'>p</span>
<a name="line-15"></a>          <span class='hs-keyword'>else</span> <span class='hs-varid'>printPatch</span> <span class='hs-varid'>p</span>
<a name="line-16"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>showpi</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachineReadable</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showPatchInfo</span>
<a name="line-17"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-conid'>XMLOutput</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>to_xml</span>
<a name="line-18"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>human_friendly</span>
<a name="line-19"></a>          <span class='hs-varid'>show_summary</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Named</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-20"></a>          <span class='hs-varid'>show_summary</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-conid'>XMLOutput</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span>
<a name="line-21"></a>                         <span class='hs-keyword'>then</span> <span class='hs-varid'>xmlSummary</span>
<a name="line-22"></a>                         <span class='hs-keyword'>else</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Patch</span><span class='hs-varop'>.</span><span class='hs-varid'>summary</span>
</pre>\end{code}

If a directory name is given, annotate will output details of the last
modifying patch for each file in the directory and the directory itself. The
details look like this:

\begin{verbatim}
 # Created by [bounce handling patch
 # mark**20040526202216]  as ./test/m7/bounce_handling.pl
    bounce_handling.pl
\end{verbatim}

If a patch name and a directory are given, these details are output for the time after
that patch was applied.  If a directory and a tag name are given, the
details of the patches involved in the specified tagged version will be output.
\begin{code}
<pre><a name="line-1"></a><a name="annotateCmd"></a><span class='hs-definition'>annotateCmd</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>args</span><span class='hs-keyglyph'>@</span><span class='hs-keyglyph'>[</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRepository</span> <span class='hs-varid'>opts</span> <span class='hs-varop'>$-</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>repository</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-2"></a>  <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_repo</span> <span class='hs-varid'>repository</span>
<a name="line-3"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>rel_file_or_directory</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fixSubPaths</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>args</span>
<a name="line-4"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>file_or_directory</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rel_file_or_directory</span>
<a name="line-5"></a>  <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>haveNonrangeMatch</span> <span class='hs-varid'>opts</span>
<a name="line-6"></a>           <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>patch2patchinfo</span> <span class='hs-varop'>`unseal2`</span> <span class='hs-layout'>(</span><span class='hs-varid'>matchPatch</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-7"></a>           <span class='hs-keyword'>else</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mapRL</span> <span class='hs-varid'>info</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concatRL</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-8"></a>                <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Annotate does not currently work correctly on empty repositories."</span>
<a name="line-9"></a>                <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-10"></a>  <span class='hs-varid'>pop</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getRepoPopVersion</span> <span class='hs-str'>"."</span> <span class='hs-varid'>pinfo</span>
<a name="line-11"></a>
<a name="line-12"></a>  <span class='hs-comment'>-- deal with --creator-hash option</span>
<a name="line-13"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>maybe_creation_pi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findCreationPatchinfo</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>r</span>
<a name="line-14"></a>      <span class='hs-varid'>lookup_thing</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>maybe_creation_pi</span> <span class='hs-keyword'>of</span>
<a name="line-15"></a>                     <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>lookup_pop</span>
<a name="line-16"></a>                     <span class='hs-conid'>Just</span> <span class='hs-varid'>cp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>lookup_creation_pop</span> <span class='hs-varid'>cp</span>
<a name="line-17"></a>
<a name="line-18"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>file_or_directory</span> <span class='hs-varop'>==</span> <span class='hs-str'>""</span>
<a name="line-19"></a>    <span class='hs-keyword'>then</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>pop</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pop</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>pt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>annotatePop</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>pt</span>
<a name="line-20"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookup_thing</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>file_or_directory</span><span class='hs-layout'>)</span> <span class='hs-varid'>pop</span> <span class='hs-keyword'>of</span>
<a name="line-21"></a>      <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"There is no file or directory named '"</span><span class='hs-varop'>++</span>
<a name="line-22"></a>                 <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>file_or_directory</span><span class='hs-varop'>++</span><span class='hs-str'>"'"</span>
<a name="line-23"></a>      <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pop</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>pt</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-24"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>modifiedHowI</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-conid'>RemovedDir</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>i</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-25"></a>              <span class='hs-varid'>errorDoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-str'>"The directory '"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>rel_file_or_directory</span> <span class='hs-varop'>++</span>
<a name="line-26"></a>                               <span class='hs-str'>"' was removed by"</span><span class='hs-layout'>)</span>
<a name="line-27"></a>                      <span class='hs-varop'>$$</span> <span class='hs-varid'>human_friendly</span> <span class='hs-layout'>(</span><span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-28"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>annotatePop</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>pt</span>
<a name="line-29"></a>      <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pop</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>pt</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-30"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>modifiedHowI</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-conid'>RemovedFile</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>i</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-31"></a>              <span class='hs-varid'>errorDoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-str'>"The file '"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>rel_file_or_directory</span> <span class='hs-varop'>++</span>
<a name="line-32"></a>                               <span class='hs-str'>"' was removed by"</span><span class='hs-layout'>)</span>
<a name="line-33"></a>                      <span class='hs-varop'>$$</span> <span class='hs-varid'>human_friendly</span> <span class='hs-layout'>(</span><span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-34"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>annotateFile</span> <span class='hs-varid'>repository</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>file_or_directory</span> <span class='hs-varid'>pt</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-definition'>annotateCmd</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"annotate accepts at most one argument"</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="annotatePop"></a><span class='hs-definition'>annotatePop</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-39"></a><span class='hs-definition'>annotatePop</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>pt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p2format</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>pt</span>
<a name="line-40"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>p2format</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-conid'>XMLOutput</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span>
<a name="line-41"></a>                     <span class='hs-keyword'>then</span> <span class='hs-varid'>p2xml</span>
<a name="line-42"></a>                     <span class='hs-keyword'>else</span> <span class='hs-varid'>p2s</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="indent"></a><span class='hs-definition'>indent</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Doc</span><span class='hs-keyglyph'>]</span>
<a name="line-45"></a><span class='hs-comment'>-- This is a bit nasty:</span>
<a name="line-46"></a><span class='hs-definition'>indent</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-varop'>.</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>lines</span> <span class='hs-varop'>.</span> <span class='hs-varid'>renderString</span>
<a name="line-47"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>i</span> <span class='hs-str'>""</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>""</span>
<a name="line-48"></a>          <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-chr'>'#'</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-chr'>'#'</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-49"></a>          <span class='hs-varid'>i</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"    "</span><span class='hs-varop'>++</span><span class='hs-varid'>s</span>
<a name="line-50"></a>
<a name="line-51"></a><a name="p2s"></a><span class='hs-comment'>-- Annotate a directory listing</span>
<a name="line-52"></a><span class='hs-definition'>p2s</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-53"></a><span class='hs-definition'>p2s</span> <span class='hs-varid'>pinfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-54"></a>    <span class='hs-varid'>created_str</span>
<a name="line-55"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>file_change</span>
<a name="line-56"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>packedString</span> <span class='hs-varop'>$</span> <span class='hs-varid'>nameI</span> <span class='hs-varid'>inf</span>
<a name="line-57"></a>          <span class='hs-varid'>file_created</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Created by"</span>
<a name="line-58"></a>                     <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-59"></a>                     <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"as"</span>
<a name="line-60"></a>                     <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>packedString</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>creationNameI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-61"></a>          <span class='hs-varid'>created_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>prefix</span> <span class='hs-str'>"# "</span> <span class='hs-varid'>file_created</span>
<a name="line-62"></a>          <span class='hs-varid'>file_change</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>inf</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span>
<a name="line-63"></a>                        <span class='hs-keyword'>then</span> <span class='hs-varid'>text</span> <span class='hs-varop'>$</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>modifiedHowI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-64"></a>                        <span class='hs-keyword'>else</span> <span class='hs-varid'>empty</span>
<a name="line-65"></a><span class='hs-definition'>p2s</span> <span class='hs-varid'>pinfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>inf</span> <span class='hs-varid'>pops</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-66"></a>    <span class='hs-varid'>created_str</span>
<a name="line-67"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>dir</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>dir_change</span>
<a name="line-68"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-varop'>.</span> <span class='hs-varid'>indent</span> <span class='hs-varop'>.</span> <span class='hs-varid'>p2s</span> <span class='hs-varid'>pinfo</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>sort</span> <span class='hs-varid'>pops</span><span class='hs-layout'>)</span>
<a name="line-69"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>dir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>packedString</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"/"</span>
<a name="line-70"></a>          <span class='hs-varid'>dir_created</span> <span class='hs-keyglyph'>=</span>
<a name="line-71"></a>              <span class='hs-keyword'>if</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>Nothing</span>
<a name="line-72"></a>              <span class='hs-keyword'>then</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Created by "</span>
<a name="line-73"></a>               <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-74"></a>               <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"as"</span>
<a name="line-75"></a>               <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>packedString</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>creationNameI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"/"</span>
<a name="line-76"></a>              <span class='hs-keyword'>else</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Root directory"</span>
<a name="line-77"></a>          <span class='hs-varid'>created_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>prefix</span> <span class='hs-str'>"# "</span> <span class='hs-varid'>dir_created</span>
<a name="line-78"></a>          <span class='hs-varid'>dir_change</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>modifiedByI</span> <span class='hs-varid'>inf</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span>
<a name="line-79"></a>                       <span class='hs-keyword'>then</span> <span class='hs-varid'>text</span> <span class='hs-varop'>$</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>modifiedHowI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-80"></a>                       <span class='hs-keyword'>else</span> <span class='hs-varid'>empty</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="escapeXML"></a><span class='hs-definition'>escapeXML</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-83"></a><span class='hs-definition'>escapeXML</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-varop'>.</span> <span class='hs-varid'>strReplace</span> <span class='hs-chr'>'\''</span> <span class='hs-str'>"&amp;apos;"</span> <span class='hs-varop'>.</span> <span class='hs-varid'>strReplace</span> <span class='hs-chr'>'"'</span> <span class='hs-str'>"&amp;quot;"</span> <span class='hs-varop'>.</span>
<a name="line-84"></a>  <span class='hs-varid'>strReplace</span> <span class='hs-chr'>'&gt;'</span> <span class='hs-str'>"&amp;gt;"</span> <span class='hs-varop'>.</span> <span class='hs-varid'>strReplace</span> <span class='hs-chr'>'&lt;'</span> <span class='hs-str'>"&amp;lt;"</span> <span class='hs-varop'>.</span> <span class='hs-varid'>strReplace</span> <span class='hs-chr'>'&amp;'</span> <span class='hs-str'>"&amp;amp;"</span>
<a name="line-85"></a>
<a name="line-86"></a><a name="strReplace"></a><span class='hs-definition'>strReplace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-87"></a><span class='hs-definition'>strReplace</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-88"></a><span class='hs-definition'>strReplace</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>z</span><span class='hs-conop'>:</span><span class='hs-varid'>zs</span><span class='hs-layout'>)</span>
<a name="line-89"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>z</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>y</span> <span class='hs-varop'>++</span> <span class='hs-layout'>(</span><span class='hs-varid'>strReplace</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span>
<a name="line-90"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <span class='hs-conop'>:</span> <span class='hs-layout'>(</span><span class='hs-varid'>strReplace</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="createdAsXml"></a><span class='hs-definition'>createdAsXml</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-93"></a><span class='hs-definition'>createdAsXml</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyword'>as</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;created_as original_name='"</span>
<a name="line-94"></a>                       <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>escapeXML</span> <span class='hs-keyword'>as</span>
<a name="line-95"></a>                       <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"'&gt;"</span>
<a name="line-96"></a>                    <span class='hs-varop'>$$</span>    <span class='hs-varid'>to_xml</span> <span class='hs-varid'>pinfo</span>
<a name="line-97"></a>                    <span class='hs-varop'>$$</span>    <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/created_as&gt;"</span>
<a name="line-98"></a><span class='hs-comment'>--removed_by_xml :: PatchInfo -&gt; String</span>
<a name="line-99"></a><span class='hs-comment'>--removed_by_xml pinfo = "&lt;removed_by&gt;\n"++to_xml pinfo++"&lt;/removed_by&gt;\n"</span>
<a name="line-100"></a>
<a name="line-101"></a><a name="p2xmlOpen"></a><span class='hs-definition'>p2xmlOpen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-102"></a><span class='hs-definition'>p2xmlOpen</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-103"></a>    <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;file name='"</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>escapeXML</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"'&gt;"</span>
<a name="line-104"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>created</span>
<a name="line-105"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>modified</span>
<a name="line-106"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varop'>$</span> <span class='hs-varid'>nameI</span> <span class='hs-varid'>inf</span>
<a name="line-107"></a>          <span class='hs-varid'>created</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span> <span class='hs-keyword'>of</span>
<a name="line-108"></a>                    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>empty</span>
<a name="line-109"></a>                    <span class='hs-conid'>Just</span> <span class='hs-varid'>ci</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>createdAsXml</span> <span class='hs-varid'>ci</span>
<a name="line-110"></a>                               <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>creationNameI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-111"></a>          <span class='hs-varid'>modified</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modified_to_xml</span> <span class='hs-varid'>inf</span>
<a name="line-112"></a><span class='hs-definition'>p2xmlOpen</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-varid'>inf</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-113"></a>    <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;directory name='"</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>escapeXML</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"'&gt;"</span>
<a name="line-114"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>created</span>
<a name="line-115"></a> <span class='hs-varop'>$$</span> <span class='hs-varid'>modified</span>
<a name="line-116"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varop'>$</span> <span class='hs-varid'>nameI</span> <span class='hs-varid'>inf</span>
<a name="line-117"></a>          <span class='hs-varid'>created</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span> <span class='hs-keyword'>of</span>
<a name="line-118"></a>                    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>empty</span>
<a name="line-119"></a>                    <span class='hs-conid'>Just</span> <span class='hs-varid'>ci</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>createdAsXml</span> <span class='hs-varid'>ci</span>
<a name="line-120"></a>                               <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>creationNameI</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-121"></a>          <span class='hs-varid'>modified</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modified_to_xml</span> <span class='hs-varid'>inf</span>
<a name="line-122"></a>
<a name="line-123"></a><a name="p2xmlClose"></a><span class='hs-definition'>p2xmlClose</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-124"></a><span class='hs-definition'>p2xmlClose</span> <span class='hs-keyword'>_</span><span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/file&gt;"</span>
<a name="line-125"></a><span class='hs-definition'>p2xmlClose</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/directory&gt;"</span>
<a name="line-126"></a>
<a name="line-127"></a><a name="p2xml"></a><span class='hs-definition'>p2xml</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Doc</span>
<a name="line-128"></a><span class='hs-definition'>p2xml</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p2xmlOpen</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>p2xmlClose</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span>
<a name="line-129"></a><span class='hs-definition'>p2xml</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PopDir</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>pops</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p2xmlOpen</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span>
<a name="line-130"></a>                            <span class='hs-varop'>$$</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>p2xml</span> <span class='hs-varid'>pinf</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>sort</span> <span class='hs-varid'>pops</span><span class='hs-layout'>)</span>
<a name="line-131"></a>                            <span class='hs-varop'>$$</span> <span class='hs-varid'>p2xmlClose</span> <span class='hs-varid'>pinf</span> <span class='hs-varid'>p</span>
</pre>\end{code}

If a file name is given, the last modifying patch details of that file will be output, along
with markup indicating patch details when each line was last (and perhaps next) modified.

If a patch name and a file name are given, these details are output for the time after
that patch was applied.

\begin{code}
<pre><a name="line-1"></a><a name="annotateFile"></a><span class='hs-definition'>annotateFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RepoPatch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Repository</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>u</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SubPath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PopTree</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-2"></a><span class='hs-definition'>annotateFile</span> <span class='hs-varid'>repository</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>  <span class='hs-keyword'>if</span> <span class='hs-conid'>XMLOutput</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span>
<a name="line-4"></a>     <span class='hs-keyword'>then</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p2xmlOpen</span> <span class='hs-varid'>pinfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-5"></a>     <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>Nothing</span>
<a name="line-6"></a>          <span class='hs-keyword'>then</span> <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-str'>"File "</span><span class='hs-varop'>++</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-varop'>++</span><span class='hs-str'>" created by "</span><span class='hs-layout'>)</span>
<a name="line-7"></a>                     <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-varid'>ci</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-str'>" as "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>createdname</span><span class='hs-layout'>)</span>
<a name="line-8"></a>          <span class='hs-keyword'>else</span> <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-varop'>$</span> <span class='hs-str'>"File "</span><span class='hs-varop'>++</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span>
<a name="line-9"></a>  <span class='hs-varid'>mk</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getMarkedupFile</span> <span class='hs-varid'>repository</span> <span class='hs-varid'>ci</span> <span class='hs-varid'>createdname</span>
<a name="line-10"></a>  <span class='hs-varid'>old_pis</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-varid'>dropWhile</span> <span class='hs-layout'>(</span><span class='hs-varop'>/=</span> <span class='hs-varid'>pinfo</span><span class='hs-layout'>)</span><span class='hs-varop'>.</span><span class='hs-varid'>mapRL</span> <span class='hs-varid'>info</span><span class='hs-varop'>.</span><span class='hs-varid'>concatRL</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>read_repo</span> <span class='hs-varid'>repository</span>
<a name="line-11"></a>  <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>annotateMarkedup</span> <span class='hs-varid'>opts</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span><span class='hs-layout'>)</span> <span class='hs-varid'>mk</span>
<a name="line-12"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-conid'>XMLOutput</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>  <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p2xmlClose</span> <span class='hs-varid'>pinfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>PopFile</span> <span class='hs-varid'>inf</span><span class='hs-layout'>)</span>
<a name="line-13"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>ci</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>createdByI</span> <span class='hs-varid'>inf</span>
<a name="line-14"></a>        <span class='hs-varid'>createdname</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromJust</span> <span class='hs-varop'>$</span> <span class='hs-varid'>creationNameI</span> <span class='hs-varid'>inf</span>
<a name="line-15"></a><span class='hs-definition'>annotateFile</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>impossible</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="annotateMarkedup"></a><span class='hs-definition'>annotateMarkedup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PatchInfo</span><span class='hs-keyglyph'>]</span>
<a name="line-18"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>LineMark</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-19"></a><span class='hs-definition'>annotateMarkedup</span> <span class='hs-varid'>opts</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>XMLOutput</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>opts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>xmlMarkedup</span>
<a name="line-20"></a>                       <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>textMarkedup</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="textMarkedup"></a><span class='hs-definition'>textMarkedup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PatchInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>LineMark</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-23"></a><span class='hs-definition'>textMarkedup</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>None</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putLine</span> <span class='hs-chr'>' '</span> <span class='hs-varid'>l</span>
<a name="line-24"></a><span class='hs-definition'>textMarkedup</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>RemovedLine</span> <span class='hs-varid'>wheni</span><span class='hs-layout'>)</span>
<a name="line-25"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putLine</span> <span class='hs-chr'>'-'</span> <span class='hs-varid'>l</span>
<a name="line-26"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-27"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putLine</span> <span class='hs-chr'>' '</span> <span class='hs-varid'>l</span>
<a name="line-28"></a><span class='hs-definition'>textMarkedup</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>AddedLine</span> <span class='hs-varid'>wheni</span><span class='hs-layout'>)</span>
<a name="line-29"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putLine</span> <span class='hs-chr'>'+'</span> <span class='hs-varid'>l</span>
<a name="line-30"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Following line added by "</span>
<a name="line-31"></a>                                      <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-varid'>wheni</span>
<a name="line-32"></a>                                <span class='hs-varid'>putLine</span> <span class='hs-chr'>' '</span> <span class='hs-varid'>l</span>
<a name="line-33"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-34"></a><span class='hs-definition'>textMarkedup</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>AddedRemovedLine</span> <span class='hs-varid'>whenadd</span> <span class='hs-varid'>whenrem</span><span class='hs-layout'>)</span>
<a name="line-35"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>whenadd</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Following line removed by "</span>
<a name="line-36"></a>                                  <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-varid'>whenrem</span>
<a name="line-37"></a>                            <span class='hs-varid'>putLine</span> <span class='hs-chr'>'+'</span> <span class='hs-varid'>l</span>
<a name="line-38"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>whenrem</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Following line added by "</span>
<a name="line-39"></a>                                  <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-varid'>whenadd</span>
<a name="line-40"></a>                            <span class='hs-varid'>putLine</span> <span class='hs-chr'>'-'</span> <span class='hs-varid'>l</span>
<a name="line-41"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>whenadd</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>whenrem</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-42"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Following line removed by "</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-varid'>whenrem</span>
<a name="line-43"></a>           <span class='hs-varid'>putAnn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Following line added by "</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>showPatchInfo</span> <span class='hs-varid'>whenadd</span>
<a name="line-44"></a>           <span class='hs-varid'>putLine</span> <span class='hs-chr'>' '</span> <span class='hs-varid'>l</span>
<a name="line-45"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="putLine"></a><span class='hs-definition'>putLine</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-48"></a><span class='hs-definition'>putLine</span> <span class='hs-varid'>c</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putStrLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>c</span> <span class='hs-conop'>:</span> <span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>s</span>
<a name="line-49"></a><a name="putAnn"></a><span class='hs-definition'>putAnn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Doc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-50"></a><span class='hs-definition'>putAnn</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>prefix</span> <span class='hs-str'>"# "</span> <span class='hs-varid'>s</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="xmlMarkedup"></a><span class='hs-definition'>xmlMarkedup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PatchInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PatchInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>LineMark</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-53"></a><span class='hs-definition'>xmlMarkedup</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>None</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putLine</span> <span class='hs-chr'>' '</span> <span class='hs-varid'>l</span>
<a name="line-54"></a><span class='hs-definition'>xmlMarkedup</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>RemovedLine</span> <span class='hs-varid'>wheni</span><span class='hs-layout'>)</span>
<a name="line-55"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;removed_line&gt;"</span>
<a name="line-56"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-57"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/removed_line&gt;"</span>
<a name="line-58"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-59"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;normal_line&gt;"</span>
<a name="line-60"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;removed_by&gt;"</span>
<a name="line-61"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>to_xml</span> <span class='hs-varid'>wheni</span>
<a name="line-62"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/removed_by&gt;"</span>
<a name="line-63"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-64"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/normal_line&gt;"</span>
<a name="line-65"></a><span class='hs-definition'>xmlMarkedup</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>AddedLine</span> <span class='hs-varid'>wheni</span><span class='hs-layout'>)</span>
<a name="line-66"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;added_line&gt;"</span>
<a name="line-67"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-68"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/added_line&gt;"</span>
<a name="line-69"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wheni</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;normal_line&gt;"</span>
<a name="line-70"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;added_by&gt;"</span>
<a name="line-71"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>to_xml</span> <span class='hs-varid'>wheni</span>
<a name="line-72"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/added_by&gt;"</span>
<a name="line-73"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-74"></a>                             <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/normal_line&gt;"</span>
<a name="line-75"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-76"></a><span class='hs-definition'>xmlMarkedup</span> <span class='hs-varid'>pinfo</span> <span class='hs-varid'>old_pis</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>AddedRemovedLine</span> <span class='hs-varid'>whenadd</span> <span class='hs-varid'>whenrem</span><span class='hs-layout'>)</span>
<a name="line-77"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>whenadd</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>=</span>
<a name="line-78"></a>        <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;added_line&gt;"</span>
<a name="line-79"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;removed_by&gt;"</span>
<a name="line-80"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>to_xml</span> <span class='hs-varid'>whenrem</span>
<a name="line-81"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/removed_by&gt;"</span>
<a name="line-82"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-83"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/added_line&gt;"</span>
<a name="line-84"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>whenrem</span> <span class='hs-varop'>==</span> <span class='hs-varid'>pinfo</span> <span class='hs-keyglyph'>=</span>
<a name="line-85"></a>        <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;removed_line&gt;"</span>
<a name="line-86"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;added_by&gt;"</span>
<a name="line-87"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>to_xml</span> <span class='hs-varid'>whenadd</span>
<a name="line-88"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/added_by&gt;"</span>
<a name="line-89"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-90"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/removed_line&gt;"</span>
<a name="line-91"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>whenadd</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>whenrem</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>old_pis</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-92"></a>        <span class='hs-varid'>putDocLn</span> <span class='hs-varop'>$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;normal_line&gt;"</span>
<a name="line-93"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;removed_by&gt;"</span>
<a name="line-94"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>to_xml</span> <span class='hs-varid'>whenrem</span>
<a name="line-95"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/removed_by&gt;"</span>
<a name="line-96"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;added_by&gt;"</span>
<a name="line-97"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>to_xml</span> <span class='hs-varid'>whenadd</span>
<a name="line-98"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/added_by&gt;"</span>
<a name="line-99"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>escapeXML</span> <span class='hs-layout'>(</span><span class='hs-conid'>BC</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-100"></a>                <span class='hs-varop'>$$</span> <span class='hs-varid'>text</span> <span class='hs-str'>"&lt;/normal_line&gt;"</span>
<a name="line-101"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
</pre>\end{code}

\begin{options}
--creator-hash HASH
\end{options}

The \verb!--creator-hash! option should only be used in combination with a
file or directory to be annotated.  In this case, the name of that file or
directory is interpreted to be its name \emph{at the time it was created},
and the hash given along with \verb!--creator-hash! indicates the patch
that created the file or directory.  This allows you to (relatively) easily
examine a file even if it has been renamed multiple times.

\begin{code}
<pre><a name="line-1"></a><a name="findCreationPatchinfo"></a><span class='hs-definition'>findCreationPatchinfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DarcsFlag</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PatchSet</span> <span class='hs-varid'>p</span> <span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>PatchInfo</span>
<a name="line-2"></a><span class='hs-definition'>findCreationPatchinfo</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-3"></a><span class='hs-definition'>findCreationPatchinfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>CreatorHash</span> <span class='hs-varid'>h</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findHash</span> <span class='hs-varid'>h</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mapRL</span> <span class='hs-varid'>info</span> <span class='hs-varop'>$</span> <span class='hs-varid'>concatRL</span> <span class='hs-varid'>r</span>
<a name="line-4"></a><span class='hs-definition'>findCreationPatchinfo</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findCreationPatchinfo</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>r</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="findHash"></a><span class='hs-definition'>findHash</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PatchInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>PatchInfo</span>
<a name="line-7"></a><span class='hs-definition'>findHash</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-8"></a><span class='hs-definition'>findHash</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-varid'>pinf</span><span class='hs-conop'>:</span><span class='hs-varid'>pinfs</span><span class='hs-layout'>)</span>
<a name="line-9"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>make_filename</span> <span class='hs-varid'>pinf</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>pinf</span>
<a name="line-10"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findHash</span> <span class='hs-varid'>h</span> <span class='hs-varid'>pinfs</span>
</pre>\end{code}
</body>
</html>