|
150 | 150 | (push source result)))) |
151 | 151 | (sort result 'string< :key 'name))) |
152 | 152 |
|
153 | | -(defun pmap-sources (fun &key (parallel-key #'source-host) |
| 153 | + |
| 154 | +(defun source-bucket (source) |
| 155 | + "Return a string suitable for binning a source for parallel work." |
| 156 | + (subseq (string-digest (first-line-of (source-file source))) |
| 157 | + 0 1)) |
| 158 | + |
| 159 | +(defun fasl-directory (source) |
| 160 | + (translate-logical-pathname |
| 161 | + (make-pathname :host "quicklisp-controller" |
| 162 | + :directory (list :absolute "dist" "fasls" |
| 163 | + (source-bucket source))))) |
| 164 | + |
| 165 | +(defun pmap-sources (fun &key (parallel-key 'source-bucket) |
154 | 166 | (test #'identity)) |
155 | 167 | (let ((dependency-tree (lparallel:make-ptree)) |
156 | 168 | (parallel-key-dependency (make-hash-table :test 'equal)) |
157 | | - (i 0)) |
| 169 | + (i 0) |
| 170 | + (result '())) |
158 | 171 | (map-sources (lambda (source) |
159 | 172 | (let ((testp (funcall test source)) |
160 | 173 | (pkey (funcall parallel-key source))) |
|
163 | 176 | parallel-key-dependency) |
164 | 177 | (lambda (&optional arg) |
165 | 178 | (declare (ignore arg)) |
166 | | - (map-source fun source)) |
| 179 | + (multiple-value-bind (result error) |
| 180 | + (ignore-errors |
| 181 | + (map-source fun source)) |
| 182 | + (when error |
| 183 | + (format *trace-output* "; ERROR: ~A -> ~%;; ~A~%" |
| 184 | + source error) |
| 185 | + (push (cons source error) |
| 186 | + result)))) |
167 | 187 | dependency-tree) |
168 | 188 | (setf (gethash pkey parallel-key-dependency) |
169 | 189 | (list i)) |
170 | 190 | (incf i))))) |
171 | 191 | (lparallel:ptree-fn 'everything (loop for j below i collect j) |
172 | 192 | (constantly nil) dependency-tree) |
173 | 193 | (lparallel:call-ptree 'everything dependency-tree) |
174 | | - nil)) |
| 194 | + (values nil result))) |
175 | 195 |
|
176 | 196 | (defun project-name-source-file (project-name) |
177 | 197 | (merge-pathnames |
|
0 commit comments