Skip to content

tpn/enversion

Repository files navigation

What is Enversion?

Enversion is a server-side tool that sits in front of your Subversion repositories and validates incoming commits. It can detect a wide variety of problematic commits (over 80) and will block them at the pre-commit stage.

Enversion was designed specifically for enterprise Subversion deployments, which have vastly different usage patterns than typical open source Subversion repositories.

See the wiki for more information:

Installation & Quick Start: Cheatsheet

Pre-requisites:

% wget http://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86_64.sh
% bash Miniconda-3.3.0-Linux-x86_64.sh
% source ~/.bashrc
% conda config --add channels enversion

To install:

% conda install enversion

To update to the latest version:

% conda update enversion

To create isolated environments with different versions:

% conda create -n evn-0.2.5 enversion=0.2.5
% source activate evn-0.2.5
% conda create -n evn-0.2.6 enversion=0.2.6
% source activate evn-0.2.6

To create a new Subversion repository automatically protected by Enversion:

% evnadmin create foo

To verify Enversion is installed and working:

% evnadmin show-repo-hook-status test
+-------------------------------------------------------------------------+
|                    Repository Hook Status for 'test'                    |
|                           (/home/evnadm/test)                           |
+-------------------------------------------------------------------------+
|         Name        | Exists? | Valid? | Exe? | Cnfgrd? | Enbld? | Rdb? |
+---------------------|---------|--------|------|---------|--------|------+
|  post-revprop-change|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|         start-commit|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|            post-lock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|             pre-lock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|          post-unlock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|           pre-unlock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|           pre-commit|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|          post-commit|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|   pre-revprop-change|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|=====================|=========|========|======|=========|========|======|
|               evn.sh|    Y    |   Y    |  Y   |   9/9   |  9/9   |  -   |
+-------------------------------------------------------------------------+

To enable Enversion against an existing repository, first, analyze it:

% evnadmin analyze myrepo

Then enable:

% evnadmin enable myrepo

Tutorials:

Installation Guide - Detailed

The easiest (and recommended) way to install Enversion is via conda, the cross-platform (Windows, Linux and OS X) binary package manager from Continuum Analytics.

Already have conda installed? Enversion installation is simple:

% conda config --add channels enversion
% conda install enversion

You can get conda in one of two ways:

  • Install Anaconda (245MB to 483MB depending on platform).

  • Install Miniconda (18MB to 30MB depending on platform).

Anaconda is a fully-fledged, completely free, enterprise-ready Python distribution for large-scale data processing, predictive analytics, and scientific computing. It ships with over 125 of the most popular Python packages for science, math, engineering and data analysis.

Miniconda is a bare-bones version of Anaconda that only includes the small subset of Python packages required by conda.

Pro-tip: installed Miniconda, but want to try out Anaconda? Simply run:

% conda install anaconda

Miniconda Installation (Linux)

Miniconda installation is trivial:

[evnadm@centos5x64 ~]$ wget http://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86_64.sh
--2014-03-25 08:12:37--  http://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86_64.sh
Resolving repo.continuum.io... 72.21.195.181
Connecting to repo.continuum.io|72.21.195.181|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19998995 (19M) [application/x-sh]
Saving to: `Miniconda-3.3.0-Linux-x86_64.sh'

100%[=========================================>] 19,998,995  1.81M/s   in 9.2s

2014-03-25 08:12:50 (2.07 MB/s) - `Miniconda-3.3.0-Linux-x86_64.sh' saved [19998995/19998995]

[evnadm@centos5x64 ~]$

Once downloaded, simply execute the file via bash to install:

[evnadm@centos5x64 ~]$ bash Miniconda-3.3.0-Linux-x86_64.sh

Welcome to Miniconda 3.3.0 (by Continuum Analytics, Inc.)

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
===================================
Anaconda END USER LICENSE AGREEMENT
===================================
<snip>

1. You include a copy of this EULA in all copies of the derived software.
2. In advertising and labeling material for products built with Anaconda

Do you approve the license terms? [yes|no]
[no] >>> yes

Miniconda will now be installed into this location:
/home/evnadm/miniconda

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify an different location below

[/home/evnadm/miniconda] >>>
PREFIX=/home/evnadm/miniconda
installing: python-2.7.6-1 ...
installing: openssl-1.0.1c-0 ...
installing: pycosat-0.6.0-py27_0 ...
installing: pyyaml-3.10-py27_0 ...
installing: readline-6.2-2 ...
installing: sqlite-3.8.4.1-0 ...
installing: system-5.8-1 ...
installing: tk-8.5.13-0 ...
installing: yaml-0.1.4-0 ...
installing: zlib-1.2.7-0 ...
installing: conda-3.3.0-py27_0 ...
Python 2.7.6 :: Continuum Analytics, Inc.
creating default environment...
installation finished.
Do you wish the installer to prepend the Miniconda install location
to PATH in your /home/evnadm/.bashrc ? [yes|no]
[no] >>> yes

Prepending PATH=/home/evnadm/miniconda/bin to PATH in /home/evnadm/.bashrc
A backup will be made to: /home/evnadm/.bashrc-miniconda.bak


For this change to become active, you have to open a new terminal.

Thank you for installing Miniconda!

Then simply source .bashrc again (or open a new terminal) and you should have access to conda:

[evnadm@centos5x64 ~]$ source .bashrc
[evnadm@centos5x64 ~]$ which conda
~/miniconda/bin/conda

Then simply run the following to install Enversion:

[evnadm@centos5x64 ~]$ conda config --add channels enversion
[evnadm@centos5x64 ~]$ conda install enversion
Fetching package metadata: ...
Solving package specifications: .
Package plan for installation in environment /home/evnadm/miniconda:

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    enversion-0.2.5            |           py27_1         151 KB
    expat-2.1.0                |                0         307 KB
    httpd-2.2.26               |                0         4.3 MB
    pcre-8.31                  |                0         535 KB
    serf-1.2.1                 |                0         307 KB
    sqlite-3.7.13              |                0         1.9 MB
    subversion-1.8.8           |           py27_0        11.8 MB
    swig-2.0.12                |           py27_0         1.8 MB
    ------------------------------------------------------------
                                           Total:        21.0 MB

The following packages will be UN-linked:

    package                    |            build
    ---------------------------|-----------------
    conda-3.3.0                |           py27_0
    sqlite-3.8.4.1             |                0

The following packages will be linked:

    package                    |            build
    ---------------------------|-----------------
    apr-1.5.0                  |                0   hard-link
    apr-iconv-1.2.1            |                0   hard-link
    apr-util-1.5.3             |                0   hard-link
    conda-3.3.2                |           py27_0   hard-link
    enversion-0.2.5            |           py27_1   hard-link
    expat-2.1.0                |                0   hard-link
    httpd-2.2.26               |                0   hard-link
    pcre-8.31                  |                0   hard-link
    serf-1.2.1                 |                0   hard-link
    sqlite-3.7.13              |                0   hard-link
    subversion-1.8.8           |           py27_0   hard-link
    swig-2.0.12                |           py27_0   hard-link

Proceed ([y]/n)? y

Fetching packages ...
enversion-0.2.5-py27_1.tar.bz2 100% |################| Time: 0:00:00   1.48 MB/s
expat-2.1.0-0.tar.bz2 100% |#########################| Time: 0:00:00   1.51 MB/s
httpd-2.2.26-0.tar.bz2 100% |########################| Time: 0:00:02   2.12 MB/s
pcre-8.31-0.tar.bz2 100% |###########################| Time: 0:00:00   1.86 MB/s
serf-1.2.1-0.tar.bz2 100% |##########################| Time: 0:00:00   1.39 MB/s
sqlite-3.7.13-0.tar.bz2 100% |#######################| Time: 0:00:01   1.89 MB/s
subversion-1.8.8-py27_0.tar.bz2 100% |###############| Time: 0:00:06   2.06 MB/s
swig-2.0.12-py27_0.tar.bz2 100% |####################| Time: 0:00:00   1.97 MB/s
Extracting packages ...
[      COMPLETE      ] |##################################################| 100%
Unlinking packages ...
[      COMPLETE      ] |##################################################| 100%
Linking packages ...
[      COMPLETE      ] |##################################################| 100%
[evnadm@centos5x64 ~]$

This will install Enversion, which is administered via the command line program evnadmin, and all required dependencies. Note that the entire installation is contained within the Miniconda installation, ensuring that there aren't any conflicts with other versions of Subversion/HTTPD that may be installed on your system.

Additionally, because the Enversion conda package manages all dependencies, no root access is required, nor are there any base-system RPM dependencies. This is one of the reasons conda is the recommended installation technique.

[evnadm@centos5x64 ~]$ which svn
~/miniconda/bin/svn
[evnadm@centos5x64 ~]$ which evnadmin
~/miniconda/bin/evnadmin
[evnadm@centos5x64 ~]$ evnadmin create test
[evnadm@centos5x64 ~]$ evnadmin show-repo-hook-status test
+-------------------------------------------------------------------------+
|                    Repository Hook Status for 'test'                    |
|                           (/home/evnadm/test)                           |
+-------------------------------------------------------------------------+
|         Name        | Exists? | Valid? | Exe? | Cnfgrd? | Enbld? | Rdb? |
+---------------------|---------|--------|------|---------|--------|------+
|  post-revprop-change|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|         start-commit|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|            post-lock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|             pre-lock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|          post-unlock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|           pre-unlock|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|           pre-commit|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|          post-commit|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|   pre-revprop-change|    Y    |   -    |  Y   |    Y    |   Y    |  N   |
|=====================|=========|========|======|=========|========|======|
|               evn.sh|    Y    |   Y    |  Y   |   9/9   |  9/9   |  -   |
+-------------------------------------------------------------------------+

Upgrading

Upgrading to the latest version of Enversion is trivial:

[evnadm@centos5x64 ~]$ conda update enversion
Fetching package metadata: ...
Solving package specifications: .
Package plan for installation in environment /home/evnadm/miniconda:

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    enversion-0.2.6            |           py27_0         151 KB

The following packages will be UN-linked:

    package                    |            build
    ---------------------------|-----------------
    enversion-0.2.5            |           py27_1

The following packages will be linked:

    package                    |            build
    ---------------------------|-----------------
    enversion-0.2.6            |           py27_0   hard-link

Proceed ([y]/n)? y

Fetching packages ...
enversion-0.2.6-py27_0.tar.bz2 100% |################| Time: 0:00:00 421.03 kB/s
Extracting packages ...
[      COMPLETE      ] |##################################################| 100%
Unlinking packages ...
[      COMPLETE      ] |##################################################| 100%
Linking packages ...
[      COMPLETE      ] |##################################################| 100%
[evnadm@centos5x64 ~]$ evnadmin version
0.2.6

If there are no new versions available:

[evnadm@centos5x64 ~]$ conda update enversion
Fetching package metadata: ...
# All requested packages already installed.
# packages in environment at /home/evnadm/miniconda:
#
enversion                 0.2.6                    py27_0

Custom Environments

You can leverage conda's support for isolated environments to install different versions of Enversion. The following example creates two completely isolated enversion environments, named enversion-0.2.5 and enversion-0.2.6 (for v0.2.5 and v0.2.6 respectively):

[evnadm@centos5x64 ~]$ conda create -n enversion-0.2.5 enversion=0.2.5
Fetching package metadata: ...
Solving package specifications: .
Package plan for installation in environment /home/evnadm/miniconda/envs/enversion-0.2.5:

The following packages will be linked:

    package                    |            build
    ---------------------------|-----------------
    apr-1.5.0                  |                0   hard-link
    apr-iconv-1.2.1            |                0   hard-link
    apr-util-1.5.3             |                0   hard-link
    enversion-0.2.5            |           py27_1   hard-link
    expat-2.1.0                |                0   hard-link
    httpd-2.2.26               |                0   hard-link
    openssl-1.0.1c             |                0   hard-link
    pcre-8.31                  |                0   hard-link
    python-2.7.6               |                1   hard-link
    readline-6.2               |                2   hard-link
    serf-1.2.1                 |                0   hard-link
    sqlite-3.7.13              |                0   hard-link
    subversion-1.8.8           |           py27_0   hard-link
    swig-2.0.12                |           py27_0   hard-link
    system-5.8                 |                1   hard-link
    tk-8.5.13                  |                0   hard-link
    zlib-1.2.7                 |                0   hard-link

Proceed ([y]/n)? y

Linking packages ...
[      COMPLETE      ] |##################################################| 100%
#
# To activate this environment, use:
# $ source activate enversion-0.2.5
#
# To deactivate this environment, use:
# $ source deactivate
#
[evnadm@centos5x64 ~]$ source activate enversion-0.2.5
discarding /home/evnadm/miniconda/bin from PATH
prepending /home/evnadm/miniconda/envs/enversion-0.2.5/bin to PATH
(enversion-0.2.5)[evnadm@centos5x64 ~]$ which evnadmin
~/miniconda/envs/enversion-0.2.5/bin/evnadmin
(enversion-0.2.5)[evnadm@centos5x64 ~]$ evnadmin version
0.2.5
(enversion-0.2.5)[evnadm@centos5x64 ~]$ source deactivate
discarding /home/evnadm/miniconda/envs/enversion-0.2.5/bin from PATH
[evnadm@centos5x64 ~]$ conda create -n enversion-0.2.6 enversion=0.2.6
Fetching package metadata: ...
Solving package specifications: .
Package plan for installation in environment /home/evnadm/miniconda/envs/enversion-0.2.6:

The following packages will be linked:

    package                    |            build
    ---------------------------|-----------------
    apr-1.5.0                  |                0   hard-link
    apr-iconv-1.2.1            |                0   hard-link
    apr-util-1.5.3             |                0   hard-link
    enversion-0.2.6            |           py27_0   hard-link
    expat-2.1.0                |                0   hard-link
    httpd-2.2.26               |                0   hard-link
    openssl-1.0.1c             |                0   hard-link
    pcre-8.31                  |                0   hard-link
    python-2.7.6               |                1   hard-link
    readline-6.2               |                2   hard-link
    serf-1.2.1                 |                0   hard-link
    sqlite-3.7.13              |                0   hard-link
    subversion-1.8.8           |           py27_0   hard-link
    swig-2.0.12                |           py27_0   hard-link
    system-5.8                 |                1   hard-link
    tk-8.5.13                  |                0   hard-link
    zlib-1.2.7                 |                0   hard-link

Proceed ([y]/n)? y

Linking packages ...
[      COMPLETE      ] |##################################################| 100%
#
# To activate this environment, use:
# $ source activate enversion-0.2.6
#
# To deactivate this environment, use:
# $ source deactivate
#
[evnadm@centos5x64 ~]$ source activate enversion-0.2.6
discarding /home/evnadm/miniconda/bin from PATH
prepending /home/evnadm/miniconda/envs/enversion-0.2.6/bin to PATH
(enversion-0.2.6)[evnadm@centos5x64 ~]$ which evnadmin
~/miniconda/envs/enversion-0.2.6/bin/evnadmin
(enversion-0.2.6)[evnadm@centos5x64 ~]$ evnadmin version
0.2.6
(enversion-0.2.6)[evnadm@centos5x64 ~]$

Quick Start

evnadmin create foo
svn mkdir -m "Initializing repository." file://`pwd`/foo/trunk
svn mkdir -m "Initializing repository." file://`pwd`/foo/branches
svn mkdir -m "Initializing repository." file://`pwd`/foo/tags
svn cp -m "Branching trunk to 1.x." file://`pwd`/foo/trunk \
                                    file://`pwd`/foo/branches/1.x
svn cp -m "Branching trunk to 2.x." file://`pwd`/foo/trunk \
                                    file://`pwd`/foo/branches/2.x
svn cp -m "Tagging 1.0." file://`pwd`/foo/trunk \
                         file://`pwd`/foo/tags/1.0

Root tracking:

% evnadmin show-roots foo
Showing roots for repository 'foo' at r6:
{'/branches/1.x/': {'created': 4},
 '/branches/2.x/': {'created': 5},
 '/tags/1.0/': {'copied_from': ('/trunk/', 5),
                'copies': {},
                'created': 6,
                'creation_method': 'copied',
                'errors': []},
 '/trunk/': {'created': 1}}
%

Individual root information:

% evnadmin root-info /branches/1.x/ foo
'/branches/1.x/': {
    'copies': { },
    'copied_from': ('/trunk/', 3),
    'creation_method': 'copied',
    'errors': [],
    'created': 4,
}
%

Forward-copy information:

% evnadmin root-info /trunk/ foo
'/trunk/': {
    'copies': {
        3: [('/branches/1.x/', 4)],
         4: [('/branches/2.x/', 5)],
         5: [('/tags/1.0/', 6)]
    },
    'creation_method': 'created',
    'created': 1,
}

Extensive protection against over 80+ types of undesirable commits:

% svn co file://`pwd`/foo foo.wc
% cd foo.wc
% svn mkdir branches/3.x
% svn ci -m "Manual directory creation."
Adding         branches/3.x
svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:
error: errors:
{'/branches/3.x/': ['branch directory created manually']}

Commits with errors or warnings can be forced through by the following repository admins: <none>, or support staff:

% svn ci -m "Removing tag." tags/1.0
Deleting       tags/1.0
svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:
error: errors:
{'/tags/1.0/': ['tag removed']}

Commits with errors or warnings can be forced through by the following repository admins: <none>, or support staff: