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