skip "SKIP-GPG-CHECK"
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チェックスキップの確認)によってインストールプロセスが途中で止まってしまうことがあるのも面倒