diff options
Diffstat (limited to '')
-rw-r--r-- | emacs.d/core/core-pants.el | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/emacs.d/core/core-pants.el b/emacs.d/core/core-pants.el new file mode 100644 index 0000000..af3b35d --- /dev/null +++ b/emacs.d/core/core-pants.el @@ -0,0 +1,65 @@ +;; this functions are to make it easy to work with `pants' + +(defvar fcuny/build-command "cd ~/src/source && ./pants --no-colors" + "Command to use to execute the target") + +(defvar fcuny/build-file "BUILD" + "Name of the file containing our build targets") + +(defun fcuny/--find-directory-containing-build-file (file) + "Find the directory containing the build file." + (let ((root nil) + try) + (while (not (or root + (null file) + (string-match locate-dominating-stop-dir-regexp file))) + (setq try (if (stringp fcuny/build-file) + (file-exists-p (expand-file-name fcuny/build-file file)))) + (cond (try (setq root file)) + ((equal file (setq file (file-name-directory + (directory-file-name file)))) + (setq file nil)))) + (and root (expand-file-name (file-name-as-directory root))))) + +(defun fcuny/--build-action (target) + (compile (format "%s binary %s" fcuny/build-command target))) + +(defun fcuny/--build-target-list (file) + "Generate a list of existing targets" + (let ((build-command (format "%s list %s:" fcuny/build-command file)) + targets target) + (with-temp-buffer + (insert + (shell-command-to-string build-command)) + (goto-char (point-min)) + (while (re-search-forward "^\\(.+\\)$" nil t) + (setq target (match-string 1)) + (unless (or (save-excursion + (goto-char (match-beginning 0)) + (forward-line -1) + (looking-at "^# Not a target:")) + (string-match "^\\." target)) + (push target targets)))) + (helm + (helm :sources + `((name . "Targets") + (candidates . ,targets) + (action . fcuny/--build-action)))))) + +(defun fcuny/find-build-file () + "Find the build file and if it exists, open it." + (interactive) + (let ((build-file (fcuny/--find-directory-containing-build-file (file-name-directory (buffer-file-name))))) + (if build-file + (find-file (concat build-file fcuny/build-file)) + (error "Could not find %s" fcuny/build-file)))) + +(defun fcuny/build-run-target () + "List the targets for a BUILD file." + (interactive) + (let ((build-file (fcuny/--find-directory-containing-build-file (file-name-directory (buffer-file-name))))) + (if build-file + (fcuny/--build-target-list build-file) + (error "Could not find %s" fcuny/build-file)))) + +(provide 'core-pants) |