Newer
Older
Francois-Rene Rideau
committed
":" ; exec sbcl --script "$0" "$@" ; exit # -*- Lisp -*-
;;; Really runs on any decent Common Lisp implementation
(require :asdf)
(in-package :asdf)
(upgrade-asdf)
(load-systems :cl-ppcre :xcvb-utils)
(in-package :xcvb-utils)
(asdf-debug)
Francois-Rene Rideau
committed
(resume-image)
Francois-Rene Rideau
committed
(defun afile (x)
(asdf:system-relative-pathname :asdf x))
(defparameter *version-file*
(afile "version.lisp-expr"))
Francois-Rene Rideau
committed
(defparameter *old-version* nil)
(defparameter *new-version* nil)
Francois-Rene Rideau
committed
(defun next-version (v)
(let ((pv (parse-version v)))
(incf (third pv))
(unparse-version pv)))
Francois-Rene Rideau
committed
(defun version-from-file ()
(safe-read-first-file-form *version-file*))
(defun versions-from-argv (argv)
(ecase (length argv)
((2) (values (second argv) (first argv)))
((1) (values (version-from-file) (first argv)))
((0) (let ((old (version-from-file)))
(values old (next-version old))))))
(multiple-value-setq (*old-version* *new-version*)
(versions-from-argv *command-line-arguments*))
Francois-Rene Rideau
committed
(format t "Bumping ASDF version from ~A to ~A~%" *old-version* *new-version*)
(deftype byte-vector () '(array (unsigned-byte 8) (*)))
(defun maybe-replace-file (file transformer
&key (reader 'read-file-string)
Francois-Rene Rideau
committed
(writer nil) (comparator 'equalp)
Francois-Rene Rideau
committed
(external-format *utf-8-external-format*))
(let* ((old-contents (funcall reader file))
(new-contents (funcall transformer old-contents)))
Francois-Rene Rideau
committed
(if (funcall comparator old-contents new-contents)
(format t "No changes for file ~A~%" file)
(let ((written-contents
(if writer
(with-output (s ())
(funcall writer s new-contents))
new-contents)))
(check-type written-contents (or string (byte-vector)))
(clobber-file-with-vector file written-contents :external-format external-format)))))
Francois-Rene Rideau
committed
(defun version-transform (text)
(flet ((v1 (ver) (format nil "~S" ver))
(v2 (ver) (format nil "This is ASDF ~A:" ver))
(f (fun text)
(cl-ppcre:regex-replace-all
(funcall fun *old-version*) text (funcall fun *new-version*))))
Francois-Rene Rideau
committed
(f #'v2 (f #'v1 text))))
Francois-Rene Rideau
committed
(defparameter *versioned-files*
Francois-Rene Rideau
committed
'("version.lisp-expr" "asdf.asd" "header.lisp" "build/asdf.lisp" "upgrade.lisp"))
Francois-Rene Rideau
committed
(defun transform-file (x)
(format t "Transforming file ~A~%" x)
(maybe-replace-file (afile x) #'version-transform))
(map () 'transform-file *versioned-files*)