# Subversion

Subversion is a centralized version-control system. It can use a variety of protocols for communication between client and server.

## Subversion inside Apache HTTP

This section focuses on configuring a web-based server on top of the Apache HTTP server, which uses WebDAV/DeltaV for communication.

For more information on the general setup, please refer to the the appropriate section of the Subversion book.

To configure, include in `/etc/nixos/configuration.nix` code to activate Apache HTTP, setting appropriately:

    services.httpd.enable = true;
    services.httpd.adminAddr = ...;
    networking.firewall.allowedTCPPorts = [ 80 443 ];

For a simple Subversion server with basic authentication, configure the Subversion module for Apache as follows, setting `hostName` and `documentRoot` appropriately, and `SVNParentPath` to the parent directory of the repositories, `AuthzSVNAccessFile` to the location of the `.authz` file describing access permission, and `AuthUserFile` to the password file.

    services.httpd.extraModules = [
        # note that order is *super* important here
        { name = "dav_svn"; path = "${pkgs.apacheHttpdPackages.subversion}/modules/mod_dav_svn.so"; }
        { name = "authz_svn"; path = "${pkgs.apacheHttpdPackages.subversion}/modules/mod_authz_svn.so"; }
      ];
      services.httpd.virtualHosts = {
        "svn" = {
           hostName = HOSTNAME;
           documentRoot = DOCUMENTROOT;
           locations."/svn".extraConfig = ''
               DAV svn
               SVNParentPath REPO_PARENT
               AuthzSVNAccessFile ACCESS_FILE
               AuthName "SVN Repositories"
               AuthType Basic
               AuthUserFile PASSWORD_FILE
               Require valid-user
          '';
        }

The key `"svn"` is just a symbolic name identifying the virtual host. The `"/svn"` in `locations."/svn".extraConfig` is the path underneath which the repositories will be served.

This page explains how to set up the Subversion configuration itself. This boils down to the following:

Underneath `REPO_PARENT` repositories can be set up as follows:

    $ svn create REPO_NAME

Repository files need to be accessible by `wwwrun`:

    $ chown -R wwwrun:wwwrun REPO_PARENT

The password file `PASSWORD_FILE` can be created as follows:

    $ htpasswd -cs PASSWORD_FILE USER_NAME

Additional users can be set up similarly, omitting the `c` flag:

    $ htpasswd -s PASSWORD_FILE USER_NAME

The file describing access permissions `ACCESS_FILE` will look something like the following:

    [/]
    * = r

    [REPO_NAME:/]
    USER_NAME = rw

The Subversion repositories will be accessible as `http://HOSTNAME/svn/REPO_NAME`.