|
;;; 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)
|
|
(require 'json)
|
|
|
|
|
|
(defvar vlo/org-usernames '()
|
|
"Auto-generated list of usernames from SFDX that are both authenticated and connected.")
|
|
|
|
;; (defvar vlo/default-environment-template "{
|
|
;; \"environments\": [
|
|
;; {
|
|
;; \"env\": \"default\",
|
|
;; \"username\": \"\",
|
|
;; \"job\": \"job.yaml\"
|
|
;; }
|
|
;; ]
|
|
;; }" "Default template for creating the initial .vemacs file.")
|
|
|
|
(defvar vlo/project-file-name ".vemacs.txt"
|
|
"The name of the VlocitEmacs configuration file.
|
|
|
|
This file exists for the purpose of locating the project folder as there is no
|
|
good way of knowing you are in the root vlocity project. It also contains the
|
|
list of environments to be used for deployments/exports.")
|
|
|
|
|
|
(defun vlo/generate-project-file ()
|
|
"Create the project file and append it to .gitignore if file exists."
|
|
(interactive)
|
|
(let* ((dir (read-directory-name "Choose Project Root: "))
|
|
(project-file (concat dir vlo/project-file-name))
|
|
(gitignore (concat dir ".gitignore")))
|
|
(with-temp-file project-file (insert ""))
|
|
(let ((current-user (vlo/prompt-org-list)))
|
|
(with-temp-file project-file (insert current-user))
|
|
(when (file-exists-p gitignore)
|
|
(append-to-file vlo/project-file-name nil gitignore)))))
|
|
|
|
|
|
(defun vlo/prompt-org-list ()
|
|
"Get a list of authenticated orgs via SFDX cli and store the selected user in the project file."
|
|
(interactive)
|
|
(let* ((project-file (concat (vlo/project-path) vlo/project-file-name))
|
|
(temp-json-file
|
|
(make-temp-file "sfdx-org-list" nil ".json"
|
|
(shell-command-to-string "sfdx force:org:list --json")))
|
|
(json-object-type 'hash-table)
|
|
(json-array-type 'list)
|
|
(json-key-type 'string)
|
|
(json (json-read-file temp-json-file))
|
|
(result (gethash "result" json))
|
|
(orgs (gethash "nonScratchOrgs" result))
|
|
)
|
|
(setq vlo/org-usernames '())
|
|
(dolist (org orgs)
|
|
(add-to-list 'vlo/org-usernames (gethash "username" org)))
|
|
(let ((current-user (completing-read "SFDX user: " vlo/org-usernames)))
|
|
(with-temp-file project-file current-user)
|
|
current-user)))
|
|
|
|
(defun vlo/get-project-user ()
|
|
"Return the user stored in the project file."
|
|
(interactive)
|
|
(if (vlo/in-project)
|
|
(let* ((project-dir (concat (vlo/project-path) vlo/project-file-name)))
|
|
(with-temp-buffer (insert-file-contents project-dir)
|
|
(buffer-string)))
|
|
(prog1
|
|
nil
|
|
(message "Must be in vlocity project for that command"))))
|
|
|
|
(defun vlo/get-jobfile-name ()
|
|
"The name of the job.yaml file."
|
|
"job.yaml")
|
|
|
|
(defun vlo/get-deployment-key ()
|
|
"Return the \"key\" used by vlocity to specify what to deploy/export."
|
|
(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/in-project ()
|
|
"Check if you are currently inside a vlocity project."
|
|
(if (locate-dominating-file default-directory vlo/project-file-name)
|
|
t
|
|
nil))
|
|
|
|
(defun leo/exec-process (cmd name &optional comint)
|
|
"Execute a process running CMD and use NAME to generate a unique buffer name and optionally pass COMINT as t to put buffer in `comint-mode'."
|
|
(let ((compilation-buffer-name-function
|
|
(lambda (mode)
|
|
(format "*%s*" name))))
|
|
(message (concat "Running " cmd))
|
|
(compile cmd comint)))
|
|
|
|
|
|
(defun vlo/packExport ()
|
|
"Run the packExport command."
|
|
(interactive)
|
|
(if (and (vlo/in-project)
|
|
(file-exists-p (concat (vlo/project-path) (vlo/get-jobfile-name))))
|
|
(leo/exec-process
|
|
(format "cd %s; vlocity packExport -sfdx.username %s -job %s -key %s"
|
|
(vlo/project-path)
|
|
(vlo/get-project-user)
|
|
(vlo/get-jobfile-name)
|
|
(vlo/get-deployment-key)) "vlocity:retrieve" t)
|
|
(message "ERROR Exporting:: project: %s, user: %s, job: %s, key: %s"
|
|
(vlo/project-path)
|
|
(vlo/get-project-user)
|
|
(vlo/get-jobfile-name)
|
|
(vlo/get-deployment-key))))
|
|
|
|
(defun vlo/packDeploy ()
|
|
"Run the packDeploy command."
|
|
(interactive)
|
|
(if (and (vlo/in-project)
|
|
(file-exists-p (concat (vlo/project-path) (vlo/get-jobfile-name))))
|
|
(leo/exec-process
|
|
(format "cd %s; vlocity packDeploy -sfdx.username %s -job %s -key %s"
|
|
(vlo/project-path)
|
|
(vlo/get-project-user)
|
|
(vlo/get-jobfile-name)
|
|
(vlo/get-deployment-key)) "vlocity:deploy" t)
|
|
(message "ERROR Deploying:: project: %s, user: %s, job: %s, key: %s"
|
|
(vlo/project-path)
|
|
(vlo/get-project-user)
|
|
(vlo/get-jobfile-name)
|
|
(vlo/get-deployment-key))))
|
|
|
|
(defun vlo/packList ()
|
|
"Run the packGetAllAvailableExports command."
|
|
(interactive)
|
|
(if (and (vlo/in-project)
|
|
(file-exists-p (concat (vlo/project-path) (vlo/get-jobfile-name))))
|
|
(leo/exec-process
|
|
(format "cd %s; vlocity packGetAllAvailableExports -sfdx.username %s -job %s -type VlocityUITemplate"
|
|
(vlo/project-path)
|
|
(vlo/get-project-user)
|
|
(vlo/get-jobfile-name)) "vlocity:exports" t)
|
|
(message "ERROR Retrieving List:: project: %s, user: %s, job: %s"
|
|
(vlo/project-path)
|
|
(vlo/get-project-user)
|
|
(vlo/get-jobfile-name))))
|
|
|
|
(defun vlo/transient-action ()
|
|
"Dynamically choose which transient to show based on if currently in a project."
|
|
(interactive)
|
|
(if (vlo/in-project)
|
|
(vlo/transient-project-action)
|
|
(vlo/transient-init-action)))
|
|
|
|
(define-transient-command vlo/transient-init-action ()
|
|
"Vlocity Build Tool CLI Actions"
|
|
["Initialize"
|
|
("c" "Create project file" vlo/generate-project-file)])
|
|
|
|
(define-transient-command vlo/transient-project-action ()
|
|
"Vlocity Build Tool CLI Actions"
|
|
;; ["Environments"
|
|
;; ("a" "Add new org environment" vlo/transient-action)]
|
|
["List"
|
|
("l" "get available list" vlo/packList)]
|
|
["Actions"
|
|
("r" "retrieve" vlo/packExport)
|
|
("d" "deploy" vlo/packDeploy)])
|
|
|
|
|
|
|
|
(provide 'vlocitemacs)
|
|
;;; vlocitemacs.el ends here
|