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

$LastChangedDate$

Contents:

     I. A FEW POINTERS
    II. DOCUMENTATION
   III. PARTICIPATING IN THE SUBVERSION COMMUNITY
    IV. QUICKSTART GUIDE
       A.  REPOSITORIES
         1.  Repository Access
         2.  Creating a Repository
         3.  Creating a Subversion Server
       B.  EXAMPLE WALKTHROUGH



I.    A FEW POINTERS

      This code is still under development.  For an overview, visit

         http://subversion.tigris.org/

      Once you have a Subversion client you can get the latest version
      of the code with the command:

         $ svn co http://svn.collab.net/repos/svn/trunk -d subversion



II.   DOCUMENTATION

      If you like what you see, then run "make ps" inside the doc/ directory
      and read any PostScript files that result.

      See COPYING for copyright information.
      See HACKING for development information.
      See INSTALL for installation information.



III.  PARTICIPATING IN THE SUBVERSION COMMUNITY

      First, read the HACKING file!  It describes Subversion coding and
      log message standards, as well as how to join discussion lists.

      Talk on IRC with developers:  irc.openprojects.net, channel #svn.

      Read the FAQ:  http://subversion.tigris.org/project_faq.html



IV.   QUICKSTART GUIDE

  A.  REPOSITORIES

      1.  REPOSITORY ACCESS

      The Subversion client has an abstract interface for accessing a
      repository.  Two "Repository Access" (RA) implementations
      currently exist as libraries:

      libsvn_ra_dav:   accesses a networked repository using WebDAV.
      libsvn_ra_local: accesses a local repository using Berkeley DB.

      You can see which methods are available to your 'svn' client
      like so:

          $ svn --version
          Subversion Client, version 0.8.0
          compiled Jan 26 2002, 16:43:58

          Copyright (C) 2000-2002 CollabNet.
          Subversion is open source software, see http://subversion.tigris.org/

          The following repository access (RA) modules are available:

           * ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
             - handles 'http' schema
           * ra_local : Module for accessing a repository on local disk.
             - handles 'file' schema

      If you don't see ra_local, it probably means that Berkeley DB
      wasn't found when compiling your client binary.  If you don't
      see ra_dav, then something is very wrong;  most likely your
      dynamic loader/linker can't find libsvn_ra_dav.so (see section
      I.B above.)


      2.  CREATING A REPOSITORY

      A Subversion repository is an ordinary directory that mainly
      contains Berkeley DB .db files.  You can only create a
      repository if you have Berkeley DB available on your system and
      it was found during the compile.  If this is true, you should
      have a utility called 'svnadmin' installed.  'svnadmin' does
      many things, but its most important feature is creating an empty
      repository:

          $ svnadmin create /usr/local/svn/repos1

      After the repository is created, you can initially import data
      into it, using libsvn_ra_local (invoked by using a 'file' URL):

          $ svn import file:///usr/local/svn/repos1 some/local/dir/

      The above example imports the contents of some/local/dir/ right
      into the root of the repository.  If you want to put these
      contents into a newly-created repository subdirectory, use
      *three* args to import.  (Try 'svn help import' for details).

      Also, watch out for 'ownership' pitfalls.  Notice who has the
      rights to modify the .db files in the repository.  Repository
      commit access is ultimately determined by whomever has the
      rights to modify the .db files.


      Note: The repository should NOT be on a remote filesystem like
      NFS or AFS.  For details see:

          http://www.sleepycat.com/docs/ref/env/remote.html


      3.  CREATING A SUBVERSION SERVER

      Subversion uses Apache 2.0 as its network server.  Apache's
      mod_dav speaks to a special mod_dav_svn module, which uses
      Berkeley DB to talk to a repository.

      Apache's own authentication system allows remote users to access
      the repository with Subversion clients.  However: make sure that
      Apache has the right to edit the .db files itself, or you'll get
      all sorts of Apache errors.  Often people create a special 'svn'
      user who owns the repository, and folks put a line into
      httpd.conf that tells Apache to run as that special user.

      Compiling Apache and mod_dav_svn is a separate project; please
      see section II at the end of the INSTALL document for a HOWTO.


  B.  EXAMPLE WALKTHOUGH

      Here are some simple examples of how one might use the svn
      client.  In general, things are designed to be similar to CVS.
      But many things are different.  *PLEASE* read the 'SVN for CVS
      Users' document (in docs/, or on the website) to understand the
      broader concepts of what's going on!

          # Checkout a working copy.  This can either be a file: or
          #  http: url, depending on which RA modules are available.

          $ svn co file:///usr/local/svn/repos1 -d wc
          A wc/foo
          A wc/bar
          A wc/baz
          A wc/baz/gloo
          A wc/baz/bloo

          $ cp -R wc wc2                 # back up this working copy

          $ cd wc
          $ echo "new text" >> bar       # change bar's text
          $ svn propset color green foo  # add a metadata property to foo
          $ svn rm baz                   # schedule baz directory for deletion
          $ touch newfile
          $ svn add newfile              # schedule newfile for addition

          $ svn status                   # See what's locally modified
          M   ./bar
          _M  ./foo
          A   ./newfile
          D   ./baz
          D   ./baz/gloo
          D   ./baz/bloo

          $ svn commit -m "Made many changes"  # Commit the changes
          Sending    bar
          Sending    foo
          Adding     newfile
          Deleting   baz
          Commit succeeded.

          $ cd ../wc2                # change to the back-up working copy

          $ svn update               # get changes from repository
          U   ./bar
          _U  ./foo
          A   ./newfile
          D   ./baz



