@node Architecture
@chapter Architecture


Subversion is conceptually divided into a number of separable layers.

Assuming that the programmatic interface of each layer is well-defined,
it is easy to customize the different parts of the system.  Contributors
can write new client apps, new network protocols, new server processes,
new server features, and new storage back-ends.

The following diagram illustrates the "layered" architecture, and where
each particular interface lies.

@example
@group
                    +--------------------+
                    | commandline or GUI |
                    |    client app      |
         +----------+--------------------+----------+ <=== Client interface
         |              Client Library              |
         |                                          |
         |        +----+                            |
         |        |    |                            |
 +-------+--------+    +--------------+--+----------+ <=== Network interface
 | Working Copy   |    |    Remote    |  | Local    |
 | Management lib |    | Repos Access |  | Repos    |
 +----------------+    +--------------+  | Access   |
                       |     neon     |  |          |
                       +--------------+  |          |
                          ^              |          |
                         /               |          |
                   DAV  /                |          |
                       /                 |          |
                      v                  |          |
              +---------+                |          |
              |         |                |          |
              | Apache  |                |          |
              |         |                |          |
              +---------+                |          |
              | mod_DAV |                |          |
            +-------------+              |          |
            | mod_DAV_SVN |              |          |
 +----------+-------------+--------------+----------+ <=== Filesystem interface
 |                                                  |
 |               Subversion Filesystem              |
 |                                                  |
 +--------------------------------------------------+

@end group
@end example



@menu
* Client Layer::              Client-side overview.
* Network Layer::             Network overview.
* Filesystem Layer::          Server-side overview.
@end menu

@c ------------------------------------------------------------------
@node Client Layer
@section Client Layer

The Subversion client, which may be either command-line or GUI, draws on
three libraries.

The working copy library, @file{libsvn_wc}, provides an API for
managing the client's working copy of a project.  This includes
operations like renaming or removal of files, patching files,
extracting local diffs, and routines for maintaining administrative
files in the @file{.svn/} directory.

The repository_access library, @file{libsvn_ra}, provides an API for
exchanging information with a Subversion repository.  This includes
the ability to read files, write new revisions of files, and ask the
repository to compare a working copy against its latest revision.
Note that there are two implementations of this interface: one
designed to talk to a repository over a network, and one designed to
work with a repository on local disk.  Any number of interface
implementations can exist.

The client library, @file{libsvn_client} provides general client
functions such as @code{update()} and @code{commit()}, which may
involve one or both of the other two client libraries.
@file{libsvn_client} should, in theory, provide an API that allows
anyone to write a Subversion client application.

For details, @xref{Client}.

@c ------------------------------------------------------------------
@node Network Layer
@section Network Layer

The network layer's job is to move the repository API requests over a
wire.

On the client side, a network library (@file{libneon}) translates
these requests into a set of HTTP WebDAV/DeltaV requests.  The
information is sent over TCP/IP to an Apache server.  Apache is used
for the following reasons:

@itemize @bullet
@item
it is time-tested and extremely stable;
@item
it has built-in load-balancing;
@item
it has built-in proxy and firewall support;
@item
it has authentication and encryption features;
@item
it allows client-side caching;
@item
it has an extensible module system
@end itemize

Our rationale is that any attempt to write a dedicated "Subversion
server" (with a "Subversion protocol") would inevitably end up
evolving towards Apache's already-existing feature set.  (However,
Subversion's layered architecture certainly doesn't @emph{prevent}
anyone from writing a totally new network access implementation.)

An Apache module (@file{mod_dav_svn}) translates the DAV requests into
API calls against a particular repository.

For details, @xref{Protocol}.

@c ------------------------------------------------------------------
@node Filesystem Layer
@section Filesystem Layer

When the requests reach a particular repository, they are interpreted
by the @dfn{Subversion Filesystem library}, @file{libsvn_fs}.  The
Subversion Filesystem is a custom Unix-like filesystem, with a twist:
writes are revisioned and atomic, and no data is ever deleted!  This
filesystem is currently implemented on top of a normal filesystem,
using Berkeley DB files.

For a more detailed explanation: @xref{Server}.
