Comment: | wip |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | v1.65-try3 |
Files: | files | file ages | folders |
SHA1: |
6afd2e723ab6072f128b66ebdae01d4f |
User & Date: | matt on 2019-11-03 04:45:40 |
Other Links: | branch diff | manifest | tags |
2019-11-03
| ||
04:48 | wip check-in: 036b7a9d4e user: matt tags: v1.65-try3 | |
04:45 | wip check-in: 6afd2e723a user: matt tags: v1.65-try3 | |
04:00 | try3 check-in: fde3cd0ad1 user: matt tags: v1.65-try3 | |
Modified api-inc.scm from [e7f077996e] to [e36429c1c3].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== | < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== ;; allow these queries through without starting a server ;; (define api:read-only-queries '(get-key-val-pairs get-var get-keys |
︙ | ︙ |
Modified archive-inc.scm from [618f9a591e] to [cf335d492b].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') | < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') ;;====================================================================== ;; ;;====================================================================== ;; NOT CURRENTLY USED ;; (define (archive:main linktree target runname testname itempath options) |
︙ | ︙ |
Modified client-inc.scm from [e77217956b] to [56810346df].
︙ | ︙ | |||
16 17 18 19 20 21 22 | ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; C L I E N T S ;;====================================================================== | < < < < < < < < < < < < < | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; C L I E N T S ;;====================================================================== ;; client:get-signature (define (client:get-signature) (if *my-client-signature* *my-client-signature* (let ((sig (conc (get-host-name) " " (current-process-id)))) (set! *my-client-signature* sig) *my-client-signature*))) |
︙ | ︙ |
Modified common-inc.scm from [14cc138a44] to [5d1061a2f1].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== | < < < < < < < < < < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; (define old-exit exit) ;; ;; (define (exit . code) ;; (if (null? code) ;; (old-exit) ;; (old-exit code))) |
︙ | ︙ |
Modified commonmod.scm from [317520ed38] to [e7647bdfa6].
︙ | ︙ | |||
37 38 39 40 41 42 43 | (import processmod) (import stml2) (include "common_records.scm") (include "megatest-fossil-hash.scm") (include "megatest-version.scm") | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < | > > | 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | (import processmod) (import stml2) (include "common_records.scm") (include "megatest-fossil-hash.scm") (include "megatest-version.scm") ;; (define (common:low-noise-print alldat waitval . keys) ;; (let* ((key (string-intersperse (map conc keys) "-" )) ;; (lasttime (hash-table-ref/default (alldat-denoise alldat) key 0)) ;; (currtime (current-seconds))) ;; (if (> (- currtime lasttime) waitval) ;; (begin ;; (hash-table-set! (alldat-denoise alldat) key currtime) ;; #t) ;; #f))) ;; ;; (define (common:version-signature alldat) ;; (conc (alldat-megatest-version alldat) ;; "-" (substring (alldat-megatest-fossil-hash alldat) 0 4))) ;; ;; (define (common:get-fields cfgdat) ;; (let ((fields (hash-table-ref/default cfgdat "fields" '()))) ;; (map car fields))) ;; ;; ;;====================================================================== ;; ;; T I M E A N D D A T E ;; ;;====================================================================== ;; ;; ;; Convert strings like "5s 2h 3m" => 60x60x2 + 3x60 + 5 ;; (define (common:hms-string->seconds tstr) ;; (let ((parts (string-split-fields "\\w+" tstr)) ;; (time-secs 0) ;; ;; s=seconds, m=minutes, h=hours, d=days, M=months, y=years, w=weeks ;; (trx (regexp "(\\d+)([smhdMyw])"))) ;; (for-each (lambda (part) ;; (let ((match (string-match trx part))) ;; (if match ;; (let ((val (string->number (cadr match))) ;; (unt (caddr match))) ;; (if val ;; (set! time-secs (+ time-secs (* val ;; (case (string->symbol unt) ;; ((s) 1) ;; ((m) 60) ;; minutes ;; ((h) 3600) ;; ((d) 86400) ;; ((w) 604800) ;; ((M) 2628000) ;; aproximately one month ;; ((y) 31536000) ;; (else #f)))))))))) ;; parts) ;; time-secs)) ;; ;; (define (seconds->hr-min-sec secs) ;; (let* ((hrs (quotient secs 3600)) ;; (min (quotient (- secs (* hrs 3600)) 60)) ;; (sec (- secs (* hrs 3600)(* min 60)))) ;; (conc (if (> hrs 0)(conc hrs "hr ") "") ;; (if (> min 0)(conc min "m ") "") ;; sec "s"))) ;; ;; (define (seconds->time-string sec) ;; (time->string ;; (seconds->local-time sec) "%H:%M:%S")) ;; ;; (define (seconds->work-week/day-time sec) ;; (time->string ;; (seconds->local-time sec) "ww%V.%u %H:%M")) ;; ;; (define (seconds->work-week/day sec) ;; (time->string ;; (seconds->local-time sec) "ww%V.%u")) ;; ;; (define (seconds->year-work-week/day sec) ;; (time->string ;; (seconds->local-time sec) "%yww%V.%w")) ;; ;; (define (seconds->year-work-week/day-time sec) ;; (time->string ;; (seconds->local-time sec) "%Yww%V.%w %H:%M")) ;; ;; (define (seconds->year-week/day-time sec) ;; (time->string ;; (seconds->local-time sec) "%Yw%V.%w %H:%M")) ;; ;; (define (seconds->quarter sec) ;; (case (string->number ;; (time->string ;; (seconds->local-time sec) ;; "%m")) ;; ((1 2 3) 1) ;; ((4 5 6) 2) ;; ((7 8 9) 3) ;; ((10 11 12) 4) ;; (else #f))) ;; ;; ;; basic ISO8601 format (e.g. "2017-02-28 06:02:54") date time => Unix epoch ;; ;; ;; (define (common:date-time->seconds datetime) ;; (local-time->seconds (string->time datetime "%Y-%m-%d %H:%M:%S"))) ;; ;; ;; given span of seconds tstart to tend ;; ;; find start time to mark and mark delta ;; ;; ;; (define (common:find-start-mark-and-mark-delta tstart tend) ;; (let* ((deltat (- (max tend (+ tend 10)) tstart)) ;; can't handle runs of less than 4 seconds. Pad it to 10 seconds ... ;; (result #f) ;; (min 60) ;; (hr (* 60 60)) ;; (day (* 24 hr)) ;; (yr (* 365 day)) ;; year ;; (mo (/ yr 12)) ;; (wk (* day 7))) ;; (for-each ;; (lambda (max-blks) ;; (for-each ;; (lambda (span) ;; 5 2 1 ;; (if (not result) ;; (for-each ;; (lambda (timeunit timesym) ;; year month day hr min sec ;; (if (not result) ;; (let* ((time-blk (* span timeunit)) ;; (num-blks (quotient deltat time-blk))) ;; (if (and (> num-blks 4)(< num-blks max-blks)) ;; (let ((first (* (quotient tstart time-blk) time-blk))) ;; (set! result (list span timeunit time-blk first timesym)) ;; ))))) ;; (list yr mo wk day hr min 1) ;; '( y mo w d h m s)))) ;; (list 8 6 5 2 1))) ;; '(5 10 15 20 30 40 50 500)) ;; (if values ;; (apply values result) ;; (values 0 day 1 0 'd)))) ;; ;; ;; given x y lim return the cron expansion ;; ;; ;; (define (common:expand-cron-slash x y lim) ;; (let loop ((curr x) ;; (res `())) ;; (if (< curr lim) ;; (loop (+ curr y) (cons curr res)) ;; (reverse res)))) ;; ;; ;; expand a complex cron string to a list of cron strings ;; ;; ;; ;; x/y => x, x+y, x+2y, x+3y while x+Ny<max_for_field ;; ;; a,b,c => a, b ,c ;; ;; ;; ;; NOTE: with flatten a lot of the crud below can be factored down. ;; ;; ;; (define (common:cron-expand cron-str) ;; (if (list? cron-str) ;; (flatten ;; (fold (lambda (x res) ;; (if (list? x) ;; (let ((newres (map common:cron-expand x))) ;; (append x newres)) ;; (cons x res))) ;; '() ;; cron-str)) ;; (map common:cron-expand cron-str)) ;; (let ((cron-items (string-split cron-str)) ;; (slash-rx (regexp "(\\d+)/(\\d+)")) ;; (comma-rx (regexp ".*,.*")) ;; (max-vals '((min . 60) ;; (hour . 24) ;; (dayofmonth . 28) ;;; BUG!!!! This will be a bug for some combinations ;; (month . 12) ;; (dayofweek . 7)))) ;; (if (< (length cron-items) 5) ;; bad spec ;; cron-str ;; `(,cron-str) ;; just return the string, something downstream will fix it ;; (let loop ((hed (car cron-items)) ;; (tal (cdr cron-items)) ;; (type 'min) ;; (type-tal '(hour dayofmonth month dayofweek)) ;; (res '())) ;; (regex-case ;; hed ;; (slash-rx ( _ base incr ) (let* ((basen (string->number base)) ;; (incrn (string->number incr)) ;; (expanded-vals (common:expand-cron-slash basen incrn (alist-ref type max-vals))) ;; (new-list-crons (fold (lambda (x myres) ;; (cons (conc (if (null? res) ;; "" ;; (conc (string-intersperse res " ") " ")) ;; x " " (string-intersperse tal " ")) ;; myres)) ;; '() expanded-vals))) ;; ;; (print "new-list-crons: " new-list-crons) ;; ;; (fold (lambda (x res) ;; ;; (if (list? x) ;; ;; (let ((newres (map common:cron-expand x))) ;; ;; (append x newres)) ;; ;; (cons x res))) ;; ;; '() ;; (flatten (map common:cron-expand new-list-crons)))) ;; ;; (map common:cron-expand (map common:cron-expand new-list-crons)))) ;; (else (if (null? tal) ;; cron-str ;; (loop (car tal)(cdr tal)(car type-tal)(cdr type-tal)(append res (list hed))))))))))) ;; ;; ;; ;; given a cron string and the last time event was processed return #t to run or #f to not run ;; ;; ;; ;; min hour dayofmonth month dayofweek ;; ;; 0-59 0-23 1-31 1-12 0-6 ### NOTE: dayofweek does not include 7 ;; ;; ;; ;; #t => yes, run the job ;; ;; #f => no, do not run the job ;; ;; ;; (define (common:cron-event cron-str now-seconds-in last-done) ;; ref-seconds = #f is NOW. ;; (let* ((cron-items (map string->number (string-split cron-str))) ;; (now-seconds (or now-seconds-in (current-seconds))) ;; (now-time (seconds->local-time now-seconds)) ;; (last-done-time (seconds->local-time last-done)) ;; (all-times (make-hash-table))) ;; ;; (print "cron-items: " cron-items "(length cron-items): " (length cron-items)) ;; (if (not (eq? (length cron-items) 5)) ;; don't even try to figure out junk strings ;; #f ;; (match-let ((( cmin chour cdayofmonth cmonth cdayofweek) ;; cron-items) ;; ;; 0 1 2 3 4 5 6 ;; ((nsec nmin nhour ndayofmonth nmonth nyr ndayofweek n7 n8 n9) ;; (vector->list now-time)) ;; ((lsec lmin lhour ldayofmonth lmonth lyr ldayofweek l7 l8 l9) ;; (vector->list last-done-time))) ;; ;; create all possible time slots ;; ;; remove invalid slots due to (for example) day of week ;; ;; get the start and end entries for the ref-seconds (current) time ;; ;; if last-done > ref-seconds => this is an ERROR! ;; ;; does the last-done time fall in the legit region? ;; ;; yes => #f do not run again this command ;; ;; no => #t ok to run the command ;; (for-each ;; month ;; (lambda (month) ;; (for-each ;; dayofmonth ;; (lambda (dom) ;; (for-each ;; (lambda (hr) ;; hour ;; (for-each ;; (lambda (minute) ;; minute ;; (let ((copy-now (apply vector (vector->list now-time)))) ;; (vector-set! copy-now 0 0) ;; force seconds to zero ;; (vector-set! copy-now 1 minute) ;; (vector-set! copy-now 2 hr) ;; (vector-set! copy-now 3 dom) ;; dom is already corrected for zero referenced ;; (vector-set! copy-now 4 month) ;; (let* ((copy-now-secs (local-time->seconds copy-now)) ;; (new-copy (seconds->local-time copy-now-secs))) ;; remake the time vector ;; (if (or (not cdayofweek) ;; (equal? (vector-ref new-copy 6) ;; cdayofweek)) ;; if the day is specified and a match OR if the day is NOT specified ;; (if (or (not cdayofmonth) ;; (equal? (vector-ref new-copy 3) ;; (+ 1 cdayofmonth))) ;; if the month is specified and a match OR if the month is NOT specified ;; (hash-table-set! all-times copy-now-secs new-copy)))))) ;; (if cmin ;; `(,cmin) ;; if given cmin, have to use it ;; (list (- nmin 1) nmin (+ nmin 1))))) ;; minute ;; (if chour ;; `(,chour) ;; (list (- nhour 1) nhour (+ nhour 1))))) ;; hour ;; (if cdayofmonth ;; `(,cdayofmonth) ;; (list (- ndayofmonth 1) ndayofmonth (+ ndayofmonth 1))))) ;; (if cmonth ;; `(,cmonth) ;; (list (- nmonth 1) nmonth (+ nmonth 1)))) ;; (let ((before #f) ;; (is-in #f)) ;; (for-each ;; (lambda (moment) ;; (if (and before ;; (<= before now-seconds) ;; (>= moment now-seconds)) ;; (begin ;; ;; (print) ;; ;; (print "Before: " (time->string (seconds->local-time before))) ;; ;; (print "Now: " (time->string (seconds->local-time now-seconds))) ;; ;; (print "After: " (time->string (seconds->local-time moment))) ;; ;; (print "Last: " (time->string (seconds->local-time last-done))) ;; (if (< last-done before) ;; (set! is-in before)) ;; )) ;; (set! before moment)) ;; (sort (hash-table-keys all-times) <)) ;; is-in))))) ;; ;; (define (common:extended-cron cron-str now-seconds-in last-done) ;; (let ((expanded-cron (common:cron-expand cron-str))) ;; (if (string? expanded-cron) ;; (common:cron-event expanded-cron now-seconds-in last-done) ;; (let loop ((hed (car expanded-cron)) ;; (tal (cdr expanded-cron))) ;; (if (common:cron-event hed now-seconds-in last-done) ;; #t ;; (if (null? tal) ;; #f ;; (loop (car tal)(cdr tal)))))))) ;; ;; ;;====================================================================== ;; ;; C O L O R S ;; ;;====================================================================== ;; ;; (define (common:name->iup-color name) ;; (case (string->symbol (string-downcase name)) ;; ((red) "223 33 49") ;; ((grey) "192 192 192") ;; ((orange) "255 172 13") ;; ((purple) "This is unfinished ..."))) ;; ;; ;; (define (common:get-color-for-state-status state status) ;; ;; (case (string->symbol state) ;; ;; ((COMPLETED) ;; ;; (case (string->symbol status) ;; ;; ((PASS) "70 249 73") ;; ;; ((WARN WAIVED) "255 172 13") ;; ;; ((SKIP) "230 230 0") ;; ;; (else "223 33 49"))) ;; ;; ((LAUNCHED) "101 123 142") ;; ;; ((CHECK) "255 100 50") ;; ;; ((REMOTEHOSTSTART) "50 130 195") ;; ;; ((RUNNING) "9 131 232") ;; ;; ((KILLREQ) "39 82 206") ;; ;; ((KILLED) "234 101 17") ;; ;; ((NOT_STARTED) "240 240 240") ;; ;; (else "192 192 192"))) ;; ;; (define (common:iup-color->rgb-hex instr) ;; (string-intersperse ;; (map (lambda (x) ;; (number->string x 16)) ;; (map string->number ;; (string-split instr))) ;; "/")) ;; ;; ;; dot-locking egg seems not to work, using this for now ;; ;; if lock is older than expire-time then remove it and try again ;; ;; to get the lock ;; ;; ;; (define (common:simple-file-lock fname #!key (expire-time 300)) ;; (if (file-exists? fname) ;; (if (> (- (current-seconds)(file-modification-time fname)) expire-time) ;; (begin ;; (handle-exceptions exn #f (delete-file* fname)) ;; (common:simple-file-lock fname expire-time: expire-time)) ;; #f) ;; (let ((key-string (conc (get-host-name) "-" (current-process-id)))) ;; (with-output-to-file fname ;; (lambda () ;; (print key-string))) ;; (thread-sleep! 0.25) ;; (if (file-exists? fname) ;; (handle-exceptions exn ;; #f ;; (with-input-from-file fname ;; (lambda () ;; (equal? key-string (read-line))))) ;; #f)))) ;; ;; (define (common:simple-file-lock-and-wait fname #!key (expire-time 300)) ;; (let ((end-time (+ expire-time (current-seconds)))) ;; (let loop ((got-lock (common:simple-file-lock fname expire-time: expire-time))) ;; (if got-lock ;; #t ;; (if (> end-time (current-seconds)) ;; (begin ;; (thread-sleep! 3) ;; (loop (common:simple-file-lock fname expire-time: expire-time))) ;; #f))))) ;; ;; (define (common:simple-file-release-lock fname) ;; (handle-exceptions ;; exn ;; #f ;; I don't really care why this failed (at least for now) ;; (delete-file* fname))) ;; ;; ;; lazy-safe get file mod time. on any error (file not existing etc.) return 0 ;; ;; ;; (define (common:lazy-modification-time fpath) ;; (handle-exceptions ;; exn ;; 0 ;; (file-modification-time fpath))) ;; ;; ;; find timestamp of newest file associated with a sqlite db file ;; (define (common:lazy-sqlite-db-modification-time fpath) ;; (let* ((glob-list (handle-exceptions ;; exn ;; `(,(conc "/no/such/file, message: " ((condition-property-accessor 'exn 'message) exn))) ;; (glob (conc fpath "*")))) ;; (file-list (if (eq? 0 (length glob-list)) ;; '("/no/such/file") ;; glob-list))) ;; (apply max ;; (map ;; common:lazy-modification-time ;; file-list)))) ;; ;; ;; ;; execute thunk, return value. If exception thrown, trap exception, return #f, and emit nonfatal condition note to *default-log-port* . ;; ;; arguments - thunk, message ;; (define (common:fail-safe thunk warning-message-on-exception) ;; (handle-exceptions ;; exn ;; (begin ;; (debug:print-info 0 *default-log-port* "notable but nonfatal condition - "warning-message-on-exception) ;; (debug:print-info 0 *default-log-port* ;; (string-substitute "\n?Error:" "nonfatal condition:" ;; (with-output-to-string ;; (lambda () ;; (print-error-message exn) )))) ;; (debug:print-info 0 *default-log-port* " -- continuing after nonfatal condition...") ;; #f) ;; (thunk))) ;; ;; (define getenv get-environment-variable) ;; (define (safe-setenv key val) ;; (if (or (substring-index "!" key) (substring-index ":" key)) ;; variables containing : are for internal use and cannot be environment variables. ;; (debug:print-error 4 *default-log-port* "skip setting internal use only variables containing \":\" or starting with \"!\"") ;; (if (and (string? val) ;; (string? key)) ;; (handle-exceptions ;; exn ;; (debug:print-error 0 *default-log-port* "bad value for setenv, key=" key ", value=" val) ;; (setenv key val)) ;; (debug:print-error 0 *default-log-port* "bad value for setenv, key=" key ", value=" val)))) ;; ;; (define home (getenv "HOME")) ;; (define user (getenv "USER")) ;; ;; ;; ;; returns list of fd count, socket count ;; (define (get-file-descriptor-count #!key (pid (current-process-id ))) ;; (list ;; (length (glob (conc "/proc/" pid "/fd/*"))) ;; (length (filter identity (map socket? (glob (conc "/proc/" pid "/fd/*"))))) ;; ) ;; ) ;; ) |
Modified configf-inc.scm from [c596e07f23] to [503249419d].
︙ | ︙ | |||
18 19 20 21 22 23 24 | ;;====================================================================== ;;====================================================================== ;; Config file handling ;;====================================================================== | < < < < < < < < | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ;;====================================================================== ;;====================================================================== ;; Config file handling ;;====================================================================== ;; return list (path fullpath configname) (define (find-config configname #!key (toppath #f)) (if toppath (let ((cfname (conc toppath "/" configname))) (if (common:file-exists? cfname) (list toppath cfname configname) (list #f #f #f))) |
︙ | ︙ |
Modified configfmod.scm from [c17041e6db] to [44e63049df].
︙ | ︙ | |||
28 29 30 31 32 33 34 | (import (prefix sqlite3 sqlite3:) posix typed-records srfi-18 srfi-69 format ports srfi-1 matchable regex) ;; (import commonmod) ;; (use (prefix ulex ulex:)) (include "common_records.scm") | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 | (import (prefix sqlite3 sqlite3:) posix typed-records srfi-18 srfi-69 format ports srfi-1 matchable regex) ;; (import commonmod) ;; (use (prefix ulex ulex:)) (include "common_records.scm") ;; (define (configf:lookup cfgdat section var) ;; (if (hash-table? cfgdat) ;; (let ((sectdat (hash-table-ref/default cfgdat section '()))) ;; (if (null? sectdat) ;; #f ;; (let ((match (assoc var sectdat))) ;; (if match ;; (and match (list? match)(> (length match) 1)) ;; (cadr match) ;; #f)) ;; )) ;; #f)) ;; ;; (define (configf:get-section cfgdat section) ;; (hash-table-ref/default cfgdat section '())) ;; ;; ;; safely look up a value that is expected to be a number, return ;; ;; a default (#f unless provided) ;; ;; ;; (define (configf:lookup-number cfgdat section varname #!key (default #f)) ;; (let* ((val (configf:lookup cfgdat section varname)) ;; (res (if val ;; (string->number (string-substitute "\\s+" "" val #t)) ;; #f))) ;; (cond ;; (res res) ;; (val (debug:print 0 *default-log-port* "ERROR: no number found for [" section "], " varname ", got: " val)) ;; (else default)))) ;; ;; ) |
Modified db-inc.scm from [560d632862] to [f8932f0678].
︙ | ︙ | |||
20 21 22 23 24 25 26 | ;;====================================================================== ;; Database access ;;====================================================================== ;; dbstruct vector containing all the relevant dbs like main.db, megatest.db, run.db etc | < < < < < < < < < < < < < < < < < | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ;;====================================================================== ;; Database access ;;====================================================================== ;; dbstruct vector containing all the relevant dbs like main.db, megatest.db, run.db etc (define *rundb-mutex* (make-mutex)) ;; prevent problems opening/closing rundb's (define *number-of-writes* 0) (define *number-non-write-queries* 0) ;;====================================================================== ;; R E C O R D S ;;====================================================================== |
︙ | ︙ |
Modified dcommon-inc.scm from [83db082a27] to [79a39b86c7].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== | < < < < < < < < < < < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== ;; yes, this is non-ideal (define dashboard:update-summary-tab #f) (define dashboard:update-servers-table #f) ;;====================================================================== ;; C O M M O N D A T A S T R U C T U R E ;;====================================================================== |
︙ | ︙ |
Modified env-inc.scm from [058c0a7117] to [8d8fa780e9].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== | < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== (define (env:open-db fname) (let* ((db-exists (common:file-exists? fname)) (db (open-database fname))) (if (not db-exists) (begin (exec (sql db "CREATE TABLE envvars ( id INTEGER PRIMARY KEY, |
︙ | ︙ |
Modified ezsteps-inc.scm from [b166d59095] to [6a7b6e8d3a].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') | < < < < < < < < < < < < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') (define (ezsteps:run-from testdat start-step-name run-one) ;;# TODO - recapture item variables, debug repeated step eval; regen logpro from test (let* ((do-update-test-state-status #f) (test-run-dir ;; (filedb:get-path *fdb* (db:test-get-rundir testdat)) ;; ) (testconfig (read-config (conc test-run-dir "/testconfig") #f #t environ-patt: "pre-launch-env-vars")) |
︙ | ︙ |
Modified items-inc.scm from [2265706948] to [53e58f7020].
︙ | ︙ | |||
17 18 19 20 21 22 23 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; (define itemdat '((ripeness "green ripe overripe") ;; (temperature "cool medium hot") ;; (season "summer winter fall spring"))) | < < < < | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; (define itemdat '((ripeness "green ripe overripe") ;; (temperature "cool medium hot") ;; (season "summer winter fall spring"))) ;; Puts out all combinations (define (process-itemlist hierdepth curritemkey itemlist) (let ((res '())) (if (not hierdepth) (set! hierdepth (length itemlist))) (let loop ((hed (car itemlist)) |
︙ | ︙ |
Modified keys-inc.scm from [9fa2c0cfa5] to [b354a0320e].
︙ | ︙ | |||
17 18 19 20 21 22 23 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== ;; Run keys, these are used to hierarchially organise tests and run areas ;;====================================================================== | < < < < < < < < < | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== ;; Run keys, these are used to hierarchially organise tests and run areas ;;====================================================================== (define (keys->keystr keys) ;; => key1,key2,key3,additiona1, ... (string-intersperse keys ",")) (define (args:usage . a) #f) ;;====================================================================== ;; key <=> target routines |
︙ | ︙ |
Modified launch-inc.scm from [ddbd5933a3] to [0b3c5dc7f0].
︙ | ︙ | |||
17 18 19 20 21 22 23 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; launch a task - this runs on the originating host, tests themselves ;; ;;====================================================================== | < < < < < < < < < < < < < < < | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; launch a task - this runs on the originating host, tests themselves ;; ;;====================================================================== ;;====================================================================== ;; ezsteps ;;====================================================================== ;; ezsteps were going to be coded as ;; stepname[,predstep1,predstep2 ...] [{VAR1=first,second,third}] command to execute |
︙ | ︙ |
Modified megamod.scm from [f0edd2b867] to [a660061afb].
︙ | ︙ | |||
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 | (declare (uses vgmod)) (module rmtmod * (import scheme chicken data-structures extras) (import (prefix sqlite3 sqlite3:) call-with-environment-variables csv format http-client intarweb irregex matchable ports posix regex s11n spiffy spiffy-directory-listing spiffy-request-vars srfi-1 srfi-13 srfi-18 srfi-69 stack stml2 typed-records uri-common z3 ) ;; (import apimod) (import archivemod) (import clientmod) | > > > > > > > > > > > > > > > > > > | 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 91 92 93 94 95 96 97 98 99 100 | (declare (uses vgmod)) (module rmtmod * (import scheme chicken data-structures extras) (import (prefix base64 base64:) (prefix dbi dbi:) (prefix nanomsg nmsg:) (prefix sqlite3 sqlite3:) call-with-environment-variables canvas-draw csv csv-xml data-structures directory-utils dot-locking extras format hostinfo http-client intarweb irregex (prefix iup iup:) matchable md5 message-digest pathname-expand ports posix regex regex-case s11n spiffy spiffy-directory-listing spiffy-request-vars sql-de-lite srfi-1 srfi-13 srfi-18 srfi-69 stack stml2 tcp typed-records udp uri-common z3 ) ;; (import apimod) (import archivemod) (import clientmod) |
︙ | ︙ | |||
101 102 103 104 105 106 107 108 109 | (import testsmod) (import vgmod) (use (prefix ulex ulex:)) (include "common_records.scm") (include "db_records.scm") (include "task_records.scm") (include "test_records.scm") | > > | > > | > > > > | > | > > > > > > > > > > > > > > | > | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | (import testsmod) (import vgmod) (use (prefix ulex ulex:)) (include "common_records.scm") (include "db_records.scm") (include "key_records.scm") (include "run_records.scm") (include "task_records.scm") (include "test_records.scm") (include "vg_records.scm") (include "js-path.scm") ;;====================================================================== ;; L O C K I N G M E C H A N I S M S ;;====================================================================== (include "api-inc.scm") (include "archive-inc.scm") (include "client-inc.scm") (include "common-inc.scm") (include "configf-inc.scm") (include "db-inc.scm") (include "dcommon-inc.scm") (include "env-inc.scm") (include "ezsteps-inc.scm") (include "items-inc.scm") (include "keys-inc.scm") (include "launch-inc.scm") (include "ods-inc.scm") (include "process-inc.scm") (include "rmt-inc.scm") (include "runconfig-inc.scm") (include "runs-inc.scm") (include "server-inc.scm") (include "subrun-inc.scm") (include "tasks-inc.scm") (include "tests-inc.scm") (include "vg-inc.scm") ) ;; http-transport:server-dat definition moved to common_records.scm ;; bunch of small functions factored out of send-receive to make debug easier |
Modified ods-inc.scm from [42e94b826f] to [e824ef9a37].
︙ | ︙ | |||
12 13 14 15 16 17 18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; | < < < < | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; (define ods:dirs '("Configurations2" "Configurations2/toolpanel" "Configurations2/menubar" "Configurations2/toolbar" "Configurations2/progressbar" "Configurations2/floater" |
︙ | ︙ |
Modified odsmod.scm from [325f3ce5a1] to [c7aa05c87d].
︙ | ︙ | |||
28 29 30 31 32 33 34 | (import (prefix sqlite3 sqlite3:) posix typed-records srfi-18 srfi-69 format ports srfi-1 matchable srfi-13) (import commonmod) ;; (use (prefix ulex ulex:)) (include "common_records.scm") | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | (import (prefix sqlite3 sqlite3:) posix typed-records srfi-18 srfi-69 format ports srfi-1 matchable srfi-13) (import commonmod) ;; (use (prefix ulex ulex:)) (include "common_records.scm") ;; (define ods:dirs ;; '("Configurations2" ;; "Configurations2/toolpanel" ;; "Configurations2/menubar" ;; "Configurations2/toolbar" ;; "Configurations2/progressbar" ;; "Configurations2/floater" ;; "Configurations2/images" ;; "Configurations2/images/Bitmaps" ;; "Configurations2/statusbar" ;; "Configurations2/popupmenu" ;; "Configurations2/accelerator" ;; "META-INF" ;; "Thumbnails")) ;; ;; (define ods:0-len-files ;; '("Configurations2/accelerator/current.xml" ;; ;; "Thumbnails/thumbnail.png" ;; "content.xml" ;; )) ;; ;; (define ods:files ;; '(("META-INF/manifest.xml" ;; ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ;; "<manifest:manifest xmlns:manifest=\"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0\">\n" ;; "<manifest:file-entry manifest:media-type=\"application/vnd.oasis.opendocument.spreadsheet\" manifest:version=\"1.2\" manifest:full-path=\"/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/statusbar/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/accelerator/current.xml\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/accelerator/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/floater/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/popupmenu/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/progressbar/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/toolpanel/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/menubar/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/toolbar/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/images/Bitmaps/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Configurations2/images/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"application/vnd.sun.xml.ui.configuration\" manifest:full-path=\"Configurations2/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"content.xml\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"styles.xml\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"meta.xml\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"image/png\" manifest:full-path=\"Thumbnails/thumbnail.png\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"\" manifest:full-path=\"Thumbnails/\"/>\n" ;; "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"settings.xml\"/>\n" ;; "</manifest:manifest>\n")) ;; ("styles.xml" ;; ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ;; "<office:document-styles xmlns:office=\"urn:oasis:names:tc:opendocument:xmlns:office:1.0\" xmlns:style=\"urn:oasis:names:tc:opendocument:xmlns:style:1.0\" xmlns:text=\"urn:oasis:names:tc:opendocument:xmlns:text:1.0\" xmlns:table=\"urn:oasis:names:tc:opendocument:xmlns:table:1.0\" xmlns:draw=\"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\" xmlns:fo=\"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:meta=\"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\" xmlns:number=\"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\" xmlns:presentation=\"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0\" xmlns:svg=\"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\" xmlns:chart=\"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\" xmlns:dr3d=\"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\" xmlns:math=\"http://www.w3.org/1998/Math/MathML\" xmlns:form=\"urn:oasis:names:tc:opendocument:xmlns:form:1.0\" xmlns:script=\"urn:oasis:names:tc:opendocument:xmlns:script:1.0\" xmlns:ooo=\"http://openoffice.org/2004/office\" xmlns:ooow=\"http://openoffice.org/2004/writer\" xmlns:oooc=\"http://openoffice.org/2004/calc\" xmlns:dom=\"http://www.w3.org/2001/xml-events\" xmlns:rpt=\"http://openoffice.org/2005/report\" xmlns:of=\"urn:oasis:names:tc:opendocument:xmlns:of:1.2\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:grddl=\"http://www.w3.org/2003/g/data-view#\" xmlns:tableooo=\"http://openoffice.org/2009/table\" xmlns:css3t=\"http://www.w3.org/TR/css3-text/\" office:version=\"1.2\" grddl:transformation=\"http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl\"><office:font-face-decls><style:font-face style:name=\"Arial\" svg:font-family=\"Arial\" style:font-family-generic=\"swiss\" style:font-pitch=\"variable\"/><style:font-face style:name=\"DejaVu Sans\" svg:font-family=\"'DejaVu Sans'\" style:font-family-generic=\"system\" style:font-pitch=\"variable\"/><style:font-face style:name=\"Droid Sans Fallback\" svg:font-family=\"'Droid Sans Fallback'\" style:font-family-generic=\"system\" style:font-pitch=\"variable\"/><style:font-face style:name=\"Lohit Hindi\" svg:font-family=\"'Lohit Hindi'\" style:font-family-generic=\"system\" style:font-pitch=\"variable\"/></office:font-face-decls><office:styles><style:default-style style:family=\"table-cell\"><style:paragraph-properties style:tab-stop-distance=\"0.5in\"/><style:text-properties style:font-name=\"Arial\" fo:language=\"en\" fo:country=\"US\" style:font-name-asian=\"DejaVu Sans\" style:language-asian=\"zh\" style:country-asian=\"CN\" style:font-name-complex=\"DejaVu Sans\" style:language-complex=\"hi\" style:country-complex=\"IN\"/></style:default-style><number:number-style style:name=\"N0\"><number:number number:min-integer-digits=\"1\"/></number:number-style><number:currency-style style:name=\"N104P0\" style:volatile=\"true\"><number:currency-symbol number:language=\"en\" number:country=\"US\">$</number:currency-symbol><number:number number:decimal-places=\"2\" number:min-integer-digits=\"1\" number:grouping=\"true\"/></number:currency-style><number:currency-style style:name=\"N104\"><style:text-properties fo:color=\"#ff0000\"/><number:text>-</number:text><number:currency-symbol number:language=\"en\" number:country=\"US\">$</number:currency-symbol><number:number number:decimal-places=\"2\" number:min-integer-digits=\"1\" number:grouping=\"true\"/><style:map style:condition=\"value()>=0\" style:apply-style-name=\"N104P0\"/></number:currency-style><style:style style:name=\"Default\" style:family=\"table-cell\"><style:text-properties style:font-name-asian=\"Droid Sans Fallback\" style:font-name-complex=\"Lohit Hindi\"/></style:style><style:style style:name=\"Result\" style:family=\"table-cell\" style:parent-style-name=\"Default\"><style:text-properties fo:font-style=\"italic\" style:text-underline-style=\"solid\" style:text-underline-width=\"auto\" style:text-underline-color=\"font-color\" fo:font-weight=\"bold\"/></style:style><style:style style:name=\"Result2\" style:family=\"table-cell\" style:parent-style-name=\"Result\" style:data-style-name=\"N104\"/><style:style style:name=\"Heading\" style:family=\"table-cell\" style:parent-style-name=\"Default\"><style:table-cell-properties style:text-align-source=\"fix\" style:repeat-content=\"false\"/><style:paragraph-properties fo:text-align=\"center\"/><style:text-properties fo:font-size=\"16pt\" fo:font-style=\"italic\" fo:font-weight=\"bold\"/></style:style><style:style style:name=\"Heading1\" style:family=\"table-cell\" style:parent-style-name=\"Heading\"><style:table-cell-properties style:rotation-angle=\"90\"/></style:style></office:styles><office:automatic-styles><style:page-layout style:name=\"Mpm1\"><style:page-layout-properties style:writing-mode=\"lr-tb\"/><style:header-style><style:header-footer-properties fo:min-height=\"0.2957in\" fo:margin-left=\"0in\" fo:margin-right=\"0in\" fo:margin-bottom=\"0.0984in\"/></style:header-style><style:footer-style><style:header-footer-properties fo:min-height=\"0.2957in\" fo:margin-left=\"0in\" fo:margin-right=\"0in\" fo:margin-top=\"0.0984in\"/></style:footer-style></style:page-layout><style:page-layout style:name=\"Mpm2\"><style:page-layout-properties style:writing-mode=\"lr-tb\"/><style:header-style><style:header-footer-properties fo:min-height=\"0.2957in\" fo:margin-left=\"0in\" fo:margin-right=\"0in\" fo:margin-bottom=\"0.0984in\" fo:border=\"0.0346in solid #000000\" fo:padding=\"0.0071in\" fo:background-color=\"#c0c0c0\"><style:background-image/></style:header-footer-properties></style:header-style><style:footer-style><style:header-footer-properties fo:min-height=\"0.2957in\" fo:margin-left=\"0in\" fo:margin-right=\"0in\" fo:margin-top=\"0.0984in\" fo:border=\"0.0346in solid #000000\" fo:padding=\"0.0071in\" fo:background-color=\"#c0c0c0\"><style:background-image/></style:header-footer-properties></style:footer-style></style:page-layout></office:automatic-styles><office:master-styles><style:master-page style:name=\"Default\" style:page-layout-name=\"Mpm1\"><style:header><text:p><text:sheet-name>???</text:sheet-name></text:p></style:header><style:header-left style:display=\"false\"/><style:footer><text:p>Page <text:page-number>1</text:page-number></text:p></style:footer><style:footer-left style:display=\"false\"/></style:master-page><style:master-page style:name=\"Report\" style:page-layout-name=\"Mpm2\"><style:header><style:region-left><text:p><text:sheet-name>???</text:sheet-name> (<text:title>???</text:title>)</text:p></style:region-left><style:region-right><text:p><text:date style:data-style-name=\"N2\" text:date-value=\"2011-09-06\">09/06/2011</text:date>, <text:time>20:48:51</text:time></text:p></style:region-right></style:header><style:header-left style:display=\"false\"/><style:footer><text:p>Page <text:page-number>1</text:page-number> / <text:page-count>99</text:page-count></text:p></style:footer><style:footer-left style:display=\"false\"/></style:master-page></office:master-styles></office:document-styles>\n")) ;; ("settings.xml" ;; ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ;; "<office:document-settings xmlns:office=\"urn:oasis:names:tc:opendocument:xmlns:office:1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:config=\"urn:oasis:names:tc:opendocument:xmlns:config:1.0\" xmlns:ooo=\"http://openoffice.org/2004/office\" office:version=\"1.2\"><office:settings><config:config-item-set config:name=\"ooo:view-settings\"><config:config-item config:name=\"VisibleAreaTop\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"VisibleAreaLeft\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"VisibleAreaWidth\" config:type=\"int\">4516</config:config-item><config:config-item config:name=\"VisibleAreaHeight\" config:type=\"int\">1799</config:config-item><config:config-item-map-indexed config:name=\"Views\"><config:config-item-map-entry><config:config-item config:name=\"ViewId\" config:type=\"string\">view1</config:config-item><config:config-item-map-named config:name=\"Tables\"><config:config-item-map-entry config:name=\"Sheet1\"><config:config-item config:name=\"CursorPositionX\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"CursorPositionY\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"HorizontalSplitMode\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"VerticalSplitMode\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"HorizontalSplitPosition\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"VerticalSplitPosition\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"ActiveSplitRange\" config:type=\"short\">2</config:config-item><config:config-item config:name=\"PositionLeft\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"PositionRight\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"PositionTop\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"PositionBottom\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"ZoomType\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"ZoomValue\" config:type=\"int\">100</config:config-item><config:config-item config:name=\"PageViewZoomValue\" config:type=\"int\">60</config:config-item><config:config-item config:name=\"ShowGrid\" config:type=\"boolean\">true</config:config-item></config:config-item-map-entry><config:config-item-map-entry config:name=\"Sheet2\"><config:config-item config:name=\"CursorPositionX\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"CursorPositionY\" config:type=\"int\">4</config:config-item><config:config-item config:name=\"HorizontalSplitMode\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"VerticalSplitMode\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"HorizontalSplitPosition\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"VerticalSplitPosition\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"ActiveSplitRange\" config:type=\"short\">2</config:config-item><config:config-item config:name=\"PositionLeft\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"PositionRight\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"PositionTop\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"PositionBottom\" config:type=\"int\">0</config:config-item><config:config-item config:name=\"ZoomType\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"ZoomValue\" config:type=\"int\">100</config:config-item><config:config-item config:name=\"PageViewZoomValue\" config:type=\"int\">60</config:config-item><config:config-item config:name=\"ShowGrid\" config:type=\"boolean\">true</config:config-item></config:config-item-map-entry></config:config-item-map-named><config:config-item config:name=\"ActiveTable\" config:type=\"string\">Sheet2</config:config-item><config:config-item config:name=\"HorizontalScrollbarWidth\" config:type=\"int\">270</config:config-item><config:config-item config:name=\"ZoomType\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"ZoomValue\" config:type=\"int\">100</config:config-item><config:config-item config:name=\"PageViewZoomValue\" config:type=\"int\">60</config:config-item><config:config-item config:name=\"ShowPageBreakPreview\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"ShowZeroValues\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"ShowNotes\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"ShowGrid\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"GridColor\" config:type=\"long\">12632256</config:config-item><config:config-item config:name=\"ShowPageBreaks\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"HasColumnRowHeaders\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"HasSheetTabs\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"IsOutlineSymbolsSet\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"IsSnapToRaster\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"RasterIsVisible\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"RasterResolutionX\" config:type=\"int\">1270</config:config-item><config:config-item config:name=\"RasterResolutionY\" config:type=\"int\">1270</config:config-item><config:config-item config:name=\"RasterSubdivisionX\" config:type=\"int\">1</config:config-item><config:config-item config:name=\"RasterSubdivisionY\" config:type=\"int\">1</config:config-item><config:config-item config:name=\"IsRasterAxisSynchronized\" config:type=\"boolean\">true</config:config-item></config:config-item-map-entry></config:config-item-map-indexed></config:config-item-set><config:config-item-set config:name=\"ooo:configuration-settings\"><config:config-item config:name=\"IsKernAsianPunctuation\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"IsRasterAxisSynchronized\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"LinkUpdateMode\" config:type=\"short\">3</config:config-item><config:config-item config:name=\"SaveVersionOnClose\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"AllowPrintJobCancel\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"HasSheetTabs\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"ShowPageBreaks\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"RasterResolutionX\" config:type=\"int\">1270</config:config-item><config:config-item config:name=\"PrinterSetup\" config:type=\"base64Binary\"/><config:config-item config:name=\"RasterResolutionY\" config:type=\"int\">1270</config:config-item><config:config-item config:name=\"LoadReadonly\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"RasterSubdivisionX\" config:type=\"int\">1</config:config-item><config:config-item config:name=\"ShowNotes\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"ShowZeroValues\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"RasterSubdivisionY\" config:type=\"int\">1</config:config-item><config:config-item config:name=\"ApplyUserData\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"GridColor\" config:type=\"long\">12632256</config:config-item><config:config-item config:name=\"RasterIsVisible\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"IsSnapToRaster\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"PrinterName\" config:type=\"string\"/><config:config-item config:name=\"ShowGrid\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"CharacterCompressionType\" config:type=\"short\">0</config:config-item><config:config-item config:name=\"HasColumnRowHeaders\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"IsOutlineSymbolsSet\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"AutoCalculate\" config:type=\"boolean\">true</config:config-item><config:config-item config:name=\"IsDocumentShared\" config:type=\"boolean\">false</config:config-item><config:config-item config:name=\"UpdateFromTemplate\" config:type=\"boolean\">true</config:config-item></config:config-item-set></office:settings></office:document-settings>\n")) ;; ("mimetype" ;; ("application/vnd.oasis.opendocument.spreadsheet")) ;; ("meta.xml" ;; ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ;; "<office:document-meta xmlns:office=\"urn:oasis:names:tc:opendocument:xmlns:office:1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:meta=\"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\" xmlns:ooo=\"http://openoffice.org/2004/office\" xmlns:grddl=\"http://www.w3.org/2003/g/data-view#\" office:version=\"1.2\" grddl:transformation=\"http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl\"><office:meta><meta:initial-creator>Matt Welland</meta:initial-creator><meta:creation-date>2011-09-06T20:46:23</meta:creation-date><dc:date>2011-09-06T20:48:51</dc:date><dc:creator>Matt Welland</dc:creator><meta:editing-duration>PT2M29S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:table-count=\"3\" meta:cell-count=\"10\" meta:object-count=\"0\"/><meta:generator>LibreOffice/3.3$Linux LibreOffice_project/330m19$Build-301</meta:generator></office:meta></office:document-meta>\n")))) ;; ;; (define ods:content-header ;; '("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ;; "<office:document-content xmlns:office=\"urn:oasis:names:tc:opendocument:xmlns:office:1.0\" xmlns:style=\"urn:oasis:names:tc:opendocument:xmlns:style:1.0\" xmlns:text=\"urn:oasis:names:tc:opendocument:xmlns:text:1.0\" xmlns:table=\"urn:oasis:names:tc:opendocument:xmlns:table:1.0\" xmlns:draw=\"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\" xmlns:fo=\"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:meta=\"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\" xmlns:number=\"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\" xmlns:presentation=\"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0\" xmlns:svg=\"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\" xmlns:chart=\"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\" xmlns:dr3d=\"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\" xmlns:math=\"http://www.w3.org/1998/Math/MathML\" xmlns:form=\"urn:oasis:names:tc:opendocument:xmlns:form:1.0\" xmlns:script=\"urn:oasis:names:tc:opendocument:xmlns:script:1.0\" xmlns:ooo=\"http://openoffice.org/2004/office\" xmlns:ooow=\"http://openoffice.org/2004/writer\" xmlns:oooc=\"http://openoffice.org/2004/calc\" xmlns:dom=\"http://www.w3.org/2001/xml-events\" xmlns:xforms=\"http://www.w3.org/2002/xforms\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:rpt=\"http://openoffice.org/2005/report\" xmlns:of=\"urn:oasis:names:tc:opendocument:xmlns:of:1.2\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:grddl=\"http://www.w3.org/2003/g/data-view#\" xmlns:tableooo=\"http://openoffice.org/2009/table\" xmlns:field=\"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0\" xmlns:formx=\"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0\" xmlns:css3t=\"http://www.w3.org/TR/css3-text/\" office:version=\"1.2\" grddl:transformation=\"http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl\">\n" ;; "<office:scripts/>\n" ;; "<office:font-face-decls>\n" ;; "<style:font-face style:name=\"Arial\" svg:font-family=\"Arial\" style:font-family-generic=\"swiss\" style:font-pitch=\"variable\"/>\n" ;; "<style:font-face style:name=\"DejaVu Sans\" svg:font-family=\"'DejaVu Sans'\" style:font-family-generic=\"system\" style:font-pitch=\"variable\"/>\n" ;; "<style:font-face style:name=\"Droid Sans Fallback\" svg:font-family=\"'Droid Sans Fallback'\" style:font-family-generic=\"system\" style:font-pitch=\"variable\"/>\n" ;; "<style:font-face style:name=\"Lohit Hindi\" svg:font-family=\"'Lohit Hindi'\" style:font-family-generic=\"system\" style:font-pitch=\"variable\"/>\n" ;; "</office:font-face-decls>\n" ;; "<office:automatic-styles>\n" ;; "<style:style style:name=\"co1\" style:family=\"table-column\">\n" ;; "<style:table-column-properties fo:break-before=\"auto\" style:column-width=\"0.8925in\"/>\n" ;; "</style:style>\n" ;; "<style:style style:name=\"ro1\" style:family=\"table-row\">\n" ;; "<style:table-row-properties style:row-height=\"0.178in\" fo:break-before=\"auto\" style:use-optimal-row-height=\"true\"/>\n" ;; "</style:style>\n" ;; "<style:style style:name=\"ta1\" style:family=\"table\" style:master-page-name=\"Default\">\n" ;; "<style:table-properties table:display=\"true\" style:writing-mode=\"lr-tb\"/>\n" ;; "</style:style>\n" ;; "</office:automatic-styles>\n" ;; "<office:body>\n" ;; "<office:spreadsheet>\n")) ;; ;; (define ods:content-footer ;; '("</office:spreadsheet>\n" ;; "</office:body>\n" ;; "</office:document-content>\n")) ;; ;; (define (ods:make-thumbnail path) ;; (let ((oup (open-output-pipe (conc "uudecode -o " path "/Thumbnails/thumbnail.png")))) ;; (with-output-to-port oup ;; (lambda () ;; (print "begin-base64 640 Thumbnail.png ;; iVBORw0KGgoAAAANSUhEUgAAAL4AAAEACAIAAACCoVt7AAAEWElEQVR4nO3X ;; MU4bWQCA4bGUo5gUKCcgJwCaVNvShdI06VKmSxNKp6PdKg3xCcgJIhr7Ll6P ;; DTgBRbv5i11W+r7Gw7yZx0jv5415sV6vB/h9L/7rB+D/apfO4nxy8nk8OPq0 ;; vDm9Pr8+nc+mv75pcXl5MNtfsLp8fXDxbRjefl3Pj//xb340yW+N8gyM6awu ;; vxwu1+txnVar1Xj2z7PJpoUxhYNdFmNSs+EukdHRcHpzt7Kr69s/luub6Wa1 ;; V8Px9tx9TLsSH2a4OxwjWx5+uLgYhtOr4ezXo8Ori4tt0b8XJf+KMZ3p7N3w ;; ejIZV227hMP3V+/XNweX59erxZddK98uPi5eDvfdbC672u8I09l8tvlYDC/v ;; z93HNJa4+Hj7fr0+3mxs54vTw1e7BM+vh9n7T8PBbPlx8jD/k9HT4WzsRzfP ;; 0/aFtVi+vNl9W75b4MODhwv2C7c4vz/e7C8/zzK+8Iav6ycLPJ1Ol3/zAPv5 ;; N5vfo7tnN+vZuIFNJvJ5frYvrOHLh8nJyfjjuOsM1/slPH53uNmPTnYDD8dH ;; R5ut4uGFdf9F6WQy3C3wdPbmdjKZDNsw7u56PPMw3F6cXS6vDs/u57/66cE2 ;; o+e3w+fP203p7RvdPDvbF9bx/GY935/bvYDuPsa//IeBH473jufrH+9+cu54 ;; f9dPM893u9QPcz4dnT+emGfDP+dE0iGSDpF0iKRDJB0i6RBJh0g6RNIhkg6R ;; dIikQyQdIukQSYdIOkTSIZIOkXSIpEMkHSLpEEmHSDpE0iGSDpF0iKRDJB0i ;; 6RBJh0g6RNIhkg6RdIikQyQdIukQSYdIOkTSIZIOkXSIpEMkHSLpEEmHSDpE ;; 0iGSDpF0iKRDJB0i6RBJh0g6RNIhkg6RdIikQyQdIukQSYdIOkTSIZIOkXSI ;; pEMkHSLpEEmHSDpE0iGSDpF0iKRDJB0i6RBJh0g6RNIhkg6RdIikQyQdIukQ ;; SYdIOkTSIZIOkXSIpEMkHSLpEEmHSDpE0iGSDpF0iKRDJB0i6RBJh0g6RNIh ;; kg6RdIikQyQdIukQSYdIOkTSIZIOkXSIpEMkHSLpEEmHSDpE0iGSDpF0iKRD ;; JB0i6RBJh0g6RNIhkg6RdIikQyQdIukQSYdIOkTSIZIOkXSIpEMkHSLpEEmH ;; SDpE0iGSDpF0iKRDJB0i6RBJh0g6RNIhkg6RdIikQyQdIukQSYdIOkTSIZIO ;; kXSIpEMkHSLpEEmHSDpE0iGSDpF0iKRDJB0i6RBJh0g6RNIhkg6RdIikQyQd ;; IukQSYdIOkTSIZIOkXSIpEMkHSLpEEmHSDpE0iGSDpF0iKRDJB0i6RBJh0g6 ;; RNIhkg6RdIikQyQdIukQSYdIOkTSIZIOkXSIpEMkHSLpEEmHSDpE0iGSDpF0 ;; iKRDJB0i6RBJh0g6RNIhkg6RdIikQyQdIukQSYdIOkTSIZIOkXSIpEMkHSLp ;; EEmHSDpE0iGSDpF0iKRDJB0i6RBJh+gv8TgE/jVPQbMAAAAASUVORK5CYII= ;; ===="))))) ;; ;; ;; sheetdat is '("sheetname" (r1c1 r2c2 ...)(r2c1 r2c2 ...) ...) ;; (define (ods:sheet sheetdat) ;; (let ((name (car sheetdat)) ;; (rows (cdr sheetdat))) ;; (conc "<table:table table:name=\"" name "\" table:style-name=\"ta1\" table:print=\"false\">\n" ;; (conc (ods:column) ;; (string-join (map ods:row rows) "")) ;; "</table:table>"))) ;; ;; ;; seems to be called once at top of each sheet, i.e. a column of rows ;; (define (ods:column) ;; "<table:table-column table:style-name=\"co1\" table:number-columns-repeated=\"2\" table:default-cell-style-name=\"Default\"/>\n") ;; ;; ;; cells is a list of <table:table-cell ..> ... </table:table-cell> ;; (define (ods:row cells) ;; (conc "<table:table-row table:style-name=\"ro1\">\n" ;; (string-join (map ods:cell cells) "") ;; "</table:table-row>\n")) ;; ;; ;; types are "string" or "float" ;; (define (ods:cell value) ;; (let* ((type (cond ;; ((string? value) "string") ;; ((symbol? value) "string") ;; ((number? value) "float") ;; (else #f))) ;; (tmpval (if (symbol? value) ;; (symbol->string value) ;; (if type value ""))) ;; convert everything else to an empty string ;; (escval (if (string? tmpval)(string-substitute (regexp "<") "<" (string-substitute (regexp ">") ">" tmpval)) tmpval))) ;; (conc "<table:table-cell office:value-type=\"" (if type type "string") "\"" ;; (if (equal? type "float")(conc " office:value=\"" value "\"") "") ;; ">\n" ;; "<text:p>" escval "</text:p>" "\n" ;; "</table:table-cell>" "\n"))) ;; ;; ;; create the directories ;; (define (ods:construct-dir path) ;; (for-each ;; (lambda (subdir) ;; (system (conc "mkdir -p " path "/" subdir))) ;; ods:dirs)) ;; ;; ;; populate the necessary, non-constructed, files ;; (define (ods:add-non-content-files path) ;; ;; first the zero-length files, nb// the dir should already be created ;; (for-each ;; (lambda (fname) ;; (system (conc "touch " path "/" fname))) ;; ods:0-len-files) ;; ;; create the files with stuff in them ;; (for-each ;; (lambda (fdat) ;; (let* ((name (car fdat)) ;; (lines (cadr fdat))) ;; (with-output-to-file (conc path "/" name) ;; (lambda () ;; (for-each ;; (lambda (line) ;; (display line)) ;; lines))))) ;; ods:files)) ;; ;; ;; data format: ;; ;; '( (sheet1 (r1c1 r1c2 r1c3 ...) ;; ;; (r2c1 r2c3 r2c3 ...) ) ;; ;; (sheet2 ( ... ) ;; ;; ( ... ) ) ) ;; (define (ods:list->ods path fname data) ;; (if (not (file-exists? path)) ;; (print "ERROR: path to create ods data must pre-exist") ;; (begin ;; (with-output-to-file (conc path "/content.xml") ;; (lambda () ;; (ods:construct-dir path) ;; (ods:add-non-content-files path) ;; (ods:make-thumbnail path) ;; (map display ods:content-header) ;; ;; process each sheet ;; (map print ;; (map ods:sheet data)) ;; (map display ods:content-footer))) ;; (system (conc "cd " path "; zip " fname " -n mimetype mimetype `find . |grep -v mimetype` > /dev/null"))))) ;; ;; ) |
Modified process-inc.scm from [5288c0cd7b] to [4ac258f1e9].
︙ | ︙ | |||
18 19 20 21 22 23 24 | ;;====================================================================== ;;====================================================================== ;; Process convience utils ;;====================================================================== | < < < | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ;;====================================================================== ;;====================================================================== ;; Process convience utils ;;====================================================================== (define (process:conservative-read port) (let loop ((res "")) (if (not (eof-object? (peek-char port))) (loop (conc res (read-char port))) res))) (define (process:cmd-run-with-stderr->list cmd . params) |
︙ | ︙ |
Modified processmod.scm from [ee6645e059] to [6303547c57].
︙ | ︙ | |||
28 29 30 31 32 33 34 | (import (prefix sqlite3 sqlite3:) posix typed-records srfi-18 srfi-69 format ports srfi-1 matchable regex directory-utils) ;; (import commonmod) ;; (use (prefix ulex ulex:)) (include "common_records.scm") | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | (import (prefix sqlite3 sqlite3:) posix typed-records srfi-18 srfi-69 format ports srfi-1 matchable regex directory-utils) ;; (import commonmod) ;; (use (prefix ulex ulex:)) (include "common_records.scm") ;; ;; ;; ;; accept an alist or hash table containing envvar/env value pairs (value of #f causes unset) ;; ;; execute thunk in context of environment modified as per this list ;; ;; restore env to prior state then return value of eval'd thunk. ;; ;; ** this is not thread safe ** ;; (define (common:with-env-vars delta-env-alist-or-hash-table thunk) ;; (let* ((delta-env-alist (if (hash-table? delta-env-alist-or-hash-table) ;; (hash-table->alist delta-env-alist-or-hash-table) ;; delta-env-alist-or-hash-table)) ;; (restore-thunks ;; (filter ;; identity ;; (map (lambda (env-pair) ;; (let* ((env-var (car env-pair)) ;; (new-val (let ((tmp (cdr env-pair))) ;; (if (list? tmp) (car tmp) tmp))) ;; (current-val (get-environment-variable env-var)) ;; (restore-thunk ;; (cond ;; ((not current-val) (lambda () (unsetenv env-var))) ;; ((not (string? new-val)) #f) ;; ((eq? current-val new-val) #f) ;; (else ;; (lambda () (setenv env-var current-val)))))) ;; ;;(when (not (string? new-val)) ;; ;; (debug:print 0 *default-log-port* " PROBLEM: not a string: "new-val"\n from env-alist:\n"delta-env-alist) ;; ;; (pp delta-env-alist) ;; ;; (exit 1)) ;; ;; ;; (cond ;; ((not new-val) ;; modify env here ;; (unsetenv env-var)) ;; ((string? new-val) ;; (setenv env-var new-val))) ;; restore-thunk)) ;; delta-env-alist)))) ;; (let ((rv (thunk))) ;; (for-each (lambda (x) (x)) restore-thunks) ;; restore env to original state ;; rv))) ;; ;; (define (process:conservative-read port) ;; (let loop ((res "")) ;; (if (not (eof-object? (peek-char port))) ;; (loop (conc res (read-char port))) ;; res))) ;; ;; (define (process:cmd-run-with-stderr->list cmd . params) ;; ;; (print "Called with cmd=" cmd ", proc=" proc ", params=" params) ;; ;; (handle-exceptions ;; ;; exn ;; ;; (begin ;; ;; (print "ERROR: Failed to run command: " cmd " " (string-intersperse params " ")) ;; ;; (print " " ((condition-property-accessor 'exn 'message) exn)) ;; ;; #f) ;; (let-values (((fh fho pid fhe) (if (null? params) ;; (process* cmd) ;; (process* cmd params)))) ;; (let loop ((curr (read-line fh)) ;; (result '())) ;; (let ((errstr (process:conservative-read fhe))) ;; (if (not (string=? errstr "")) ;; (set! result (append result (list errstr))))) ;; (if (not (eof-object? curr)) ;; (loop (read-line fh) ;; (append result (list curr))) ;; (begin ;; (close-input-port fh) ;; (close-input-port fhe) ;; (close-output-port fho) ;; result))))) ;; ) ;; ;; (define (process:cmd-run-with-stderr-and-exitcode->list cmd . params) ;; ;; (print "Called with cmd=" cmd ", proc=" proc ", params=" params) ;; ;; (handle-exceptions ;; ;; exn ;; ;; (begin ;; ;; (print "ERROR: Failed to run command: " cmd " " (string-intersperse params " ")) ;; ;; (print " " ((condition-property-accessor 'exn 'message) exn)) ;; ;; #f) ;; (let-values (((fh fho pid fhe) (if (null? params) ;; (process* cmd) ;; (process* cmd params)))) ;; (let loop ((curr (read-line fh)) ;; (result '())) ;; (let ((errstr (process:conservative-read fhe))) ;; (if (not (string=? errstr "")) ;; (set! result (append result (list errstr))))) ;; (if (not (eof-object? curr)) ;; (loop (read-line fh) ;; (append result (list curr))) ;; (begin ;; (let-values (((anotherpid normalexit? exitstatus) (process-wait pid))) ;; (close-input-port fh) ;; (close-input-port fhe) ;; (close-output-port fho) ;; (list result (if normalexit? exitstatus -1)))))))) ;; ;; (define (process:cmd-run-proc-each-line cmd proc . params) ;; ;; (print "Called with cmd=" cmd ", proc=" proc ", params=" params) ;; (handle-exceptions ;; exn ;; (begin ;; (print "ERROR: Failed to run command: " cmd " " (string-intersperse params " ")) ;; (debug:print 0 *default-log-port* " message: " ((condition-property-accessor 'exn 'message) exn)) ;; (debug:print 5 *default-log-port* "exn=" (condition->list exn)) ;; #f) ;; (let-values (((fh fho pid) (if (null? params) ;; (process cmd) ;; (process cmd params)))) ;; (let loop ((curr (read-line fh)) ;; (result '())) ;; (if (not (eof-object? curr)) ;; (loop (read-line fh) ;; (append result (list (proc curr)))) ;; (begin ;; (close-input-port fh) ;; ;; (close-input-port fhe) ;; (close-output-port fho) ;; result)))))) ;; ;; (define (process:cmd-run-proc-each-line-alt cmd proc) ;; (let* ((fh (open-input-pipe cmd)) ;; (res (port-proc->list fh proc)) ;; (status (close-input-pipe fh))) ;; (if (eq? status 0) res #f))) ;; ;; (define (process:cmd-run->list cmd #!key (delta-env-alist-or-hash-table '())) ;; (common:with-env-vars ;; delta-env-alist-or-hash-table ;; (lambda () ;; (let* ((fh (open-input-pipe cmd)) ;; (res (port->list fh)) ;; (status (close-input-pipe fh))) ;; (list res status))))) ;; ;; (define (port->list fh) ;; (if (eof-object? fh) #f ;; (let loop ((curr (read-line fh)) ;; (result '())) ;; (if (not (eof-object? curr)) ;; (loop (read-line fh) ;; (append result (list curr))) ;; result)))) ;; ;; (define (port-proc->list fh proc) ;; (if (eof-object? fh) #f ;; (let loop ((curr (proc (read-line fh))) ;; (result '())) ;; (if (not (eof-object? curr)) ;; (loop (let ((l (read-line fh))) ;; (if (eof-object? l) l (proc l))) ;; (append result (list curr))) ;; result)))) ;; ;; ;; here is an example line where the shell is sh or bash ;; ;; "find / -print 2&>1 > findall.log" ;; (define (run-n-wait cmdline #!key (params #f)(print-cmd #f)(run-dir #f)) ;; (if print-cmd ;; (debug:print 0 *default-log-port* ;; (if (string? print-cmd) ;; print-cmd ;; "") ;; (if run-dir (conc "Run in " run-dir ";") "") ;; cmdline ;; (if params ;; (conc " " (string-intersperse params " ")) ;; ""))) ;; (if (and run-dir ;; (directory-exists? run-dir)) ;; (push-directory run-dir)) ;; (let ((pid (if params ;; (process-run cmdline params) ;; (process-run cmdline)))) ;; (let loop ((i 0)) ;; (let-values (((pid-val exit-status exit-code) (process-wait pid #t))) ;; (if (eq? pid-val 0) ;; (begin ;; (thread-sleep! 2) ;; (loop (+ i 1))) ;; (begin ;; (if (and run-dir ;; (directory-exists? run-dir)) ;; (pop-directory)) ;; (values pid-val exit-status exit-code))))))) ;; ;; ;;====================================================================== ;; ;; MISC PROCESS RELATED STUFF ;; ;;====================================================================== ;; ;; (define (process:children proc) ;; (with-input-from-pipe ;; (conc "ps h --ppid " (current-process-id) " -o pid") ;; (lambda () ;; (let loop ((inl (read-line)) ;; (res '())) ;; (if (eof-object? inl) ;; (reverse res) ;; (let ((pid (string->number inl))) ;; (if proc (proc pid)) ;; (loop (read-line) (cons pid res)))))))) ;; ;; (define (process:alive? pid) ;; (handle-exceptions ;; exn ;; ;; possibly pid is a process not a child, look in /proc to see if it is running still ;; (file-exists? (conc "/proc/" pid)) ;; (let-values (((rpid exit-type exit-signal)(process-wait pid #t))) ;; (and (number? rpid) ;; (equal? rpid pid))))) ;; ;; (define (process:alive-on-host? host pid) ;; (let ((cmd (conc "ssh " host " ps -o pid= -p " pid))) ;; (handle-exceptions ;; exn ;; #f ;; anything goes wrong - assume the process in NOT running. ;; (with-input-from-pipe ;; cmd ;; (lambda () ;; (let loop ((inl (read-line))) ;; (if (eof-object? inl) ;; #f ;; (let* ((clean-str (string-substitute "^[^\\d]*([0-9]+)[^\\d]*$" "\\1" inl)) ;; (innum (string->number clean-str))) ;; (and innum ;; (eq? pid innum)))))))))) ;; ;; (define (process:get-sub-pids pid) ;; (with-input-from-pipe ;; (conc "pstree -A -p " pid) ;; | tr 'a-z\\-+`()\\.' ' ' " pid) ;; (lambda () ;; (let loop ((inl (read-line)) ;; (res '())) ;; (if (eof-object? inl) ;; (reverse res) ;; (let ((nums (map string->number ;; (string-split-fields "\\d+" inl)))) ;; (loop (read-line) ;; (append res nums)))))))) ) |
Modified rmt-inc.scm from [5054b48a41] to [96b8adb98a].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== | < < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;;====================================================================== ;; ;; THESE ARE ALL CALLED ON THE CLIENT SIDE!!! ;; ;; generate entries for ~/.megatestrc with the following ;; ;; grep define ../rmt.scm | grep rmt: |perl -pi -e 's/\(define\s+\((\S+)\W.*$/\1/'|sort -u |
︙ | ︙ |
Modified runconfig-inc.scm from [66b9c38588] to [e28b5a956f].
︙ | ︙ | |||
16 17 18 19 20 21 22 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; read a config file, loading only the section pertinent ;; to this run field1val/field2val/field3val ... ;;====================================================================== | < < < < < < < | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;;====================================================================== ;; read a config file, loading only the section pertinent ;; to this run field1val/field2val/field3val ... ;;====================================================================== (define (runconfig:read fname target environ-patt) (let ((ht (make-hash-table))) (if target (hash-table-set! ht target '())) (read-config fname ht #t environ-patt: environ-patt sections: (if target (list "default" target) #f)))) ;; NB// to process a runconfig ensure to use environ-patt with target! ;; |
︙ | ︙ |
Modified runs-inc.scm from [098355e5d0] to [a044c9b2fb].
︙ | ︙ | |||
13 14 15 16 17 18 19 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') | < < < < < < < < < < < < < < < < < < < < < < | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') ;; use this struct to facilitate refactoring ;; (defstruct runs:dat reglen regfull runname max-concurrent-jobs run-id test-patts required-tests test-registry |
︙ | ︙ |
Modified server-inc.scm from [78810e8804] to [640528e606].
︙ | ︙ | |||
13 14 15 16 17 18 19 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; | < < < < < < < < < < < < < < < < < < < < < | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; (define (server:make-server-url hostport) (if (not hostport) #f (conc "http://" (car hostport) ":" (cadr hostport)))) (define *server-loop-heart-beat* (current-seconds)) |
︙ | ︙ |
Modified subrun-inc.scm from [bd1952a98c] to [82d1fc06cb].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') | < < < < < < < < < < < < < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') (define (subrun:subrun-test-initialized? test-run-dir) (if (and (common:file-exists? (conc test-run-dir "/subrun-area") ) (common:file-exists? (conc test-run-dir "/testconfig.subrun") )) #t #f)) (define (subrun:launch-dashboard test-run-dir) |
︙ | ︙ |
Modified tasks-inc.scm from [b5c98d9ead] to [075e065161].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') | < < < < < < < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') ;;====================================================================== ;; Tasks db ;;====================================================================== ;; wait up to aprox n seconds for a journal to go away ;; (define (tasks:wait-on-journal path n #!key (remove #f)(waiting-msg #f)) |
︙ | ︙ |
Modified tests-inc.scm from [3fce4840b2] to [412882104c].
︙ | ︙ | |||
18 19 20 21 22 23 24 | ;; ;;====================================================================== ;;====================================================================== ;; Tests ;;====================================================================== | < < < < < < < < < < < < < < < < < < < < < < | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ;; ;;====================================================================== ;;====================================================================== ;; Tests ;;====================================================================== ;; Call this one to do all the work and get a standardized list of tests ;; gets paths from configs and finds valid tests ;; returns hash of testname --> fullpath ;; (define (tests:get-all) (let* ((test-search-path (tests:get-tests-search-path *configdat*))) |
︙ | ︙ |
Modified vg-inc.scm from [79994f610c] to [99adbfd2ee].
︙ | ︙ | |||
14 15 16 17 18 19 20 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') | < < < < < < < < | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') ;; ;; structs ;; ;; ;; (defstruct vg:lib comps) ;; (defstruct vg:comp objs name file) ;; ;; extents caches extents calculated on draw ;; ;; proc is called on draw and takes the obj itself as a parameter ;; ;; attrib is an alist of parameters |
︙ | ︙ |