Fix ASSET-WRITE-DATE for LESS assets, root asset file was not taken in account.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
diff --git a/less.lisp b/less.lisp
index 79cf8cd..828d822 100644
--- a/less.lisp
+++ b/less.lisp
@@ -73,30 +73,74 @@ try {
;; LESS
(defclass less-asset (css-asset)
- ((less-sources :type list)))
+ ((less-imports :type list)))
(defmethod asset-class-extensions ((class (eql 'less-asset)))
'(.less))
-(defun less-imports (asset)
- (let ((imports))
+(defun less-imports% (asset)
+ (let* ((head (cons nil nil))
+ (tail head))
(regex-lines "(?:^|\\b)@import\\s+\"([^\"]+)\"\\s*;"
(pathname (asset-source-path asset))
:match (lambda (whole i)
(declare (ignore whole))
- (pushnew i imports :test #'string=)))
- imports))
+ (when-let ((a (find-asset i 'less-asset)))
+ (unless (find (asset-path a) (cdr head)
+ :test #'string=
+ :key #'asset-path)
+ (setf tail (setf (cdr tail)
+ (cons a nil)))))))
+ (cdr head)))
+
+(defgeneric less-imports (asset))
+
+(defmethod less-imports ((asset less-asset))
+ (let* ((source-path (pathname (asset-source-path asset)))
+ (write-date (file-write-date source-path))
+ (imports (when (slot-boundp asset 'less-imports)
+ (slot-value asset 'less-imports))))
+ (if (and imports (= write-date (car imports)))
+ (cdr imports)
+ (cdr (setf (slot-value asset 'less-imports)
+ (cons write-date (less-imports% asset)))))))
(defgeneric less-sources (asset))
(defmethod less-sources ((asset less-asset))
+ (let* ((head (cons nil nil))
+ (tail head))
+ (labels ((iter (a)
+ (unless (find (asset-path a) (cdr head)
+ :test #'string= :key #'asset-path)
+ (setf tail (setf (cdr tail) (cons a nil)))
+ (mapc #'iter (less-imports a)))))
+ (iter asset))
+ (cdr head)))
+
+#+nil
+(defun less-sources (asset)
(if (slot-boundp asset 'less-sources)
- (slot-value asset 'less-sources)
- (setf (slot-value asset 'less-sources)
- (mapcan (lambda (import)
- (let ((asset (find-asset import 'less-asset)))
- (cons asset (less-sources asset))))
- (less-imports asset)))))
+ #1=(slot-value asset 'less-sources)
+ (setf #1#
+ (let* ((head (cons asset nil))
+ (tail head))
+ (labels ((collect (item)
+ (setf tail (setf (cdr tail) (cons item nil))))
+ (have (item)
+ (find item head :test #'string= :key #'asset-path))
+ (match (whole i)
+ (declare (ignore whole))
+ (unless (have i)
+ (when-let ((a (find-asset i 'less-asset)))
+ (collect a)
+ (parse a))))
+ (parse (a)
+ (regex-lines "(?:^|\\b)@import\\s+\"([^\"]+)\"\\s*;"
+ (pathname (asset-source-path a))
+ :match #'match)))
+ (parse asset)
+ head)))))
(defmethod asset-write-date ((asset less-asset))
(loop for a in (less-sources asset)