about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-08-27T17·27+0100
committerWilliam Carroll <wpcarro@gmail.com>2020-08-27T17·29+0100
commit78172233f808f60000b5aa87a1cf92746b856c0c (patch)
tree75bf9b005fa70e56b85b8bead5e21db5c2b15021
parentd67dbec7e82b7c907d7c1c4fa92ae922abeca059 (diff)
Add build, lint Emacs steps to post-receive pipeline
TL;DR:
- Define runEmacsScript to emacs/default.nix for ci/pipelines/post-receive
- Write script.el to call (load init.el) and catch any errors
- Lint Elisp with gonewest818/elisp-lint

Also nice how Buildkite supports :gnu: emojis!
-rw-r--r--ci/pipelines/post-receive.nix33
-rw-r--r--ci/pipelines/script.el28
-rw-r--r--emacs/default.nix15
3 files changed, 75 insertions, 1 deletions
diff --git a/ci/pipelines/post-receive.nix b/ci/pipelines/post-receive.nix
index 3f14dfade557..d41c3b67b328 100644
--- a/ci/pipelines/post-receive.nix
+++ b/ci/pipelines/post-receive.nix
@@ -1,6 +1,16 @@
-{ pkgs, ... }:
+{ briefcase, pkgs, ... }:
 
 let
+  elispLintSrc = builtins.fetchGit {
+    url = "https://github.com/gonewest818/elisp-lint";
+    rev = "2b645266be8010a6a49c6d0ebf6a3ad5bd290ff4";
+  };
+
+  scriptEl = builtins.path {
+    path = ./script.el;
+    name = "script.el";
+  };
+
   pipeline.steps = [
     {
       key = "lint-secrets";
@@ -14,6 +24,27 @@ let
       depends_on = "lint-secrets";
     }
     {
+      key = "init-emacs";
+      command = ''
+        ${briefcase.emacs.runScript scriptEl} ${briefcase.emacs.initEl}
+      '';
+      label = ":gnu: initialize Emacs";
+      depends_on = "build-briefcase";
+    }
+    {
+      key = "lint-emacs";
+      command = ''
+        ${briefcase.emacs.nixos}/bin/wpcarros-emacs \
+          --quick \
+          --batch \
+          --load ${elispLintSrc}/elisp-lint.el \
+          --funcall elisp-lint-files-batch \
+          "$@"
+      '';
+      label = ":gnu: lint Emacs";
+      depends_on = "init-emacs";
+    }
+    {
       key = "build-socrates";
       command = ''
         nix-build '<nixpkgs/nixos>' \
diff --git a/ci/pipelines/script.el b/ci/pipelines/script.el
new file mode 100644
index 000000000000..45b5ea688500
--- /dev/null
+++ b/ci/pipelines/script.el
@@ -0,0 +1,28 @@
+;; This script initializes Emacs and exits with either a zero or non-zero status
+;; depending on whether or not Emacs initialized without logging warnings or
+;; encountering errors.
+;;
+;; This script reads the location of init.el as the last argument in `argv'.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Dependencies
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'dash)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Script
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(condition-case err
+    (load (-last-item argv))
+  (error
+   (message "Encountered an error while attempting to load init.el: %s" err)
+   (kill-emacs 1)))
+
+(if (bufferp "*Warnings*")
+    (progn
+      (with-current-buffer "*Warnings*"
+        (message "Encountered warnings in *Warnings* buffer: %s" (buffer-string)))
+      (kill-emacs 1))
+  (kill-emacs 0))
diff --git a/emacs/default.nix b/emacs/default.nix
index e8d52c34cc9d..126894a8fc3a 100644
--- a/emacs/default.nix
+++ b/emacs/default.nix
@@ -148,6 +148,21 @@ let
       "$@"
   '';
 in {
+  inherit initEl;
+
+  # I need to start my Emacs from CI without the call to `--load ${initEl}`.
+  runScript = script: pkgs.writeShellScript "run-emacs-script" ''
+    export BRIEFCASE=$HOME/briefcase
+    export PATH="${emacsBinPath}:$PATH"
+    export EMACSLOADPATH="${wpcDir}:${vendorDir}:${wpcarrosEmacs.deps}/share/emacs/site-lisp"
+    exec ${wpcarrosEmacs}/bin/emacs \
+      --no-site-file \
+      --no-site-lisp \
+      --no-init-file \
+      --script ${script} \
+      "$@"
+  '';
+
   # Use `nix-env -f '<briefcase>' emacs.glinux` to install `wpcarro-emacs` on
   # gLinux machines. This will ensure that X and GL linkage behaves as expected.
   glinux = withEmacsPath "/usr/bin/google-emacs";