2014-01-29

Client update now available, and a bit of GPG

Client updates

edit There is a problem with the update. If you're having a problem related to client-info.sexp, I'll post a fix shortly. Sorry about the hassle!

The Quicklisp client updates I described last week are now part of Quicklisp. If you install Quicklisp from scratch with today you will be using the new client versioning system. To update an existing Quicklisp installation, use(ql:update-client).

This update provides several new options in quicklisp-quickstart:install:
  • :dist-url can be used to specify the initial dist version to use at installation time. Valid URLs can be obtained from an existing Quicklisp installation by evaluating one of the new functions (ql:dist-url "quicklisp") or (ql:available-dist-versions "quicklisp")
  • :client-url can be used to specify the initial client version to use at installation time. Valid URLs can be obtained from an existing Quicklisp installation by evaluating one of the new functions (ql:client-url) or (ql:available-client-versions)
There is also a new function, (ql:install-client :url url), that can be used to change the client version of an existing Quicklisp installation.

The ability to easily install (or go back to) a known-working client sets the stage for a pretty big Quicklisp client change. In the next few days I'm going to update Quicklisp to require ASDF 3, which it will fetch automatically if needed. If that change breaks your project, you will have a safety net: you can always go back to the previous version of the Quicklisp client. (If it breaks too many projects, Quicklisp itself will go back to a previous version of ASDF.)

If you have any trouble with this new Quicklisp setup, please let me know at xach@clozure.com. You can also discuss it on the mailing list or talk to me in realtime (if I'm around) in #quicklisp on freenode.

GPG signatures

I have created a new GPG key, release@quicklisp.org, for signing Quicklisp-related programs and metadata. You can get the key from various keyservers, i.e. "gpg --keyserver pgp.mit.edu --recv-keys 028B5FF7", or from http://beta.quicklisp.org/release-key.txt.

Here are some examples of signed files:
In general, if a the file at URL "http://beta.quicklisp.org/whatever" has a signature, it is the same URL with ".asc" appended, e.g. "http://beta.quicklisp.org/whatever.asc". If you fetch both files, you can verify the signature with "gpg --verify whatever.asc whatever".

The Quicklisp client code does not yet verify signatures, but you may use these signatures to independently verify the Quicklisp code and metadata you have fetched. A future Quicklisp update will provide more built-in cryptographic verification.

Enjoy!

3 comments:

  1. I updated quicklisp by (ql:update-client), which was successful. But after the update, I ran (ql:update-client) again on the new quicklisp and I got an error like below.

    error opening #P"/Users/jinwoo/quicklisp/client-info.sexp":
    No such file or directory
    [Condition of type SB-INT:SIMPLE-FILE-ERROR]

    Restarts:
    0: [RETRY] Retry SLIME REPL evaluation request.
    1: [*ABORT] Return to SLIME's top level.
    2: [ABORT] Abort thread (#)

    Backtrace:
    0: (SB-IMPL::SIMPLE-FILE-PERROR "error opening ~S" #P"/Users/jinwoo/quicklisp/client-info.sexp" 2)
    1: ((FLET SB-IMPL::VANILLA-OPEN-ERROR :IN OPEN))
    2: (OPEN #P"/Users/jinwoo/quicklisp/client-info.sexp" :DIRECTION :INPUT :ELEMENT-TYPE BASE-CHAR :IF-EXISTS NIL :IF-DOES-NOT-EXIST NIL :EXTERNAL-FORMAT :DEFAULT)
    3: (QL-UTIL:SAFELY-READ-FILE #P"/Users/jinwoo/quicklisp/client-info.sexp")
    4: (QUICKLISP-CLIENT::LOAD-CLIENT-INFO #P"/Users/jinwoo/quicklisp/client-info.sexp")
    5: (QUICKLISP-CLIENT:UPDATE-CLIENT :PROMPT T)
    6: (SB-INT:SIMPLE-EVAL-IN-LEXENV (QUICKLISP-CLIENT:UPDATE-CLIENT) #)
    7: (EVAL (QUICKLISP-CLIENT:UPDATE-CLIENT))
    8: (SWANK::EVAL-REGION "(ql:update-client) ..)
    9: ((LAMBDA NIL :IN SWANK::REPL-EVAL))
    10: (SWANK::TRACK-PACKAGE #)
    11: (SWANK::CALL-WITH-RETRY-RESTART "Retry SLIME REPL evaluation request." #)
    12: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #)
    13: (SWANK::REPL-EVAL "(ql:update-client) ..)
    14: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:LISTENER-EVAL "(ql:update-client) ..)
    15: (EVAL (SWANK:LISTENER-EVAL "(ql:update-client) ..)
    16: (SWANK:EVAL-FOR-EMACS (SWANK:LISTENER-EVAL "(ql:update-client) ..)
    17: (SWANK::PROCESS-REQUESTS NIL)
    18: ((LAMBDA NIL :IN SWANK::HANDLE-REQUESTS))
    19: ((LAMBDA NIL :IN SWANK::HANDLE-REQUESTS))
    20: (SWANK-BACKEND::CALL-WITH-BREAK-HOOK # #)
    21: ((FLET SWANK-BACKEND:CALL-WITH-DEBUGGER-HOOK :IN "/Users/jinwoo/quicklisp/dists/quicklisp/software/slime-20131211-cvs/swank-sbcl.lisp") # #) (*STANDARD-INPUT* . #2=#) (*TRACE-OUTPUT* . #1#)..
    23: (SWANK::HANDLE-REQUESTS # NIL)
    24: ((FLET #:WITHOUT-INTERRUPTS-BODY-1137 :IN SB-THREAD::INITIAL-THREAD-FUNCTION-TRAMPOLINE))
    25: ((FLET SB-THREAD::WITH-MUTEX-THUNK :IN SB-THREAD::INITIAL-THREAD-FUNCTION-TRAMPOLINE))
    26: ((FLET #:WITHOUT-INTERRUPTS-BODY-535 :IN SB-THREAD::CALL-WITH-MUTEX))
    27: (SB-THREAD::CALL-WITH-MUTEX # # #S(SB-THREAD:SEMAPHORE :NAME "Thread setup semaphore" :%COUNT 0 :WAITCOUNT 0 :MUTEX #<SB-THREAD:MU..
    29: ("foreign function: call_into_lisp")
    30: ("foreign function: new_thread_trampoline")
    31: ("foreign function: _pthread_body")
    32: ("foreign function: _pthread_struct_init")
    33: ("foreign function: thread_start")

    ReplyDelete
    Replies
    1. This is indeed a problem. I'm working on fixing it right now.

      Delete
    2. Your fix worked like a charm! Thanks.

      Delete