blob: 0d6dd0bffbc1d04fbfe380280bafb9a485151779 [file] [log] [blame]
@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}.