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:
- Tutorial 1 - Creating a new, Enversion-enabled Subversion Repository
- Tutorial 2 - Enabling Enversion against an existing Subversion Repository
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:
- Tutorial 1 - Creating a new, Enversion-enabled Subversion Repository
- Tutorial 2 - Enabling Enversion against an existing Subversion Repository
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
condainstalled? 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 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 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
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 ~]$
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: