読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

git repositoryじゃない場所でもanything-git-project.elがエラーにならないように

 先ほどのanything-git-project.elを少し手直ししてみた - $shibayu36->blog;に引き続きしてみた。けっこうひどいコードになってきてるから、リファクタリングしてもいいかもという気分になってきた。

(defun anything-git-project-is-git-repository ()
  (let ((error-message (shell-command-to-string "git rev-parse")))
    (if (string= error-message "")
        t
      nil)
    ))

(defun anything-git-project-project-dir ()
  (chomp
   (shell-command-to-string "git rev-parse --show-toplevel")
   ))

(defun anything-c-sources-git-project-for ()
  (cond ((anything-git-project-is-git-repository)
         (loop for elt in
               '(("Modified files (%s)" . "--modified")
                 ("Untracked files (%s)" . "--others --exclude-standard")
                 ("All controlled files in this project (%s)" . ""))
               collect
               `((name . ,(format (car elt) (anything-git-project-project-dir)))
                 (init . (lambda ()
                           (setq current-git-project-dir
                                 (anything-git-project-project-dir))
                           (unless (and ,(string= (cdr elt) "") ;update candidate buffer every time except for that of all project files
                                        (anything-candidate-buffer))
                             (with-current-buffer
                                 (anything-candidate-buffer 'global)
                               (insert
                                (shell-command-to-string
                                 ,(format "git ls-files --full-name $(git rev-parse --show-cdup) %s"
                                          (cdr elt))))))))
                 (candidates-in-buffer)
                 (display-to-real . (lambda (name)
                                      (format "%s/%s"
                                              current-git-project-dir name)))
                 (type . file))
               ))
        ((list))
        ))

(defun anything-git-project ()
  (interactive)
  (let* ((sources (anything-c-sources-git-project-for)))
    (anything-other-buffer sources
                           (format "*Anything git project in %s*"
                                   (anything-git-project-project-dir)))))


 これをやった理由は、たとえばanything-filelistのsourceとしてanything-git-projectも入れたいとなった時、git repository以外(例えば*scratch*とか)で起動するとエラーが出てしまい、邪魔なので勢いでやった。

 gitのrepositoryかどうか判断するのは、カレントディレクトリがGitリポジトリ下か否か判定する - すぎゃーんメモを参考にした。exit codeを見るパターンだとなんか*Message*にエラーが吐かれて嫌なので、error messageを見るようにした。