|
16 | 16 | (defvar qob-files nil)
|
17 | 17 | (defvar qob-depends-on nil)
|
18 | 18 |
|
| 19 | +(defvar qob-before-command-hook nil) |
| 20 | +(defvar qob-after-command-hook nil) |
| 21 | + |
19 | 22 | ;;
|
20 | 23 | ;;; Utils
|
21 | 24 |
|
@@ -599,6 +602,58 @@ Set up the systems; on contrary, you should use the function
|
599 | 602 | (defvar qob-dist-path "dist/"
|
600 | 603 | "Default path where to place the package artifact.")
|
601 | 604 |
|
| 605 | +;; |
| 606 | +;;; Entry |
| 607 | + |
| 608 | +(defun qob-add-hook (hook function) |
| 609 | + "Add FUNCTION to the HOOK list if not already present." |
| 610 | + (set hook nil) ; Declare it. |
| 611 | + (unless (member function (symbol-value hook)) |
| 612 | + (push function (symbol-value hook)))) |
| 613 | + |
| 614 | +(defun qob-run-hooks (hooks) |
| 615 | + "Run all functions in the HOOKS list." |
| 616 | + (dolist (fn (ignore-errors (symbol-value hooks))) |
| 617 | + (funcall fn))) |
| 618 | + |
| 619 | +(defun qob--form-command-var (name) |
| 620 | + "From the command variable by NAME." |
| 621 | + (let* ((name (string-upcase name)) |
| 622 | + (name (intern name))) |
| 623 | + name)) |
| 624 | + |
| 625 | +(defun qob--before-command-var () |
| 626 | + "Return the before command name." |
| 627 | + (let* ((command (qob-command)) |
| 628 | + (before (concatenate 'string "qob-before-" command "-hook"))) |
| 629 | + (qob--form-command-var before))) |
| 630 | + |
| 631 | +(defun qob--after-command-var () |
| 632 | + "Return the after command name." |
| 633 | + (let* ((command (qob-command)) |
| 634 | + (after (concatenate 'string "qob-after-" command "-hook"))) |
| 635 | + (qob--form-command-var after))) |
| 636 | + |
| 637 | +;; Define variable |
| 638 | +(let ((before (qob--before-command-var)) |
| 639 | + (after (qob--after-command-var))) |
| 640 | + (set before nil) |
| 641 | + (set after nil)) |
| 642 | + |
| 643 | +(defun qob--with-hooks (body) |
| 644 | + "Execute BODY with before/after hooks." |
| 645 | + (let ((before (qob--before-command-var)) |
| 646 | + (after (qob--after-command-var))) |
| 647 | + (qob-run-hooks 'qob-before-command-hook) |
| 648 | + (qob-run-hooks before) |
| 649 | + (funcall body) |
| 650 | + (qob-run-hooks after) |
| 651 | + (qob-run-hooks 'qob-after-command-hook))) |
| 652 | + |
| 653 | +(defmacro qob-start (&rest body) |
| 654 | + "Execute BODY with workspace setup." |
| 655 | + `(qob--with-hooks (lambda () ,@body))) |
| 656 | + |
602 | 657 | ;;
|
603 | 658 | ;;; Initialization
|
604 | 659 |
|
|
0 commit comments