<chapter id="svn-ch-9">
  <title>Subversion Complete Reference</title>
  
  <simplesect>
    <para>This chapter is intended to be a complete reference to using
      Subversion. This includes the command line client
      (<command>svn</command>) and all its subcommands, as well as the
      repository administration programs (<command>svnadmin</command>
      and <command>svnlook</command>) and their respective subcommands.
    </para>
  </simplesect>
  
  <!-- ================================================================= -->
  <!-- ======================== SECTION 1 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn-ch-9-sect-1">
    <title>The Subversion Command Line Client:
      <command>svn</command></title>
    
    <para>To use the command line client, you type
      <command>svn</command>, the subcommand you wish to use
      <footnote><para>Yes, yes, you don't need a subcommand to use the
      <option>--version</option> switch, but we'll get to that in just
      a minute.</para> </footnote>, and any switches or targets that
      you wish to operate on&mdash;there is no specific order that the
      subcommand and the switches must appear in.  For example, all of
      the following are valid ways to use <command>svn
      status</command>:</para>

    <screen>
$ svn -v status
$ svn status -v 
$ svn status -v myfile
</screen>

    <para>You can find many more examples of how to use most client
      commands in <xref linkend="svn-ch-3"/> and commands for managing
      properties in <xref linkend="svn-ch-7-sect-2"/>.</para>
    
    <sect2 id="svn-ch-9-sect-1.1">
      <title><command>svn</command> Switches</title> 
      
      <para>While Subversion has different switches for its
        subcommands, all switches are global&mdash;that is, each
        switch is guaranteed to mean the same thing regardless of
        the subcommand you use it with.  For example,
        <option>--verbose</option> (<option>-v</option>) always
        means <quote>verbose output</quote>, regardless of the
        subcommand you use it with.</para>

      <variablelist>
        
        <varlistentry>
          <term><option>--auto-props</option></term>
          <listitem>
            <para>Enables auto-props, overriding the
            <literal>enable-auto-props</literal> directive in the
            <filename>config</filename> file.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--config-dir</option>
            <replaceable>DIR</replaceable></term>
          <listitem>
            <para>Instructs Subversion to read configuration
            information from the specified directory instead
            of the default location (<filename>.subversion</filename>
            in the user's home directory).</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--diff-cmd</option>
            <replaceable>CMD</replaceable></term>
          <listitem>
            <para>Specifies an external program to use to show
            differences between files.  When <command>svn
            diff</command> is invoked, it uses Subversion's internal
            diff engine, which provides unified diffs by default.  If
            you want to use an external diff program, use
            <option>--diff-cmd</option>.  You can pass switches to the
            diff program with the <option>--extensions</option>
            switch (more on that later in this section).</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--diff3-cmd</option>
            <replaceable>CMD</replaceable></term>
          <listitem>
            <para>Specifies an external program to use to merge files.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--dry-run</option></term>
          <listitem>
            <para>Goes through all the motions of running a command,
              but makes no actual changes&mdash;either on disk or in
              the repository. </para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--editor-cmd</option>
            <replaceable>CMD</replaceable></term>
          <listitem>
            <para>Specifies an external program to use to edit a log message
              or a property value.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--encoding</option> <replaceable>ENC</replaceable></term>
          <listitem>
            <para>Tells Subversion that your commit message is encoded
              in the charset provided.  The default is your operating
              system's native locale, and you should specify the
              encoding if your commit message is in any other
              encoding.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--extensions</option> (<option>-x</option>)
          <replaceable>ARGS</replaceable></term>
          <listitem>
            <para>Specifies an argument or arguments that Subversion
              should pass to an external diff command when providing
              differences between files.  If you wish to pass multiple
              arguments, you must enclose all of them in quotes (for
              example, <command>svn diff --diff-cmd /usr/bin/diff -x
              "-b -E"</command>).  This switch can
              <emphasis>only</emphasis> be used if you also pass the
              <option>--diff-cmd</option> switch.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--file</option> (<option>-F</option>)
            <replaceable>FILENAME</replaceable>
          </term>
          <listitem>
            <para>Uses the contents of the file passed as an argument
              to this switch for the specified subcommand.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--force</option></term>
          <listitem>
            <para>Forces a particular command or operation to run.
              There are some operations that Subversion will prevent
              you from doing in normal usage, but you can pass the
              force switch to tell Subversion <quote>I know what I'm
              doing as well as the possible repercussions of doing it,
              so let me at 'em</quote>. This switch is the
              programmatic equivalent of doing your own electrical
              work with the power on&mdash;if you don't know what
              you're doing, you're likely to get a nasty shock.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--force-log</option></term>
          <listitem>
            <para>Forces a suspicious parameter passed to the
              <option>--message</option> (<option>-m</option>) or
              <option>--file</option> (<option>-F</option>) options to
              be accepted as valid.  By default, Subversion will
              produce an error if parameters to these options look
              like they might instead be targets of the subcommand.
              For example, if you pass a versioned file's path to the
              <option>--file</option> (<option>-F</option>) option,
              Subversion will assume you've made a mistake, that the
              path was instead intended as the target of the
              operation, and that you simply failed to provide some
              other&mdash;unversioned&mdash;file as the source of your log
              message.  To assert your intent and override these types
              of errors, pass the <option>--force-log</option> option 
              to commands that accept log messages.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--help</option> (<option>-h</option> or
                <option>-?</option>)
          </term>
          <listitem>
            <para>If used with one or more subcommands, shows the
              built-in help text for each subcommand.  If used alone,
              it displays the general client help text.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--ignore-ancestry</option></term>
          <listitem>
            <para>Tells Subversion to ignore ancestry when calculating
            differences (rely on path contents alone).</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--incremental</option></term>
          <listitem>
            <para>Prints output in a format suitable for
              concatenation.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--message</option> (<option>-m</option>)
            <replaceable>MESSAGE</replaceable>
          </term>
          <listitem>
            <para>Indicates that you will specify a commit message
              on the command line, following this switch. For
              example:</para>
            
            <screen>
$ svn commit -m "They don't make Sunday."
</screen>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--new</option> <replaceable>ARG</replaceable></term>
          <listitem>
            <para>Uses <replaceable>ARG</replaceable> as the newer target.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--no-auth-cache</option></term>
          <listitem>
            <para>Prevents caching of authentication information
              (e.g. username and password) in the Subversion
              administrative directories.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--no-auto-props</option></term>
          <listitem>
            <para>Disables auto-props, overriding the
            <literal>enable-auto-props</literal> directive in the
            <filename>config</filename> file.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--no-diff-deleted</option></term>
        <listitem>
            <para>Prevents Subversion from printing differences for
              deleted files.  The default behavior when you remove a
              file is for <command>svn diff</command> to print the
              same differences that you would see if you had left
              the file but removed all the content.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--no-ignore</option></term>
          <listitem>
            <para>Shows files in the status listing that would
              normally be omitted since they match a pattern in the
              svn:ignore property. See <xref
              linkend="svn-ch-7-sect-1.3.2"/> for more
              information.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--non-interactive</option></term>
          <listitem>
            <para>In the case of an authentication failure, or
            insufficient credentials, prevents prompting for credentials
            (e.g. username or password).  This is useful if you're
            running Subversion inside of an automated script and it's
            more appropriate to have Subversion fail than to prompt
            for more information.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--non-recursive</option> (<option>-N</option>)</term>
          <listitem>
            <para>Stops a subcommand from recursing into
              subdirectories.  Most subcommands recurse by default,
              but some subcommands&mdash;usually those that have the
              potential to remove or undo your local
              modifications&mdash;do not.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--notice-ancestry</option></term>
          <listitem>
            <para>Pay attention to ancestry when calculating 
              differences.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--old</option> <replaceable>ARG</replaceable></term>
          <listitem>
            <para>Uses <replaceable>ARG</replaceable> as the older target.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--password</option>
            <replaceable>PASS</replaceable></term>
          <listitem>
            <para>Indicates that you are providing your password for
              authentication on the command line&mdash;otherwise, if
              it is needed, Subversion will prompt you for
              it.</para>
          </listitem>
        </varlistentry>
      
        <varlistentry>
          <term><option>--quiet</option> (<option>-q</option>)</term>
          <listitem>
            <para>Requests that the client print only essential
              information while performing an operation.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--recursive</option> (<option>-R</option>)</term>
          <listitem>
            <para>Makes a subcommand recurse into subdirectories.
              Most subcommands recurse by default.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--relocate</option> <replaceable>FROM TO
          [PATH...]</replaceable></term>
          <listitem>
            <para>Used with the <command>svn switch</command>
              subcommand, changes the location of the repository that
              your working copy references.  This is useful if the
              location of your repository changes and you have an
              existing working copy that you'd like to continue to
              use.  See <command>svn switch</command> for an
              example.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--revision</option> (<option>-r</option>)
            <replaceable>REV</replaceable>
          </term>
          <listitem>
            <para>Indicates that you're going to supply a revision (or
              range of revisions) for a particular operation.  You can
              provide revision numbers, revision keywords or dates (in
              curly braces), as arguments to the revision switch.  If
              you wish to provide a range of revisions, you can
              provide two revisions separated by a colon. For
              example:</para>

            <screen>
$ svn log -r 1729
$ svn log -r 1729:HEAD
$ svn log -r 1729:1744
$ svn log -r {2001-12-04}:{2002-02-17}
$ svn log -r 1729:{2002-02-17}
</screen>

            <para>See <xref linkend="svn-ch-3-sect-3.2"/> for more
              information.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--revprop</option></term>
          <listitem>
            <para>Operates on a revision property instead of a
              Subversion property specific to a file or directory.
              This switch requires that you also pass a revision
              with the <option>--revision</option>
              (<option>-r</option>) switch. See <xref
              linkend="svn-ch-5-sect-1.2"/> for more details on
              unversioned properties.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--show-updates</option> (<option>-u</option>)</term>
          <listitem>
            <para>Causes the client to display information about
              which files in your working copy are out-of-date.
              This doesn't actually update any of your
              files&mdash;it just shows you which files will be
              updated if you run <command>svn update </command>.
            </para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--stop-on-copy</option></term>
          <listitem>
            <para>Causes a Subversion subcommand which is traversing
            the history of a versioned resource to stop harvesting
            that historical information when a copy&mdash;that is, a
            location in history where that resource was copied from
            another location in the repository&mdash;is
            encountered.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--strict</option></term>
          <listitem>
            <para>Causes Subversion to use strict semantics, a notion
            which is rather vague unless talking about specific
            subcommands.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--targets</option>
            <replaceable>FILENAME</replaceable></term>
          <listitem>
            <para>Tells Subversion to get the list of files that you
              wish to operate on from the filename you provide
              instead of listing all the files on the command line.
            </para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--username</option>
            <replaceable>NAME</replaceable></term>
          <listitem>
            <para>Indicates that you are providing your username for
              authentication on the command line&mdash;otherwise, if
              it is needed, Subversion will prompt you for
              it.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--verbose</option> (<option>-v</option>)</term>
          <listitem>
            <para>Requests that the client print out as much
              information as it can while running any subcommand.
              This may result in Subversion printing out additional
              fields, detailed information about every file, or
              additional information regarding its actions.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--version</option></term>
          <listitem>
            <para>Prints the client version info.  This information
              not only includes the version number of the client,
              but also a listing of all repository access modules
              that the client can use to access a Subversion
              repository.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--xml</option></term>
          <listitem>
            <para>Prints output in XML format.</para>
          </listitem>
        </varlistentry>
        
      </variablelist>
      
    </sect2>
    
    <sect2 id="svn-ch-9-sect-1.2">
      <title><command>svn</command> Subcommands</title>

      <refentry id="svn-ch-9-sect-1.2-re-add">
        <refnamediv>
          <refname>svn add</refname>
          <refpurpose>Add files and directories.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title> 
          <programlisting>svn add PATH...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>
          
          <para>Add files and directories to your working copy and
            schedule them for addition to the repository.  They
            will be uploaded and added to the repository on your
            next commit.  If you add something and change your mind
            before committing, you can unschedule the addition using
            <command>svn revert</command>.</para>
        </refsect1>
        
        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>
        
        <refsect1>
          <title>Changes</title>
          <para>Working Copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>No</para>
        </refsect1>
        
        <refsect1>
          <title>Switches</title>

          <screen>
--targets FILENAME
--non-recursive (-N)
--quiet (-q)
--config-dir DIR
--auto-props
--no-auto-props
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>
          
          <para>To add a file to your working copy:</para>

          <screen>
$ svn add foo.c 
A         foo.c
</screen>

          <para>When adding a directory, the default behavior of
            <command>svn add</command> is to recurse:</para>
          
          <screen>
$ svn add testdir
A         testdir
A         testdir/a
A         testdir/b
A         testdir/c
A         testdir/d
</screen>

          <para>You can add a directory without adding its
            contents:</para>
          
          <screen>
$ svn add --non-recursive otherdir
A         otherdir
</screen>
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-blame">
        <refnamediv>
          <refname>svn blame</refname>
          <refpurpose>Show author and revision information in-line
            for the specified files or URLs.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn blame TARGET...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>
          
          <para>Show author and revision information in-line for the
            specified files or URLs.  Each line of text is annotated
            at the beginning with the author (username) and the
            revision number for the last change to that line.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>praise, annotate, ann</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>If you want to see blame annotated source for
          readme.txt in your test repository:</para>
          <screen>
$ svn blame http://svn.red-bean.com/repos/test/readme.txt
     3      sally This is a README file.
     5      harry You should read this.
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-cat">
        <refnamediv>
          <refname>svn cat</refname>
          <refpurpose>Output the contents of the specified files or
            URLs.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn cat TARGET...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>
          
          <para>Output the contents of the specified files or URLs.
            For listing the contents of directories, see <command>svn
            list</command>.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>If you want to view readme.txt in your repository
            without checking it out:</para>
          <screen>
$ svn cat http://svn.red-bean.com/repos/test/readme.txt
This is a README file.
You should read this.
</screen>

          <tip>
            <para>If your working copy is out of date (or you have
            local modifications) and you want to see the
            <literal>HEAD</literal> revision of a file in your working
            copy, <command>svn cat</command> will automatically fetch
            the <literal>HEAD</literal> revision when you give it a
            path:</para>
          </tip>

          <screen>
$ cat foo.c
This file is in my local working copy 
and has changes that I've made.

$ svn cat foo.c
Latest revision fresh from the repository!
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-checkout">
        <refnamediv>
          <refname>svn checkout</refname>
          <refpurpose>Check out a working copy from a repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn checkout URL... [PATH]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>
          
          <para>Check out a working copy from a repository. If
            <replaceable>PATH</replaceable> is omitted, the
            basename of the URL will be used as the
            destination. If multiple URLs are given each will be
            checked out into a subdirectory of PATH, with the
            name of the subdirectory being the basename of the
            URL.</para>

        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>co</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Creates a working copy.</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--revision (-r) REV
--quiet (-q)
--non-recursive (-N)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>

          <para>Check out a working copy into a directory called
            'mine':</para>

          <screen>
$ svn checkout file:///tmp/repos/test mine
A  mine/a
A  mine/b
Checked out revision 2.
$ ls
mine
</screen>

          <para>Check out 2 different directories into two separate
            working copies:</para>

          <screen>
$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz
A  test/a
A  test/b
Checked out revision 2.
A  quiz/l
A  quiz/m
Checked out revision 2.
$ ls
quiz  test
</screen>

          <para>Check out 2 different directories into two separate
            working copies, but place both into a directory called
            'working copies':</para>

          <screen>
$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz working-copies
A  working-copies/test/a
A  working-copies/test/b
Checked out revision 2.
A  working-copies/quiz/l
A  working-copies/quiz/m
Checked out revision 2.
$ ls
working-copies
</screen>

          <para>If you interrupt a checkout (or something else
            interrupts your checkout like loss of connectivity, etc.),
            you can restart it either by issuing the
            identical checkout command again, or by updating the
            incomplete working copy:</para>

          <screen>
$ svn checkout file:///tmp/repos/test test
A  test/a
A  test/b
^C
svn: The operation was interrupted
svn: caught SIGINT

$ svn checkout file:///tmp/repos/test test
A  test/c
A  test/d
^C
svn: The operation was interrupted
svn: caught SIGINT

$ cd test
$ svn update
A  test/e
A  test/f
Updated to revision 3.
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-cleanup">
        <refnamediv>
          <refname>svn cleanup</refname>
          <refpurpose>Recursively clean up the working copy.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn cleanup [PATH...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Recursively clean up the working copy, removing
            locks resuming unfinished operations.  If you ever get a
            <quote>working copy locked</quote> error, run this
            command to remove stale locks and get your working copy
            into a usable state again.  See <xref
            linkend="svn-ap-b"/>.</para>

          <para>If, for some reason, an <command>svn update</command>
            fails due to a problem running an external diff program
            (e.g. user input or network failure), pass the
            <option>--diff3-cmd</option> to allow cleanup to complete
            any merging with your external diff program.  You can also
            specify any configuration directory with the
            <option>--config-dir</option> switch, but you should need
            these switches extremely infrequently.</para>

        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>No</para>
        </refsect1>

        <refsect1>
          <title>Switches:</title>

          <screen>
--diff3-cmd CMD
--config-dir DIR
</screen>

        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Well, there's not much to the examples here as
            <command>svn cleanup</command> generates no output.  If
            you pass no PATH, <quote><filename>.</filename></quote> is
            used.</para>

          <screen>
$ svn cleanup

$ svn cleanup /path/to/working-copy
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-commit">
        <refnamediv>
          <refname>svn commit</refname>
          <refpurpose>Send changes from your working copy to the repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn commit [PATH...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Send changes from your working copy to the
            repository. If you do not supply a log message with your
            commit by using either the <option>--file</option> or
            <option>--message</option> switch,
            <command>svn</command> will launch your editor for you
            to compose a commit message.  See the
            <literal>editor-cmd</literal> section in <xref
            linkend="svn-ch-7-sect-1.3.2"/>.</para>

          <tip>
            <para>If you begin a commit and Subversion launches your
            editor to compose the commit message, you can still abort
            without committing your changes.  If you want to cancel
            your commit, just quit your editor without saving your
            commit message and Subversion will prompt you to either
            abort the commit, continue with no message, or edit the
            message again.</para>
          </tip>

        </refsect1>


        
        <refsect1>
          <title>Alternate Names</title>
          <para>ci (short for <quote>check in</quote> not 
            <quote>co</quote>, which is short for 
            <quote>checkout</quote>)</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--non-recursive (-N)
--targets FILENAME
--force-log
--username USER
--password PASS
--no-auth-cache
--non-interactive
--encoding ENC
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Commit a simple modification to a file with the
            commit message on the command line and an implicit
            target of your current directory (<quote><filename>.</filename></quote>):</para>
          
          <screen>
$ svn commit -m "added howto section."
Sending        a
Transmitting file data .
Committed revision 3.
</screen>

          <para>Commit a modification to the file
            <filename>foo.c</filename> (explicitly specified on the
            command line) with the commit message in a file named
            <literal>msg</literal>:</para>

          <screen>
$ svn commit -F msg foo.c
Sending        foo.c
Transmitting file data .
Committed revision 5.
</screen>

          <para>If you want to use a file that's under version
            control for your commit message with
            <option>--file</option>, you need to pass the
            <option>--force-log</option> switch:</para>

          <screen>
$ svn commit --file file_under_vc.txt foo.c
svn: The log message file is under version control
svn: Log message file is a versioned file; use '--force-log' to override

$ svn commit --force-log --file file_under_vc.txt foo.c
Sending        foo.c
Transmitting file data .
Committed revision 6.
</screen>

          <para>To commit a file scheduled for deletion:</para>

          <screen>
$ svn commit -m "removed file 'c'."
Deleting       c

Committed revision 7.
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-copy">
        <refnamediv>
          <refname>svn copy</refname>
          <refpurpose>Copy a file or directory in a working copy or
            in the repository.</refpurpose>
        </refnamediv>

        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn copy SRC DST</programlisting>
        </refsect1>

        <refsect1>
          <title>Description</title>
          
          <para>Copy a file in a working copy or in the repository.
            <replaceable>SRC</replaceable> and
            <replaceable>DST</replaceable> can each be either a
            working copy (WC) path or URL:</para>
            
            <variablelist>

              <varlistentry>
                <term>WC  -&gt; WC</term>
                <listitem>
                  <para>Copy and schedule an item for
                    addition (with history).</para>
                </listitem>
              </varlistentry>

              <varlistentry>
                <term>WC  -&gt; URL</term>
                <listitem>
                  <para>Immediately commit a copy of WC to URL.</para>
                </listitem>
              </varlistentry>

              <varlistentry>
                <term>URL -&gt; WC</term>
                <listitem>
                  <para>Check out URL into WC, and schedule it for addition.</para>
                </listitem>
              </varlistentry>

              <varlistentry>
                <term>URL -&gt; URL</term>
                <listitem>
                  <para>Complete server-side copy.  This is
                    usually used to branch and tag.</para>
                </listitem>
              </varlistentry>

            </variablelist>

          <note>
            <para>You can only copy files within a single repository.
              Subversion does not support cross-repository copying.</para>
          </note>

        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>cp</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Repository if destination is a URL.</para>
          <para>Working copy if destination is a WC path.</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>If source or destination is in the repository, or if needed
            to look up the source revision number.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--message (-m) TEXT
--file (-F) FILE
--revision (-r) REV
--quiet (-q)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--force-log
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Copy an item within your working copy (just
            schedules the copy&mdash;nothing goes into the repository
            until you commit):</para>

          <screen>
$ svn copy foo.txt bar.txt
A         bar.txt
$ svn status
A  +   bar.txt
</screen>

          <para>Copy an item in your working copy to a URL in the
            repository (an immediate commit, so you must supply a
            commit message):</para>

          <screen>
$ svn copy near.txt file:///tmp/repos/test/far-away.txt -m "Remote copy."

Committed revision 8.
</screen>

          <para>Copy an item from the repository to your working
            copy (just schedules the copy&mdash;nothing goes into the
            repository until you commit):</para>

          <tip>
            <para>This is the recommended way to resurrect a dead
              file in your repository!</para>
          </tip>

          <screen>
$ svn copy file:///tmp/repos/test/far-away near-here
A         near-here
</screen>

          <para>And finally, copying between two URLs:</para>

          <screen>
$ svn copy file:///tmp/repos/test/far-away file:///tmp/repos/test/over-there -m "remote copy."

Committed revision 9.
</screen>

          <tip>
            <para>This is the easiest way to <quote>tag</quote> a
              revision in your repository&mdash;just <command>svn
              copy</command> that revision (usually
              <literal>HEAD</literal>) into your tags directory.</para>
          </tip>

          <screen>
$ svn copy file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "tag tree"

Committed revision 12.
</screen>

          <para>And don't worry if you forgot to tag&mdash;you can
            always specify an older revision and tag anytime:</para>

          <screen>
$ svn copy -r 11 file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "Forgot to tag at rev 11"

Committed revision 13.
</screen>
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-delete">
        <refnamediv>
          <refname>svn delete</refname>
          <refpurpose>Delete an item from a working copy
            or the repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn delete PATH...</programlisting>
          <programlisting>svn delete URL...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Items specified by <replaceable>PATH</replaceable> are scheduled
            for deletion upon the next commit.  Files (and
            directories that have not been committed) are
            immediately removed from the working copy.  The command
            will not remove any unversioned or modified items; use
            the <option>--force</option> switch to override this
            behavior.</para>

          <para>Items specified by URL are deleted from
            the repository via an immediate commit.  Multiple URLs are
            committed atomically.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>del, remove, rm</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy if operating on files, Repository if operating on URLs</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on URLs</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--force
--force-log
--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--targets FILENAME
--username USER
--password PASS
--no-auth-cache
--non-interactive
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>

          <para>Using <command>svn</command> to delete a file from
            your working copy merely schedules it to be
            deleted. When you commit, the file is deleted in the
            repository.</para>

          <screen>
$ svn delete myfile
D         myfile

$ svn commit -m "Deleted file 'myfile'."
Deleting       myfile
Transmitting file data .
Committed revision 14.
</screen>

          <para>Deleting a URL, however, is immediate, so you have
          to supply a log message:</para>

          <screen>
$ svn delete -m "Deleting file 'yourfile'" file:///tmp/repos/test/yourfile

Committed revision 15.
</screen>

          <para>Here's an example of how to force deletion of a file
            that has local mods:</para>

          <screen>
$ svn delete over-there 
svn: Attempting restricted operation for modified resource
svn: Use --force to override this restriction
svn: 'over-there' has local modifications

$ svn delete --force over-there 
D         over-there
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-diff">
        <refnamediv>
          <refname>svn diff</refname>
          <refpurpose>Display the differences between two paths.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn diff [-r N[:M]] [--old OLD-TGT] [--new NEW-TGT] [PATH...]</programlisting>
          <programlisting>svn diff -r N:M URL</programlisting>
          <programlisting>svn diff [-r N[:M]] URL1[@N] URL2[@M]</programlisting>

        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Display the differences between two paths.  The three
            different ways you can use <command>svn diff</command>
            are:</para>

          <para><command>svn diff [-r N[:M]] [--old OLD-TGT] [--new
            NEW-TGT] [PATH...]</command> displays the differences
            between <replaceable>OLD-TGT</replaceable> and
            <replaceable>NEW-TGT</replaceable>.  If
            <replaceable>PATH</replaceable>s are given, they are
            treated as relative to <replaceable>OLD-TGT</replaceable>
            and <replaceable>NEW-TGT</replaceable> and the output is
            restricted to differences in only those paths.
            <replaceable>OLD-TGT</replaceable> and
            <replaceable>NEW-TGT</replaceable> may be working copy
            paths or
            <replaceable>URL</replaceable><literal>[@</literal><replaceable>REV</replaceable><literal>]</literal>.
            <replaceable>OLD-TGT</replaceable> defaults to the current
            working directory and <replaceable>NEW-TGT</replaceable>
            defaults to <replaceable>OLD-TGT</replaceable>.
            <replaceable>N</replaceable> defaults to
            <literal>BASE</literal> or, if
            <replaceable>OLD-TGT</replaceable> is a URL, to
            <literal>HEAD</literal>.  <replaceable>M</replaceable>
            defaults to the current working version or, if
            <replaceable>NEW-TGT</replaceable> is a URL, to
            <literal>HEAD</literal>.  <command>svn diff -r N</command>
            sets the revision of <replaceable>OLD-TGT</replaceable> to
            <replaceable>N</replaceable>, <command>svn diff -r
            N:M</command> also sets the revision of
            <replaceable>NEW-TGT</replaceable> to
            <replaceable>M</replaceable>.</para>

          <para><command>svn diff -r N:M URL</command> is shorthand
            for <command>svn diff -r N:M --old=URL
            --new=URL</command>.</para>

          <para><command>svn diff [-r N[:M]] URL1[@N]
            URL2[@M]</command> is shorthand for <command>svn diff [-r
            N[:M]] --old=URL1 --new=URL2</command>.</para>

          <para>If <replaceable>TARGET</replaceable> is a URL, then
            revs N and M can be given either via the
            <option>--revision</option> or by using
            <quote>@</quote> notation as described earlier.</para>

          <para>If <replaceable>TARGET</replaceable> is a working copy
            path, then the <option>--revision</option> switch
            means:</para>

          <variablelist>

            <varlistentry>
              <term><command>--revision N:M</command></term>
              <listitem>
                <para>The server compares
                <replaceable>TARGET</replaceable>@<replaceable>N</replaceable>
                and
                <replaceable>TARGET</replaceable>@<replaceable>M</replaceable>.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term><command>--revision N</command></term>
              <listitem>
                <para>The client compares
                  <replaceable>TARGET</replaceable>@<replaceable>N</replaceable>
                against working copy.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term><command>(no --revision)</command></term>
              <listitem>
                <para>The client compares base and working copies of
                  <replaceable>TARGET</replaceable>.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>If the alternate syntax is used, the server compares
            <replaceable>URL1</replaceable> and
            <replaceable>URL2</replaceable> at revisions
            <replaceable>N</replaceable> and
            <replaceable>M</replaceable> respectively.  If either
            <replaceable>N</replaceable> or
            <replaceable>M</replaceable> are omitted, a value of
            <literal>HEAD</literal> is assumed.</para>

          <para>By default, <command>svn diff</command> ignores the
            ancestry of files and merely compares the contents of the
            two files being compared.  If you use
            <option>--notice-ancestry</option>, the ancestry of the
            paths in question will be taken into consideration when
            comparing revisions (that is, if you run <command>svn
            diff</command> on two files with identical contents but
            different ancestry you will see the entire contents of the
            file as having been removed and added again).</para>

        </refsect1>
        <refsect1>
          <title>Alternate Names</title>
          <para>di</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>For obtaining differences against anything but
            <literal>BASE</literal> revision in your working copy</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--old OLD-TARGET
--new NEW-TARGET
--extensions (-x) "ARGS"
--non-recursive (-N)
--diff-cmd CMD
--notice-ancestry
--username USER
--password PASS
--no-auth-cache
--non-interactive
--no-diff-deleted
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Compare <literal>BASE</literal> and your working copy
            (one of the most popular uses of <command>svn
            diff</command>):</para>

          <screen>
$ svn diff COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 4404)
+++ COMMITTERS	(working copy)
</screen>

          <para>See how your working copy's modifications compare
            against an older revision:</para>

          <screen>
$ svn diff -r 3900 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3900)
+++ COMMITTERS	(working copy)
</screen>

          <para>Compare revision 3000 to revision 3500 using <quote>@</quote>
            syntax:</para>

          <screen>
$ svn diff http://svn.collab.net/repos/svn/trunk/COMMITTERS@3000 http://svn.collab.net/repos/svn/trunk/COMMITTERS@3500
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)
&hellip;
</screen>

          <para>Compare revision 3000 to revision 3500 using range
            notation (you only pass the one URL in this
            case):</para>

          <screen>
$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk/COMMITTERS
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)
</screen>


          <para>Compare revision 3000 to revision 3500 of all files in
          <filename>trunk</filename> using range notation:</para>

          <screen>
$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk
          </screen>


          <para>Compare revision 3000 to revision 3500 of only three
            files in <filename>trunk</filename> using range
            notation:</para>

          <screen>
$ svn diff -r 3000:3500 --old http://svn.collab.net/repos/svn/trunk COMMITTERS README HACKING
          </screen>

          <para>If you have a working copy, you can obtain the
            differences without typing in the long URLs:</para>

          <screen>
$ svn diff -r 3000:3500 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)
</screen>

          <para>Use <option>--diff-cmd</option>
            <replaceable>CMD</replaceable> <option>-x</option> to
            pass arguments directly to the external diff
            program</para>
          
          <screen>
$ svn diff --diff-cmd /usr/bin/diff -x "-i -b" COMMITTERS 
Index: COMMITTERS
===================================================================
0a1,2
&gt; This is a test
&gt; 
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-export">
        <refnamediv>
          <refname>svn export</refname>
          <refpurpose>Export a clean directory tree.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn export [-r REV] URL [PATH]</programlisting>
          <programlisting>svn export PATH1 PATH2</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>The first form exports a clean directory tree from the
            repository specified by URL, at revision
            <replaceable>REV</replaceable> if it is given, otherwise
            at <literal>HEAD</literal>, into
            <replaceable>PATH</replaceable>. If
            <replaceable>PATH</replaceable> is omitted, the last
            component of the <replaceable>URL</replaceable> is used
            for the local directory name.</para>

          <para>The second form exports a clean directory tree from
            the working copy specified by
            <replaceable>PATH1</replaceable> into
            <replaceable>PATH2</replaceable>.  All local changes will
            be preserved, but files not under version control will not
            be copied.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Local disk</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if exporting from a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--quiet (-q)
--force
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Export from your working copy (doesn't print every
            file and directory):</para>

          <screen>
$ svn export a-wc my-export
Export complete.
</screen>

          <para>Export directly from the repository (prints every
            file and directory):</para>

          <screen>
$ svn export file:///tmp/repos my-export
A  my-export/test
A  my-export/quiz
&hellip;
Exported revision 15.
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-help">
        <refnamediv>
          <refname>svn help</refname>
          <refpurpose>Help!</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn help [SUBCOMMAND...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>This is your best friend when you're using
            Subversion and this book isn't within reach!</para>
        </refsect1>
        
        <refsect1>
          <title>Alternate Names</title>
          <para>?, h</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>No</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--version
--quiet (-q)
</screen>
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-import">
        <refnamediv>
          <refname>svn import</refname>
          <refpurpose>Recursively commit a copy of PATH to URL.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn import [PATH] URL</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Recursively commit a copy of
            <replaceable>PATH</replaceable> to
            <replaceable>URL</replaceable>.  If
            <replaceable>PATH</replaceable> is omitted
            <quote><filename>.</filename></quote> is assumed.  Parent
            directories are created in the repository as
            necessary.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Repository</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--non-recursive (-N)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--force-log
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR
--auto-props
--no-auto-props
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This imports the local directory <filename>myproj</filename> into the
            root of your repository:</para>

          <screen>
$ svn import -m "New import" myproj http://svn.red-bean.com/repos/test
Adding         myproj/sample.txt
&hellip;
Transmitting file data .........
Committed revision 16.
</screen>

          <para>This imports the local directory <filename>myproj</filename> into
            <filename>trunk/vendors</filename> in your repository.  The directory
            <filename>trunk/vendors</filename> need not exist before you import into
            it&mdash;<command>svn import</command> will
            recursively create directories for you:</para>
          <screen>
$ svn import -m "New import" myproj \
    http://svn.red-bean.com/repos/test/trunk/vendors/myproj
Adding         myproj/sample.txt
&hellip;
Transmitting file data .........
Committed revision 19.
</screen>

          <para>After importing data, note that the original tree is
            <emphasis>not</emphasis> under version control.  To start
            working, you still need to <command>svn checkout</command>
            a fresh working copy of the tree.</para>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-info">
        <refnamediv>
          <refname>svn info</refname>
          <refpurpose>Print information about PATHs.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn info [PATH...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print information about paths in your working copy,
          including:</para>

          <itemizedlist>
            <listitem><para>Path</para></listitem>
            <listitem><para>Name</para></listitem>
            <listitem><para>URL</para></listitem>
            <listitem><para>Revision</para></listitem>
            <listitem><para>Node Kind</para></listitem>
            <listitem><para>Last Changed Author</para></listitem>
            <listitem><para>Last Changed Revision</para></listitem>
            <listitem><para>Last Changed Date</para></listitem>
            <listitem><para>Text Last Updated</para></listitem>
            <listitem><para>Properties Last Updated</para></listitem>
            <listitem><para>Checksum</para></listitem>
          </itemizedlist>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>No</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--targets FILENAME
--recursive (-R)
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para><command>svn info</command> will show you all the
            useful information that it has for items in your working
            copy.  It will show information for files:</para>

          <screen>
$ svn info foo.c
Path: foo.c
Name: foo.c
URL: http://svn.red-bean.com/repos/test/foo.c
Revision: 4417
Node Kind: file
Schedule: normal
Last Changed Author: sally
Last Changed Rev: 20
Last Changed Date: 2003-01-13 16:43:13 -0600 (Mon, 13 Jan 2003)
Text Last Updated: 2003-01-16 21:18:16 -0600 (Thu, 16 Jan 2003)
Properties Last Updated: 2003-01-13 21:50:19 -0600 (Mon, 13 Jan 2003)
Checksum: /3L38YwzhT93BWvgpdF6Zw==
</screen>

          <para>It will also show information for directories:</para>

          <screen>
$ svn info vendors
Path: trunk
URL: http://svn.red-bean.com/repos/test/vendors
Revision: 19
Node Kind: directory
Schedule: normal
Last Changed Author: harry
Last Changed Rev: 19
Last Changed Date: 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003)
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-list">
        <refnamediv>
          <refname>svn list</refname>
          <refpurpose>List directory entries in the repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn list [TARGET...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>List each <replaceable>TARGET</replaceable> file and
            the contents of each <replaceable>TARGET</replaceable>
            directory as they exist in the repository.  If
            <replaceable>TARGET</replaceable> is a working copy path,
            the corresponding repository URL will be used.</para>

          <para>The default <replaceable>TARGET</replaceable> is
            <quote><filename>.</filename></quote>, meaning the
            repository URL of the current working copy
            directory.</para>

          <para>With <option>--verbose</option>, the following fields show
            the status of the item:</para>

          <itemizedlist>
            <listitem><para>Revision number of the last
            commit</para></listitem> <listitem><para>Author of the
            last commit</para></listitem> <listitem><para>Size (in
            bytes)</para></listitem> <listitem><para>Date and time of
            the last commit</para></listitem>
          </itemizedlist>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>ls</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--verbose (-v)
--recursive (-R)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para><command>svn list</command> is most useful if you
            want to see what files a repository has without
            downloading a working copy:</para>

          <screen>
$ svn list http://svn.red-bean.com/repos/test/support
README.txt
INSTALL
examples/
&hellip;
</screen>

          <para>Like UNIX <command>ls</command>, you can also pass
          the <option>--verbose</option> switch for additional
          information:</para>

          <screen>
$ svn list --verbose file:///tmp/repos
     16 sally         28361 Jan 16 23:18 README.txt
     27 sally             0 Jan 18 15:27 INSTALL
     24 harry               Jan 18 11:27 examples/
</screen>

          <para>For further details, see <xref
              linkend="svn-ch-3-sect-5.4"/>.</para>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-log">
        <refnamediv>
          <refname>svn log</refname>
          <refpurpose>Display commit log messages.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn log [PATH]</programlisting>
          <programlisting>svn log URL [PATH...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>The default target is the path of your current
            directory.  If no arguments are supplied, <command>svn
            log</command> shows the log messages for all files and
            directories inside of (and including) the current working
            directory of your working copy.  You can refine the
            results by specifying a path, one or more revisions, or
            any combination of the two.  The default revision range
            for a local path is <literal>BASE:1</literal>.</para>

          <para>If you specify a URL alone, then it prints log
            messages for everything that the URL contains.  If you
            add paths past the URL, only messages for those paths
            under that URL will be printed.  The default revision range
            for a URL is <literal>HEAD:1</literal>.</para>

          <para>With <option>--verbose</option>, <command>svn log</command>
            will also print all affected paths with each log message.
            With <option>--quiet</option>, <command>svn log</command>
            will not print the log message body itself (this is
            compatible with <option>--verbose</option>).</para>

          <para>Each log message is printed just once, even if more
            than one of the affected paths for that revision were
            explicitly requested.  Logs follow copy history by
            default.  Use <option>--stop-on-copy</option> to disable
            this behavior, which can be useful for determining branch
            points.</para>

        </refsect1>
        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--quiet (-q)
--verbose (-v)
--targets FILENAME
--stop-on-copy
--incremental
--xml
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>You can see the log messages for all the paths that
            changed in your working copy by running <command>svn
            log</command> from the top:</para>

          <screen>
$ svn log
------------------------------------------------------------------------
r20 | harry | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Tweak.
------------------------------------------------------------------------
r17 | sally | 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003) | 2 lines
&hellip;
</screen>

          <para>Examine all log messages for a particular file in
            your working copy:</para>

          <screen>
$ svn log foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
&hellip;
</screen>

          <para>If you don't have a working copy handy, you can log
            a URL:</para>

          <screen>
$ svn log http://svn.red-bean.com/repos/test/foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
&hellip;
</screen>

          <para>If you want several distinct paths underneath the
            same URL, you can use the <literal>URL [PATH...]</literal>
            syntax.</para>

          <screen>
$ svn log http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line

Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
&hellip;
</screen>

          <para>That is the same as explicitly placing both URLs on
            the command line:</para>

          <screen>
$ svn log http://svn.red-bean.com/repos/test/foo.c \
          http://svn.red-bean.com/repos/test/bar.c
&hellip;
</screen>

          <para>When you're concatenating the results of multiple
            calls to the log command, you may want to use the
            <option>--incremental</option> switch. <command>svn
            log</command> normally prints out a dashed line at the
            beginning of a log message, after each subsequent log
            message, and following the final log message.  If you
            ran svn log on a range of two revisions, you would get
            this:</para>
          <screen>
$ svn log -r 14:15
------------------------------------------------------------------------
r14 | ... 

------------------------------------------------------------------------
r15 | ... 

------------------------------------------------------------------------
</screen>

          <para>However, if you wanted to gather 2 non-sequential
            log messages into a file, you might do something like
            this:</para>

          <screen>
$ svn log -r 14 &gt; mylog
$ svn log -r 19 &gt;&gt; mylog
$ svn log -r 27 &gt;&gt; mylog
$ cat mylog
------------------------------------------------------------------------
r14 | ... 

------------------------------------------------------------------------
------------------------------------------------------------------------
r19 | ... 

------------------------------------------------------------------------
------------------------------------------------------------------------
r27 | ... 

------------------------------------------------------------------------
</screen>

          <para>You can avoid the clutter of the double dashed lines
            in your output by using the incremental switch:</para>


          <screen>
$ svn log --incremental -r 14 &gt; mylog
$ svn log --incremental -r 19 &gt;&gt; mylog
$ svn log --incremental -r 27 &gt;&gt; mylog
$ cat mylog
------------------------------------------------------------------------
r14 | ... 

------------------------------------------------------------------------
r19 | ... 

------------------------------------------------------------------------
r27 | ... 
</screen>

          <para>The <option>--incremental</option> switch provides
            similar output control when using the
            <option>--xml</option> switch.</para>



          <tip>
            <para>If you run <command>svn log</command> on a specific
              path and provide a specific revision and get no output
              at all</para>

            <screen>
$ svn log -r 20 http://svn.red-bean.com/untouched.txt
------------------------------------------------------------------------
</screen>

            <para>That just means that the path was not modified in
              that revision.  If you log from the top of the
              repository, or know the file that changed in that
              revision, you can specify it explicitly:</para>
            
            <screen>
$ svn log -r 20 touched.txt 
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Made a change.
------------------------------------------------------------------------
</screen>
          </tip>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-merge">
        <refnamediv>
          <refname>svn merge</refname>
          <refpurpose>Apply the differences between two sources to a
          working copy path.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]</programlisting>
          <programlisting>svn merge -r N:M SOURCE [PATH]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>In the first form, the source URLs are specified at
            revisions <replaceable>N</replaceable> and
            <replaceable>M</replaceable>.  These are the two sources
            to be compared.  The revisions default to
            <literal>HEAD</literal> if omitted.</para>

          <para>In the second form, <replaceable>SOURCE</replaceable>
            can be a URL or working copy item, in which case the
            corresponding URL is used.  This URL, at revisions
            <replaceable>N</replaceable> and
            <replaceable>M</replaceable>, defines the two sources to
            be compared.</para>

          <para><replaceable>WCPATH</replaceable> is the working copy
            path that will receive the changes. If
            <replaceable>WCPATH</replaceable> is omitted, a default
            value of <quote><filename>.</filename></quote> is assumed,
            unless the sources have identical basenames that match a
            file within <quote><filename>.</filename></quote>: in which
            case, the differences will be applied to that file.</para>

          <para>Unlike <command>svn diff</command>, the merge command
            takes the ancestry of a file into consideration when
            performing a merge operation.  This is very important when
            you're merging changes from one branch into another and
            you've renamed a file on one branch but not the other.
          </para>

        </refsect1>
        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if working with URLs</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--non-recursive (-N)
--quiet (-q)
--force
--dry-run
--diff3-cmd CMD
--ignore-ancestry
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Merge a branch back into the trunk (assuming that
            you have a working copy of the trunk, and that the branch
            was created in revision 250):</para>

          <screen>
$ svn merge -r 250:HEAD http://svn.red-bean.com/repos/branches/my-branch
U  myproj/tiny.txt
U  myproj/thhgttg.txt
U  myproj/win.txt
U  myproj/flo.txt
</screen>

          <para>If you branched at revision 23, and you want to
            merge changes on trunk into your branch, you could do
            this from inside the working copy of your branch:</para>

          <screen>
$ svn merge -r 23:30 file:///tmp/repos/trunk/vendors
U  myproj/thhgttg.txt
&hellip;
</screen>
          
        <para>To merge changes to a single file:</para>

        <screen>
$ cd myproj
$ svn merge -r 30:31 thhgttg.txt 
U  thhgttg.txt
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-mkdir">
        <refnamediv>
          <refname>svn mkdir</refname>
          <refpurpose>Create a new directory under version control.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn mkdir PATH...</programlisting>
          <programlisting>svn mkdir URL...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Create a directory with a name given by the final
            component of the <replaceable>PATH</replaceable> or URL.
            A directory specified by a working copy
            <replaceable>PATH</replaceable> is scheduled for addition
            in the working copy.  A directory specified by a URL is
            created in the repository via an immediate commit.
            Multiple directory URLs are committed atomically.  In both
            cases all the intermediate directories must already
            exist.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--editor-cmd EDITOR
--encoding ENC
--force-log
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Create a directory in your working copy:</para>

          <screen>
$ svn mkdir newdir
A         newdir
</screen>

          <para>Create one in the repository (instant commit, so a
            log message is required):</para>

          <screen>
$ svn mkdir -m "Making a new dir." http://svn.red-bean.com/repos/newdir

Committed revision 26.
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-move">
        <refnamediv>
          <refname>svn move</refname>
          <refpurpose>Move a file or directory.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn move SRC DST</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>This command moves a file or directory in your
            working copy or in the repository.</para>

          <tip>
            <para>This command is equivalent to an <command>svn
              copy</command> followed by <command>svn
              delete</command>.</para>
          </tip>

          <note>
            <para>Subversion does not support moving between working
            copies and URLs.  In addition, you can only move files
            within a single repository&mdash;Subversion does not
            support cross-repository moving.</para>
          </note>

          <variablelist>

            <varlistentry>
              <term>WC  -&gt; WC</term>
              <listitem>
                <para>Move and schedule a file or directory for
                  addition (with history).</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>URL -&gt; URL</term>
              <listitem>
                <para>Complete server-side rename.</para>
              </listitem>
            </varlistentry>

          </variablelist>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>mv, rename, ren</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--message (-m) TEXT
--file (-F) FILE
--revision (-r) REV
--quiet (-q)
--force
--username USER
--password PASS
--no-auth-cache
--non-interactive
--editor-cmd EDITOR
--encoding ENC
--force-log
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Move a file in your working copy:</para>

          <screen>
$ svn move foo.c bar.c
A         bar.c
D         foo.c
</screen>

          <para>Move a file in the repository (an immediate commit,
            so it requires a commit message): </para>

          <screen>
$ svn move -m "Move a file" http://svn.red-bean.com/repos/foo.c \
                            http://svn.red-bean.com/repos/bar.c

Committed revision 27.
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-propdel">
        <refnamediv>
          <refname>svn propdel</refname>
          <refpurpose>Remove a property from an item.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn propdel PROPNAME [PATH...]</programlisting>
          <programlisting>svn propdel PROPNAME --revprop -r REV [URL]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>This removes properties from files, directories, or
            revisions.  The first form removes versioned properties
            in your working copy, while the second removes unversioned
            remote properties on a repository revision.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>pdel, pd</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--quiet (-q)
--recursive (-R)
--revision (-r) REV
--revprop
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Delete a property from a file in your working
            copy</para>

          <screen>
$ svn propdel svn:mime-type  some-script
property 'svn:mime-type' deleted from 'some-script'.
</screen>

          <para>Delete a revision property:</para>

          <screen>
$ svn propdel --revprop -r 26 release-date 
property 'release-date' deleted from repository revision '26'
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-propedit">
        <refnamediv>
          <refname>svn propedit</refname>
          <refpurpose>Edit the property of one or more items under
            version control.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn propedit PROPNAME PATH...</programlisting>
          <programlisting>svn propedit PROPNAME --revprop -r REV [URL]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Edit one or more properties using your favorite
            editor. The first form edits versioned properties in
            your working copy, while the second edits unversioned
            remote properties on a repository revision.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>pedit, pe</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--revprop
--username USER
--password PASS
--no-auth-cache
--non-interactive
--encoding ENC
--editor-cmd EDITOR
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para><command>svn propedit</command> makes it easy to
            modify properties that have multiple values:</para>

          <screen>
$ svn propedit svn:keywords  foo.c 
    &lt;svn will launch your favorite editor here, with a buffer open
    containing the current contents of the svn:keywords property.  You
    can add multiple values to a property easily here by entering one
    value per line.&gt;
Set new value for property 'svn:keywords' on 'foo.c'
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-propget">
        <refnamediv>
          <refname>svn propget</refname>
          <refpurpose>Print the value of a property.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn propget PROPNAME [PATH...]</programlisting>
          <programlisting>svn propget PROPNAME --revprop -r REV [URL]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the value of a property on files,
            directories, or revisions.  The first form prints the
            versioned property of an item or items in your working
            copy, while the second prints unversioned remote
            property on a repository revision.  See <xref
            linkend="svn-ch-7-sect-2"/> for more information on
            properties.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>pget, pg</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--recursive (-R)
--revision (-r) REV
--revprop
--strict
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Examine a property of a file in your working
            copy:</para>
          
          <screen>
$ svn propget svn:keywords foo.c
Author
Date
Rev
</screen>

          <para>The same goes for a revision property:</para>

          <screen>
$ svn propget svn:log --revprop -r 20 
Began journal.
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-proplist">
        <refnamediv>
          <refname>svn proplist</refname>
          <refpurpose>List all properties.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn proplist [PATH...]</programlisting>
          <programlisting>svn proplist --revprop -r REV [URL]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>List all properties on files, directories, or
            revisions.  The first form lists versioned properties in
            your working copy, while the second lists unversioned remote
            properties on a repository revision.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>plist, pl</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--verbose (-v)
--recursive (-R)
--revision (-r) REV
--quiet (-q)
--revprop
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>

          <para>You can use proplist to see the properties on an
            item in your working copy:</para>

          <screen>
$ svn proplist foo.c
Properties on 'foo.c':
  svn:mime-type
  svn:keywords
  owner
</screen>

          <para>But with the <option>--verbose</option> flag, svn
            proplist is extremely handy as it also shows you the
            values for the properties:</para>

          <screen>
$ svn proplist --verbose foo.c
Properties on 'foo.c':
  svn:mime-type : text/plain
  svn:keywords : Author Date Rev
  owner : sally
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-propset">
        <refnamediv>
          <refname>svn propset</refname>
          <refpurpose>Set PROPNAME to PROPVAL on files, directories, or revisions.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn propset PROPNAME [PROPVAL | -F VALFILE] PATH...</programlisting>
          <programlisting>svn propset PROPNAME --revprop -r REV [PROPVAL | -F VALFILE] [URL]</programlisting>
        </refsect1>

        <refsect1>
          <title>Description</title>

          <para>Set <replaceable>PROPNAME</replaceable> to
            <replaceable>PROPVAL</replaceable> on files, directories,
            or revisions. The first example creates a versioned, local
            property change in the working copy, and the second
            creates an unversioned, remote property change on a
            repository revision.</para>

          <tip>
            <para>Subversion has a number of <quote>special</quote>
              properties that affect its behavior.  See <xref
              linkend="svn-ch-7-sect-2.3"/> for more on these
              properties.</para>
          </tip>

        </refsect1>
        <refsect1>
          <title>Alternate Names</title>
          <para>pset, ps</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy, repository only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if operating on a URL</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--file (-F) FILE
--quiet (-q)
--revision (-r) REV
--targets FILENAME
--recursive (-R)
--revprop
--username USER
--password PASS
--no-auth-cache
--non-interactive
--encoding ENC
--force
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Set the mimetype on a file:</para>

          <screen>
$ svn propset svn:mime-type image/jpeg foo.jpg 
property 'svn:mime-type' set on 'foo.jpg'
</screen>

          <para>On a UNIX system, if you want a file to have the
            executable permission set:</para>

          <screen>
$ svn propset svn:executable ON somescript
property 'svn:executable' set on 'somescript'
</screen>

          <para>Perhaps you have an internal policy to set certain
            properties for the benefit of your coworkers:</para>

          <screen>
$ svn propset owner sally foo.c
property 'owner' set on 'foo.c'
</screen>

          <para>If you made a mistake in a log message for a
            particular revision and want to change it, use
            <option>--revprop</option> and set svn:log to the new
            log message:</para>

          <screen>
$ svn propset --revprop -r 25 svn:log "Journaled about trip to New York."
property 'svn:log' set on repository revision '25'
</screen>

          <para>Or, if you don't have a working copy, you can
          provide a URL.</para>
          
          <screen>
$ svn propset --revprop -r 26 svn:log "Document nap." http://svn.red-bean.com/repos
property 'svn:log' set on repository revision '25'
</screen>

          <para>Lastly, you can tell propset to take its input from
          a file.  You could even use this to set the contents of a
          property to something binary:</para>

          <screen>
$ svn propset owner-pic -F sally.jpg moo.c 
property 'owner-pic' set on 'moo.c'
</screen>

          <note>
            <para>By default, you cannot modify revision properties
              in a Subversion repository.  Your repository
              administrator must explicitly enable revision property
              modifications by creating a hook named
              <literal>pre-revprop-change</literal>. See <xref
              linkend="svn-ch-5-sect-2.1"/> for more information on
              hook scripts.</para>
          </note>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-resolved">
        <refnamediv>
          <refname>svn resolved</refname>
          <refpurpose>Remove <quote>conflicted</quote> state on
            working copy files or directories.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn resolved PATH...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Remove <quote>conflicted</quote> state on working
            copy files or directories. This routine does not
            semantically resolve conflict markers; it merely removes
            conflict-related artifact files and allows PATH to be
            committed again; that is, it tells Subversion that the
            conflicts have been <quote>resolved</quote>.  See <xref
            linkend="svn-ch-3-sect-4.4"/> for an in-depth look at
            resolving conflicts.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>No</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--targets FILENAME
--recursive (-R)
--quiet (-q)
--config-dir DIR
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>
          
          <para>If you get a conflict on an update, your working
            copy will sprout three new files:</para>

          <screen>
$ svn update
C  foo.c
Updated to revision 31.
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
</screen>

          <para>Once you've resolved the conflict and
            <filename>foo.c</filename> is ready to be committed, run
            <command>svn resolved</command> to let your working copy
            know you've taken care of everything.</para>

          <warning>
            <para>You <emphasis>can</emphasis> just remove the
              conflict files and commit, but <command>svn
              resolved</command> fixes up some bookkeeping data
              in the working copy administrative area in addition
              to removing the conflict files, so we recommend that
              you use this command.</para>
          </warning>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-revert">
        <refnamediv>
          <refname>svn revert</refname>
          <refpurpose>Undo all local edits.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn revert PATH...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Reverts any local changes to a file or directory and
            resolves any conflicted states.  <command>svn
            revert</command> will not only revert the contents of an
            item in your working copy, but also any property
            changes.  Finally, you can use it to undo any scheduling
            operations that you may have done (e.g. files scheduled
            for addition or deletion can be
            <quote>unscheduled</quote>).</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>None</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>No</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--targets FILENAME
--recursive (-R)
--quiet (-q)
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Discard changes to a file:</para>

          <screen>
$ svn revert foo.c
Reverted foo.c
</screen>

          <para>If you want to revert a whole directory of files,
            use the <option>--recursive</option> flag:</para>

          <screen>
$ svn revert --recursive .
Reverted newdir/afile
Reverted foo.c
Reverted bar.txt
</screen>

          <para>Lastly, you can undo any scheduling
            operations:</para>

          <screen>
$ svn add mistake.txt whoops
A         mistake.txt
A         whoops
A         whoops/oopsie.c

$ svn revert mistake.txt whoops
Reverted mistake.txt
Reverted whoops

$ svn status
?      mistake.txt
?      whoops
</screen>

          <note>
            <para>If you provide no targets to <command>svn
              revert</command>, it will do nothing&mdash;to protect
              you from accidentally losing changes in your working
              copy, <command>svn revert</command> requires you to
              provide at least one target.</para>
          </note>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-status">
        <refnamediv>
          <refname>svn status</refname>
          <refpurpose>Print the status of working copy files and directories.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn status [PATH...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the status of working copy files and
            directories.  With no arguments, it prints only locally
            modified items (no repository access).  With
            <option>--show-updates</option>, add working revision
            and server out-of-date information.  With
            <option>--verbose</option>, print full revision
            information on every item.</para>

          <para>The first five columns in the output are each one
            character wide, and each column gives you information
            about different aspects of each working copy
            item.</para>
          
          <para>The first column indicates that an item
            was added, deleted, or otherwise changed.</para>

          <variablelist>
            
            <varlistentry>
              <term>' '</term>
              <listitem>
                <para>No modifications.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'A'</term>
              <listitem>
                <para>Item is scheduled for Addition.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'D'</term>
              <listitem>
                <para>Item is scheduled for Deletion.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'M'</term>
              <listitem>
                <para>Item has been modified.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'C'</term>
              <listitem>
                <para>Item is in conflict with updates received from
                the repository.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'X'</term>
              <listitem>
                <para>Item is related to an externals definition.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'I'</term>
              <listitem>
                <para>Item is being ignored (e.g. with the 
                  svn:ignore property).</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'?'</term>
              <listitem>
                <para>Item is not under version control.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'!'</term>
              <listitem>
                <para>Item is missing (e.g. you moved or deleted it
                without using <command>svn</command>).  This also
                indicates that a directory is incomplete (a checkout
                or update was interrupted).</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'~'</term>
              <listitem>
                <para>Item is versioned as a directory, but has
                  been replaced by a file, or vice versa.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>The second column tells the status of a file's or
            directory's properties.</para>

          <variablelist>
            
            <varlistentry>
              <term>' '</term>
              <listitem>
                <para>No modifications.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'M'</term>
              <listitem>
                <para>Properties for this item have been
                  modified.</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>'C'</term>
              <listitem>
                <para>Properties for this item are in conflict with
                property updates received from the
                repository.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>The third column is populated only if the
            working copy directory is locked.</para>

          <variablelist>
            
            <varlistentry>
              <term>' '</term>
              <listitem>
                <para>Item is not locked.</para>
              </listitem>
            </varlistentry>
            
            <varlistentry>
              <term>'L'</term>
              <listitem>
                <para>Item is locked.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>The fourth column is populated only if the item is
            scheduled for addition-with-history.</para>
          
          <variablelist>
            
            <varlistentry>
              <term>' '</term>
              <listitem>
                <para>No history scheduled with commit.</para>
              </listitem>
            </varlistentry>
            
            <varlistentry>
              <term>'+'</term>
              <listitem>
                <para>History scheduled with commit.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>The fifth column is populated only if the item is
            switched relative to its parent (see <xref
            linkend="svn-ch-4-sect-5"/>).</para>

          <variablelist>
            
            <varlistentry>
              <term>' '</term>
              <listitem>
                <para>Item is a child of its parent directory.</para>
              </listitem>
            </varlistentry>
            
            <varlistentry>
              <term>'S'</term>
              <listitem>
                <para>Item is switched.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>The out-of-date information appears in the eighth
            column (only if you pass the
            <option>--show-updates</option> switch).</para>

          <variablelist>
            
            <varlistentry>
              <term>' '</term>
              <listitem>
                <para>The item in your working copy is up-to-date.</para>
              </listitem>
            </varlistentry>
            
            <varlistentry>
              <term>'*'</term>
              <listitem>
                <para>A newer revision of the item exists on the
                  server.</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>The remaining fields are variable width and
            delimited by spaces.  The working revision is the next
            field if the <option>--show-updates</option> or
            <option>--verbose</option> switches are passed.</para>
          
          <para>If the <option>--verbose</option> switch is passed,
            the last committed revision and last committed author
            are displayed next.</para>
          
          <para>The working copy path is always the final field, so
            it can include spaces.</para>

        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>stat, st</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Nothing</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Only if using <option>--show-updates</option></para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--show-updates (-u)
--verbose (-v)
--non-recursive (-N)
--quiet (-q)
--no-ignore
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This is the easiest way to find out what changes you
            have made to your working copy:</para>

          <screen>
$ svn status wc
 M     wc/bar.c
A  +   wc/qax.c
</screen>

          <para>If you want to find out what files in your working
            copy are out-of-date, pass the
            <option>--show-updates</option> switch (this will
            <emphasis>not</emphasis> make any changes to your
            working copy).  Here you can see that
            <filename>wc/foo.c</filename> has changed in the
            repository since we last updated our working
            copy:</para>

          <screen>
$ svn status --show-updates wc
 M           965    wc/bar.c
       *     965    wc/foo.c
A  +         965    wc/qax.c
Status against revision:    981
</screen>

          <note>
            <para><option>--show-updates</option>
            <emphasis>only</emphasis> places an asterisk next to items
            that are out of date (that is, items that will be updated
            from the repository if you run <command>svn
            update</command>).  <option>--show-updates</option> does
            <emphasis>not</emphasis> cause the status listing to
            reflect the repository's version of the item.</para>
          </note>

          <para>And finally, the most information you can get out of
            the status subcommand:</para>

          <screen>
$ svn status --show-updates --verbose wc
 M           965       938 sally        wc/bar.c
       *     965       922 harry        wc/foo.c
A  +         965       687 harry        wc/qax.c
             965       687 harry        wc/zig.c
Head revision:   981
</screen>

          <para>For many more examples of <command>svn status</command>,
            see <xref linkend="svn-ch-3-sect-4.3.1"/>.</para>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-switch">
        <refnamediv>
          <refname>svn switch</refname>
          <refpurpose>Update working copy to a different URL.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn switch URL [PATH]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>This subcommand updates your working copy to mirror
            a new URL&mdash;usually a URL which shares a common
            ancestor with your working copy, although not
            necessarily.  This is the Subversion way to move a
            working copy to a new branch.  See <xref
            linkend="svn-ch-4-sect-5"/> for an in-depth look at
            switching.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>sw</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--non-recursive (-N)
--quiet (-q)
--diff3-cmd CMD
--relocate
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>

          <para>If you're currently inside the directory
            <filename>vendors</filename> which was branched to
            <filename>vendors-with-fix</filename> and you'd like to
            switch your working copy to that branch:</para>

          <screen>
$ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
U  myproj/foo.txt
U  myproj/bar.txt
U  myproj/baz.c
U  myproj/qux.c
Updated to revision 31.
</screen>

          <para>And to switch back, just provide the URL to the
            location in the repository from which you originally
            checked out your working copy:</para>

          <screen>
$ svn switch http://svn.red-bean.com/repos/trunk/vendors .
U  myproj/foo.txt
U  myproj/bar.txt
U  myproj/baz.c
U  myproj/qux.c
Updated to revision 31.
</screen>

          <tip>
            <para>You can just switch part of your working copy to a
              branch if you don't want to switch your entire working
              copy.</para>
          </tip>

          <para>Sometimes an administrator might change the "base
             location" of your repository &mdash; in other words,
             the contents of the repository doesn't change, but the
             main URL used to reach the root of the repository does.
             For example, the hostname may change, or the URL schema,
             or perhaps just the path which leads to the repository.
             Rather than checkout a new working copy, you can have the
             <command>svn switch</command> command "rewrite" the the
             beginnings of all the URLs in your working copy.  Use the
             <option>--relocate</option> command to do the
             substitution.  No file contents are changed, nor is the
             repository contacted.  It's similar to running a perl
             script over your working copy <filename>.svn/</filename>
             directories which runs
             <command>s/OldRoot/NewRoot/</command>.</para>

          <screen>
$ svn checkout file:///tmp/repos test
A  test/a
A  test/b
&hellip;

$ mv repos newlocation
$ cd test/

$ svn update
svn: Unable to open an ra_local session to URL
svn: Unable to open repository 'file:///tmp/repos'

$ svn switch --relocate file:///tmp/repos file:///tmp/newlocation .
$ svn update
At revision 3.
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-1.2-re-update">
        <refnamediv>
          <refname>svn update</refname>
          <refpurpose>Update your working copy.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svn update [PATH...]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para><command>svn update</command> brings changes from the
            repository into your working copy.  If no revision given,
            it brings your working copy up-to-date with the
            <literal>HEAD</literal> revision.  Otherwise, it
            synchronizes the working copy to the revision given by the
            <option>--revision</option> switch.</para>

          <para>For each updated item a line will start with a
            character reporting the action taken.  These characters
            have the following meaning:</para>

          <variablelist>

            <varlistentry>
              <term>A</term>
              <listitem>
                <para>Added</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>D</term>
              <listitem>
                <para>Deleted</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>U</term>
              <listitem>
                <para>Updated</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>C</term>
              <listitem>
                <para>Conflict</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>G</term>
              <listitem>
                <para>Merged</para>
              </listitem>
            </varlistentry>

          </variablelist>

          <para>A character in the first column signifies an update
            to the actual file, while updates to the file's
            properties are shown in the second column.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>up</para>
        </refsect1>

        <refsect1>
          <title>Changes</title>
          <para>Working copy</para>
        </refsect1>

        <refsect1>
          <title>Accesses Repository</title>
          <para>Yes</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) REV
--non-recursive (-N)
--quiet (-q)
--diff3-cmd CMD
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Pick up repository changes that have happened since
            your last update:</para>

          <screen>
$ svn update
A  newdir/toggle.c
A  newdir/disclose.c
A  newdir/launch.c
D  newdir/README
Updated to revision 32.
</screen>

          <para>You can also update your working copy to an older
            revision (Subversion doesn't have the concept of
            <quote>sticky</quote> files like CVS does; see <xref
            linkend="svn-ap-a"/>):</para>

          <screen>
$ svn update -r30
A  newdir/README
D  newdir/toggle.c
D  newdir/disclose.c
D  newdir/launch.c
U  foo.c
Updated to revision 30.
</screen>

          <tip>
            <para>If you want to examine an older revision of a
              single file, you may want to use <command>svn
              cat</command>.</para>
          </tip>
          
        </refsect1>
      </refentry>
    </sect2>
    
  </sect1>

  <!-- ================================================================= -->
  <!-- ======================== SECTION 2 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn-ch-9-sect-2">
    <title><command>svnadmin</command></title>
    
    <para><command>svnadmin</command> is the administrative tool for
      monitoring and repairing your Subversion repository.  For
      detailed information, see <xref
        linkend="svn-ch-5-sect-3.1.2"/>.</para>

    <para>Since <command>svnadmin</command> works via direct repository access
      (and thus can only be used on the machine that holds the
      repository), it refers to the repository with a path, not a URL.</para>
      
    <sect2 id="svn-ch-9-sect-2.1">
      <title><command>svnadmin</command> Switches</title> 
      
      <variablelist>
        
        <varlistentry>
          <term><option>--bdb-log-keep</option></term>
          <listitem>
            <para>(Berkeley DB specific) Disable automatic log removal
              of database log files.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--bdb-txn-nosync</option></term>
          <listitem>
            <para>(Berkeley DB specific) Disables fsync when
              committing database transactions.</para>
          </listitem>
        </varlistentry>
        
        <varlistentry>
          <term><option>--bypass-hooks</option></term>
          <listitem>
            <para>Bypass the repository hook system.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--clean-logs</option></term>
          <listitem>
            <para>Removes unused Berkeley DB logs.</para>
          </listitem>
        </varlistentry>

        <!-- TODO config-dir? Is it really used? -->

        <varlistentry>
          <term><option>--force-uuid</option></term>
          <listitem>
            <para>By default, when loading data into repository that
            already contains revisions, <command>svnadmin</command>
            will ignore the <literal>UUID</literal> from the dump
            stream.  This switch will cause the repository's
            <literal>UUID</literal> to be set to the
            <literal>UUID</literal> from the stream.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--ignore-uuid</option></term>
          <listitem>
            <para>By default, when loading an empty repository,
            <command>svnadmin</command> will use the
            <literal>UUID</literal> from the dump stream.  This switch
            will cause that UUID to be ignored.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--incremental</option></term>
          <listitem>
            <para>Dump a revision only as a diff against the
              previous revision, instead of the usual
              fulltext.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--parent-dir
          <replaceable>DIR</replaceable></option></term>
          <listitem>
            <para>When loading a dumpfile, root paths at
            <replaceable>DIR</replaceable> instead of
            <replaceable>/</replaceable>.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--revision</option> (<option>-r</option>)
          <replaceable>ARG</replaceable></term>
          <listitem>
            <para>Specify a particular revision to operate
              on.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--quiet</option></term>
          <listitem>
            <para>Do not show normal progress&mdash;show only
            errors.</para>
          </listitem>
        </varlistentry>
      </variablelist>
    </sect2>

    <!-- ================================================================= -->
    <sect2 id="svn-ch-9-sect-2.2">
      <title><command>svnadmin</command> Subcommands</title>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-create">
        <refnamediv>
          <refname>svnadmin create</refname>
          <refpurpose>Create a new, empty repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin create REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

            <para>Create a new, empty repository at the path provided.
              If the provided directory does not exist, it will be
              created for you.<footnote><para>Remember,
              <command>svnadmin</command> works only with local
              <emphasis>paths</emphasis>, not
              <emphasis>URL</emphasis>s.</para></footnote></para>
          </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--bdb-txn-nosync
--bdb-log-keep
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Creating a new repository is just this easy:</para>

          <screen>
$ svnadmin create /usr/local/svn/repos
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-deltify">
        <refnamediv>
          <refname>svnadmin deltify</refname>
          <refpurpose>Deltify changed paths in a revision range.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para><command>svnadmin deltify</command> only exists in
            1.0.x due to historical reasons.  This command is
            deprecated and no longer needed.</para>

          <para>It dates from a time when Subversion offered
            administrators greater control over compression strategies
            in the repository.  This turned out to be a lot of
            complexity for <emphasis>very</emphasis> little gain, and
            this <quote>feature</quote> was deprecated.</para>

          <para></para>

            </refsect1>
        <refsect1>
          <title>Switches</title>
          
          <screen>
--revision (-r)
--quiet
</screen>
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-dump">
        <refnamediv>
          <refname>svnadmin dump</refname>
          <refpurpose>Dump the contents of filesystem to stdout.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Dump the contents of filesystem to stdout in a
            <quote>dumpfile</quote> portable format, sending feedback
            to stderr.  Dump revisions
            <replaceable>LOWER</replaceable> rev through
            <replaceable>UPPER</replaceable> rev.  If no revisions are
            given, dump all revision trees.  If only
            <replaceable>LOWER</replaceable> is given, dump that one
            revision tree.  See <xref linkend="svn-ch-5-sect-3.5"/>
            for a practical use. </para>
            </refsect1>
        <refsect1>
          <title>Switches</title>
          
          <screen>
--revision (-r)
--incremental
--quiet
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>

          <para>Dump your whole repository:</para>

          <screen>
$ svnadmin dump /usr/local/svn/repos
SVN-fs-dump-format-version: 1
Revision-number: 0
* Dumped revision 0.
Prop-content-length: 56
Content-length: 56
&hellip;
</screen>

          <para>Incrementally dump a single transaction from your
            repository: </para>

          <screen>
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental 
* Dumped revision 21.
SVN-fs-dump-format-version: 1
Revision-number: 21
Prop-content-length: 101
Content-length: 101
&hellip;
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-help">
        <refnamediv>
          <refname>svnadmin help</refname>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin help [SUBCOMMAND...]</programlisting>
        </refsect1>

        <refsect1>
          <title>Description</title>

          <para>This subcommand is useful when you're trapped on a
            desert island with neither a net connection nor a copy of
            this book.</para>

        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>?, h</para>
        </refsect1>

      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-hotcopy">
        <refnamediv>
          <refname>svnadmin hotcopy</refname>
          <refpurpose>Make a hot copy of a repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH</programlisting>
        </refsect1>

        <refsect1>
          <title>Description</title>

          <para>This subcommand makes a full <quote>hot</quote> backup
          of your repository, including all hooks, configuration
          files, and, of course, database files.  If you pass the
          <literal>--clean-logs</literal> switch,
          <command>svnadmin</command> will perform a hotcopy of your
          repository, and then remove unused Berkeley DB logs from the
          original repository.  You can run this command at any time and make
          a safe copy of the repository, regardless of whether other processes
          are using the repository.</para>

        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--clean-logs
</screen>
        </refsect1>

      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-list-dblogs">
        <refnamediv>
          <refname>svnadmin list-dblogs</refname>
          <refpurpose>Ask Berkeley DB which log files exist for a given
          svn repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin list-dblogs REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

            <para>Berkeley DB creates logs of all changes to the
            repository, which allow it to recover in the face of
            catastrophe.  Unless you enable
            <literal>DB_LOGS_AUTOREMOVE</literal>, the log files
            accumulate, although most are no longer used and can be
            deleted to reclaim disk space. See <xref
            linkend="svn-ch-5-sect-3.3"/> for more
            information.</para>
          </refsect1>

      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-list-unused-dblogs">
        <refnamediv>
          <refname>svnadmin list-unused-dblogs</refname>
          <refpurpose>Ask Berkeley DB which log files can be safely
          deleted.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin list-unused-dblogs REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

            <para>Berkeley DB creates logs of all changes to the
            repository, which allow it to recover in the face of
            catastrophe.  Unless you enable
            <literal>DB_LOGS_AUTOREMOVE</literal>, the log files
            accumulate, although most are no longer used and can be
            deleted to reclaim disk space. See <xref
            linkend="svn-ch-5-sect-3.3"/> for more
            information.</para>
          </refsect1>

        <refsect1>
          <title>Examples</title>
          
          <para>Remove all unused log files from a repository:</para>

        <screen>
$ svnadmin list-unused-dblogs /path/to/repos
/path/to/repos/log.0000000031
/path/to/repos/log.0000000032
/path/to/repos/log.0000000033

$ svnadmin list-unused-dblogs /path/to/repos | xargs rm
## disk space reclaimed!
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-load">
        <refnamediv>
          <refname>svnadmin load</refname> <refpurpose>Read a
            <quote>dumpfile-formatted</quote> stream from
            stdin.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin load REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Read a <quote>dumpfile</quote>-formatted stream from
            stdin, committing new revisions into the repository's
            filesystem.  Send progress feedback to stdout.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--quiet (-q)
--ignore-uuid
--force-uuid
--parent-dir
</screen>
        </refsect1>

        <refsect1>
          <title>Example</title>

          <para>This shows the beginning of loading a repository from
            a backup file (made, of course, with <command>svn
            dump</command>):</para>

          <screen>
$ svnadmin load /usr/local/svn/restored &lt; repos-backup
&lt;&lt;&lt; Started new txn, based on original revision 1
     * adding path : test ... done.
     * adding path : test/a ... done.
&hellip;
</screen>

          <para>Or if you want to load into a subdirectory:</para>

          <screen>
$ svnadmin load --parent-dir new/subdir/for/project /usr/local/svn/restored &lt; repos-backup
&lt;&lt;&lt; Started new txn, based on original revision 1
     * adding path : test ... done.
     * adding path : test/a ... done.
&hellip;
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-lstxns">
        <refnamediv>
          <refname>svnadmin lstxns</refname>
          <refpurpose>Print the names of all uncommitted transactions.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin lstxns REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the names of all uncommitted transactions.  See
            <xref linkend="svn-ch-5-sect-3.2"/> for information on how
            uncommitted transactions are created and what you should
            do with them.</para>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>List all outstanding transactions in a
            repository.</para>

          <screen>
$ svnadmin lstxns /usr/local/svn/repos/ 
1w
1x
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-recover">
        <refnamediv>
          <refname>svnadmin recover</refname>
          <refpurpose>Recover any lost state in a repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin recover REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Run this command if you get an error indicating that
            your repository needs to be recovered.</para>
        </refsect1>

        <refsect1>
          <title>Examples</title>
          
          <para>Recover a hung repository:</para>

          <screen>
$ svnadmin recover /usr/local/svn/repos/ 
Acquiring exclusive lock on repository db.
Recovery is running, please stand by...
Recovery completed.
The latest repos revision is 34.
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->

      <refentry id="svn-ch-9-sect-2.2-re-rmtxns">
        <refnamediv>
          <refname>svnadmin rmtxns</refname>
          <refpurpose>Delete transactions from a repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin rmtxns REPOS_PATH TXN_NAME...</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Delete outstanding transactions from a repository.
            This is covered in detail in <xref
            linkend="svn-ch-5-sect-3.2"/>.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--quiet (-q)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Remove named transactions:</para>

          <screen>
$ svnadmin rmtxns /usr/local/svn/repos/ 1w 1x
</screen>

          <para>Fortunately, the output of svn lstxns works great as
            the input for rmtxns:</para>

          <screen>
$ svnadmin rmtxns /usr/local/svn/repos/  `svnadmin lstxns /usr/local/svn/repos/`
</screen>

          <para>Which will remove all uncommitted transactions from
            your repository.</para>

        </refsect1>
      </refentry>


      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-setlog">
        <refnamediv>
          <refname>svnadmin setlog</refname>
          <refpurpose>Set the log-message on a revision.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin setlog REPOS_PATH -r REVISION FILE</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Set the log-message on revision REVISION to the
            contents of FILE.</para>

          <para>This is similar to using <command>svn propset
            --revprop</command> to set the <literal>svn:log</literal> property
            on a revision, except that you can also use the option
            <option>--bypass-hooks</option> to avoid running any pre- or
            post-commit hooks, which is useful if the modification of
            revision properties has not been enabled in the pre-revprop-change
            hook.</para>

          <warning>
            <para>Revision properties are not under version control,
              so this command will permanently overwrite the previous
              log message.</para>
          </warning>

        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r) ARG
--bypass-hooks
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>Set the log message for revision 19 to the contents of
            the file <filename>msg</filename>:</para>

          <screen>
$ svnadmin setlog /usr/local/svn/repos/ -r 19 msg
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-2.2-re-verify">
        <refnamediv>
          <refname>svnadmin verify</refname>
          <refpurpose>Verify the data stored in the repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnadmin verify REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Run this command if you wish to verify the integrity
          of your repository.  This basically iterates through all
          revisions in the repository by internally dumping all
          revisions and discarding the output.</para>
        </refsect1>

        <refsect1>
          <title>Examples</title>
          
          <para>Verify a hung repository:</para>

          <screen>
$ svnadmin verify /usr/local/svn/repos/ 
* Verified revision 1729.
</screen>

        </refsect1>
      </refentry>

    </sect2>

  </sect1>
  
  <!-- ================================================================= -->
  <!-- ======================== SECTION 3 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn-ch-9-sect-3">
    <title><command>svnlook</command></title>
    
    <para><command>svnlook</command> is a command-line utility for
      examining different aspects of a Subversion repository.  It
      does not make any changes to the repository&mdash;it's just
      used for <quote>peeking</quote>.
      <command>svnlook</command> is typically used by the
      repository hooks, but a repository administrator might find it
      useful for diagnostic purposes.</para>

    <para>Since <command>svnlook</command> works via direct repository access
      (and thus can only be used on the machine that holds the
      repository), it refers to the repository with a path, not a URL.</para>

    <para>If no revision or transaction is specified,
      <command>svnlook</command> defaults to the youngest (most
      recent) revision of the repository.</para>
    
    <sect2 id="svn-ch-9-sect-3.1">
      <title><command>svnlook</command> Switches</title>
      
      <para>Switches in <command>svnlook</command> are global, just
        like in <command>svn</command> and
        <command>svnadmin</command>; however, most switches only
        apply to one subcommand since the functionality of
        <command>svnlook</command> is (intentionally) limited in
        scope.</para>

      <variablelist>

        <varlistentry>
          <term><option>--no-diff-deleted</option></term>
          <listitem>
            <para>Prevents <command>svnlook</command> from printing
              differences for deleted files.  The default behavior
              when a file is deleted in a transaction/revision is
              to print the same differences that you would see if
              you had left the file but removed all the content.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--revision</option>
            (<option>-r</option>)</term>
          <listitem>
            <para>Specify a particular revision number that you wish
              to examine.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--transaction</option>
            (<option>-t</option>)</term>
          <listitem>
            <para>Specify a particular transaction ID that you wish to
              examine. </para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--show-ids</option></term>
          <listitem>
            <para>Show the filesystem node revision IDs for each path in the filesystem
              tree.</para>
          </listitem>
        </varlistentry>

      </variablelist>

    </sect2>

    <!-- ================================================================= -->
    <sect2 id="svn-ch-9-sect-3.2">
      <title><command>svnlook</command></title>

      <refentry id="svn-ch-9-sect-3.2-re-author">
        <refnamediv>
          <refname>svnlook author</refname>
          <refpurpose>Print the author.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook author REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the author of a revision or transaction in
            the repository.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

        <para><command>svnlook author</command> is handy, but not
            very exciting:</para>

          <screen>
$ svnlook author -r 40 /usr/local/svn/repos 
sally
</screen>            

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-cat">
        <refnamediv>
          <refname>svnlook cat</refname>
          <refpurpose>Print the contents of a file.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook cat REPOS_PATH PATH_IN_REPOS</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the contents of a file.</para>

          </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows the contents of a file in transaction
            <literal>ax8</literal>, located at 
            <filename>/trunk/README</filename>:</para>

          <screen>
$ svnlook cat -t ax8 /usr/local/svn/repos /trunk/README

               Subversion, a version control system.
               =====================================

$LastChangedDate: 2003-07-17 10:45:25 -0500 (Thu, 17 Jul 2003) $

Contents:

     I. A FEW POINTERS
    II. DOCUMENTATION
   III. PARTICIPATING IN THE SUBVERSION COMMUNITY
&hellip;
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-changed">
        <refnamediv>
          <refname>svnlook changed</refname>
          <refpurpose>Print the paths that were changed.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook changed REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the paths that were changed in a particular
            revision or transaction, as well as an <quote>svn
            update-style</quote> status letter in the first column:
            <literal>A</literal> for added, <literal>D</literal> for
            deleted, and <literal>U</literal> for updated
            (modified).</para>

          </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows a list of all the changed files in
            revision 39 of a test repository:</para>

          <screen>
$ svnlook changed -r 39 /usr/local/svn/repos
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-date">
        <refnamediv>
          <refname>svnlook date</refname>
          <refpurpose>Print the datestamp.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook date REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the datestamp of a revision or transaction in
            a repository.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>
          
          <para>This shows the date of revision 40 of a test
            repository:</para>

          <screen>            
$ svnlook date -r 40 /tmp/repos/
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-diff">
        <refnamediv>
          <refname>svnlook diff</refname>
          <refpurpose>Print differences of changed files and properties.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook diff REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print GNU-style differences of changed files and
            properties in a repository.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--revision (-r)
--transaction (-t)
--no-diff-deleted
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>
          
          <para>This shows a newly added (empty) file, a deleted
          file, and a copied file:</para>

          <screen>
$ svnlook diff -r 40 /usr/local/svn/repos/
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)

Added: trunk/vendors/deli/soda.txt
==============================================================================

Modified: trunk/vendors/deli/sandwich.txt
==============================================================================
--- trunk/vendors/deli/sandwich.txt	(original)
+++ trunk/vendors/deli/sandwich.txt	2003-02-22 17:45:04.000000000 -0600
@@ -0,0 +1 @@
+Don't forget the mayo!

Modified: trunk/vendors/deli/logo.jpg
==============================================================================
(Binary files differ)

Deleted: trunk/vendors/deli/chips.txt
==============================================================================

Deleted: trunk/vendors/deli/pickle.txt
==============================================================================
</screen>
          
       <para>
       If a file has a non-textual <literal>svn:mime-type</literal>
       property, then the differences are not explicitly shown.
       </para>
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-dirs-changed">
        <refnamediv>
          <refname>svnlook dirs-changed</refname>
          <refpurpose>Print the directories that were themselves changed.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook dirs-changed REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the directories that were themselves changed
            (property edits) or whose file children were
            changed.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows the directories that changed in
            revision 40 in our sample repository:</para>

          <screen>
$ svnlook dirs-changed -r 40 /usr/local/svn/repos
trunk/vendors/deli/
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-help">
        <refnamediv>
          <refname>svnlook help</refname>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>Also svnlook -h and svnlook -?.</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Displays the help message for svnlook.  This
            command, like its brother <command>svn help</command>, is
            also your friend, even though you never call it anymore
            and forgot to invite it to your last party.</para>
        </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>?, h</para>
        </refsect1>

      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-history">
        <refnamediv>
          <refname>svnlook history</refname>
          <refpurpose>Print information about the history of a path in
            the repository (or the root directory if no path is
            supplied).</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook history REPOS_PATH 
            [PATH_IN_REPOS]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print information about the history of a path in
            the repository (or the root directory if no path is
            supplied).</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--show-ids
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows the history output for the path
            <filename>/tags/1.0</filename> as of revision 20 in our
            sample repository.</para>

          <screen>
$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
REVISION   PATH &lt;ID&gt;
--------   ---------
      19   /tags/1.0 &lt;1.2.12&gt;
      17   /branches/1.0-rc2 &lt;1.1.10&gt;
      16   /branches/1.0-rc2 &lt;1.1.x&gt;
      14   /trunk &lt;1.0.q&gt;
      13   /trunk &lt;1.0.o&gt;
      11   /trunk &lt;1.0.k&gt;
       9   /trunk &lt;1.0.g&gt;
       8   /trunk &lt;1.0.e&gt;
       7   /trunk &lt;1.0.b&gt;
       6   /trunk &lt;1.0.9&gt;
       5   /trunk &lt;1.0.7&gt;
       4   /trunk &lt;1.0.6&gt;
       2   /trunk &lt;1.0.3&gt;
       1   /trunk &lt;1.0.2&gt;
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-info">
        <refnamediv>
          <refname>svnlook info</refname>
          <refpurpose>Print the author, datestamp, log message size,
            and log message.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook info REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the author, datestamp, log message size, and
            log message.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows the info output for revision 40 in our
            sample repository.</para>

          <screen>
$ svnlook info -r 40 /usr/local/svn/repos
sally
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
15
Rearrange lunch.
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-log">
        <refnamediv>
          <refname>svnlook log</refname>
          <refpurpose>Print the log message.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook log REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the log message.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>
          
          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>
        
        <refsect1>
          <title>Examples</title>
          
          <para>This shows the log output for revision 40 in our sample
          repository:</para>

          <screen>
$ svnlook log /tmp/repos/
Rearrange lunch.
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-propget">
        <refnamediv>
          <refname>svnlook propget</refname>
          <refpurpose>Print the raw value of a property on a path in
            the repository.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook propget REPOS_PATH PROPNAME PATH_IN_REPOS</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>List the value of a property on a path in the
            repository.</para>

          </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>pg, pget</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows the value of the <quote>seasonings</quote> property
            on the file <filename>/trunk/sandwich</filename> in the
            <literal>HEAD</literal> revision:</para>

          <screen>
$ svnlook pg /usr/local/svn/repos seasonings /trunk/sandwich
mustard
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-proplist">
        <refnamediv>
          <refname>svnlook proplist</refname>
          <refpurpose>Print the names and values of versioned file and
            directory properties.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook proplist REPOS_PATH PATH_IN_REPOS</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>List the properties of a path in the repository.  With
            <option>--verbose</option>, show the property values too.</para>

          </refsect1>

        <refsect1>
          <title>Alternate Names</title>
          <para>pl, plist</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
--verbose (-v)
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <para>This shows the names of properties set on the file
            <filename>/trunk/README</filename> in the
            <literal>HEAD</literal> revision:</para>

          <screen>
$ svnlook proplist /usr/local/svn/repos /trunk/README
  original-author
  svn:mime-type
</screen>

          <para>This is the same command as in the previous example,
            but this time showing the property values as well:</para>

          <screen>
$ svnlook proplist /usr/local/svn/repos /trunk/README
  original-author : fitz
  svn:mime-type : text/plain
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-tree">
        <refnamediv>
          <refname>svnlook tree</refname>
          <refpurpose>Print the tree.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook tree REPOS_PATH [PATH_IN_REPOS]</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the tree, starting at <replaceable>PATH_IN_REPOS</replaceable> (if
            supplied, at the root of the tree otherwise), optionally
            showing node revision IDs.</para>
        </refsect1>

        <refsect1>
          <title>Switches</title>

          <screen>
--revision (-r)
--transaction (-t)
--show-ids
</screen>
        </refsect1>

        <refsect1>
          <title>Examples</title>
          
          <para>This shows the tree output (with node-IDs) for revision
            40 in our sample repository:</para>

          <screen>
$ svnlook tree -r 40 /usr/local/svn/repos --show-ids
/ &lt;0.0.2j&gt;
 trunk/ &lt;p.0.2j&gt;
  vendors/ &lt;q.0.2j&gt;
   deli/ &lt;1g.0.2j&gt;
    egg.txt &lt;1i.e.2j&gt;
    soda.txt &lt;1k.0.2j&gt;
    sandwich.txt &lt;1j.0.2j&gt;
</screen>
          
        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-uuid">
        <refnamediv>
          <refname>svnlook uuid</refname>
          <refpurpose>Print the repository's
          <literal>UUID</literal>.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook uuid REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the <literal>UUID</literal> for the repository.
            the UUID is the repository's
            <emphasis>U</emphasis>niversal <emphasis>U</emphasis>nique
            <emphasis>ID</emphasis>entifier.  The Subversion client
            uses this identifier to differentiate between one
            repository and another.</para>
        </refsect1>

        <refsect1>
          <title>Examples</title>

          <screen>          
$ svnlook uuid /usr/local/svn/repos
e7fe1b91-8cd5-0310-98dd-2f12e793c5e8
</screen>

        </refsect1>
      </refentry>

      <!-- ================================================================= -->
      <refentry id="svn-ch-9-sect-3.2-re-youngest">
        <refnamediv>
          <refname>svnlook youngest</refname>
          <refpurpose>Print the youngest revision number.</refpurpose>
        </refnamediv>
        <refsect1>
          <title>Synopsis</title>
          <programlisting>svnlook youngest REPOS_PATH</programlisting>
        </refsect1>
        <refsect1>
          <title>Description</title>

          <para>Print the youngest revision number of a repository.</para>
        </refsect1>

        <refsect1>
          <title>Examples</title>

        <para>This shows the youngest revision of our sample
            repository:</para>

          <screen>          
$ svnlook youngest /tmp/repos/ 
42
</screen>

        </refsect1>
      </refentry>

    </sect2>
  </sect1>

  <!-- ================================================================= -->
  <!-- ======================== SECTION 4 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn-ch-9-sect-4">

    <title><command>svnserve</command></title>
    
    <para><command>svnserve</command> allows access to Subversion
      repositories using the <literal>svn</literal> network protocol.
      You can run svnserve either as a standalone server process, or
      you can have another process, such as <command>inetd</command>,
      <command>xinetd</command> or <command>sshd</command>, launch it
      for you.</para>

    <para>Once the client has selected a repository by transmitting
      its URL, <command>svnserve</command> reads a file named
      <filename>conf/svnserve.conf</filename> in the repository
      directory to determine repository-specific settings such as what
      authentication database to use and what authorization policies
      to apply.  See <xref linkend="svn-ch-6-sect-3"/> for details of
      the <filename>svnserve.conf</filename> file.</para>
    
    <sect2 id="svn-ch-9-sect-4.1">
      <title><command>svnserve</command> Switches</title>
      
      <para>Unlike the previous commands we've
        described. <command>svnserve</command> has no
        subcommands&mdash;<command>svnserve</command> is controlled
        exclusively by switches.</para>

      <variablelist>

        <varlistentry>
          <term><option>--daemon</option> (<option>-d</option>)</term>
          <listitem>
            <para>Causes <command>svnserve</command> to run in daemon
              mode.  <command>svnserve</command> backgrounds itself
              and accepts and serves TCP/IP connections on the svn
              port (3690, by default).</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--listen-port</option>=<replaceable>PORT</replaceable></term>
          <listitem>
            <para>Causes svnserve to listen on
              <replaceable>PORT</replaceable> when run in daemon
              mode.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--listen-host</option>=<replaceable>HOST</replaceable></term>
          <listitem>
            <para>Causes <command>svnserve</command> to listen on the
              interface specified by <replaceable>HOST</replaceable>,
              which may be either a hostname or an IP address.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--foreground</option></term>
          <listitem>
            <para>When used together with <option>-d</option>, this
              switch causes <command>svnserve</command> to stay in the
              foreground.  This switch is mainly useful for
              debugging.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--inetd</option> (<option>-i</option>)</term>
          <listitem>
            <para>Causes <command>svnserve</command> to use the
              stdin/stdout file descriptors, as is appropriate for a
              daemon running out of <command>inetd</command>.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--help</option> (<option>-h</option>)</term>
          <listitem>
            <para>Displays a usage summary and exits.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--root</option>=<replaceable>ROOT</replaceable>
          (<option>-r</option>=<replaceable>ROOT</replaceable>)</term>
          <listitem>
            <para>Sets the virtual root for repositories served by
              <command>svnserve</command>.  The pathname in URLs
              provided by the client will be interpreted relative to
              this root, and will not be allowed to escape this
              root.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--tunnel</option> (<option>-t</option>)</term>
          <listitem>
            <para>Causes <command>svnserve</command> to run in tunnel
              mode, which is just like the <command>inetd</command>
              mode of operation (serve one connection over
              stdin/stdout) except that the connection is considered
              to be pre-authenticated with the username of the current
              uid.  This flag is selected by the client when running
              over a tunnel agent such as
              <command>ssh</command>.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--threads</option> (<option>-T</option>)</term>
          <listitem>
            <para>When running in daemon mode, causes
              <command>svnserve</command> to spawn a thread instead of
              a process for each connection.  The
              <command>svnserve</command> process still backgrounds
              itself at startup time.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><option>--listen-once</option> (<option>-X</option>)</term>
          <listitem>
            <para>Causes <command>svnserve</command> to accept one
              connection on the svn port, serve it, and exit.  This
              option is mainly useful for debugging.</para>
          </listitem>
        </varlistentry>

      </variablelist>

    </sect2>

  </sect1>

</chapter>

<!--
local variables: 
sgml-parent-document: ("book.xml" "chapter")
end:
-->
