[[Main]]  
 + [[What_Is_Subversion_For|What Is Subversion For]]
 .- Setting Up A Subversion Repository
 .+ [[SVNKit_Architecture|SVNKit Architecture]]
 .+ [[Getting_Started_With_SVNKit|Getting Started With SVNKit]]
 .+ [[Authentication]]
 .+ [[Managing_Repository_With_SVNKit|Managing Repository With SVNKit]]
  .+ [[Printing_Out_A_Subversion_Repository_Tree|Printing Out A Subversion Repository Tree]]
  .+ [[Printing_Out_File_Contents|Printing Out File Contents]]
  .+ [[Printing_Out_Repository_History|Printing Out Repository History]]
  .+ [[Committing_To_A_Repository|Editing operation: committing to a repository]]
  .+ [[Updating_From_A_Repository|Editing Operation: receiving changes from a repository]]
  .+ [[Replicating_An_Existing_Repository|Replicating An Existing Repository]]
  .+ [[Managing_A_Working_Copy|Managing A Working Copy]]

----

<<TableOfContents>>

= Subversion repository types =
Up to now a [[http://svnbook.red-bean.com/nightly/en/svn.reposadmin.html#svn.reposadmin.basics.backends|Subversion repository storage]]
can be represented by either a [[http://svnbook.red-bean.com/nightly/en/svn.reposadmin.html#svn.reposadmin.basics.backends.bdb|Berkley DB database]]
(mostly reffered as ''Berkley DB'' type) or by an [[http://svnbook.red-bean.com/nightly/en/svn.reposadmin.html#svn.reposadmin.basics.backends.fsfs|ordinary filesystem]]
(mostly reffered as ''FSFS'' type).

= Creating a Subversion repository manually =
A [[Subversion]] distribution package (it can be downloaded from the [[http://subversion.tigris.org|Subversion home site]])
includes a tool called '''svnadmin''' which is responsible for creating repositories. When you install [[Subversion]] you
can create a repository performing a command in the command prompt:

{{{
...>svnadmin create C:\path
}}}

This will create an FSFS repository at the path you specify. You may also explicitly provide the type of a repository
back-end:

{{{
...>svnadmin create --fs-type bdb C:\path
}}}

The layout of a repository root directory looks like this:

{{{
 /
 |_conf/
 |_dav/
 |_db/
 |_hooks/
 |_locks/
 |_format
 |_readme.txt
}}}

Read [[http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html|official instructions]] how to create and set up
a repository on your computer using official [[Subversion]] tools.

= Creating a Subversion repository with SVNKit =
[[SVNKit]] provides an ability to create only FSFS-type repositories. The following is a code snippet which
demonstrates how you can create a blank repository using [[SVNKit]]:

{{{#!java 
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.SVNException;
...

    try {
        String tgtPath = "C:/repos/root/path";
        SVNURL tgtURL = SVNRepositoryFactory.createLocalRepository( new File( tgtPath ), true , false );
    } catch ( SVNException e ) {
        //handle exception
    }

...
}}}

This will create an FSFS-type repository at path {{{C:/repos/root/path}}}.
The second parameter of the {{{createLocalRepository(...)}}} method set to {{{true}}} enables modifications to
[[http://svnbook.red-bean.com/nightly/en/svn.reposadmin.html#svn.reposadmin.basics.revprops|revision properties]] of the
created repository. As revision properties are unversioned, there's a risk to lose their values forever if changes
to them are allowed. To allow revision properties changing you have to place an executable ''pre-revprop-change''
[[http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html#svn.reposadmin.create.hooks|hook script]]
file into the ''hooks'' directory (see the repository root directory layout above). 

When someone is trying to change a
revision property, a server (say, [[http://svnbook.red-bean.com/nightly/en/svn.serverconfig.svnserve.html|svnserve]])
first invokes a ''pre-revprop-change'' hook. If this hook script is not found in the ''hooks'' directory, or the script
returns a non-zero value, modifications to revision properties are rejected by the server.

When you create a new repository with the Subversion's '''svnadmin''' tool a new repository's ''hook'' directory
contains no real hook files, but only hook templates. This means that you won't be able to change revision properties
until you place a ''pre-revprop-change'' hook manually into the target ''hooks'' directory. 

With [[SVNKit]] enabling
changes to revision properties is quite straightforward. When the second parameter of the {{{createLocalRepository(...)}}}
method is {{{true}}} [[SVNKit]] places an empty executable ''pre-revprop-change'' hook script into the ''hooks''
directory of a new repository. Such a hook does nothing, simply returns 0 letting the requested change operation perform.
However when this parameter is {{{false}}} no hook script is added (but only templates), and revision properties changing
is disabled.

The third parameter of the {{{createLocalRepository(...)}}} method controls whether a repository creation must be forced
or not. That is, if this parameter is {{{true}}} and the specified path already exists [[SVNKit]] replaces it with a new repository. However if it's {{{false}}}, an existing path (whatever it is) is not removed and a new repository creation fails with an [[http://svnkit.com/kb/javadoc/org/tmatesoft/svn/core/SVNException.html|SVNException]].

If a repository is successfully created the {{{createLocalRepository(...)}}} method returns a {{{file:///}}} url of the
repository root location.
Also you may create an FSFS-type repository with [[http://svnkit.com/kb/javadoc/org/tmatesoft/svn/core/wc/SVNAdminClient.html|SVNAdminClient]] -
the class belonging to the high-level API. Actually this admin client class uses [[http://svnkit.com/kb/javadoc/org/tmatesoft/svn/core/io/SVNRepositoryFactory.html|SVNRepositoryFactory]]
to do the same job.

{{{#!java 
import org.tmatesoft.svn.core.wc.admin.SVNAdminClient;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.SVNException;
...
    SVNAdminClient adminClient;
    ...
    try {
        String tgtPath = "C:/repos/root/path";
        SVNURL tgtURL = adminClient.doCreateRepository( new File( tgtPath ), null , true , false );
    } catch ( SVNException e ) {
        //handle exception
    }
...
}}}

= Accessing a repository =

There are two ways of accessing a [[Subversion]] repository:
 * over a network
 * on a local machine

{{attachment:Subversion_Architecture.png}}

Up to now [[Subversion]] supports the following repository access schemes:

||<:#E0E0FF>Schema||<:#E0E0FF>Access Method||
||{{{file:///}}}||direct repository access (on a local disk)||
||{{{http://}}}||access via WebDAV protocol to Subversion-aware Apache server||
||{{{https://}}}||same as {{{http://}}}, but with SSL encryption||
||{{{svn://}}}||access via custom protocol to an svnserve server||
||{{{svn+ssh://}}}||same as {{{svn://}}}, but through an SSH tunnel||

== file:/// access ==
This protocol does not require you to set up a user account for the repository to work with since the repository is
located on the same computer. [[Subversion]] will use only a user name in commit operations: if no user name is provided
explicitly, a session user name is used.

== svn://, svn+ssh:// access ==
To use the {{{svn://}}} protocol an administrator configures access rules and accounts that will be used by an '''svnserve'''
program to authenticate users. {{{svn+ssh://}}} protocol: first a client authenticates himself to a host
server over an ssh, a tunneled connection is established and further he works with a repository just like on a local
machine. You may try either technique, details are described in [[http://svnbook.red-bean.com/nightly/en/svn.serverconfig.svnserve.html|this chapter]]
of the Subversion book.

== http://, https:// access ==
To use the {{{http://}}} protocol an dministrator configures an Apache server with a WebDAV protocol extension module.
How to share your repository access over {{{http://}}} (including account configuration tips), please, be sure to read
the [[http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html|Apache dedicated chapter]] of the [[Subversion]]
book.