@@ -17,11 +17,13 @@ ;; along with Megatest. If not, see . ;;====================================================================== (declare (unit genexample)) -(use posix regex) +(use posix regex matchable) + +(include "db_records.scm") (define genexample:example-logpro #<seconds str) + (let* ((parts (string-split str)) + (res 0)) + (for-each + (lambda (part) + (set! res + (+ res + (match (string-match "(\\d+)([a-z])" part) + ((_ val units)(* (string->number val)(case (string->symbol units) + ((s) 1) + ((m) 60) + ((h) 3600)))) + (else 0))))) + parts) + res)) + +;; generate a skeleton Megatest area from a current area with runs +;; +;; specify target, runname etc to use specific runs for the template +;; +(define (genexample:extract-skeleton-area dest-path) + (let* ((target (args:get-arg "-target")) + (runname (args:get-arg "-runname")) + ) + (if (not (and target runname)) + (debug:print 0 *default-log-port* "WARNING: For best results please specifiy -target and -runname for a good run to use as a template.")) + (if (not (and (file-exists? "megatest.config") + (file-exists? "megatest.db"))) + (begin + (debug:print 0 *default-log-port* "ERROR: this command must be run at the top level of a megatest area where runs have been completed") + (exit))) + + ;; first create the dest path and needed subdirectories + (if (not (file-exists? dest-path)) + (begin + (create-directory dest-path) + (create-directory (conc dest-path "/tests"))) + (if (file-exists? (conc dest-path "/megatest.config")) + (begin + (debug:print 0 *default-log-port* "ERROR: destination path already has megatest.config, stopping now.") + (exit)))) + + ;; dump the config files from this area to the dest area + (system (conc "megatest -show-config > " dest-path "/megatest.config")) + (system (conc "megatest -show-runconfig > " dest-path "/runconfigs.config")) + + ;; create a refdb, some stuff has to be done due to refdb not initing area + ;; sheet row col value + ;; test itempath stepname steptime + (if (not (file-exists? (conc dest-path "/stepsinfo"))) + (begin + (create-directory (conc dest-path "/stepsinfo/sxml") #t) + (with-output-to-file (conc dest-path "/stepsinfo/sheet-names.cfg") (lambda ()(print))))) + + ;; rmt:get-tests-for-run + ;; rmt:get-tests-for-run-mindata run-id testpatt states status not-in + ;; rmt:simple-get-runs + ;; (define-record simple-run target id runname state status owner event_time) + (let* ((runs (rmt:simple-get-runs (or runname "%") #f #f (or target "%"))) + (tests (make-hash-table)) + (refdb (conc dest-path "/stepsinfo"))) + (if (> (length runs) 1) + (debug:print-info 0 *default-log-port* "More than one run matches, first found data will be used.")) + ;; get all testnames + (for-each + (lambda (run-id) + (let* ((tests-data (rmt:get-tests-for-run-mindata run-id "%" '() '() #f))) + (for-each + (lambda (testdat) + (let* ((test-id (db:mintest-get-id testdat)) + (testname (db:mintest-get-testname testdat)) + (item-path (db:mintest-get-item_path testdat)) + ;; now get steps info + (test-steps (tests:get-compressed-steps run-id test-id))) + (if (not (hash-table-exists? tests testname)) + (begin + (print "\n" testname) + (for-each + (lambda (teststep) + (let* ((step-name (vector-ref teststep 0)) + (step-duration (hrs-min-sec->seconds (vector-ref teststep 4)))) + (system (conc "refdb set " refdb " " testname " '" (if (equal? item-path "") + "no-item-path" + item-path) + "' " step-name " " step-duration)) + )) + test-steps)) + (else (debug:print-info 0 *default-log-port* "Skipping already seen test " testname))))) + tests-data))) + (map (lambda (runrec)(simple-run-id runrec)) runs))) + ))