ViewVC Installation

De EjnTricks

La procédure d'installation présentée ci dessous a été effectuée sous Ubuntu en se basant sur le fichier INSTALL dans l'archive téléchargée.

Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


System-Install-icon.png Installation initiale

Quelques dépendances sont nécessaire pour l'utilisation de ViewVC qui est écrit en python.

La dépendance python-pygments a été ajoutée:

#sudo apt-get install python-subversion
#sudo apt-get install python-pygments

La dépendance code>python-mysqldb</code> a été ajoutée, nécessaire pour la capture des commits sous SVN:

#sudo apt-get install python-mysqldb

L'archive est uploader dans /tmp puis installée sous /var/opt/viewvc.

#cd /var/opt
#sudo mkdir viewvc
#sudo tar -C /var/opt -xzvf /tmp/viewvc-1.1.8.tar.gz

Pour s'assurer le bon fonctionnement de l'application, le serveur en mode standalone est lancé:

#cd /var/opt/viewvc-1.1.8
#sudo bin/standalone.py -r /var/opt/svn/study/
server ready at http://localhost:49152/viewvc

Process-Icon.png Préparation de l'installation

La préparation de l'installation s'effectue en exécutant le script viewvc-install sous /var/opt/viewvc-1.1.8.


Icon File Owner.png Propriétaire fichiers

L'installation a été réalisée avec le compte root. Il est préférable de donner la propriété au compte de démarrage du serveur web, soit www-data dans le cadre de cette installation.

#sudo chown -R www-data:www-data /var/opt/viewvc


Icon ACL.png Sécurisation

Après avoir modifié le propriétaire des fichiers, il est conseillé de positionner des droits restrictifs afin que seul le propriétaire puisse accéder à ceux-ci.

#sudo find /var/opt/viewvc -exec chmod -R go-rwx {} \;

A noter l'utilisation de la suppression des droits, et non pas la spécification avec une commande de type chmod 600. En effet, l'utilitaire d'installation positionne les droits d'exécution sur certains fichiers, qu'il ne faudrait pas supprimer.


Icon-Configuration-Settings.png Configuration

Comme indiqué en fin d'exécution, il est nécessaire de compléter celle-ci en modifiant le fichier de configuration viewvc.conf. Par défaut, l'installation est effectuée dans le répertoire /var/opt/viewvc. Dans le cadre de cet exemple, un seul repository SVN, situé à l'emplacement /var/opt/svn/study, est exposé. Les modifications apportées à la configuration initiale sont:

  • Configuration du répertoire root d'un repository SVN.
## svn_roots: Specifies each of the Subversion roots (repositories) on
## your system and assigns names to them. Each root should be given by
## a "name: path" value. Multiple roots should be separated by commas
## and can be placed on separate lines.
##
## Example:
## svn_roots = svnrepos: /opt/svn/,
##             anotherrepos: /usr/local/svn/repos2
##
svn_roots = studyrepos: /var/opt/svn/study
  • Le paramètre root_parents n'est pas configuré car un unique repository est exposé.
  • Le repository par défaut est spécifié à l'unique configuré:
## default_root: This is the name of the default root.  Valid names
## include those explicitly listed in the cvs_roots and svn_roots
## configuration options, as well as those implicitly indicated by
## virtue of being the basenames of repositories found in the
## root_parents option locations.
##
## NOTE: This setting is ignored when root_as_url_component is enabled.
##
## Example:
## default_root = cvsroot
##
default_root = studyrepos

Dans le cas, où plusieurs repository doivent être publiés, et sont stockés dans le même emplacement, il est préférable d'utiliser le paramètre default_root, en commentant le paramètre svn_roots. Dans cet exemple, les repository se trouvent à la racine /var/opt/svn. Le "root" par défaut est positionné à studyrepos.

## svn_roots: Specifies each of the Subversion roots (repositories) on
## your system and assigns names to them. Each root should be given by
## a "name: path" value. Multiple roots should be separated by commas
## and can be placed on separate lines.
##
## Example:
## svn_roots = svnrepos: /opt/svn/,
##             anotherrepos: /usr/local/svn/repos2
##
# svn_roots = studyrepos: /var/opt/svn/study

## root_parents: Specifies a list of directories under which any
## number of repositories may reside.  You can specify multiple root
## parents separated by commas or new lines, each of which is of the
## form "path: type" (where type is either "cvs" or "svn").
##
## Rather than force you to add a new entry to 'cvs_roots' or
## 'svn_roots' each time you create a new repository, ViewVC rewards
## you for organizing all your repositories under a few parent
## directories by allowing you to simply tell it about those parent
## directories.  ViewVC will then notice each repository of the
## specified type in that directory as a root whose name is the
## subdirectory in which that repository lives.
##
## For example, if you have three Subversion repositories located at
## /opt/svn/projects, /opt/svn/websites, and /opt/svn/devstuff, you
## could list them individually in svn_roots like so:
##
##    svn_roots = projects: /opt/svn/projects,
##                websites: /opt/svn/websites,
##                devstuff: /opt/svn/devstuff
##
## or you could instead use the root_parents configuration option:
##
##    root_parents = /opt/svn: svn
##
## The benefit of this latter approach is that, as you add new
## repositories to your /opt/svn directory, they automatically become
## available for display in ViewVC without additional configuration.
##
## WARNING: the root names derived for repositories configured via the
## root_parents option can, of course, clash with names you have
## defined in your cvs_roots or svn_roots configuration items.  If
## this occurs, you can either rename the offending repository on
## disk, or grant new names to the clashing item in cvs_roots or
## svn_roots.  Each parent path is processed sequentially, so the
## names of repositories under later parent paths may override earlier
## ones.
##
## Example:
## root_parents = /opt/svn: svn,
##                /opt/cvs: cvs
##
root_parents = /var/opt/svn: svn

## default_root: This is the name of the default root.  Valid names
## include those explicitly listed in the cvs_roots and svn_roots
## configuration options, as well as those implicitly indicated by
## virtue of being the basenames of repositories found in the
## root_parents option locations.
##
## NOTE: This setting is ignored when root_as_url_component is enabled.
##
## Example:
## default_root = cvsroot
##
default_root = studyrepos

A noter que dans le cadre de cette installation, celle ci est réalisée dans le répertoire /var/opt/viewvc. Or, l'administration est simplifiée, surtout pour les mises à jour, en utilisant des liens symbolique. Pour cela, il faut installer l'application dans /var/opt/viewvc-1.1.8 et mettre en place un lien symbolique /var/opt/viewvc pointant sur ce dernier. Ceci est réalisé dans le cadre des mises à jour.

Icon-database.png Configuration MySql

Configuration-icon.png Publication sous Apache

Update icon.png Update

1.1.8 → 1.1.11 1.1.11 → 1.1.12 1.1.12 → 1.1.13 1.1.13 → 1.1.14 1.1.14 → 1.1.15
1.1.15 → 1.1.16 1.1.16 → 1.1.17 1.1.17 → 1.1.18 1.1.18 → 1.1.19 1.1.19 → 1.1.20
1.1.20 → 1.1.21 1.1.21 → 1.1.22 1.1.22 → 1.1.23 1.1.23 → 1.1.24 1.1.24 → 1.1.25
1.1.25 → 1.1.26 1.1.26 → 1.1.27


Bug-icon.png Bug

Suite à une mise à jour de Ubuntu, version 15.10, la version de python est modifiée. Les actions posts commit et la mise à jour de la base de données n'était plus fonctionnelle avec le message d'erreur suivant.

#sudo /var/opt/viewvc/viewvc/bin/svndbadmin -v rebuild /var/opt/svn/study
Traceback (most recent call last):
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 376, in <module>
    main(command, repository, revs, verbose, force)
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 255, in main
    db = cvsdb.ConnectDatabase(cfg)
  File "/var/opt/viewvc/1.1.15/lib/cvsdb.py", line 898, in ConnectDatabase
    db.Connect()
  File "/var/opt/viewvc/1.1.15/lib/cvsdb.py", line 61, in Connect
    version = self.GetMetadataValue("version")
  File "/var/opt/viewvc/1.1.15/lib/cvsdb.py", line 190, in GetMetadataValue
    cursor.execute(sql, sql_args)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 198, in execute
    query = query % args
TypeError: not all arguments converted during string formatting

Cette anomalie est corrigée à partir de la version 1.1.23, et il faut donc passer la mise à jour.


Suite à une mise à jour des paquest python en version 2.7 sur Ubuntu, une erreur se produisait lors de actions post commit ou du rafraîchissement, avec le message suivant.

Traceback (most recent call last):
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 376, in <module>
    main(command, repository, revs, verbose, force)
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 277, in main
    handle_revision(db, command, repo, rev, verbose)
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 208, in handle_revision
    revision = repo[rev]
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 85, in __getitem__
    rev = SvnRev(self, rev)
  File "/var/opt/viewvc/viewvc/bin/svndbadmin", line 194, in __init__
    diff_fp = diffobj.get_pipe()
  File "/usr/lib/python2.7/dist-packages/svn/fs.py", line 109, in get_pipe
    self.get_files()
  File "/usr/lib/python2.7/dist-packages/svn/fs.py", line 104, in get_files
    self._dump_contents(self.tempfile2, self.root2, self.path2)
  File "/usr/lib/python2.7/dist-packages/svn/fs.py", line 88, in _dump_contents
    fp.write(chunk)
TypeError: write() argument 1 must be unicode, not str

Il semblerait qu'il y ait un bug dans le module SVN de la version de python utilisé, au niveau de la fonction _dump_contents du script svn/fs.py. La cause semble être le mode d'ouverture d'un fichier temporaire, qui ne l'effectue pas en binaire, mode w+. Le mode d'ouverture est modifié en wb+ pour y remédier. Warning-icon.png Attention, le correctif semble fonctionner dans ce cas, mais cela n'a pas été validé pour tous les produits.

  def _dump_contents(self, file, root, path, pool=None):
    #fp = builtins.open(file, 'w+') # avoid namespace clash with
                                   # trimmed-down svn_fs_open()
    fp = builtins.open(file, 'wb+')
    if path is not None:
      stream = file_contents(root, path, pool)
      try:
        while True:
          chunk = _svncore.svn_stream_read(stream, _svncore.SVN_STREAM_CHUNK_SIZE)
          if not chunk:
            break
          fp.write(chunk)
      finally:
        _svncore.svn_stream_close(stream)
    fp.close()