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
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 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: