aboutsummaryrefslogtreecommitdiffstats
path: root/oni/home/config/pop-os/emacs.el
blob: 3154794478025a8b3f561fd5ccee42ea9f1767b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
(defun snowball-reformat-chanced-file ()
  "Run the current buffer through Pint."
  (interactive)
  (let ((format-file-name (concat "fmt-" (file-name-nondirectory (buffer-file-name)))))
    (unwind-protect
        (progn
          (write-region (point-min) (point-max) format-file-name)
          (shell-command
           (format "%s %s"
                   (expand-file-name "../chanced-scripts/format" (project-root (project-current)))
                   (file-relative-name format-file-name (project-root (project-current))))
           nil nil)
          (let ((temp-buffer (find-file-noselect format-file-name)))
            (unwind-protect
                (replace-buffer-contents temp-buffer)
              (kill-buffer temp-buffer))))
      (delete-file format-file-name))))

(defun tomwpunt:enable-directory-local-modes ()
  "Enable hooks and modes that are bound to specific directory."
  (cond
   ((string-suffix-p "src/social-api/" (or (and-let* ((project (project-current)))
                                             (project-root project))
                                           ""))
    (local-set-key (kbd "C-c c") #'artisan-transient)
    (when (equal major-mode 'php-mode)
      (add-hook 'before-save-hook 'snowball-reformat-chanced-file nil t)))))

(add-hook 'find-file-hook 'tomwpunt:enable-directory-local-modes)

(transient-define-prefix artisan-transient ()
  "A transient to run artisan commands."
  ["Punt"
   ["Composer"
    ("pci" "Install" artisan-punt-composer-install)]
   ["Artisan"
    ("pac" "Run Command" artisan-punt-run-command)
    ("pam" "Migrate" artisan-punt-migrate)
    ("pat" "Test" artisan-punt-test)]]
  ["Chanced"
   ["Composer"
    ("cci" "Install" artisan-chanced-composer-install)]
   ["Artisan"
    ("cac" "Run Command" artisan-chanced-run-command)
    ("cam" "Migrate" artisan-chanced-migrate)
    ("cat" "Test" artisan-chanced-test)]])

(defun artisan-punt-composer-install ()
  (interactive)
  (let ((default-directory (expand-file-name "punt" (project-root (project-current)))))
    (async-shell-command "docker exec -it punt-backend composer install")))

(defun artisan-chanced-composer-install ()
  (interactive)
  (let ((default-directory (expand-file-name "chanced" (project-root (project-current)))))
    (async-shell-command "docker exec -it chanced-backend composer install")))

(defun artisan-punt-run-command (command)
  (interactive
   (list
    (read-string "Command: ")))
  (let ((default-directory (expand-file-name "punt" (project-root (project-current)))))
    (async-shell-command (format "docker exec -it punt-backend php artisan %s" command))))

(defun artisan-chanced-run-command (command)
  (interactive
   (list
    (read-string "Command: ")))
  (let ((default-directory (expand-file-name "chanced" (project-root (project-current)))))
    (async-shell-command (format "docker exec -it chanced-backend php artisan %s" command))))

(defun artisan-punt-migrate ()
  (interactive)
  (let ((default-directory (expand-file-name "punt" (project-root (project-current)))))
    (async-shell-command "docker exec -it punt-backend php artisan migrate")))

(defun artisan-chanced-migrate ()
  (interactive)
  (let ((default-directory (expand-file-name "chanced" (project-root (project-current)))))
    (async-shell-command "docker exec -it chanced-backend php artisan migrate")))

(defun artisan-punt-test (pick)
  (interactive "P")
  (artisan--test-internal pick "punt" "chanced"))

(defun artisan-chanced-test (pick)
  (interactive "P")
  (artisan--test-internal pick "chanced" "punt"))

(defvar artisan--test-last-command nil
  "The last testing commnand that was run in the test buffer.
This variable should always be buffer local and only set in test
buffers.")
(make-variable-buffer-local 'artisan--test-last-command)

(defun artisan--test-internal (pick name ignore)
  (let* ((default-directory (expand-file-name name (project-root (project-current))))
         (buffer-name (format "*%s Tests*" (capitalize name)))
         (buffer (get-buffer-create buffer-name))
         (files (cons '("all" . "")
                      (mapcar (lambda (dir) (cons (file-name-nondirectory dir) dir))
                              (directory-files-recursively "../" (rx "Test.php") nil (lambda (subdir) (not (or (string-suffix-p "vendor" subdir) (string-suffix-p ignore subdir))))))))
         (command (with-current-buffer buffer
                    (or (and (not pick) artisan--test-last-command)
                        (format "../../chanced-scripts/test %s %s"
                                name (map-elt files (completing-read "File: " files nil t))))))
         (compilation-scroll-output t))
    (cl-letf (((symbol-function 'compilation-buffer-name)
               (lambda (&rest args) buffer-name)))
      (compile command))
    (with-current-buffer buffer
      (setq artisan--test-last-command command)
      (local-set-key (kbd "g")
                     (lambda ()
                       (interactive)
                       (artisan--test-internal nil name ignore)))
      (local-set-key (kbd "q") #'bury-buffer))))