gnu: libical: Correct zoneinfo search path.
[jackhill/guix/guix.git] / gnu / packages / version-control.scm
index 4f9ed54..944eb7a 100644 (file)
@@ -1,10 +1,14 @@
 ;;; 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, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
+;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2016 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015 Kyle Meyer <kyle@kyleam.com>
+;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
 
 (define-module (gnu packages version-control)
   #:use-module ((guix licenses)
-                #:select (asl2.0 bsd-2
+                #:select (asl2.0 bsd-2 bsd-3
                           gpl1+ gpl2 gpl2+ gpl3+ lgpl2.1
-                          x11-style))
+                          public-domain x11-style))
+  #:use-module (guix utils)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix build-system cmake)
   #: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 autotools)
+  #:use-module (gnu packages asciidoc)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages cook)
   #:use-module (gnu packages curl)
+  #:use-module (gnu packages docbook)
   #:use-module (gnu packages ed)
   #:use-module (gnu packages file)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages groff)
   #:use-module (gnu packages linux)
-;;   #:use-module (gnu packages gnutls)
   #:use-module (gnu packages nano)
-  #:use-module (gnu packages openssl)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages ssh)
+  #:use-module (gnu packages web)
+  #:use-module (gnu packages openstack)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages swig)
   #:use-module (gnu packages tcl)
-  #:use-module (gnu packages))
+  #: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.6.0")
+    (version "2.7.0")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://launchpad.net/bzr/2.6/" version
+      (uri (string-append "https://launchpad.net/bzr/"
+                          (version-major+minor version) "/" version
                           "/+download/bzr-" version ".tar.gz"))
       (sha256
        (base32
-        "1c6sj77h5f97qimjc14kr532kgc0jk3wq778xrkqi0pbh9qpk509"))))
+        "1cysix5k3wa6y7jjck3ckq3abls4gvz570s0v0hxv805nwki4i8d"))))
     (build-system python-build-system)
     (inputs
      ;; Note: 'tools/packaging/lp-upload-release' and 'tools/weavemerge.sh'
@@ -95,16 +109,17 @@ as well as the classic centralized workflow.")
     (license gpl2+)))
 
 (define-public git
+  ;; Keep in sync with 'git-manpages'!
   (package
    (name "git")
-   (version "2.1.2")
+   (version "2.7.4")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://kernel.org/software/scm/git/git-"
                                 version ".tar.xz"))
             (sha256
              (base32
-              "12x1qycc0rii6fqpiizp9v9ysdmj6lpi9imqqbrkdx6cifbwh9vv"))))
+              "0ys55v2xrhzj74jrrqx75xpr458klnyxshh8d8swfpp0zgg79rfy"))))
    (build-system gnu-build-system)
    (native-inputs
     `(("native-perl" ,perl)
@@ -120,14 +135,25 @@ 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
-    `(#:make-flags `("V=1") ; more verbose compilation
+    `(#:make-flags `("V=1"                        ;more verbose compilation
+
+                     ;; By default 'make install' creates hard links for
+                     ;; things in 'libexec/git-core', which leads to huge
+                     ;; nars; see <http://bugs.gnu.org/21949>.
+                     "NO_INSTALL_HARDLINKS=indeed")
       #:test-target "test"
       #:tests? #f ; FIXME: Many tests are failing
 
@@ -137,6 +163,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
@@ -146,63 +174,99 @@ 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"))
+                        (list
+                         ,@(transitive-input-references
+                            'inputs
+                            (map (lambda (l)
+                                   (assoc l (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
@@ -210,17 +274,167 @@ 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
+                "09ffk5c0dl1xg7xcvr0kadhspx4fr2spmlmcajzfycmap0ddhkyh"))))
+    (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 libgit2
+  (package
+    (name "libgit2")
+    (version "0.24.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/libgit2/libgit2/"
+                                  "archive/v" version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1c5jx0pcpz83x7s36jimfz5bj0vy7vwpchq9p4sgdqxy8gwr6rhw"))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-hardcoded-paths
+           (lambda _
+             (substitute* "tests/repo/init.c"
+               (("#!/bin/sh") (string-append "#!" (which "sh"))))
+             (substitute* "tests/clar/fs.h"
+               (("/bin/cp") (which "cp"))
+               (("/bin/rm") (which "rm")))
+             #t))
+         ;; Run checks more verbosely.
+         (replace 'check
+           (lambda _ (zero? (system* "./libgit2_clar" "-v" "-Q")))))))
+    (inputs
+     `(("libssh2" ,libssh2)
+       ("libcurl" ,curl)
+       ("python" ,python-wrapper)
+       ("openssl" ,openssl)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "http://libgit2.github.com/")
+    (synopsis "Library providing Git core methods")
+    (description
+     "Libgit2 is a portable, pure C implementation of the Git core methods
+provided as a re-entrant linkable library with a solid API, allowing you to
+write native speed custom Git applications in any language with bindings.")
+    ;; GPLv2 with linking exception
+    (license gpl2)))
+
+(define-public cgit
+  (package
+    (name "cgit")
+    (version "0.12")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://git.zx2c4.com/cgit/snapshot/cgit-"
+                    version ".tar.xz"))
+              (sha256
+               (base32
+                "1dx54hgfyabmg9nm5qp6d01f54nlbqbbdwhwl0llb9imjf237qif"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:tests? #f ; XXX: fail to build the in-source git.
+       #:test-target "test"
+       #:make-flags '("CC=gcc" "SHELL_PATH=sh")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'unpack-git
+           (lambda* (#:key inputs #:allow-other-keys)
+             ;; Unpack the source of git into the 'git' directory.
+             (zero? (system*
+                     "tar" "--strip-components=1" "-C" "git" "-xf"
+                     (assoc-ref inputs "git:src")))))
+         (delete 'configure) ; no configure script
+         (add-after 'build 'build-man
+           (lambda* (#:key make-flags #:allow-other-keys)
+             (zero? (apply system* `("make" ,@make-flags "doc-man")))))
+         (replace 'install
+           (lambda* (#:key make-flags outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (and (zero? (apply system*
+                                  `("make" ,@make-flags
+                                    ,(string-append "prefix=" out)
+                                    ,(string-append
+                                      "CGIT_SCRIPT_PATH=" out "/share/cgit")
+                                    "install" "install-man")))
+                    ;; Move the platform-dependent 'cgit.cgi' into lib
+                    ;; to get it stripped.
+                    (rename-file (string-append out "/share/cgit/cgit.cgi")
+                                 (string-append out "/lib/cgit/cgit.cgi"))
+                    #t)))))))
+    (native-inputs
+     ;; For building manpage.
+     `(("asciidoc" ,asciidoc)
+       ("docbook-xml" ,docbook-xml)
+       ("docbook-xsl" ,docbook-xsl)
+       ("xmllint" ,libxml2)
+       ("xsltprot" ,libxslt)))
+    (inputs
+     `(("git:src" ,(package-source git))
+       ("openssl" ,openssl)
+       ("zlib" ,zlib)))
+    (home-page "https://git.zx2c4.com/cgit/")
+    (synopsis "Web frontend for git repositories")
+    (description
+     "CGit is an attempt to create a fast web interface for the Git SCM, using
+a built-in cache to decrease server I/O pressure.")
+    (license gpl2)))
+
 (define-public shflags
   (package
     (name "shflags")
-    (version "1.0.3")
+    (version "1.2.0")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://shflags.googlecode.com/files/"
-                                  "shflags-" version ".tgz"))
+              (uri (string-append "https://github.com/kward/shflags/archive/v"
+                                  version ".tar.gz"))
               (sha256
                (base32
-                "08laxhf1hifh3w4j0hri5ppcklaqz0mnkmbaz8j0wxih29vi8slm"))))
+                "0zxw12haylaq60a335xlqcs4afw2zrgwqymmpw0m21r51w6irdmr"))))
     (build-system trivial-build-system)
     (native-inputs `(("tar" ,tar)
                      ("gzip" ,gzip)))
@@ -242,7 +456,7 @@ everything from small to very large projects with speed and efficiency.")
                        (copy-file "src/shflags"
                                   (string-append srcdir "/shflags"))
                        #t)))))
-    (home-page "https://code.google.com/p/shflags/")
+    (home-page "https://github.com/kward/shflags")
     (synopsis "Command-line flags library for shell scripts")
     (description
      "Shell Flags (shFlags) is a library written to greatly simplify the
@@ -321,11 +535,9 @@ lot easier.")
                             (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)))))
+                       (install-file (string-append source "/" script)
+                                     bindir)
+                       #t))))
       (home-page "http://dustin.sallings.org/2010/03/28/git-test-sequence.html")
       (synopsis "Run a command over a sequence of commits")
       (description
@@ -334,17 +546,73 @@ 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.5")
+    (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"))
+              (sha256
+               (base32
+                "0xpqg04gyr4dhdhxx5lbk61lwwd5ml32530bigg2qy663icngwqm"))))
+    (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.8.1")
     (source (origin
              (method url-fetch)
-             (uri (string-append "http://mercurial.selenic.com/release/mercurial-"
-                                 version ".tar.gz"))
+             (uri (string-append "https://www.mercurial-scm.org/"
+                                 "release/mercurial-" version ".tar.gz"))
              (sha256
               (base32
-               "121m8f7vmipmdg00cnzdz2rjkgydh28mwfirqkrbs5fv089vywl4"))))
+               "156m6269xdqq7mpw01c6b065k29xnb8b9lyzn1b0nlz5il2izkps"))))
     (build-system python-build-system)
     (arguments
      `(;; Restrict to Python 2, as Python 3 would require
@@ -353,7 +621,7 @@ also walk each side of a merge and test those changes individually.")
        ;; FIXME: Disabled tests because they require the nose unit
        ;; testing framework: https://nose.readthedocs.org/en/latest/ .
        #:tests? #f))
-    (home-page "http://mercurial.selenic.com")
+    (home-page "https://www.mercurial-scm.org/")
     (synopsis "Decentralized version control system")
     (description
      "Mercurial is a free, distributed source control management tool.
@@ -364,14 +632,14 @@ and offers an easy and intuitive interface.")
 (define-public neon
   (package
     (name "neon")
-    (version "0.30.0")
+    (version "0.30.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://www.webdav.org/neon/neon-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "1hlhg5w505jxdvaf7bq17057f6a48dry981g7lp2gwrhbp5wyqi9"))))
+               "1pawhk02x728xn396a1kcivy9gqm94srmgad6ymr9l0qvk02dih0"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("perl" ,perl)
@@ -409,29 +677,17 @@ 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.18")
+    (version "1.8.16")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://archive.apache.org/dist/subversion/"
                                  "subversion-" version ".tar.bz2"))
              (sha256
               (base32
-               "06nrqnn3qq1hhskkcdbm0ilk2xv6ay2gyf2c7qvxp6xncb782wzn"))))
+               "0imkxn25n6sbcgfldrx4z29npjprb1lxjm5fb89q4297161nx3zi"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (alist-cons-after
@@ -447,7 +703,7 @@ property manipulation.")
                      (substitute* "libtool"
                        (("\\\\`ls") (string-append "\\`" coreutils "/bin/ls")))))
                  (alist-cons-after
-                  'install 'instal-perl-bindings
+                  'install 'install-perl-bindings
                   (lambda* (#:key outputs #:allow-other-keys)
                     ;; Follow the instructions from
                     ;; 'subversion/bindings/swig/INSTALL'.
@@ -464,7 +720,10 @@ property manipulation.")
                                    (system* "perl" "Makefile.PL"
                                             (string-append "PREFIX=" out)))
                                   (zero?
-                                   (system* "make" "install")))))))
+                                   (system* "make" "install"
+                                            (string-append "OTHERLDFLAGS="
+                                                           "-Wl,-rpath="
+                                                           out "/lib"))))))))
                   %standard-phases))))
     (native-inputs
       `(("pkg-config" ,pkg-config)
@@ -473,7 +732,7 @@ 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)
@@ -491,14 +750,14 @@ projects, from individuals to large-scale enterprise operations.")
 (define-public rcs
   (package
     (name "rcs")
-    (version "5.9.3")
+    (version "5.9.4")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/rcs/rcs-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0isvzwfvqkg7zcsznra6wqh650z49ib113n7gp6ncxv5p30x3c38"))))
+               "1zsx7bb0rgvvvisiy4zlixf56ay8wbd9qqqcp1a1g0m1gl6mlg86"))))
     (build-system gnu-build-system)
     (native-inputs `(("ed" ,ed)))
     (home-page "http://www.gnu.org/software/rcs/")
@@ -526,7 +785,8 @@ machine.")
     (build-system gnu-build-system)
     (arguments
      ;; XXX: The test suite looks flawed, and the package is obsolete anyway.
-     '(#:tests? #f))
+     '(#:tests? #f
+       #:configure-flags (list "--with-external-zlib")))
     (inputs `(("zlib" ,zlib)
               ("nano" ,nano)))                    ; the default editor
     (home-page "http://cvs.nongnu.org")
@@ -538,6 +798,45 @@ sources files, and documents.  It fills a similar role to the free software
 RCS, PRCS, and Aegis packages.")
     (license gpl1+)))
 
+(define-public cvs-fast-export
+  (package
+    (name "cvs-fast-export")
+    (version "1.33")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.catb.org/~esr/"
+                                  name "/" name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1c3s4nacbwlaaccx1fr7hf72kxxrzy49y2rdz5hhqbk8r29vm8w1"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases (delete 'configure))
+       #:make-flags
+       (list "CC=gcc" (string-append "prefix?=" (assoc-ref %outputs "out")))))
+    (inputs `(("git" ,git)))
+    (native-inputs `(("asciidoc"    ,asciidoc)
+                     ("docbook-xml" ,docbook-xml)
+                     ("docbook-xsl" ,docbook-xsl)
+                     ("xmllint"     ,libxml2)
+                     ("xsltproc"    ,libxslt)
+                     ;; These are needed for the tests.
+                     ("cvs"    ,cvs)
+                     ("python" ,python-2)
+                     ("rcs"    ,rcs)))
+    (home-page "http://www.catb.org/esr/cvs-fast-export/")
+    (synopsis "Export an RCS or CVS history as a fast-import stream")
+    (description "This program analyzes a collection of RCS files in a CVS
+repository (or outside of one) and, when possible, emits an equivalent history
+in the form of a fast-import stream.  Not all possible histories can be
+rendered this way; the program tries to emit useful warnings when it can't.
+
+The program can also produce a visualization of the resulting commit directed
+acyclic graph (DAG) in the input format of @uref{http://www.graphviz.org,
+Graphviz}.  The package also includes @command{cvssync}, a tool for mirroring
+masters from remote CVS hosts.")
+    (license gpl2+)))
+
 (define-public vc-dwim
   (package
     (name "vc-dwim")
@@ -552,7 +851,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
@@ -596,8 +895,8 @@ large, complex patch files.")
               (sha256
                (base32
                 "0bkw6fjh20ppvn54smv05461lm1vcwvn02avx941c4acafmkl1cm"))
-              (patches (list (search-patch "cssc-gets-undeclared.patch")
-                             (search-patch "cssc-missing-include.patch")))))
+              (patches (search-patches "cssc-gets-undeclared.patch"
+                                       "cssc-missing-include.patch"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases (alist-cons-before
@@ -627,7 +926,7 @@ 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 
+;; This package can unfortunately work only in -TEST mode, since Aegis
 ;; requires that it is installed setuid root.
 (define-public aegis
   (package
@@ -635,16 +934,16 @@ accessed and migrated on modern systems.")
     (version "4.24")
     (source (origin
               (method url-fetch)
-              (uri (string-append "mirror://sourceforge/aegis/aegis-" 
+              (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")))))
+            (patches (search-patches "aegis-perl-tempdir1.patch"
+                                     "aegis-perl-tempdir2.patch"
+                                     "aegis-test-fixup-1.patch"
+                                     "aegis-test-fixup-2.patch"
+                                     "aegis-constness-error.patch"))))
     (build-system gnu-build-system)
     (inputs
      `(("e2fsprogs" ,e2fsprogs)
@@ -658,17 +957,17 @@ accessed and migrated on modern systems.")
        ("groff" ,groff)
        ("perl" ,perl)
        ;; Various tests require the following:
-       ("cvs" ,cvs) 
+       ("cvs" ,cvs)
        ("flex" ,flex)
        ("cook" ,cook)
        ("subversion" ,subversion)
        ("rcs" ,rcs)
        ("ed" ,ed)))
     (arguments
-     `(#:configure-flags (list "--with-no-aegis-configured" 
+     `(#:configure-flags (list "--with-no-aegis-configured"
                                "--sharedstatedir=/var/com/aegis")
        #:parallel-build? #f ; There are some nasty racy rules in the Makefile.
-       #:phases 
+       #:phases
         (alist-cons-before
          'configure 'pre-conf
          (lambda _
@@ -712,3 +1011,243 @@ 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 reposurgeon
+  (package
+    (name "reposurgeon")
+    (version "3.37")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.catb.org/~esr/" name "/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "14asjg4xy3mhh5z0r3k7c1wv9y803j2zfq32g5q5m95sf7yzygan"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                      ;no test suite distributed
+       #:make-flags
+       (list (string-append "target=" (assoc-ref %outputs "out")))
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'build 'fix-docbook
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* (find-files "." "\\.xml$")
+               (("docbook/docbookx.dtd")
+                (string-append (assoc-ref inputs "docbook-xml")
+                               "/xml/dtd/docbook/docbookx.dtd")))
+             #t))
+         (add-after 'install 'install-emacs-data
+           (lambda* (#:key outputs #:allow-other-keys)
+             (install-file "reposurgeon-mode.el"
+                           (string-append (assoc-ref outputs "out")
+                                          "/share/emacs/site-lisp")))))))
+    (inputs
+     `(("python" ,python-wrapper)))
+    (native-inputs
+     `(("asciidoc" ,asciidoc)
+       ("docbook-xml" ,docbook-xml-4.1.2)
+       ("docbook-xsl" ,docbook-xsl)
+       ("libxml2" ,libxml2)
+       ("xmlto" ,xmlto)))
+    (home-page "http://www.catb.org/~esr/reposurgeon/")
+    (synopsis "Edit version-control repository history")
+    (description "Reposurgeon enables risky operations that version-control
+systems don't want to let you do, such as editing past comments and metadata
+and removing commits.  It works with any version control system that can
+export and import Git fast-import streams, including Git, Mercurial, Fossil,
+Bazaar, CVS, RCS, and Src.  It can also read Subversion dump files directly
+and can thus be used to script production of very high-quality conversions
+from Subversion to any supported Distributed Version Control System (DVCS).")
+    ;; Most files are distributed under bsd-2, except 'repocutter' which is
+    ;; under bsd-3.
+    (license (list bsd-2 bsd-3))))
+
+(define-public tig
+  (package
+    (name "tig")
+    (version "2.1.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://jonas.nitro.dk/tig/releases/tig-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "0bw5wivswwh7vx897q8xc2cqgkqhdzk8gh6fnav2kf34sngigiah"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("ncurses" ,ncurses)))
+    (arguments
+     `(#:tests? #f)) ; tests require access to /dev/tty
+     ;;`(#:test-target "test"))
+    (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+)))
+
+(define-public findnewest
+  (package
+    (name "findnewest")
+    (version "0.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/0-wiz-0/findnewest/archive/findnewest-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1ydis4y0amkgfr4y60sn076f1l41ya2kn89kfd9fqf44f9ccgb5r"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-before 'configure 'bootstrap
+                    (lambda _
+                      (zero? (system* "autoreconf" "-vfi")))))))
+    (native-inputs `(("autoconf" ,autoconf)
+                     ("automake" ,automake)))
+    (home-page "https://github.com/0-wiz-0/findnewest/releases")
+    (synopsis "Print the modification time of the latest file")
+    (description
+     "Recursively find the newest file in a file tree and print its
+modification time.")
+    (license bsd-2)))
+
+(define-public myrepos
+  (package
+    (name "myrepos")
+    (version "1.20160123")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/joeyh/myrepos/archive/"
+             version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1723cg5haplz2w9dwdzp6ds1ip33cx3awmj4wnb0h4yq171v5lqk"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("perl" ,perl)))
+    (arguments
+     `(#:test-target "test"
+       #:phases (alist-delete 'configure %standard-phases)
+       #:make-flags (list (string-append "PREFIX=" %output))))
+    (home-page "http://myrepos.branchable.com/")
+    (synopsis "Multiple repository management tool")
+    (description
+     "Myrepos provides the @code{mr} command, which maps an operation (e.g.,
+fetching updates) over a collection of version control repositories.  It
+supports a large number of version control systems: Git, Subversion,
+Mercurial, Bazaar, Darcs, CVS, Fossil, and Veracity.")
+    (license gpl2+)))
+
+(define-public git-annex-remote-hubic
+  (package
+    (name "git-annex-remote-hubic")
+    (version "0.3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/Schnouki/" name "/archive/v"
+                    version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "196g3jkaybjx11nbr51n0cjps3wjzb145ab76y717diqvvxp5v4r"))))
+    (build-system python-build-system)
+    (arguments `(#:python ,python-2))
+    (native-inputs
+     `(("python2-setuptools" ,python2-setuptools)
+       ;; for the tests
+       ("python2-six" ,python2-six)))
+    (propagated-inputs
+     `(("python2-dateutil" ,python2-dateutil-2)
+       ("python2-futures" ,python2-futures)
+       ("python2-rauth" ,python2-rauth)
+       ("python2-swiftclient" ,python2-swiftclient)))
+    (home-page "https://github.com/Schnouki/git-annex-remote-hubic/")
+    (synopsis "Use hubic as a git-annex remote")
+    (description
+     "This package allows you to use your hubic account as a \"special
+repository\" with git-annex.")
+    (license gpl3+)))
+
+(define-public fossil
+  (package
+    (name "fossil")
+    (version "1.34")
+    (source
+     (origin
+       (method url-fetch)
+       ;; Upstream source affected by
+       ;; http://debbugs.gnu.org/cgi/bugreport.cgi?bug=20962
+       (uri (string-append
+             "https://web.archive.org/web/20160402202958/"
+             "https://www.fossil-scm.org/download/fossil-src-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "17x4vgjcfihwmq195qg32irp50panvjqfpvhqydfvv4ghwzbi9jk"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;; Commit 0a2ebe57 on 2015-08-03 18:35:53 changed output formatting
+           ;; for some commands, but affected tests were not updated.  Use
+           ;; substitute here, which is more concise than patching.
+           (substitute* "test/clean.test"
+             (("NEW ") "NEW    "))
+           (substitute* '("test/revert.test" "test/mv-rm.test")
+             (("REVERTED:") "REVERT  ")
+             (("DELETE:")   "DELETE  ")
+             (("UNMANAGE:") "UNMANAGE "))
+           ;; Fix use of __DATE__ and __TIME__
+           (substitute* "src/main.c"
+             (("Compiled on %s %s") "Compiled")
+             (("__DATE__, __TIME__, ") ""))
+           #t))
+       (patches (list (search-patch "fossil-test-fixes.patch")))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("tcl" ,tcl)                     ;for configuration only
+       ("which" ,which)                 ;for tests only
+       ("ed" ,ed)))                     ;ditto
+    (inputs
+     `(("openssl" ,openssl)
+       ("zlib" ,zlib)
+       ("sqlite" ,sqlite)))
+    (arguments
+     `(#:configure-flags (list "--with-openssl=auto"
+                               "--disable-internal-sqlite")
+       #:test-target "test"
+       #:phases (modify-phases %standard-phases
+                  (replace 'configure
+                    (lambda* (#:key outputs (configure-flags '())
+                                    #:allow-other-keys)
+                      ;; The 'configure' script is not an autoconf script and
+                      ;; chokes on unrecognized options.
+                      (zero? (apply system*
+                                    "./configure"
+                                    (string-append "--prefix="
+                                                   (assoc-ref outputs "out"))
+                                    configure-flags))))
+                  (add-before 'check 'test-setup
+                    (lambda _
+                      (setenv "USER" "guix")
+                      (setenv "TZ" "UTC")
+                      ;; Fixing the th1 test would require many backports, so
+                      ;; just disable for now.
+                      (delete-file "test/th1.test")
+                      #t)))))
+    (home-page "https://fossil-scm.org")
+    (synopsis "Software configuration management system")
+    (description
+     "Fossil is a distributed source control management system which supports
+access and administration over HTTP CGI or via a built-in HTTP server.  It has
+a built-in wiki, built-in file browsing, built-in tickets system, etc.")
+    (license (list public-domain        ;src/miniz.c, src/shell.c
+                   bsd-2))))