anchor.diff:  (uiop:define-package :nyxt/vcs
     (:use :common-lisp :trivia :nyxt)
     (:documentation "Interact with Git repositories.
  -
  -New command: vcs-clone (alias git-clone), to clone a VCS repository on
  -disk (Git only at the moment).
   
   Change the `*vcs-projects-roots*' list to define where to look for
   existing repositories on disk.
  
positive.code: (sera:export-always '*vcs-projects-roots*)
  (defparameter *vcs-projects-roots* '("~/projects" "~/src" "~/work" "~/common-lisp" "~/quicklisp/local-projects")
    "A list of directories to look for VCS repositories into.")
  ;; Possible improvement: specify the depth to look for projects alongside the directory.
  ;; See magit-list-repositories.
  
  (declaim (type (or null alist-of-strings) *vcs-usernames-alist*))
  (sera:export-always '*vcs-usernames-alist*)
  (defvar *vcs-usernames-alist* '(("github.com" . "")
                                  ("gitlab.com" . "")
                                  ("bitbucket.org" . ""))
    "Your VCS usernames on different forges.  It helps some commands to do things
  right, such as cloning over SSH instead of HTTPS.  The forge name should be a
  domain, such as 'github.com'.")
  
  (declaim (type (or null string) *vcs-username*))
  (sera:export-always '*vcs-username*)
  
negative.code: 
  (defun find-project-directory (name &key exit-recursive-scan)
    "Return the directory pathname of the project named NAME by searching the local projects.
  If EXIT-RECURSIVE-SCAN is non-nil, avoid recursive scan of local
  projects. By default, it will re-scan the local projects to avoid
  false negatives and false positives."
    (unless *git-projects*
      (setf *git-projects* (parse-projects)))
    (let ((result (find name *git-projects*
  