\section{\module{filecmp} ---
         File and Directory Comparisons}

\declaremodule{standard}{filecmp}
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
\modulesynopsis{Compare files efficiently.}


The \module{filecmp} module defines functions to compare files and
directories, with various optional time/correctness trade-offs.

The \module{filecmp} module defines the following functions:

\begin{funcdesc}{cmp}{f1, f2\optional{, shallow\optional{, use_statcache}}}
Compare the files named \var{f1} and \var{f2}, returning \code{True} if
they seem equal, \code{False} otherwise.

Unless \var{shallow} is given and is false, files with identical
\function{os.stat()} signatures are taken to be equal.
\versionchanged[\var{use_statcache} is obsolete and ignored.]{2.3}

Files that were compared using this function will not be compared again
unless their \function{os.stat()} signature changes.

Note that no external programs are called from this function, giving it
portability and efficiency.
\end{funcdesc}

\begin{funcdesc}{cmpfiles}{dir1, dir2, common\optional{,
                           shallow\optional{, use_statcache}}}
Returns three lists of file names: \var{match}, \var{mismatch},
\var{errors}.  \var{match} contains the list of files match in both
directories, \var{mismatch} includes the names of those that don't,
and \var{errros} lists the names of files which could not be
compared.  Files may be listed in \var{errors} because the user may
lack permission to read them or many other reasons, but always that
the comparison could not be done for some reason.

The \var{common} parameter is a list of file names found in both directories.
The \var{shallow} and \var{use_statcache} parameters have the same
meanings and default values as for \function{filecmp.cmp()}.
\end{funcdesc}

Example:

\begin{verbatim}
>>> import filecmp
>>> filecmp.cmp('libundoc.tex', 'libundoc.tex')
True
>>> filecmp.cmp('libundoc.tex', 'lib.tex')
False
\end{verbatim}


\subsection{The \protect\class{dircmp} class \label{dircmp-objects}}

\class{dircmp} instances are built using this constructor:

\begin{classdesc}{dircmp}{a, b\optional{, ignore\optional{, hide}}}
Construct a new directory comparison object, to compare the
directories \var{a} and \var{b}. \var{ignore} is a list of names to
ignore, and defaults to \code{['RCS', 'CVS', 'tags']}. \var{hide} is a
list of names to hide, and defaults to \code{[os.curdir, os.pardir]}.
\end{classdesc}

The \class{dircmp} class provides the following methods:

\begin{methoddesc}[dircmp]{report}{}
Print (to \code{sys.stdout}) a comparison between \var{a} and \var{b}.
\end{methoddesc}

\begin{methoddesc}[dircmp]{report_partial_closure}{}
Print a comparison between \var{a} and \var{b} and common immediate
subdirctories.
\end{methoddesc}

\begin{methoddesc}[dircmp]{report_full_closure}{}
Print a comparison between \var{a} and \var{b} and common 
subdirctories (recursively).
\end{methoddesc}


The \class{dircmp} offers a number of interesting attributes that may
be used to get various bits of information about the directory trees
being compared.

Note that via \method{__getattr__()} hooks, all attributes are
computed lazilly, so there is no speed penalty if only those
attributes which are lightweight to compute are used.

\begin{memberdesc}[dircmp]{left_list}
Files and subdirectories in \var{a}, filtered by \var{hide} and
\var{ignore}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{right_list}
Files and subdirectories in \var{b}, filtered by \var{hide} and
\var{ignore}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{common}
Files and subdirectories in both \var{a} and \var{b}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{left_only}
Files and subdirectories only in \var{a}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{right_only}
Files and subdirectories only in \var{b}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{common_dirs}
Subdirectories in both \var{a} and \var{b}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{common_files}
Files in both \var{a} and \var{b}
\end{memberdesc}

\begin{memberdesc}[dircmp]{common_funny}
Names in both \var{a} and \var{b}, such that the type differs between
the directories, or names for which \function{os.stat()} reports an
error.
\end{memberdesc}

\begin{memberdesc}[dircmp]{same_files}
Files which are identical in both \var{a} and \var{b}.
\end{memberdesc}

\begin{memberdesc}[dircmp]{diff_files}
Files which are in both \var{a} and \var{b}, whose contents differ.
\end{memberdesc}

\begin{memberdesc}[dircmp]{funny_files}
Files which are in both \var{a} and \var{b}, but could not be
compared.
\end{memberdesc}

\begin{memberdesc}[dircmp]{subdirs}
A dictionary mapping names in \member{common_dirs} to
\class{dircmp} objects.
\end{memberdesc}
