anchor.diff:  
   (defmacro with-system-path ((var system) &body body)
     `(let ((,var (ql:where-is-system ,system)))
  -     ,@body))
  +     (if ,var
  +         (progn ,@body)
  +         (error (format nil "path for system \"~a\" not found" ,system)))))
  +
  +(defun run-program (cmd)
  +  (multiple-value-bind (out err status)
  +      (asdf/run-program:run-program
  +       cmd
  +       :output '(:string :stripped t)
  +       :error-output '(:string :stripped t)
  +       :ignore-error-status t)
  +    (if (zerop status)
  +        out
  +        (error (format nil "command ~s exited with status ~a: ~s" cmd status err)))))
   
   (defun git-version ()
  -  (with-system-path (system "lbot")
  -    (if system
  -        (multiple-value-bind (out err status)
  -            (asdf/run-program:run-program
  -             (format nil "cd ~a && git log -1 --format='%cD (%cr)'" system)
  -             :output '(:string :stripped t)
  -             :error-output '(:string :stripped t)
  -             :ignore-error-status t)
  -          (if (zerop status) out err))
  -        "lbot system path not found")))
  +  (with-system-path (path "lbot")
  +    (run-program (format nil "cd ~a && git log -1 --format='%cD (%cr)'" path))))
   
   (defun reload ()
  -  (with-system-path (system "lbot")
  -    (when system
  -      (multiple-value-bind (out err status)
  -          (asdf/run-program:run-program
  -           (format nil "cd ~a && git pull" system)
  -           :output '(:string :stripped t)
  -           :error-output '(:string :stripped t)
  -           :ignore-error-status t)
  -        (if (zerop status)
  -            (ignore-errors
  -              (ql:quickload "lbot")
  -              (values t out))
  -            (values nil err))))))
  +  (with-system-path (path "lbot")
  +    (run-program (format nil "cd ~a && git pull" path))
  +    (ql:quickload "lbot")))
   
   (defparameter *connection* nil)
   
  
positive.code:      (reply-chat connection (xmpp:from message)
                   (format-ideas *ideas*) (xmpp::type- message)))
      ((equal "reload")
       (let* ((repo (get-github-repo))
              (status (if repo (travis-status repo)))
              (text (if (eq status :passing)
                        (multiple-value-bind (success text) (reload)
                          (if success (git-version) text))
                        (format nil "ci status: ~a (https://travis-ci.org/~a)" status repo))))
         (reply-chat connection (xmpp:from message)
                     text (xmpp::type- message))))
      ((equal "ci")
       (let* ((repo (get-github-repo))
              (status (if repo (travis-status repo))))
         (reply-chat connection (xmpp:from message)
                     (format nil "~a" status) (xmpp::type- message))))
      ((or (optima.ppcre:ppcre "(^|\\s)300($|\\s)")
           (optima.ppcre:ppcre "(^|\\s)тристо($|\\s)")
           (optima.ppcre:ppcre "(^|\\s)триста($|\\s)"))
  
negative.code: (defun get-github-repo (&optional (system (string-downcase (package-name *package*))))
    (check-type system (or string keyword))
    (with-system-path (path system)
      (let* ((out (run-program (format nil "cd ~a && git config --get remote.origin.url" path)))
             (repo (ppcre:register-groups-bind (match) (":(.+).git$" out :sharedp t)
                     match)))
        (if repo repo (error (format nil "repo not found in ~a" out))))))
  