gnu: Rename module gnutls to tls.
[jackhill/guix/guix.git] / gnu / packages / version-control.scm
index ed7d6f6..09f5a89 100644 (file)
@@ -1,9 +1,10 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
 
 (define-module (gnu packages version-control)
   #:use-module ((guix licenses)
-                #:select (asl2.0 gpl1+ gpl2 gpl2+ gpl3+ x11-style))
+                #:select (asl2.0 bsd-2
+                          gpl1+ gpl2 gpl2+ gpl3+ lgpl2.1
+                          x11-style))
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system python)
+  #:use-module (guix build-system trivial)
   #:use-module (guix build utils)
   #:use-module (gnu packages apr)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bison)
+  #:use-module (gnu packages cook)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages ed)
+  #:use-module (gnu packages file)
+  #:use-module (gnu packages flex)
   #:use-module (gnu packages gettext)
-;;   #:use-module (gnu packages gnutls)
+  #:use-module (gnu packages groff)
+  #:use-module (gnu packages linux)
   #:use-module (gnu packages nano)
+  #:use-module (gnu packages ncurses)
   #:use-module (gnu packages openssl)
+  #:use-module (gnu packages ssh)
+  #:use-module (gnu packages web)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
-  #:use-module (gnu packages sqlite)
+  #:use-module (gnu packages databases)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages emacs)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages swig)
-  #:use-module (gnu packages tcl))
+  #:use-module (gnu packages tcl)
+;;   #:use-module (gnu packages tls)
+  #:use-module (gnu packages)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1))
 
 (define-public bazaar
   (package
     (name "bazaar")
-    (version "2.5.1")
+    (version "2.6.0")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://launchpad.net/bzr/2.5/" version
+      (uri (string-append "https://launchpad.net/bzr/2.6/" version
                           "/+download/bzr-" version ".tar.gz"))
       (sha256
        (base32
-        "10krjbzia2avn09p0cdlbx2wya0r5v11w5ymvyl72af5dkx4cwwn"))))
+        "1c6sj77h5f97qimjc14kr532kgc0jk3wq778xrkqi0pbh9qpk509"))))
     (build-system python-build-system)
     (inputs
      ;; Note: 'tools/packaging/lp-upload-release' and 'tools/weavemerge.sh'
     (synopsis "Version control system supporting both distributed and centralized workflows")
     (description
      "GNU Bazaar is a version control system that allows you to record
-changes to project files over time. It supports both a distributed workflow
+changes to project files over time.  It supports both a distributed workflow
 as well as the classic centralized workflow.")
     (license gpl2+)))
 
+(define (package-transitive-propagated-labels* package)
+  "Return a list of the input labels of PACKAGE and its transitive inputs."
+  (let ((name (package-name package)))
+    `(,name
+      ,@(map (match-lambda
+               ((label (? package? _) . _)
+                (string-append name "/" label)))
+             (package-transitive-propagated-inputs package)))))
+
+(define (package-propagated-input-refs inputs packages)
+  "Return a list of (assoc-ref INPUTS <package-name>) for each package in
+PACKAGES and their propagated inputs."
+  (map (lambda (l)
+         `(assoc-ref ,inputs ,l))
+       (append-map package-transitive-propagated-labels*
+                   packages)))
+
 (define-public git
+  ;; Keep in sync with 'git-manpages'!
   (package
    (name "git")
-   (version "1.8.4")
+   (version "2.4.3")
    (source (origin
             (method url-fetch)
-            (uri (string-append "http://git-core.googlecode.com/files/git-"
-                                version ".tar.gz"))
+            (uri (string-append "mirror://kernel.org/software/scm/git/git-"
+                                version ".tar.xz"))
             (sha256
              (base32
-              "156bwqqgaw65rsvbb4wih5jfg94bxyf6p16mdwf0ky3f4ln55s2i"))))
+              "056qh112f2afnbc4sjzkf8idzhi9bp7ggpci83cc6a7gs6lhfl7h"))))
    (build-system gnu-build-system)
    (native-inputs
     `(("native-perl" ,perl)
@@ -107,10 +143,16 @@ as well as the classic centralized workflow.")
       ;; For 'git-svn'.
       ("subversion" ,subversion)
 
+      ;; For 'git-send-email'
+      ("perl-authen-sasl" ,perl-authen-sasl)
+      ("perl-net-smtp-ssl" ,perl-net-smtp-ssl)
+      ("perl-io-socket-ssl" ,perl-io-socket-ssl)
+
       ;; For 'git gui', 'gitk', and 'git citool'.
       ("tcl" ,tcl)
       ("tk" ,tk)))
    (outputs '("out"                               ; the core
+              "send-email"                        ; for git-send-email
               "svn"                               ; git-svn
               "gui"))                             ; gitk, git gui
    (arguments
@@ -124,6 +166,8 @@ as well as the classic centralized workflow.")
                                              (assoc-ref %build-inputs "tk")
                                              "/bin/wish8.6")) ; XXX
 
+      #:modules ((srfi srfi-1)
+                 ,@%gnu-build-system-modules)
       #:phases
        (alist-cons-after
         'configure 'patch-makefile-shebangs
@@ -133,63 +177,98 @@ as well as the classic centralized workflow.")
             (("/usr/bin/perl") (which "perl"))
             (("/usr/bin/python") (which "python"))))
         (alist-cons-after
-         'install 'split
-         (lambda* (#:key inputs outputs #:allow-other-keys)
-           ;; Split the binaries to the various outputs.
-           (let* ((out      (assoc-ref outputs "out"))
-                  (svn      (assoc-ref outputs "svn"))
-                  (gui      (assoc-ref outputs "gui"))
-                  (gitk     (string-append out "/bin/gitk"))
-                  (gitk*    (string-append gui "/bin/gitk"))
-                  (git-gui  (string-append out "/libexec/git-core/git-gui"))
-                  (git-gui* (string-append gui "/libexec/git-core/git-gui"))
-                  (git-cit  (string-append out "/libexec/git-core/git-citool"))
-                  (git-cit* (string-append gui "/libexec/git-core/git-citool"))
-                  (git-svn  (string-append out "/libexec/git-core/git-svn"))
-                  (git-svn* (string-append svn "/libexec/git-core/git-svn"))
-                  (git-sm   (string-append out
-                                           "/libexec/git-core/git-submodule")))
-             (mkdir-p (string-append gui "/bin"))
-             (mkdir-p (string-append gui "/libexec/git-core"))
-             (mkdir-p (string-append svn "/libexec/git-core"))
-
-             (for-each (lambda (old new)
-                         (copy-file old new)
-                         (delete-file old)
-                         (chmod new #o555))
-                       (list gitk git-gui git-cit git-svn)
-                       (list gitk* git-gui* git-cit* git-svn*))
-
-             ;; Tell 'git-svn' where Subversion is.
-             (wrap-program git-svn*
-                           `("PATH" ":" prefix
-                             (,(string-append (assoc-ref inputs "subversion")
-                                              "/bin")))
-                           `("PERL5LIB" ":" prefix
-                             (,(string-append (assoc-ref inputs "subversion")
-                                              "/lib/perl5/site_perl")))
-
-                           ;; XXX: The .so for SVN/Core.pm lacks a RUNPATH, so
-                           ;; help it find 'libsvn_client-1.so'.
-                           `("LD_LIBRARY_PATH" ":" prefix
-                             (,(string-append (assoc-ref inputs "subversion")
-                                              "/lib"))))
-
-             ;; Tell 'git-submodule' where Perl is.
-             (wrap-program git-sm
-                           `("PATH" ":" prefix
-                             (,(string-append (assoc-ref inputs "perl")
-                                              "/bin"))))
-
-             ;; Tell 'git' to look for core programs in the user's profile.
-             ;; This allows user to install other outputs of this package and
-             ;; have them transparently taken into account.  There's a
-             ;; 'GIT_EXEC_PATH' environment variable, but it's supposed to
-             ;; specify a single directory, not a search path.
-             (wrap-program (string-append out "/bin/git")
-                           `("PATH" ":" prefix
-                             ("$HOME/.guix-profile/libexec/git-core")))))
-         %standard-phases))))
+         'install 'install-shell-completion
+         (lambda* (#:key outputs #:allow-other-keys)
+           (let* ((out         (assoc-ref outputs "out"))
+                  (completions (string-append out "/etc/bash_completion.d")))
+             ;; TODO: Install the tcsh and zsh completions in the right place.
+             (mkdir-p completions)
+             (copy-file "contrib/completion/git-completion.bash"
+                        (string-append completions "/git"))
+             #t))
+         (alist-cons-after
+          'install 'split
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            ;; Split the binaries to the various outputs.
+            (let* ((out      (assoc-ref outputs "out"))
+                   (se       (assoc-ref outputs "send-email"))
+                   (svn      (assoc-ref outputs "svn"))
+                   (gui      (assoc-ref outputs "gui"))
+                   (gitk     (string-append out "/bin/gitk"))
+                   (gitk*    (string-append gui "/bin/gitk"))
+                   (git-gui  (string-append out "/libexec/git-core/git-gui"))
+                   (git-gui* (string-append gui "/libexec/git-core/git-gui"))
+                   (git-cit  (string-append out "/libexec/git-core/git-citool"))
+                   (git-cit* (string-append gui "/libexec/git-core/git-citool"))
+                   (git-se   (string-append out "/libexec/git-core/git-send-email"))
+                   (git-se*  (string-append se  "/libexec/git-core/git-send-email"))
+                   (git-svn  (string-append out "/libexec/git-core/git-svn"))
+                   (git-svn* (string-append svn "/libexec/git-core/git-svn"))
+                   (git-sm   (string-append out
+                                            "/libexec/git-core/git-submodule")))
+              (mkdir-p (string-append gui "/bin"))
+              (mkdir-p (string-append gui "/libexec/git-core"))
+              (mkdir-p (string-append se  "/libexec/git-core"))
+              (mkdir-p (string-append svn "/libexec/git-core"))
+
+              (for-each (lambda (old new)
+                          (copy-file old new)
+                          (delete-file old)
+                          (chmod new #o555))
+                        (list gitk git-gui git-cit git-se git-svn)
+                        (list gitk* git-gui* git-cit* git-se* git-svn*))
+
+              ;; Tell 'git-svn' where Subversion is.
+              (wrap-program git-svn*
+                `("PATH" ":" prefix
+                  (,(string-append (assoc-ref inputs "subversion")
+                                   "/bin")))
+                `("PERL5LIB" ":" prefix
+                  (,(string-append (assoc-ref inputs "subversion")
+                                   "/lib/perl5/site_perl")))
+
+                ;; XXX: The .so for SVN/Core.pm lacks a RUNPATH, so
+                ;; help it find 'libsvn_client-1.so'.
+                `("LD_LIBRARY_PATH" ":" prefix
+                  (,(string-append (assoc-ref inputs "subversion")
+                                   "/lib"))))
+
+              ;; Tell 'git-send-email' where perl modules are.
+              (wrap-program git-se*
+                `("PERL5LIB" ":" prefix
+                  ,(map (lambda (o) (string-append o "/lib/perl5/site_perl"))
+                        (delete-duplicates
+                         (list
+                          ,@(package-propagated-input-refs
+                             'inputs
+                             `(,perl-authen-sasl
+                               ,perl-net-smtp-ssl
+                               ,perl-io-socket-ssl)))))))
+
+              ;; Tell 'git-submodule' where Perl is.
+              (wrap-program git-sm
+                `("PATH" ":" prefix
+                  (,(string-append (assoc-ref inputs "perl")
+                                   "/bin"))))
+
+              ;; Tell 'git' to look for core programs in the user's profile.
+              ;; This allows user to install other outputs of this package and
+              ;; have them transparently taken into account.  There's a
+              ;; 'GIT_EXEC_PATH' environment variable, but it's supposed to
+              ;; specify a single directory, not a search path.
+              (wrap-program (string-append out "/bin/git")
+                `("PATH" ":" prefix
+                  ("$HOME/.guix-profile/libexec/git-core")))))
+          %standard-phases)))))
+
+   (native-search-paths
+    ;; For HTTPS access, Git needs a single-file certificate bundle, specified
+    ;; with $GIT_SSL_CAINFO.
+    ;; FIXME: This variable designates a single file; it is not a search path.
+    (list (search-path-specification
+           (variable "GIT_SSL_CAINFO")
+           (files '("etc/ssl/certs/ca-certificates.crt")))))
+
    (synopsis "Distributed version control system")
    (description
     "Git is a free distributed version control system designed to handle
@@ -197,17 +276,246 @@ everything from small to very large projects with speed and efficiency.")
    (license gpl2)
    (home-page "http://git-scm.com/")))
 
+(define-public git-manpages
+  ;; Keep in sync with 'git'!
+
+  ;; Granted, we could build the man pages from the 'git' package itself,
+  ;; which contains the real source.  However, it would add a dependency on a
+  ;; full XML tool chain, and building it actually takes ages.  So we use this
+  ;; lazy approach.
+  (package
+    (name "git-manpages")
+    (version (package-version git))
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://kernel.org/software/scm/git/git-manpages-"
+                    version ".tar.xz"))
+              (sha256
+               (base32
+                "1k24p33v9hvmpkx4l818x1vbdv090kfgwqshhyyl3h9m9b5skqci"))))
+    (build-system trivial-build-system)
+    (arguments
+     '(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+
+         (let* ((xz  (assoc-ref %build-inputs "xz"))
+                (tar (assoc-ref %build-inputs "tar"))
+                (out (assoc-ref %outputs "out"))
+                (man (string-append out "/share/man")))
+           (setenv "PATH" (string-append tar "/bin:" xz "/bin"))
+
+           (mkdir-p man)
+           (with-directory-excursion man
+             (zero? (system* "tar" "xvf"
+                             (assoc-ref %build-inputs "source"))))))))
+
+    (native-inputs `(("tar" ,tar)
+                     ("xz" ,xz)))
+    (home-page (package-home-page git))
+    (license (package-license git))
+    (synopsis "Man pages of the Git version control system")
+    (description
+     "This package provides the man pages of the Git version control system.
+This is the documentation displayed when using the '--help' option of a 'git'
+command.")))
+
+(define-public shflags
+  (package
+    (name "shflags")
+    (version "1.0.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://shflags.googlecode.com/files/"
+                                  "shflags-" version ".tgz"))
+              (sha256
+               (base32
+                "08laxhf1hifh3w4j0hri5ppcklaqz0mnkmbaz8j0wxih29vi8slm"))))
+    (build-system trivial-build-system)
+    (native-inputs `(("tar" ,tar)
+                     ("gzip" ,gzip)))
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((source (assoc-ref %build-inputs "source"))
+                          (tar    (assoc-ref %build-inputs "tar"))
+                          (gzip   (assoc-ref %build-inputs "gzip"))
+                          (output (assoc-ref %outputs "out"))
+                          (srcdir (string-append output "/src")))
+                     (begin
+                       (setenv "PATH" (string-append gzip "/bin"))
+                       (system* (string-append tar "/bin/tar") "xzf"
+                                source)
+                       (chdir ,(string-append name "-" version))
+                       (mkdir-p srcdir)
+                       (copy-file "src/shflags"
+                                  (string-append srcdir "/shflags"))
+                       #t)))))
+    (home-page "https://code.google.com/p/shflags/")
+    (synopsis "Command-line flags library for shell scripts")
+    (description
+     "Shell Flags (shFlags) is a library written to greatly simplify the
+handling of command-line flags in Bourne based Unix shell scripts (bash, dash,
+ksh, sh, zsh).  Most shell scripts use getopt for flags processing, but the
+different versions of getopt on various OSes make writing portable shell
+scripts difficult.  shFlags instead provides an API that doesn't change across
+shell and OS versions so the script writer can be confident that the script
+will work.")
+    (license lgpl2.1)))
+
+(define-public git-flow
+  (package
+    (name "git-flow")
+    ;; This version has not be officially released yet, so we build it
+    ;; directly from the git repository.
+    (version "0.4.2-pre")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/nvie/gitflow/")
+                    (commit "15aab26")))
+              (sha256
+               (base32
+                "01fs97q76fdfnvmrh2cyjhywcs3pykf1dg58sy0frflnsdzs6prx"))))
+    (build-system gnu-build-system)
+    (inputs `(("shflags" ,shflags)))
+    (arguments
+     '(#:tests? #f                    ; no tests
+       #:make-flags (list (string-append "prefix="
+                                         (assoc-ref %outputs "out")))
+       #:phases (alist-cons-after
+                 'unpack 'reset-shFlags-link
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; The link points to a file in the shFlags submodule.
+                   ;; Redirect it to point to our system shFlags.
+                   (let ((shflags (assoc-ref inputs "shflags")))
+                     (begin
+                       (delete-file "gitflow-shFlags")
+                       (symlink (string-append shflags "/src/shflags")
+                                "gitflow-shFlags"))))
+                 (alist-delete
+                  'configure
+                  (alist-delete 'build %standard-phases)))))
+    (home-page "http://nvie.com/posts/a-successful-git-branching-model/")
+    (synopsis "Git extensions for Vincent Driessen's branching model")
+    (description
+     "Vincent Driessen's branching model is a git branching and release
+management strategy that helps developers keep track of features, hotfixes,
+and releases in bigger software projects.  The git-flow library of git
+subcommands helps automate some parts of the flow to make working with it a
+lot easier.")
+    (license bsd-2)))
+
+(define-public git-test-sequence
+  (let ((commit "48e5a2f"))
+    (package
+      (name "git-test-sequence")
+      (version (string-append "20140312." commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      ;; There are many other scripts in this directory; we
+                      ;; are interested in just one for this package.
+                      (url "https://github.com/dustin/bindir")
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "1dcq0y16yznbv4k9h8gg90kv1gkn8r8dbvl4m2rpfd7q5nqhn617"))))
+      (build-system trivial-build-system)
+      (arguments
+       `(#:modules ((guix build utils))
+         #:builder (begin
+                     (use-modules (guix build utils))
+                     (let* ((source (assoc-ref %build-inputs "source"))
+                            (output (assoc-ref %outputs "out"))
+                            (bindir (string-append output "/bin"))
+                            (script "git-test-sequence"))
+                       (begin
+                         (mkdir-p bindir)
+                         (copy-file (string-append source "/" script)
+                                    (string-append bindir "/" script))
+                         #t)))))
+      (home-page "http://dustin.sallings.org/2010/03/28/git-test-sequence.html")
+      (synopsis "Run a command over a sequence of commits")
+      (description
+       "git-test-sequence is similar to an automated git bisect except it’s
+linear.  It will test every change between two points in the DAG.  It will
+also walk each side of a merge and test those changes individually.")
+      (license (x11-style "file://LICENSE")))))
+
+(define-public gitolite
+  (package
+    (name "gitolite")
+    (version "3.6.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/sitaramc/gitolite/archive/v"
+                    version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              ;; Commit ed807a4 upstream
+              (patches
+               (list (search-patch "gitolite-openssh-6.8-compat.patch")))
+              (sha256
+               (base32
+                "1gsgzi9ayb4rablki3mqr11b0h8db4xg43df660marfpacmkfb01"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:tests? #f ; no tests
+       #:phases (modify-phases %standard-phases
+                  (delete 'configure)
+                  (delete 'build)
+                  (add-before 'install 'patch-scripts
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (let ((perl (string-append (assoc-ref inputs "perl")
+                                                 "/bin/perl")))
+                        ;; This seems to take care of every shell script that
+                        ;; invokes Perl.
+                        (substitute* (find-files "." ".*")
+                          ((" perl -")
+                           (string-append " " perl " -"))))))
+                  (replace 'install
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let* ((output (assoc-ref outputs "out"))
+                             (sharedir (string-append output "/share/gitolite"))
+                             (bindir (string-append output "/bin")))
+                        (mkdir-p sharedir)
+                        (mkdir-p bindir)
+                        (system* "./install" "-to" sharedir)
+                        ;; Create symlinks for executable scripts in /bin.
+                        (for-each (lambda (script)
+                                    (symlink (string-append sharedir "/" script)
+                                             (string-append bindir "/" script)))
+                                  '("gitolite" "gitolite-shell"))
+                        #t))))))
+    (inputs
+     `(("perl" ,perl)))
+    ;; git and openssh are propagated because trying to patch the source via
+    ;; regexp matching is too brittle and prone to false positives.
+    (propagated-inputs
+     `(("git" ,git)
+       ("openssh" ,openssh)))
+    (home-page "http://gitolite.com")
+    (synopsis "Git access control layer")
+    (description
+     "Gitolite is an access control layer on top of Git, providing fine access
+control to Git repositories.")
+    (license gpl2)))
+
 (define-public mercurial
   (package
     (name "mercurial")
-    (version "2.7.1")
+    (version "3.2.4")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://mercurial.selenic.com/release/mercurial-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "121m8f7vmipmdg00cnzdz2rjkgydh28mwfirqkrbs5fv089vywl4"))))
+               "1g7nfvapxj5k44dyp0p08v37s0zmrj2vl0rjgfd8297x0afidm08"))))
     (build-system python-build-system)
     (arguments
      `(;; Restrict to Python 2, as Python 3 would require
@@ -272,51 +580,57 @@ WebDAV metadata support, wrappers for PROPFIND and PROPPATCH to simplify
 property manipulation.")
     (license gpl2+))) ; for documentation and tests; source under lgpl2.0+
 
-(define-public neon-0.29.6
-  (package (inherit neon)
-    (name "neon")
-    (version "0.29.6")
-    (source (origin
-             (method url-fetch)
-             (uri (string-append "http://www.webdav.org/neon/neon-"
-                                 version ".tar.gz"))
-             (sha256
-              (base32
-               "0hzbjqdx1z8zw0vmbknf159wjsxbcq8ii0wgwkqhxj3dimr0nr4w"))))))
-
 (define-public subversion
   (package
     (name "subversion")
-    (version "1.7.14")
+    (version "1.8.13")
     (source (origin
              (method url-fetch)
-             (uri (string-append "http://archive.apache.org/dist/subversion/subversion-"
-                                 version ".tar.bz2"))
+             (uri (string-append "http://archive.apache.org/dist/subversion/"
+                                 "subversion-" version ".tar.bz2"))
              (sha256
               (base32
-               "038jbcpwm083abp0rvk0fhnx65kp9mz1qvzs3f83ig8fxcvqzb64"))))
+               "0ybmc0yq83jhblp42wdqvn2cryra3sypx8mkxn5b8lq7hilcr68h"))
+             (patches
+              (list (search-patch "subversion-sqlite-3.8.9-fix.patch")))
+             (patch-flags '("-p0"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (alist-cons-after
-                 'install 'instal-perl-bindings
-                 (lambda* (#:key outputs #:allow-other-keys)
-                   ;; Follow the instructions from
-                   ;; 'subversion/bindings/swig/INSTALL'.
-                   (let ((out (assoc-ref outputs "out")))
-                     (and (zero? (system* "make" "swig-pl-lib"))
-                          ;; FIXME: Test failures.
-                          ;; (zero? (system* "make" "check-swig-pl"))
-                          (zero? (system* "make" "install-swig-pl-lib"))
-
-                          ;; Set the right installation prefix.
-                          (with-directory-excursion
-                              "subversion/bindings/swig/perl/native"
-                            (and (zero?
-                                  (system* "perl" "Makefile.PL"
-                                           (string-append "PREFIX=" out)))
-                                 (zero?
-                                  (system* "make" "install")))))))
-                 %standard-phases)))
+                 'configure 'patch-libtool-wrapper-ls
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; This substitution allows tests svnauthz_tests and
+                   ;; svnlook_tests to pass.  These tests execute svnauthz and
+                   ;; svnlook through their libtool wrapper scripts from svn
+                   ;; hooks, whose empty environments cause "ls: command not
+                   ;; found" errors.  It would be nice if this fix ultimately
+                   ;; made its way into libtool.
+                   (let ((coreutils (assoc-ref inputs "coreutils")))
+                     (substitute* "libtool"
+                       (("\\\\`ls") (string-append "\\`" coreutils "/bin/ls")))))
+                 (alist-cons-after
+                  'install 'install-perl-bindings
+                  (lambda* (#:key outputs #:allow-other-keys)
+                    ;; Follow the instructions from
+                    ;; 'subversion/bindings/swig/INSTALL'.
+                    (let ((out (assoc-ref outputs "out")))
+                      (and (zero? (system* "make" "swig-pl-lib"))
+                           ;; FIXME: Test failures.
+                           ;; (zero? (system* "make" "check-swig-pl"))
+                           (zero? (system* "make" "install-swig-pl-lib"))
+
+                           ;; Set the right installation prefix.
+                           (with-directory-excursion
+                               "subversion/bindings/swig/perl/native"
+                             (and (zero?
+                                   (system* "perl" "Makefile.PL"
+                                            (string-append "PREFIX=" out)))
+                                  (zero?
+                                   (system* "make" "install"
+                                            (string-append "OTHERLDFLAGS="
+                                                           "-Wl,-rpath="
+                                                           out "/lib"))))))))
+                  %standard-phases))))
     (native-inputs
       `(("pkg-config" ,pkg-config)
         ;; For the Perl bindings.
@@ -324,13 +638,13 @@ property manipulation.")
     (inputs
       `(("apr" ,apr)
         ("apr-util" ,apr-util)
-        ("neon" ,neon-0.29.6)
+        ("serf" ,serf)
         ("perl" ,perl)
         ("python" ,python-2) ; incompatible with Python 3 (print syntax)
         ("sqlite" ,sqlite)
         ("zlib" ,zlib)))
     (home-page "http://subversion.apache.org/")
-    (synopsis "Subversion, a revision control system")
+    (synopsis "Revision control system")
     (description
      "Subversion exists to be universally recognized and adopted as a
 centralized version control system characterized by its
@@ -342,14 +656,14 @@ projects, from individuals to large-scale enterprise operations.")
 (define-public rcs
   (package
     (name "rcs")
-    (version "5.9.2")
+    (version "5.9.4")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/rcs/rcs-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0wdmmplga9k05d9k7wjqv4zb6xvvzsli8hmn206pvangki1g66k5"))))
+               "1zsx7bb0rgvvvisiy4zlixf56ay8wbd9qqqcp1a1g0m1gl6mlg86"))))
     (build-system gnu-build-system)
     (native-inputs `(("ed" ,ed)))
     (home-page "http://www.gnu.org/software/rcs/")
@@ -403,7 +717,7 @@ RCS, PRCS, and Aegis packages.")
     (build-system gnu-build-system)
     (inputs `(("perl" ,perl)
               ("inetutils" ,inetutils)     ; for `hostname', used in the tests
-              ("emacs" ,emacs)))           ; for `ctags'
+              ("emacs" ,emacs-no-x)))      ; for `ctags'
     (home-page "http://www.gnu.org/software/vc-dwim/")
     (synopsis "Version-control-agnostic ChangeLog diff and commit tool")
     (description
@@ -431,7 +745,160 @@ standards-compliant ChangeLog entries based on the changes that it detects.")
     (home-page "http://invisible-island.net/diffstat/")
     (synopsis "Make histograms from the output of 'diff'")
     (description
-     "diffstat reads the output of 'diff' and displays a histogram of the
+     "Diffstat reads the output of 'diff' and displays a histogram of the
 insertions, deletions, and modifications per-file.  It is useful for reviewing
 large, complex patch files.")
     (license (x11-style "file://COPYING"))))
+
+(define-public cssc
+  (package
+    (name "cssc")
+    (version "1.3.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/" name "/CSSC-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "0bkw6fjh20ppvn54smv05461lm1vcwvn02avx941c4acafmkl1cm"))
+              (patches (list (search-patch "cssc-gets-undeclared.patch")
+                             (search-patch "cssc-missing-include.patch")))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases (alist-cons-before
+                 'check 'precheck
+                 (lambda _
+                   (begin
+                     (substitute* "tests/common/test-common"
+                       (("/bin/pwd") (which "pwd")))
+
+                     (substitute* "tests/prt/all-512.sh"
+                       (("/bin/sh") (which "sh")))
+
+                     ;; XXX: This test has no hope of passing until there is a "nogroup"
+                     ;; entry (or at least some group to which the guix builder does
+                     ;; not belong) in the /etc/group file of the build environment.
+                     ;; Currently we do not have such a group.  Disable this test for now.
+                     (substitute* "tests/Makefile"
+                       (("test-delta ") ""))))
+                 %standard-phases)))
+    ;; These are needed for the tests
+    (native-inputs `(("git" ,git)
+                     ("cvs" ,cvs)))
+    (home-page "http://www.gnu.org/software/cssc/")
+    (synopsis "File-based version control like SCCS")
+    (description  "GNU CSSC provides a replacement for the legacy Unix source
+code control system SCCS.  This allows old code still under that system to be
+accessed and migrated on modern systems.")
+    (license gpl3+)))
+
+;; This package can unfortunately work only in -TEST mode, since Aegis 
+;; requires that it is installed setuid root.
+(define-public aegis
+  (package
+    (name "aegis")
+    (version "4.24")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/aegis/aegis-" 
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "18s86ssarfmc4l17gbpzybca29m5wa37cbaimdji8czlcry3mcjl"))
+            (patches (list (search-patch "aegis-perl-tempdir1.patch")
+                           (search-patch "aegis-perl-tempdir2.patch")
+                           (search-patch "aegis-test-fixup-1.patch")
+                           (search-patch "aegis-test-fixup-2.patch")
+                           (search-patch "aegis-constness-error.patch")))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("e2fsprogs" ,e2fsprogs)
+       ("curl" ,curl)
+       ("file" ,file)
+       ("libxml2" ,libxml2)
+       ("zlib" ,zlib)
+       ("gettext" ,gnu-gettext)))
+    (native-inputs
+     `(("bison" ,bison)
+       ("groff" ,groff)
+       ("perl" ,perl)
+       ;; Various tests require the following:
+       ("cvs" ,cvs) 
+       ("flex" ,flex)
+       ("cook" ,cook)
+       ("subversion" ,subversion)
+       ("rcs" ,rcs)
+       ("ed" ,ed)))
+    (arguments
+     `(#:configure-flags (list "--with-no-aegis-configured" 
+                               "--sharedstatedir=/var/com/aegis")
+       #:parallel-build? #f ; There are some nasty racy rules in the Makefile.
+       #:phases 
+        (alist-cons-before
+         'configure 'pre-conf
+         (lambda _
+             (substitute* (append '("configure"
+                                    "etc/check-tar-gz.sh"
+                                    "etc/patches.sh"
+                                    "etc/test.sh"
+                                    "script/aexver.in"
+                                    "script/aebisect.in"
+                                    "script/aeintegratq.in"
+                                    "script/tkaegis.in"
+                                    "script/test_funcs.in"
+                                    "web/eg_oss_templ.sh"
+                                    "web/webiface.html"
+                                    "libaegis/getpw_cache.cc")
+                                  (find-files "test" "\\.sh"))
+               (("/bin/sh") (which "sh")))
+             (setenv "SH" (which "sh")))
+         (alist-replace
+          'check
+          (lambda _
+            (let ((home (string-append (getcwd) "/my-new-home")))
+              ;; Some tests need to write to $HOME.
+              (mkdir home)
+              (setenv "HOME" home)
+
+              ;; This test assumes that  flex has been symlinked to "lex".
+              (substitute* "test/00/t0011a.sh"
+                (("type lex")  "type flex"))
+
+              ;; The author decided to call the check rule "sure".
+              (zero? (system* "make" "sure"))))
+         %standard-phases))))
+    (home-page "http://aegis.sourceforge.net")
+    (synopsis "Project change supervisor")
+    (description "Aegis is a project change supervisor, and performs some of
+the Software Configuration Management needed in a CASE environment.  Aegis
+provides a framework within which a team of developers may work on many
+changes to a program independently, and Aegis coordinates integrating these
+changes back into the master source of the program, with as little disruption
+as possible.  Resolution of contention for source files, a major headache for
+any project with more than one developer, is one of Aegis's major functions.")
+    (license gpl3+)))
+
+(define-public tig
+  (package
+    (name "tig")
+    (version "2.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://jonas.nitro.dk/tig/releases/tig-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1c1w6w39a1dwx4whrg0ga1mhrlz095hz875z7ajn6xgmhkv8fqih"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("ncurses" ,ncurses)))
+    (arguments
+     `(#:tests? #f)) ; no tests implemented
+    (home-page "http://jonas.nitro.dk/tig/")
+    (synopsis "Ncurses-based text user interface for Git")
+    (description
+     "Tig is an ncurses text user interface for Git, primarily intended as
+a history browser.  It can also stage hunks for commit, or colorize the
+output of the 'git' command.")
+    (license gpl2+)))