aboutsummaryrefslogtreecommitdiffstats
path: root/generate.el
diff options
context:
space:
mode:
authorGravatar Tom Willemse2020-10-16 00:15:12 -0700
committerGravatar Tom Willemse2020-10-16 13:31:10 -0700
commit191d6e9ea68f3aad5fe51c6cb368a1ac13b55b23 (patch)
tree21a28a05fc1abfacfa4c283160383d7751ad01da /generate.el
parent7fb78d41eb90a4fe23933631ed3938499aef8873 (diff)
downloademacs-config-191d6e9ea68f3aad5fe51c6cb368a1ac13b55b23.tar.gz
emacs-config-191d6e9ea68f3aad5fe51c6cb368a1ac13b55b23.zip
Try running generated configuration
Diffstat (limited to 'generate.el')
-rw-r--r--generate.el86
1 files changed, 86 insertions, 0 deletions
diff --git a/generate.el b/generate.el
new file mode 100644
index 0000000..fd629a7
--- /dev/null
+++ b/generate.el
@@ -0,0 +1,86 @@
+(require 'libyaml)
+(require 'cl-lib)
+
+(defun directory-name->package-name (dir)
+ (format "package-%s" dir))
+
+(defun directory->prepackage (module)
+ `(,(directory-name->package-name module)
+ ("stage" . "pre-package-multifile")
+ ("before_script" ,(format "rm -rf %s/dist" module))
+ ("script" ,(format "cask --path %s package" module))
+ ("artifacts"
+ ("paths" ,(format "%s/dist" module)))))
+
+(defun module->unit-test (module)
+ `(,(format "unit-test-%s" module)
+ ("stage" . "unit-test")
+ ("dependencies" "package")
+ ("script" . ,(format "make unit-test-%s TEST_ARCHIVE=$(realpath bin/)" module))))
+
+(defun module->integration-test (module)
+ `(,(format "integration-test-%s" module)
+ ("stage" . "integration-test")
+ ("dependencies" "package")
+ ("script" . ,(format "make integration-test-%s TEST_ARCHIVE=$(realpath bin/)" module))))
+
+(defun unit-test-exists-p (module)
+ (file-exists-p (format "test/%s-test.el" module)))
+
+(defun integration-test-exists-p (module)
+ (file-exists-p (format "test/integration/%s.bats" module)))
+
+(defun alist-p (lst)
+ (and (listp lst)
+ (listp (car lst))
+ (= (length lst) 2)
+ (not (proper-list-p (car lst)))))
+
+(defun prepare-value-for-yaml (object)
+ (pcase object
+ ((and (pred proper-list-p)
+ lst
+ (guard (listp (car lst))))
+ (prepare-for-yaml object))
+ ((pred proper-list-p)
+ (apply #'vector object))
+ (_ object)))
+
+(defun prepare-for-yaml (object)
+ (let ((hash (make-hash-table)))
+ (dolist (item object)
+ (puthash (car item) (prepare-value-for-yaml (cdr item)) hash))
+ hash))
+
+(defun generate ()
+ (let* ((modules (directory-files "." nil (rx string-start "oni-")))
+ (directories (cl-remove-if-not #'file-directory-p modules)))
+ (with-temp-buffer
+ (insert
+ (yaml-dump
+ (prepare-for-yaml
+ `(("image" . "registry.gitlab.com/ryuslash/emacs-config")
+ ("stages" "pre-package-multi-file" "package" "unit-test" "integration-test" "deploy")
+ ,@(mapcar #'directory->prepackage directories)
+ ("package"
+ ("stage" . "package")
+ ("dependencies" ,@(mapcar #'directory-name->package-name directories))
+ ("before_script"
+ "rm -rf bin/"
+ "mkdir bin/")
+ ("script" . "make package")
+ ("artifacts"
+ ("paths" "bin/")))
+ ,@(mapcar #'module->unit-test
+ (cl-remove-if-not #'unit-test-exists-p modules))
+ ,@(mapcar #'module->integration-test
+ (cl-remove-if-not #'integration-test-exists-p modules))
+ ("deploy"
+ ("only" "master")
+ ("stage" . "deploy")
+ ("image" . "instrumentisto/rsync-ssh")
+ ("dependencies" "package")
+ ("before_script" "chmod 600 \"$DEPLOY_KEY\"")
+ ("script"
+ "rsync -e \"ssh -o \\\"UserKnownHostsFile $KNOWN_HOSTS\\\" -p 4511 -i $DEPLOY_KEY\" -v -c -r --delete bin/ \"elpa@ryuslash.org:\""))))))
+ (write-file "generated-config.yml"))))