Since the Chromium web browser does still not feature a built-in build update mechanism, and since Mac OS X lacks a comprehensive, high-quality package management system, users need to download and install Chromium updates manually at regular intervals. Even though there are both stand-alone applications and browser add-ons that try to help, most of them have seemed to be broken since the last time Google changed their build archive location.

Therefore, I have written a small Common Lisp program that downloads and unpacks the latest Chromium build for me. It's very simple and could easily be replaced by a Perl script, but it works well enough for me.

Note that the program naively unpacks the ZIP file into the /Applications folder, which results in a separate chrome-mac folder being created.

Source code follows.

(eval-when (:compile-toplevel :load-toplevel :execute)
  (dolist (module (list "drakma" "alexandria"))
    (ql:quickload module)))

(defpackage #:mulk.update-chromium
  (:use #:common-lisp #:alexandria))
(in-package #:mulk.update-chromium)


(defparameter *base-uri*
  "https://commondatastorage.googleapis.com/chromium-browser-continuous")

(defparameter *os-subdir* "Mac")
(defparameter *filename* "chrome-mac.zip")
(defparameter *target-dir* #p"/Applications/")

(defun latest-version ()
  (parse-integer
   (drakma:http-request (format nil "~A/~A/LAST_CHANGE" *base-uri* *os-subdir*))))

(defun file-uri (revision)
  (format nil "~A/~A/~A/~A" *base-uri* *os-subdir* revision *filename*))

(defun main ()
  (let* ((revision (latest-version))
         (uri      (file-uri revision))
         (file     #p"/tmp/chrome-update.zip"))
    (format t "~&Latest revision: ~A" revision)
    (format t "~&Downloading.")
    (unwind-protect
         (progn
           (with-open-file (out file
                                :direction :output
                                :if-exists :supersede
                                :element-type '(unsigned-byte 8))
             (write-sequence (drakma:http-request uri) out))
           (format t "~&Extracting archive contents.")
           (sb-ext:run-program "/usr/bin/unzip"
                               (list "-o" (namestring file)
                                     "-d" (namestring *target-dir*))
                               :wait t))
      (delete-file file))))