;;; 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
|