summary refs log tree commit diff
path: root/emacs.d/core/core-pants.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/core/core-pants.el')
-rw-r--r--emacs.d/core/core-pants.el65
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)