Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > db7a4a658d190b3e658423135710c498 > files > 1027

ghc-darcs-devel-2.8.3-1.fc18.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!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://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Darcs/Lock.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-- Copyright (C) 2003 David Roundy</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-comment'>-- This program is free software; you can redistribute it and/or modify</span>
<a name="line-4"></a><span class='hs-comment'>-- it under the terms of the GNU General Public License as published by</span>
<a name="line-5"></a><span class='hs-comment'>-- the Free Software Foundation; either version 2, or (at your option)</span>
<a name="line-6"></a><span class='hs-comment'>-- any later version.</span>
<a name="line-7"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><span class='hs-comment'>-- This program is distributed in the hope that it will be useful,</span>
<a name="line-9"></a><span class='hs-comment'>-- but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="line-10"></a><span class='hs-comment'>-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="line-11"></a><span class='hs-comment'>-- GNU General Public License for more details.</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- You should have received a copy of the GNU General Public License</span>
<a name="line-14"></a><span class='hs-comment'>-- along with this program; see the file COPYING.  If not, write to</span>
<a name="line-15"></a><span class='hs-comment'>-- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span>
<a name="line-16"></a><span class='hs-comment'>-- Boston, MA 02110-1301, USA.</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-comment'>{-# LANGUAGE CPP, ForeignFunctionInterface #-}</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-keyword'>module</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'>withLock</span><span class='hs-layout'>,</span> <span class='hs-varid'>withLockCanFail</span><span class='hs-layout'>,</span>
<a name="line-21"></a>              <span class='hs-varid'>withTemp</span><span class='hs-layout'>,</span> <span class='hs-varid'>withOpenTemp</span><span class='hs-layout'>,</span> <span class='hs-varid'>withStdoutTemp</span><span class='hs-layout'>,</span>
<a name="line-22"></a>              <span class='hs-varid'>withTempDir</span><span class='hs-layout'>,</span> <span class='hs-varid'>withPermDir</span><span class='hs-layout'>,</span> <span class='hs-varid'>withDelayedDir</span><span class='hs-layout'>,</span> <span class='hs-varid'>withNamedTemp</span><span class='hs-layout'>,</span>
<a name="line-23"></a>              <span class='hs-varid'>writeToFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>appendToFile</span><span class='hs-layout'>,</span>
<a name="line-24"></a>              <span class='hs-varid'>writeBinFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeLocaleFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeDocBinFile</span><span class='hs-layout'>,</span>
<a name="line-25"></a>              <span class='hs-varid'>appendBinFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>appendDocBinFile</span><span class='hs-layout'>,</span>
<a name="line-26"></a>              <span class='hs-varid'>readBinFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>readLocaleFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>readDocBinFile</span><span class='hs-layout'>,</span>
<a name="line-27"></a>              <span class='hs-varid'>writeAtomicFilePS</span><span class='hs-layout'>,</span>
<a name="line-28"></a>              <span class='hs-varid'>gzWriteAtomicFilePS</span><span class='hs-layout'>,</span> <span class='hs-varid'>gzWriteAtomicFilePSs</span><span class='hs-layout'>,</span> <span class='hs-varid'>gzWriteDocFile</span><span class='hs-layout'>,</span>
<a name="line-29"></a>              <span class='hs-varid'>rmRecursive</span><span class='hs-layout'>,</span> <span class='hs-varid'>removeFileMayNotExist</span><span class='hs-layout'>,</span>
<a name="line-30"></a>              <span class='hs-varid'>canonFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeRelink</span><span class='hs-layout'>,</span>
<a name="line-31"></a>              <span class='hs-varid'>worldReadableTemp</span><span class='hs-layout'>,</span> <span class='hs-varid'>tempdirLoc</span><span class='hs-layout'>,</span>
<a name="line-32"></a>              <span class='hs-varid'>editText</span><span class='hs-layout'>,</span>
<a name="line-33"></a>              <span class='hs-varid'>environmentHelpTmpdir</span><span class='hs-layout'>,</span> <span class='hs-varid'>environmentHelpKeepTmpdir</span>
<a name="line-34"></a>            <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span> <span class='hs-varid'>catch</span> <span class='hs-layout'>)</span>
<a name="line-37"></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'>inits</span> <span class='hs-layout'>)</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isJust</span><span class='hs-layout'>,</span> <span class='hs-varid'>listToMaybe</span> <span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Exit</span> <span class='hs-layout'>(</span> <span class='hs-varid'>exitWith</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExitCode</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span> <span class='hs-layout'>(</span> <span class='hs-varid'>openBinaryFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>openBinaryTempFile</span><span class='hs-layout'>,</span>
<a name="line-41"></a>                   <span class='hs-varid'>hClose</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutStr</span><span class='hs-layout'>,</span> <span class='hs-conid'>Handle</span><span class='hs-layout'>,</span>
<a name="line-42"></a>                   <span class='hs-conid'>IOMode</span><span class='hs-layout'>(</span><span class='hs-conid'>WriteMode</span><span class='hs-layout'>,</span> <span class='hs-conid'>AppendMode</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>hFlush</span><span class='hs-layout'>,</span> <span class='hs-varid'>stdout</span> <span class='hs-layout'>)</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isDoesNotExistError</span><span class='hs-layout'>,</span> <span class='hs-varid'>isAlreadyExistsError</span> <span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span><span class='hs-varop'>.</span><span class='hs-conid'>Extensible</span>
<a name="line-45"></a>                         <span class='hs-layout'>(</span> <span class='hs-varid'>bracket</span><span class='hs-layout'>,</span> <span class='hs-varid'>throwIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>catch</span><span class='hs-layout'>,</span> <span class='hs-varid'>try</span><span class='hs-layout'>,</span> <span class='hs-conid'>SomeException</span> <span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Directory</span> <span class='hs-layout'>(</span> <span class='hs-varid'>removeFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>removeDirectory</span><span class='hs-layout'>,</span>
<a name="line-47"></a>                   <span class='hs-varid'>doesFileExist</span><span class='hs-layout'>,</span> <span class='hs-varid'>doesDirectoryExist</span><span class='hs-layout'>,</span>
<a name="line-48"></a>                   <span class='hs-varid'>getDirectoryContents</span><span class='hs-layout'>,</span> <span class='hs-varid'>createDirectory</span><span class='hs-layout'>,</span>
<a name="line-49"></a>                   <span class='hs-varid'>getTemporaryDirectory</span><span class='hs-layout'>,</span>
<a name="line-50"></a>                 <span class='hs-layout'>)</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>FilePath</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span> <span class='hs-layout'>(</span> <span class='hs-varid'>splitDirectories</span> <span class='hs-layout'>)</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Workaround</span> <span class='hs-layout'>(</span> <span class='hs-varid'>renameFile</span> <span class='hs-layout'>)</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span> <span class='hs-layout'>(</span> <span class='hs-varid'>withCurrentDirectory</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeGetEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>firstJustIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>runEditor</span> <span class='hs-layout'>)</span>
<a name="line-54"></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'>unless</span><span class='hs-layout'>,</span> <span class='hs-varid'>when</span> <span class='hs-layout'>)</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>URL</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isRelative</span> <span class='hs-layout'>)</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span> <span class='hs-layout'>(</span> <span class='hs-varid'>catchall</span><span class='hs-layout'>,</span> <span class='hs-varid'>addToErrorLoc</span> <span class='hs-layout'>)</span>
<a name="line-58"></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'>AbsolutePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>FilePathLike</span><span class='hs-layout'>,</span> <span class='hs-varid'>toFilePath</span><span class='hs-layout'>,</span>
<a name="line-59"></a>                        <span class='hs-varid'>getCurrentDirectory</span><span class='hs-layout'>,</span> <span class='hs-varid'>setCurrentDirectory</span> <span class='hs-layout'>)</span>
<a name="line-60"></a>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ByteStringUtils</span> <span class='hs-layout'>(</span> <span class='hs-varid'>gzWriteFilePSs</span><span class='hs-layout'>,</span> <span class='hs-varid'>decodeLocale</span><span class='hs-layout'>,</span> <span class='hs-varid'>encodeLocale</span> <span class='hs-layout'>)</span>
<a name="line-62"></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-keyword'>as</span> <span class='hs-conid'>B</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span><span class='hs-layout'>,</span> <span class='hs-varid'>readFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPut</span><span class='hs-layout'>,</span> <span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span>
<a name="line-63"></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>
<a name="line-64"></a>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>SignalHandler</span> <span class='hs-layout'>(</span> <span class='hs-varid'>withSignalsBlocked</span> <span class='hs-layout'>)</span>
<a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Printer</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Doc</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutDoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>packedString</span><span class='hs-layout'>,</span> <span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-varid'>renderPSs</span> <span class='hs-layout'>)</span>
<a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Global</span> <span class='hs-layout'>(</span> <span class='hs-varid'>atexit</span><span class='hs-layout'>,</span> <span class='hs-varid'>darcsdir</span> <span class='hs-layout'>)</span>
<a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Darcs</span><span class='hs-varop'>.</span><span class='hs-conid'>Compat</span> <span class='hs-layout'>(</span> <span class='hs-varid'>mkStdoutTemp</span><span class='hs-layout'>,</span> <span class='hs-varid'>canonFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeRelink</span><span class='hs-layout'>,</span>
<a name="line-69"></a>                <span class='hs-varid'>atomicCreate</span><span class='hs-layout'>,</span> <span class='hs-varid'>sloppyAtomicCreate</span> <span class='hs-layout'>)</span>
<a name="line-70"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span><span class='hs-varop'>.</span><span class='hs-conid'>Files</span> <span class='hs-layout'>(</span> <span class='hs-varid'>getSymbolicLinkStatus</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDirectory</span><span class='hs-layout'>,</span>
<a name="line-71"></a>                            <span class='hs-varid'>fileMode</span><span class='hs-layout'>,</span> <span class='hs-varid'>getFileStatus</span><span class='hs-layout'>,</span> <span class='hs-varid'>setFileMode</span> <span class='hs-layout'>)</span>
<a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span> <span class='hs-layout'>(</span> <span class='hs-varid'>sleep</span> <span class='hs-layout'>)</span>
<a name="line-73"></a><span class='hs-cpp'>#include "impossible.h"</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="withLock"></a><span class='hs-definition'>withLock</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-76"></a><a name="releaseLock"></a><span class='hs-definition'>releaseLock</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-77"></a>
<a name="line-78"></a><span class='hs-definition'>withLock</span> <span class='hs-varid'>s</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bracket</span> <span class='hs-layout'>(</span><span class='hs-varid'>getlock</span> <span class='hs-varid'>s</span> <span class='hs-num'>30</span><span class='hs-layout'>)</span> <span class='hs-varid'>releaseLock</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>job</span><span class='hs-layout'>)</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="withLockCanFail"></a><span class='hs-comment'>-- | Tries to perform some task if it can obtain the lock,</span>
<a name="line-81"></a><span class='hs-comment'>-- Otherwise, just gives up without doing the task</span>
<a name="line-82"></a><span class='hs-definition'>withLockCanFail</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>()</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-83"></a><span class='hs-definition'>withLockCanFail</span> <span class='hs-varid'>s</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span>
<a name="line-84"></a>  <span class='hs-varid'>bracket</span> <span class='hs-layout'>(</span><span class='hs-varid'>takeLock</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-85"></a>          <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>l</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>when</span> <span class='hs-varid'>l</span> <span class='hs-varop'>$</span> <span class='hs-varid'>releaseLock</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-86"></a>          <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>l</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>job</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span><span class='hs-varop'>.</span><span class='hs-conid'>Right</span><span class='hs-layout'>)</span>
<a name="line-87"></a>                      <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Left</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="getlock"></a><span class='hs-definition'>getlock</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-90"></a><span class='hs-definition'>getlock</span> <span class='hs-varid'>l</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putStrLn</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Couldn't get lock "</span><span class='hs-varop'>++</span><span class='hs-varid'>l</span>
<a name="line-91"></a>                 <span class='hs-varid'>exitWith</span> <span class='hs-varop'>$</span> <span class='hs-conid'>ExitFailure</span> <span class='hs-num'>1</span>
<a name="line-92"></a><span class='hs-definition'>getlock</span> <span class='hs-varid'>lbad</span> <span class='hs-varid'>tl</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>canonFilename</span> <span class='hs-varid'>lbad</span>
<a name="line-93"></a>                     <span class='hs-varid'>gotit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>takeLock</span> <span class='hs-varid'>l</span>
<a name="line-94"></a>                     <span class='hs-keyword'>if</span> <span class='hs-varid'>gotit</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>l</span>
<a name="line-95"></a>                              <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putStrLn</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Waiting for lock "</span><span class='hs-varop'>++</span><span class='hs-varid'>l</span>
<a name="line-96"></a>                                      <span class='hs-varid'>hFlush</span> <span class='hs-varid'>stdout</span> <span class='hs-comment'>-- for Windows</span>
<a name="line-97"></a>                                      <span class='hs-varid'>done</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>sleep</span> <span class='hs-num'>2</span>
<a name="line-98"></a>                                      <span class='hs-keyword'>if</span> <span class='hs-varid'>done</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-99"></a>                                         <span class='hs-keyword'>then</span> <span class='hs-varid'>getlock</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>tl</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-100"></a>                                         <span class='hs-keyword'>else</span> <span class='hs-varid'>getlock</span> <span class='hs-varid'>l</span> <span class='hs-num'>0</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="removeFileMayNotExist"></a><span class='hs-definition'>removeFileMayNotExist</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-103"></a><span class='hs-definition'>removeFileMayNotExist</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>catchNonExistence</span> <span class='hs-layout'>(</span><span class='hs-varid'>removeFile</span> <span class='hs-varop'>$</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-conid'>()</span>
<a name="line-104"></a>
<a name="line-105"></a><a name="catchNonExistence"></a><span class='hs-definition'>catchNonExistence</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-106"></a><span class='hs-definition'>catchNonExistence</span> <span class='hs-varid'>job</span> <span class='hs-varid'>nonexistval</span> <span class='hs-keyglyph'>=</span>
<a name="line-107"></a>    <span class='hs-varid'>catch</span> <span class='hs-varid'>job</span> <span class='hs-varop'>$</span>
<a name="line-108"></a>    <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isDoesNotExistError</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>nonexistval</span>
<a name="line-109"></a>                                   <span class='hs-keyword'>else</span> <span class='hs-varid'>ioError</span> <span class='hs-varid'>e</span>
<a name="line-110"></a>
<a name="line-111"></a><span class='hs-definition'>releaseLock</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>removeFileMayNotExist</span> <span class='hs-varid'>s</span>
<a name="line-112"></a>
<a name="line-113"></a><a name="takeLock"></a><span class='hs-definition'>takeLock</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-114"></a><span class='hs-definition'>takeLock</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span>
<a name="line-115"></a>    <span class='hs-keyword'>do</span> <span class='hs-varid'>atomicCreate</span> <span class='hs-varop'>$</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>fp</span>
<a name="line-116"></a>       <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-117"></a>  <span class='hs-varop'>`catch`</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isAlreadyExistsError</span> <span class='hs-varid'>e</span>
<a name="line-118"></a>                <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-119"></a>                <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>pwd</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getCurrentDirectory</span>
<a name="line-120"></a>                        <span class='hs-varid'>throwIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addToErrorLoc</span> <span class='hs-varid'>e</span>
<a name="line-121"></a>                                   <span class='hs-layout'>(</span><span class='hs-str'>"takeLock "</span><span class='hs-varop'>++</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>fp</span><span class='hs-varop'>++</span><span class='hs-str'>" in "</span><span class='hs-varop'>++</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>pwd</span><span class='hs-layout'>)</span>
<a name="line-122"></a>
<a name="line-123"></a><a name="takeFile"></a><span class='hs-definition'>takeFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-124"></a><span class='hs-definition'>takeFile</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span>
<a name="line-125"></a>    <span class='hs-keyword'>do</span> <span class='hs-varid'>sloppyAtomicCreate</span> <span class='hs-varid'>fp</span>
<a name="line-126"></a>       <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-127"></a>  <span class='hs-varop'>`catch`</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isAlreadyExistsError</span> <span class='hs-varid'>e</span>
<a name="line-128"></a>                <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-129"></a>                <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>pwd</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getCurrentDirectory</span>
<a name="line-130"></a>                        <span class='hs-varid'>throwIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addToErrorLoc</span> <span class='hs-varid'>e</span>
<a name="line-131"></a>                                   <span class='hs-layout'>(</span><span class='hs-str'>"takeFile "</span><span class='hs-varop'>++</span><span class='hs-varid'>fp</span><span class='hs-varop'>++</span><span class='hs-str'>" in "</span><span class='hs-varop'>++</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>pwd</span><span class='hs-layout'>)</span>
<a name="line-132"></a>
<a name="line-133"></a><a name="withTemp"></a><span class='hs-comment'>-- |'withTemp' safely creates an empty file (not open for writing) and</span>
<a name="line-134"></a><span class='hs-comment'>-- returns its name.</span>
<a name="line-135"></a><span class='hs-comment'>--</span>
<a name="line-136"></a><span class='hs-comment'>-- The temp file operations are rather similar to the locking operations, in</span>
<a name="line-137"></a><span class='hs-comment'>-- that they both should always try to clean up, so exitWith causes trouble.</span>
<a name="line-138"></a><span class='hs-definition'>withTemp</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-139"></a><span class='hs-definition'>withTemp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bracket</span> <span class='hs-varid'>get_empty_file</span> <span class='hs-varid'>removeFileMayNotExist</span>
<a name="line-140"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>get_empty_file</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>openBinaryTempFile</span> <span class='hs-str'>"."</span> <span class='hs-str'>"darcs"</span>
<a name="line-141"></a>                              <span class='hs-varid'>hClose</span> <span class='hs-varid'>h</span>
<a name="line-142"></a>                              <span class='hs-varid'>return</span> <span class='hs-varid'>f</span>
<a name="line-143"></a>
<a name="line-144"></a><a name="withOpenTemp"></a><span class='hs-comment'>-- |'withOpenTemp' creates a temporary file, and opens it.</span>
<a name="line-145"></a><span class='hs-comment'>-- Both of them run their argument and then delete the file.  Also,</span>
<a name="line-146"></a><span class='hs-comment'>-- both of them (to my knowledge) are not susceptible to race conditions on</span>
<a name="line-147"></a><span class='hs-comment'>-- the temporary file (as long as you never delete the temporary file; that</span>
<a name="line-148"></a><span class='hs-comment'>-- would reintroduce a race condition).</span>
<a name="line-149"></a><span class='hs-definition'>withOpenTemp</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>Handle</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-150"></a><span class='hs-definition'>withOpenTemp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bracket</span> <span class='hs-varid'>get_empty_file</span> <span class='hs-varid'>cleanup</span>
<a name="line-151"></a><span class='hs-comment'>-- Warning:  A do-notation statement discarded a result of type Either SomeException ().</span>
<a name="line-152"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>cleanup</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>try</span> <span class='hs-layout'>(</span><span class='hs-varid'>hClose</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>SomeException</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-153"></a>                             <span class='hs-varid'>removeFileMayNotExist</span> <span class='hs-varid'>f</span>
<a name="line-154"></a>          <span class='hs-varid'>get_empty_file</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>invert</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>openBinaryTempFile</span> <span class='hs-str'>"."</span> <span class='hs-str'>"darcs"</span>
<a name="line-155"></a>          <span class='hs-varid'>invert</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-156"></a>
<a name="line-157"></a><a name="withStdoutTemp"></a><span class='hs-definition'>withStdoutTemp</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-158"></a><span class='hs-definition'>withStdoutTemp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bracket</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkStdoutTemp</span> <span class='hs-str'>"stdout_"</span><span class='hs-layout'>)</span> <span class='hs-varid'>removeFileMayNotExist</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="tempdirLoc"></a><span class='hs-definition'>tempdirLoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>FilePath</span>
<a name="line-161"></a><span class='hs-definition'>tempdirLoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstJustIO</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>readBinFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>darcsdir</span><span class='hs-varop'>++</span><span class='hs-str'>"/prefs/tmpdir"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>head</span><span class='hs-varop'>.</span><span class='hs-varid'>words</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>chkdir</span><span class='hs-layout'>,</span>
<a name="line-162"></a>                            <span class='hs-varid'>maybeGetEnv</span> <span class='hs-str'>"DARCS_TMPDIR"</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>chkdir</span><span class='hs-layout'>,</span>
<a name="line-163"></a>                            <span class='hs-varid'>getTemporaryDirectory</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>chkdir</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span><span class='hs-layout'>,</span>
<a name="line-164"></a>                            <span class='hs-varid'>getCurrentDirectorySansDarcs</span><span class='hs-layout'>,</span>
<a name="line-165"></a>                            <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Just</span> <span class='hs-str'>"."</span>  <span class='hs-comment'>-- always returns a Just</span>
<a name="line-166"></a>                          <span class='hs-keyglyph'>]</span>
<a name="line-167"></a>              <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fromJust</span>
<a name="line-168"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>chkdir</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-169"></a>          <span class='hs-varid'>chkdir</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doesDirectoryExist</span> <span class='hs-varid'>d</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-varop'>++</span><span class='hs-str'>"/"</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>Nothing</span>
<a name="line-170"></a>
<a name="line-171"></a><a name="environmentHelpTmpdir"></a><span class='hs-definition'>environmentHelpTmpdir</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-172"></a><span class='hs-definition'>environmentHelpTmpdir</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-str'>"DARCS_TMPDIR"</span><span class='hs-layout'>,</span> <span class='hs-str'>"TMPDIR"</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span>
<a name="line-173"></a> <span class='hs-str'>"Darcs often creates temporary directories.  For example, the `darcs"</span><span class='hs-layout'>,</span>
<a name="line-174"></a> <span class='hs-str'>"diff' command creates two for the working trees to be diffed.  By"</span><span class='hs-layout'>,</span>
<a name="line-175"></a> <span class='hs-str'>"default temporary directories are created in /tmp, or if that doesn't"</span><span class='hs-layout'>,</span>
<a name="line-176"></a> <span class='hs-str'>"exist, in _darcs (within the current repo).  This can be overridden by"</span><span class='hs-layout'>,</span>
<a name="line-177"></a> <span class='hs-str'>"specifying some other directory in the file _darcs/prefs/tmpdir or the"</span><span class='hs-layout'>,</span>
<a name="line-178"></a> <span class='hs-str'>"environment variable $DARCS_TMPDIR or $TMPDIR."</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-179"></a>
<a name="line-180"></a><a name="getCurrentDirectorySansDarcs"></a><span class='hs-definition'>getCurrentDirectorySansDarcs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>FilePath</span><span class='hs-layout'>)</span>
<a name="line-181"></a><span class='hs-definition'>getCurrentDirectorySansDarcs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-182"></a>  <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getCurrentDirectory</span>
<a name="line-183"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>listToMaybe</span> <span class='hs-varop'>$</span> <span class='hs-varid'>drop</span> <span class='hs-num'>5</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeWhile</span> <span class='hs-varid'>no_darcs</span> <span class='hs-varop'>$</span> <span class='hs-varid'>inits</span> <span class='hs-varop'>$</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>c</span>
<a name="line-184"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>no_darcs</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-varop'>$</span> <span class='hs-varid'>darcsdir</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>splitDirectories</span> <span class='hs-varid'>x</span>
<a name="line-185"></a>
<a name="line-186"></a><a name="WithDirKind"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>WithDirKind</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Perm</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Temp</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Delayed</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="withDir"></a><span class='hs-definition'>withDir</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WithDirKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>AbsolutePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-189"></a><span class='hs-definition'>withDir</span> <span class='hs-keyword'>_</span> <span class='hs-str'>""</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bug</span> <span class='hs-str'>"withDir called with empty directory name"</span>
<a name="line-190"></a><span class='hs-definition'>withDir</span> <span class='hs-varid'>kind</span> <span class='hs-varid'>abs_or_relative_name</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-191"></a>  <span class='hs-varid'>absolute_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isRelative</span> <span class='hs-varid'>abs_or_relative_name</span>
<a name="line-192"></a>                   <span class='hs-keyword'>then</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span> <span class='hs-varid'>abs_or_relative_name</span><span class='hs-layout'>)</span> <span class='hs-varid'>tempdirLoc</span>
<a name="line-193"></a>                   <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-varid'>abs_or_relative_name</span>
<a name="line-194"></a>  <span class='hs-varid'>formerdir</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getCurrentDirectory</span>
<a name="line-195"></a>  <span class='hs-varid'>bracket</span> <span class='hs-layout'>(</span><span class='hs-varid'>create_directory</span> <span class='hs-varid'>absolute_name</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-196"></a>          <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>dir</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>setCurrentDirectory</span> <span class='hs-varid'>formerdir</span>
<a name="line-197"></a>                      <span class='hs-varid'>k</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>keep_tmpdir</span>
<a name="line-198"></a>                      <span class='hs-varid'>unless</span> <span class='hs-varid'>k</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>kind</span> <span class='hs-keyword'>of</span>
<a name="line-199"></a>                                      <span class='hs-conid'>Perm</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-200"></a>                                      <span class='hs-conid'>Temp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>rmRecursive</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>dir</span><span class='hs-layout'>)</span>
<a name="line-201"></a>                                      <span class='hs-conid'>Delayed</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>atexit</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rmRecursive</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>dir</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-202"></a>          <span class='hs-varid'>job</span>
<a name="line-203"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>newname</span> <span class='hs-varid'>name</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span>
<a name="line-204"></a>          <span class='hs-varid'>newname</span> <span class='hs-varid'>name</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span> <span class='hs-varop'>++</span> <span class='hs-str'>"-"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>n</span>
<a name="line-205"></a>          <span class='hs-varid'>create_directory</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>AbsolutePath</span>
<a name="line-206"></a>          <span class='hs-varid'>create_directory</span> <span class='hs-varid'>name</span> <span class='hs-varid'>n</span>
<a name="line-207"></a>              <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>createDirectory</span> <span class='hs-varop'>$</span> <span class='hs-varid'>newname</span> <span class='hs-varid'>name</span> <span class='hs-varid'>n</span>
<a name="line-208"></a>                   <span class='hs-varid'>setCurrentDirectory</span> <span class='hs-varop'>$</span> <span class='hs-varid'>newname</span> <span class='hs-varid'>name</span> <span class='hs-varid'>n</span>
<a name="line-209"></a>                   <span class='hs-varid'>getCurrentDirectory</span>
<a name="line-210"></a>                <span class='hs-varop'>`catch`</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isAlreadyExistsError</span> <span class='hs-varid'>e</span>
<a name="line-211"></a>                               <span class='hs-keyword'>then</span> <span class='hs-varid'>create_directory</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-212"></a>                               <span class='hs-keyword'>else</span> <span class='hs-varid'>throwIO</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-213"></a>          <span class='hs-varid'>keep_tmpdir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isJust</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>maybeGetEnv</span> <span class='hs-str'>"DARCS_KEEP_TMPDIR"</span>
<a name="line-214"></a>
<a name="line-215"></a><a name="environmentHelpKeepTmpdir"></a><span class='hs-definition'>environmentHelpKeepTmpdir</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-216"></a><span class='hs-definition'>environmentHelpKeepTmpdir</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-str'>"DARCS_KEEP_TMPDIR"</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span>
<a name="line-217"></a> <span class='hs-str'>"If the environment variable DARCS_KEEP_TMPDIR is defined, darcs will"</span><span class='hs-layout'>,</span>
<a name="line-218"></a> <span class='hs-str'>"not remove the temporary directories it creates.  This is intended"</span><span class='hs-layout'>,</span>
<a name="line-219"></a> <span class='hs-str'>"primarily for debugging Darcs itself, but it can also be useful, for"</span><span class='hs-layout'>,</span>
<a name="line-220"></a> <span class='hs-str'>"example, to determine why your test preference (see `darcs setpref')"</span><span class='hs-layout'>,</span>
<a name="line-221"></a> <span class='hs-str'>"is failing when you run `darcs record', but working when run manually."</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-222"></a>
<a name="line-223"></a><a name="withPermDir"></a><span class='hs-comment'>-- |'withPermDir' is like 'withTempDir', except that it doesn't</span>
<a name="line-224"></a><span class='hs-comment'>-- delete the directory afterwards.</span>
<a name="line-225"></a><span class='hs-definition'>withPermDir</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>AbsolutePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-226"></a><span class='hs-definition'>withPermDir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDir</span> <span class='hs-conid'>Perm</span>
<a name="line-227"></a>
<a name="line-228"></a><a name="withTempDir"></a><span class='hs-comment'>-- |'withTempDir' creates an empty directory and then removes it when it</span>
<a name="line-229"></a><span class='hs-comment'>-- is no longer needed.  withTempDir creates a temporary directory.  The</span>
<a name="line-230"></a><span class='hs-comment'>-- location of that directory is determined by the contents of</span>
<a name="line-231"></a><span class='hs-comment'>-- _darcs/prefs/tmpdir, if it exists, otherwise by @$DARCS_TMPDIR@, and if</span>
<a name="line-232"></a><span class='hs-comment'>-- that doesn't exist then whatever your operating system considers to be a</span>
<a name="line-233"></a><span class='hs-comment'>-- a temporary directory (e.g. @$TMPDIR@ under Unix, @$TEMP@ under</span>
<a name="line-234"></a><span class='hs-comment'>-- Windows).</span>
<a name="line-235"></a><span class='hs-comment'>--</span>
<a name="line-236"></a><span class='hs-comment'>-- If none of those exist it creates the temporary directory</span>
<a name="line-237"></a><span class='hs-comment'>-- in the current directory, unless the current directory is under a _darcs</span>
<a name="line-238"></a><span class='hs-comment'>-- directory, in which case the temporary directory in the parent of the highest</span>
<a name="line-239"></a><span class='hs-comment'>-- _darcs directory to avoid accidentally corrupting darcs's internals.</span>
<a name="line-240"></a><span class='hs-comment'>-- This should not fail, but if it does indeed fail, we go ahead and use the</span>
<a name="line-241"></a><span class='hs-comment'>-- current directory anyway. If @$DARCS_KEEP_TMPDIR@ variable is set</span>
<a name="line-242"></a><span class='hs-comment'>-- temporary directory is not removed, this can be useful for debugging.</span>
<a name="line-243"></a><span class='hs-definition'>withTempDir</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>AbsolutePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-244"></a><span class='hs-definition'>withTempDir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDir</span> <span class='hs-conid'>Temp</span>
<a name="line-245"></a>
<a name="line-246"></a><a name="withDelayedDir"></a><span class='hs-definition'>withDelayedDir</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>AbsolutePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-247"></a><span class='hs-definition'>withDelayedDir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDir</span> <span class='hs-conid'>Delayed</span>
<a name="line-248"></a>
<a name="line-249"></a><a name="doesDirectoryReallyExist"></a><span class='hs-definition'>doesDirectoryReallyExist</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-250"></a><span class='hs-definition'>doesDirectoryReallyExist</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span>
<a name="line-251"></a>    <span class='hs-varid'>catchNonExistence</span> <span class='hs-layout'>(</span><span class='hs-varid'>isDirectory</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>getSymbolicLinkStatus</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-conid'>False</span>
<a name="line-252"></a>
<a name="line-253"></a><a name="rmRecursive"></a><span class='hs-definition'>rmRecursive</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-254"></a><span class='hs-definition'>rmRecursive</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span>
<a name="line-255"></a>    <span class='hs-keyword'>do</span> <span class='hs-varid'>isd</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doesDirectoryReallyExist</span> <span class='hs-varid'>d</span>
<a name="line-256"></a>       <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-varid'>isd</span>
<a name="line-257"></a>          <span class='hs-keyword'>then</span> <span class='hs-varid'>removeFile</span> <span class='hs-varid'>d</span>
<a name="line-258"></a>          <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>conts</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>actual_dir_contents</span>
<a name="line-259"></a>                  <span class='hs-varid'>withCurrentDirectory</span> <span class='hs-varid'>d</span> <span class='hs-varop'>$</span>
<a name="line-260"></a>                    <span class='hs-varid'>mapM_</span> <span class='hs-varid'>rmRecursive</span> <span class='hs-varid'>conts</span>
<a name="line-261"></a>                  <span class='hs-varid'>removeDirectory</span> <span class='hs-varid'>d</span>
<a name="line-262"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>actual_dir_contents</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-- doesn't include . or ..</span>
<a name="line-263"></a>              <span class='hs-keyword'>do</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getDirectoryContents</span> <span class='hs-varid'>d</span>
<a name="line-264"></a>                 <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varop'>/=</span><span class='hs-str'>"."</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varop'>/=</span><span class='hs-str'>".."</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span>
<a name="line-265"></a>
<a name="line-266"></a><a name="worldReadableTemp"></a><span class='hs-definition'>worldReadableTemp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-267"></a><span class='hs-definition'>worldReadableTemp</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrt</span> <span class='hs-num'>0</span>
<a name="line-268"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>wrt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-269"></a>          <span class='hs-varid'>wrt</span> <span class='hs-num'>100</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Failure creating temp named "</span><span class='hs-varop'>++</span><span class='hs-varid'>f</span>
<a name="line-270"></a>          <span class='hs-varid'>wrt</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>f_new</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span><span class='hs-varop'>++</span><span class='hs-str'>"-"</span><span class='hs-varop'>++</span><span class='hs-varid'>show</span> <span class='hs-varid'>n</span>
<a name="line-271"></a>                  <span class='hs-keyword'>in</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>ok</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>takeFile</span> <span class='hs-varid'>f_new</span>
<a name="line-272"></a>                        <span class='hs-keyword'>if</span> <span class='hs-varid'>ok</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>f_new</span>
<a name="line-273"></a>                              <span class='hs-keyword'>else</span> <span class='hs-varid'>wrt</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-274"></a>
<a name="line-275"></a><a name="withNamedTemp"></a><span class='hs-definition'>withNamedTemp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-276"></a><span class='hs-definition'>withNamedTemp</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bracket</span> <span class='hs-varid'>get_empty_file</span> <span class='hs-varid'>removeFileMayNotExist</span>
<a name="line-277"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>get_empty_file</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>worldReadableTemp</span> <span class='hs-varid'>n</span>
<a name="line-278"></a>
<a name="line-279"></a><a name="editText"></a><span class='hs-definition'>editText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</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'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-280"></a><span class='hs-definition'>editText</span> <span class='hs-varid'>desc</span> <span class='hs-varid'>txt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withNamedTemp</span> <span class='hs-varid'>desc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>f</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-281"></a>  <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>writeFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>txt</span>
<a name="line-282"></a><span class='hs-comment'>-- Warning:  A do-notation statement discarded a result of type ExitCode.</span>
<a name="line-283"></a>  <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runEditor</span> <span class='hs-varid'>f</span>
<a name="line-284"></a>  <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>readFile</span> <span class='hs-varid'>f</span>
<a name="line-285"></a>
<a name="line-286"></a><a name="readBinFile"></a><span class='hs-definition'>readBinFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-287"></a><span class='hs-definition'>readBinFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</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-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>readFile</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toFilePath</span>
<a name="line-288"></a>
<a name="line-289"></a><a name="readLocaleFile"></a><span class='hs-comment'>-- | Reads a file. Differs from readBinFile in that it interprets the file in</span>
<a name="line-290"></a><span class='hs-comment'>--   the current locale instead of as ISO-8859-1.</span>
<a name="line-291"></a><span class='hs-definition'>readLocaleFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-292"></a><span class='hs-definition'>readLocaleFile</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>decodeLocale</span> <span class='hs-varop'>`fmap`</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>readFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-293"></a>
<a name="line-294"></a><a name="readDocBinFile"></a><span class='hs-definition'>readDocBinFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Doc</span>
<a name="line-295"></a><span class='hs-definition'>readDocBinFile</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>readFile</span> <span class='hs-varop'>$</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>fp</span>
<a name="line-296"></a>                       <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>if</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>empty</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>packedString</span> <span class='hs-varid'>ps</span>
<a name="line-297"></a>
<a name="line-298"></a><a name="appendBinFile"></a><span class='hs-definition'>appendBinFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-299"></a><span class='hs-definition'>appendBinFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>appendToFile</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hPutStr</span> <span class='hs-varid'>h</span> <span class='hs-varid'>s</span>
<a name="line-300"></a>
<a name="line-301"></a><a name="appendDocBinFile"></a><span class='hs-definition'>appendDocBinFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</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-302"></a><span class='hs-definition'>appendDocBinFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>appendToFile</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hPutDoc</span> <span class='hs-varid'>h</span> <span class='hs-varid'>d</span>
<a name="line-303"></a>
<a name="line-304"></a><a name="writeBinFile"></a><span class='hs-definition'>writeBinFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-305"></a><span class='hs-definition'>writeBinFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeToFile</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hPutStr</span> <span class='hs-varid'>h</span> <span class='hs-varid'>s</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="writeLocaleFile"></a><span class='hs-comment'>-- | Writes a file. Differs from writeBinFile in that it writes the string</span>
<a name="line-308"></a><span class='hs-comment'>--   encoded with the current locale instead of what GHC thinks is right.</span>
<a name="line-309"></a><span class='hs-definition'>writeLocaleFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-310"></a><span class='hs-definition'>writeLocaleFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeToFile</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>hPut</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-varid'>encodeLocale</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-311"></a>
<a name="line-312"></a><a name="writeDocBinFile"></a><span class='hs-definition'>writeDocBinFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</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-313"></a><span class='hs-definition'>writeDocBinFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeToFile</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hPutDoc</span> <span class='hs-varid'>h</span> <span class='hs-varid'>d</span>
<a name="line-314"></a>
<a name="line-315"></a><a name="writeAtomicFilePS"></a><span class='hs-definition'>writeAtomicFilePS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</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-316"></a><span class='hs-definition'>writeAtomicFilePS</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeToFile</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>hPut</span> <span class='hs-varid'>h</span> <span class='hs-varid'>ps</span>
<a name="line-317"></a>
<a name="line-318"></a><a name="gzWriteAtomicFilePS"></a><span class='hs-definition'>gzWriteAtomicFilePS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>B</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-319"></a><span class='hs-definition'>gzWriteAtomicFilePS</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>gzWriteAtomicFilePSs</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ps</span><span class='hs-keyglyph'>]</span>
<a name="line-320"></a>
<a name="line-321"></a><a name="gzWriteAtomicFilePSs"></a><span class='hs-definition'>gzWriteAtomicFilePSs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</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-322"></a><span class='hs-definition'>gzWriteAtomicFilePSs</span> <span class='hs-varid'>f</span> <span class='hs-varid'>pss</span> <span class='hs-keyglyph'>=</span>
<a name="line-323"></a>    <span class='hs-varid'>withSignalsBlocked</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withNamedTemp</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>newf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-324"></a>    <span class='hs-varid'>gzWriteFilePSs</span> <span class='hs-varid'>newf</span> <span class='hs-varid'>pss</span>
<a name="line-325"></a>    <span class='hs-varid'>already_exists</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doesFileExist</span> <span class='hs-varop'>$</span> <span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span>
<a name="line-326"></a>    <span class='hs-varid'>when</span> <span class='hs-varid'>already_exists</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>mode</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fileMode</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>getFileStatus</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-327"></a>                             <span class='hs-varid'>setFileMode</span> <span class='hs-varid'>newf</span> <span class='hs-varid'>mode</span>
<a name="line-328"></a>             <span class='hs-varop'>`catchall`</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-329"></a>    <span class='hs-varid'>renameFile</span> <span class='hs-varid'>newf</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-330"></a>
<a name="line-331"></a><a name="gzWriteDocFile"></a><span class='hs-definition'>gzWriteDocFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</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-332"></a><span class='hs-definition'>gzWriteDocFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>gzWriteAtomicFilePSs</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-varid'>renderPSs</span> <span class='hs-varid'>d</span>
<a name="line-333"></a>
<a name="line-334"></a><a name="writeToFile"></a><span class='hs-definition'>writeToFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</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-335"></a><span class='hs-definition'>writeToFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span>
<a name="line-336"></a>    <span class='hs-varid'>withSignalsBlocked</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withNamedTemp</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>newf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-337"></a>    <span class='hs-varid'>bracket</span> <span class='hs-layout'>(</span><span class='hs-varid'>openBinaryFile</span> <span class='hs-varid'>newf</span> <span class='hs-conid'>WriteMode</span><span class='hs-layout'>)</span> <span class='hs-varid'>hClose</span> <span class='hs-varid'>job</span>
<a name="line-338"></a>    <span class='hs-varid'>already_exists</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doesFileExist</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-339"></a>    <span class='hs-varid'>when</span> <span class='hs-varid'>already_exists</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>mode</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fileMode</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>getFileStatus</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-340"></a>                             <span class='hs-varid'>setFileMode</span> <span class='hs-varid'>newf</span> <span class='hs-varid'>mode</span>
<a name="line-341"></a>             <span class='hs-varop'>`catchall`</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-342"></a>    <span class='hs-varid'>renameFile</span> <span class='hs-varid'>newf</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-343"></a>
<a name="line-344"></a><a name="appendToFile"></a><span class='hs-definition'>appendToFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePathLike</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</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-345"></a><span class='hs-definition'>appendToFile</span> <span class='hs-varid'>f</span> <span class='hs-varid'>job</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withSignalsBlocked</span> <span class='hs-varop'>$</span>
<a name="line-346"></a>    <span class='hs-varid'>bracket</span> <span class='hs-layout'>(</span><span class='hs-varid'>openBinaryFile</span> <span class='hs-layout'>(</span><span class='hs-varid'>toFilePath</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-conid'>AppendMode</span><span class='hs-layout'>)</span> <span class='hs-varid'>hClose</span> <span class='hs-varid'>job</span>
</pre></body>
</html>