Commit 1aecacc1228d620b341c6dd51582aa3faf3603f0

Thomas de Grivel 2014-03-01T19:36:38

Fix ASSET-WRITE-DATE for LESS assets, root asset file was not taken in account.

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)