% Copyright (C) 2002-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.
\begin{code}

\end{code}
\section{prefs}
The \verb!_darcs! directory contains a \verb!prefs! directory. This
directory exists simply to hold user configuration settings specific to
this repository. The contents of this directory are intended to be
modifiable by the user, although in some cases a mistake in such a
modification may cause darcs to behave strangely.
\input{Darcs/ArgumentDefaults.lhs}
\begin{code}

\end{code}
\paragraph{repos}
The \verb!_darcs/prefs/repos! file contains a list of repositories you have
pulled from or pushed to, and is used for autocompletion of pull and push
commands in bash. Feel free to delete any lines from this list that might
get in there, or to delete the file as a whole.
\paragraph{author}\label{author_prefs}
The \verb!_darcs/prefs/author! file contains the email address (or name) to
be used as the author when patches are recorded in this repository,
e.g.\ \verb!David Roundy !. This
file overrides the contents of the environment variables
\verb!$DARCS_EMAIL! and \verb!$EMAIL!.
\paragraph{boring}\label{boring}
The \verb!_darcs/prefs/boring! file may contain a list of regular
expressions describing files, such as object files, that you do not expect
to add to your project. As an example, the boring file that I use with
my darcs repository is:
\begin{verbatim}
\.hi$
\.o$
^\.[^/]
^_
~$
(^|/)CVS($|/)
\end{verbatim}
A newly created repository has a longer boring file that
includes many common source control, backup, temporary, and compiled files.
You may want to have the boring file under version
control. To do this you can use darcs setpref to set the value
``boringfile'' to the name of your desired boring file
(e.g.\ \verb-darcs setpref boringfile .boring-, where \verb-.boring-
is the repository path of a file
that has been
darcs added to your repository). The boringfile preference overrides
\verb!_darcs/prefs/boring!, so be sure to copy that file to the boringfile.
You can also set up a ``boring'' regexps
file in your home directory, named \verb!~/.darcs/boring!,
on MS Windows~\ref{ms_win}, which will be
used with all of your darcs repositories.
Any file not already managed by darcs and whose repository path (such
as \verb!manual/index.html!) matches any of
the boring regular expressions is considered boring. The boring file is
used to filter the files provided to darcs add, to allow you to use a
simple \verb-darcs add newdir newdir/-\verb-*- % cabal haddock barfs on adjacent / *
without accidentally adding a bunch of
object files. It is also used when the \verb!--look-for-adds! flag is
given to whatsnew or record.
Note that once a file has been added to darcs, it is not considered
boring, even if it matches the boring file filter.
\begin{code}

\end{code}
\paragraph{binaries}
The \verb!_darcs/prefs/binaries! file may contain a list of regular
expressions describing files that should be treated as binary files rather
than text files. Darcs automatically treats files containing
\verb!^Z\! or \verb!'\0'! within the first 4096 bytes as being binary files.
You probably will want to have the binaries file under
version control. To do this you can use darcs setpref to set the value
``binariesfile'' to the name of your desired binaries file
(e.g.\ \verb'darcs setpref binariesfile ./.binaries', where
\verb'.binaries' is a file that has been
darcs added to your repository). As with the boring file, you can also set
up a \verb!~/.darcs/binaries! file if you like, on MS Windows~\ref{ms_win}.
\begin{code}

dataFileType=BinaryFile|TextFilederiving(Eq){-# NOINLINE defaultBinaries #-}-- | The lines that will be inserted into @_darcs/prefs/binaries@ when-- @darcs init@ is run. Hence, a list of comments, blank lines and-- regular expressions (ERE dialect).---- Note that while this matches .gz and .GZ, it will not match .gZ,-- i.e. it is not truly case insensitive.defaultBinaries::[String]defaultBinaries=help++["\\.("++e++"|"++maptoUppere++")$"|e<-extensions]whereextensions=["a","bmp","bz2","doc","elc","exe","gif","gz","iso","jar","jpe?g","mng","mpe?g","p[nbgp]m","pdf","png","pyc","so","tar","tgz","tiff?","z","zip"]help=map("# "++)binariesFileHelpbinariesFileHelp::[String]binariesFileHelp=["This file contains a list of extended regular expressions, one per","line. A file path matching any of these expressions is assumed to","contain binary data (not text). The entries in ~/.darcs/binaries (if","it exists) supplement those in this file.","","Blank lines, and lines beginning with an octothorpe (#) are ignored.","See regex(7) for a description of extended regular expressions."]filetypeFunction::IO(FilePath->FileType)filetypeFunction=dobinsfile<-defPrefval"binariesfile"(darcsdir++"/prefs/binaries")bins<-getPrefLinesbinsfile`catch`(\e->ifisDoesNotExistErrorethenreturn[]elseioErrore)gbs<-getGlobal"binaries"regexes<-return(map(\r->mkRegexr)(bins++gbs))letisbinf=or$map(\r->isJust$matchRegexrf)regexesftff=ifisbin$normalizefthenBinaryFileelseTextFileinreturnftf-- this avoids a circular dependency with RepositoryprefsDirectory::ReadableDirectorym=>mStringprefsDirectory=dodarcs<-mDoesDirectoryExist$fp2fndarcsdirifdarcsthenreturn$darcsdir++"/prefs/"elsefail$"Directory "++darcsdir++"/ does not exist!"withPrefsDirectory::ReadableDirectorym=>(String->m())->m()withPrefsDirectoryj=doprefs<-prefsDirectory`mplus`return"x"when(prefs/="x")$jprefsaddToPreflist::WriteableDirectorym=>String->String->m()addToPreflistps=withPrefsDirectory$\prefs->dohasprefs<-mDoesDirectoryExist$fp2fnprefsunlesshasprefs$mCreateDirectory$fp2fnprefspl<-getPreflistpmWriteBinFile(fp2fn$prefs++p)$unlines$union[s]plgetPreflist::ReadableDirectorym=>String->m[String]getPreflistp=doprefs<-prefsDirectory`mplus`return"x"if(prefs/="x")thengetPreffile$prefs++pelsereturn[]getPreffile::ReadableDirectorym=>FilePath->m[String]getPreffilef=dohasprefs<-mDoesFileExist(fp2fnf)ifhasprefsthengetPrefLinesfelsereturn[]setPreflist::WriteableDirectorym=>String->[String]->m()setPreflistpls=withPrefsDirectory$\prefs->dohaspref<-mDoesDirectoryExist$fp2fnprefsifhasprefthenmWriteBinFile(fp2fn$prefs++p)(unlinesls)elsereturn()defPrefval::String->String->IOStringdefPrefvalpd=dopv<-getPrefvalpcasepvofNothing->returndJustv->returnvgetPrefval::ReadableDirectorym=>String->m(MaybeString)getPrefvalp=dopl<-getPreflist"prefs"casemapsnd$filter((==p).fst)$map(break(==' '))plof[val]->casewordsvalof[]->returnNothing_->return$Just$tailval_->returnNothingsetPrefval::WriteableDirectorym=>String->String->m()setPrefvalpv=dopl<-getPreflist"prefs"setPreflist"prefs"$filter((/=p).fst.(break(==' ')))pl++[p++" "++v]changePrefval::WriteableDirectorym=>String->String->String->m()changePrefvalpft=dopl<-getPreflist"prefs"ov<-getPrefvalpnewval<-caseovofNothing->returntJustold->ifold==fthenreturntelsereturnoldsetPreflist"prefs"$filter((/=p).fst.(break(==' ')))pl++[p++" "++newval]defaultrepo::[DarcsFlag]->AbsolutePath->[String]->IO[String]defaultrepoopts_[]=doletfixRr|not(is_filer)=returnr|otherwise=doabsr<-ioAbsoluterreturn$toFilePathabsrcase[r|RemoteRepor<-opts]of[]->dodefrepo<-getPreflist"defaultrepo"casedefrepoof[r]->(:[])`fmap`fixRr_->return[]rs->mapMfixRrsdefaultrepo__r=returnrsetDefaultrepo::String->[DarcsFlag]->IO()setDefaultreporopts=dodoit<-if(NoSetDefault`notElem`opts&&DryRun`notElem`opts&&r_is_not_tmp)thenreturnTrueelsedoolddef<-getPreflist"defaultrepo"return(olddef==[])whendoit(setPreflist"defaultrepo"[r])addToPreflist"repos"r`catchall`return()-- we don't care if this fails!wherer_is_not_tmp=not$r`elem`[x|RemoteRepox<-opts]

\end{code}
\paragraph{email}
The \verb!_darcs/prefs/email! file is used to provide the e-mail address for your
repository that others will use when they \verb!darcs send! a patch back to you.
The contents of the file should simply be an e-mail address.
\paragraph{sources}
The \verb!_darcs/prefs/sources! file is used to indicate alternative
locations from which to download patches when using a ``hashed''
repository. This file contains lines such as:
\begin{verbatim}
cache:/home/droundy/.darcs/cache
readonly:/home/otheruser/.darcs/cache
repo:http://darcs.net
\end{verbatim}
This would indicate that darcs should first look in
\verb!/home/droundy/.darcs/cache! for patches that might be missing, and if
the patch isn't there, it should save a copy there for future use. In that
case, darcs will look in \verb!/home/otheruser/.darcs/cache! to see if that
user might have downloaded a copy, but won't try to save a copy there, of
course. Finally, it will look in \verb!http://darcs.net!. Note that the
\verb!sources! file can also exist in \verb!~/.darcs/!. Also note that the
sources mentioned in your \verb!sources! file will be tried \emph{before}
the repository you are pulling from. This can be useful in avoiding
downloading patches multiple times when you pull from a remote repository
to more than one local repository.
We strongly advise that you enable a global cache directory, which will
allow darcs to avoid re-downloading patches (for example, when doing a
second darcs get of the same repository), and also allows darcs to use hard
links to reduce disk usage. To do this, simply
\begin{verbatim}
mkdir -p $HOME/.darcs/cache
echo cache:$HOME/.darcs/cache > $HOME/.darcs/sources
\end{verbatim}
Note that the cache directory should reside on the same filesystem as your
repositories, so you may need to vary this. You can also use multiple
cache directories on different filesystems, if you have several filesystems
on which you use darcs.
On MS Windows~\ref{ms_win})
\begin{code}