;;; vlocitemacs.el --- Vlocity Build Tool :: Emacs integration ;;; Commentary: ;; ;; Essentially the following commands are abstracted into elisp and made dynamic: ;; ;; vlocity packDeploy -propertyfile build.properties -job job.yaml -key VlocityUITemplate/Test-test ;; vlocity packExport -propertyfile build.properties -job job.yaml -key VlocityUITemplate/Test-test ;; ;; ;;; Code: (require 'transient) (use-package json :ensure t :straight (:host github :repo "ryancrum/json.el" :branch "master")) (defun vlo/generate-sfdx-login-list () "This function is used to give a list of choices (Orgs) to the user when deploying/exporting." ;; 1. make temp file to put the output of `sfdx force:org:list --json` in ;; 2. read that into the following ;; ;; let* means the variables can ref each other (let* ((json-object-type 'hash-table) (json-array-type 'list) (json-key-type 'string) (json (json-read-file "tempfile-location.json"))) ;; this is how we access the first item of the "result" json member (car (gethash "result" json)) ) ) (defvar vlo/orgs '(("build.properties" . "job.yaml")) "List of cons-es that relate a properties file to a job file.") (defvar vlo/project-file-name ".vemacs" "The name of the VlocitEmacs file.") (defvar vlo/store-user nil "Store SFDX user for current session.") (defun vlo/get-user () "Prompt for sfdx username or use stored." (if vlo/store-user vlo/store-user (read-string ;; (defun vlo/get-propertyfile-name () ;; "The name of the build.properties file." ;; (car (nth 0 vlo/orgs))) ;; (defun vlo/get-jobfile-name () ;; "The name of the job.yaml file." ;; (cdr (nth 0 vlo/orgs))) (defun vlo/get-deployment-key () "Return the \"key\" used by vlocity to specify what to deploy/export." (vlo/ensure-init-file) (let ((path-list (delete "" (split-string (file-name-directory (buffer-file-name)) "/")))) (format "%s/%s" (nth (- (length path-list) 2) path-list) (nth (- (length path-list) 1) path-list)))) (defun vlo/project-path () "Return path to the project file, or nil. If project file exists in the current working directory, or a parent directory recursively, return its path. Otherwise, return nil." (let ((dir (locate-dominating-file default-directory vlo/project-file-name))) (unless dir (error (concat "Error: cannot find " vlo/project-file-name))) dir)) (defun vlo/ensure-init-file () "Asserts that you're currently inside a vlocity project." (vlo/project-path)) (defun leo/exec-process (cmd &optional comint) "Execute a process running CMD and optionally pass COMINT as t to put buffer in `comint-mode'." (let ((compilation-buffer-name-function (lambda (mode) (format "*exec-process*")))) (message (concat "Running " cmd)) (compile cmd comint))) (defun vlo/packExport () "Run the packExport command." (interactive) (if (and (file-exists-p (vlo/get-propertyfile-name)) (file-exists-p (vlo/get-jobfile-name))) (leo/exec-process (format "cd %s; vlocity packExport -sfdx.username %s -job %s -key %s" (vlo/ensure-init-file) (vlo/get-user) (vlo/get-jobfile-name) (vlo/get-deployment-key))) (error (format "Error: cannot find either %s or %s" (vlo/get-propertyfile-name) (vlo/get-jobfile-name))))) (defun vlo/packDeploy () "Run the packDeploy command." (interactive) (if (and (file-exists-p (vlo/get-propertyfile-name)) (file-exists-p (vlo/get-jobfile-name))) (leo/exec-process (format "cd %s; vlocity packDeploy -sfdx.username %s -job %s -key %s" (vlo/ensure-init-file) (vlo/get-user) (vlo/get-jobfile-name) (vlo/get-deployment-key))) (error (format "Error: cannot find either %s or %s" (vlo/get-propertyfile-name) (vlo/get-jobfile-name))))) (define-transient-command vlo/transient-action () "Vlocity Build Tool CLI Actions" ["Actions" ("e" "export" vlo/packExport) ("d" "deploy" vlo/packDeploy)]) (provide 'vlocitemacs) ;;; vlocitemacs.el ends here