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

skip "SKIP-GPG-CHECK"

common lisp condition

asdf-installを使ってパッケージをインストールしようとすると、下のように「GPGのキーがありません」(?)とよく云われる。

>(asdf-install:install "cl-ppcre")

...略...

debugger invoked on a ASDF-INSTALL::KEY-NOT-FOUND in thread #<THREAD "initial thread" RUNNING {AB6E569}>:
  No key found for key id 0x595FF045057958C6.  Try some command like 
  gpg  --recv-keys 0x595FF045057958C6

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [SKIP-GPG-CHECK] Don't check GPG signature for this package
  1: [ABORT         ] Exit debugger, returning to top level.

この場合、決まって'0'を入力してチェックを飛ばしている(abortを選択することはまずない)のだが、毎回手動で入力するのは面倒*1なので、conditionハンドラを定義して、その動作を自動化するコードを書いてみた。
※そもそもGPGのチェックが正常に行われるようにすればいいのかもしれないが、この辺りの仕組みはいまいち分かっていないので、また今度(気が向いたら...)。


以下のコードを初期化ファイルなどに記述しておけば、(asdf-install:install関数実行時に)毎回確認を求められることがなくなる。

(requrie :asdf-install)

;;; asdf-install:install関数を上書き
(let ((original #'asdf-install:install))
  (setf (symbol-function 'asdf-install:install)
        (lambda (&rest packages)
          (handler-bind 
           ;; KEY-NOT-FOUNDコンディションが来たら、
           ;; SKIP-GPG-CHECKを(再起動関数として)選択する
           ((asdf-install::KEY-NOT-FOUND 
             (lambda (c) 
               (declare (ignore c))
               ;; XXX: (find-restart ...)がnilを返す場合がある?
               (invoke-restart (find-restart 'asdf-install::SKIP-GPG-CHECK)))))
           (apply original packages)))))

*1:他のパッケージに依存するパッケージをインストールする場合に、このコンディション送出(GPGチェックスキップの確認)によってインストールプロセスが途中で止まってしまうことがあるのも面倒