Adding travis
authorFrank Duncan <frank@kank.net>
Fri, 24 Jul 2015 16:30:17 +0000 (11:30 -0500)
committerFrank Duncan <frank@kank.net>
Fri, 24 Jul 2015 17:27:05 +0000 (12:27 -0500)
12 files changed:
.travis.yml [new file with mode: 0644]
bin/buildtravisexec.sh [new file with mode: 0755]
bin/travis.lisp [new file with mode: 0644]
deps/style-checker-test.internal.asd [new symlink]
deps/style-checker.internal.asd [new symlink]
deps/tarpit/cl-ppcre.tar.gz [new file with mode: 0644]
deps/tarpit/sbcl-1.2.6-x86-64-linux-binary.tar.bz2 [new file with mode: 0644]
src/main/style-checker.asd
src/main/syntax-checker.lisp
src/test/main.lisp [new file with mode: 0644]
src/test/package.lisp [new file with mode: 0644]
src/test/style-checker-test.asd [new file with mode: 0644]

diff --git a/.travis.yml b/.travis.yml
new file mode 100644 (file)
index 0000000..e7fc066
--- /dev/null
@@ -0,0 +1,6 @@
+before_install:
+  - wget http://frank.kank.net/travissbcl/style-checker/ef9a5c7/$(git rev-parse HEAD)/travissbcl
+  - chmod +x travissbcl
+
+script:
+  - ./travissbcl --script bin/travis.lisp
diff --git a/bin/buildtravisexec.sh b/bin/buildtravisexec.sh
new file mode 100755 (executable)
index 0000000..20480da
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash -e
+
+mkdir -p tmp/sbcl
+
+cwd=$PWD
+( cd tmp &&
+  tar jxf ../deps/tarpit/sbcl-1.2.6-x86-64-linux-binary.tar.bz2 &&
+  cd sbcl-1.2.6-x86-64-linux/ &&
+  SBCL_HOME="" INSTALL_ROOT=$cwd/tmp/sbcl/ bash install.sh )
+
+mkdir -p tmp/deps/
+
+( cd tmp/deps &&
+  tar zxf ../../deps/tarpit/cl-ppcre.tar.gz &&
+  ln -s cl-ppcre-2.0.10/cl-ppcre.asd .
+)
+
+
+SBCL_HOME="" tmp/sbcl/bin/sbcl --core tmp/sbcl/lib/sbcl/sbcl.core --no-sysinit --no-userinit \
+  --eval "(require 'asdf)" \
+  --eval '(setf asdf:*central-registry* (list #p"tmp/deps/"))' \
+  --eval "(asdf:load-system :cl-ppcre)" \
+  --eval "(asdf:clear-output-translations)" \
+  --eval '(sb-ext:save-lisp-and-die "travissbcl" :executable t)' \
+
+chmod +x travissbcl
+travisname=travissbcl-$(git rev-parse --short HEAD)
+mv travissbcl $travisname
+
+echo "You should upload via the command: scp $travisname nami:/opt/travis/sbcls/style-checker/"
+echo "You should also set travisname in .travis.yml to $travisname"
+
+rm -rf tmp
diff --git a/bin/travis.lisp b/bin/travis.lisp
new file mode 100644 (file)
index 0000000..4892120
--- /dev/null
@@ -0,0 +1,18 @@
+(setf *compile-print* nil)
+(require 'asdf)
+(setf asdf:*central-registry* (list #p"deps/"))
+(asdf:load-system :style-checker.internal)
+(asdf:load-system :style-checker-test.internal)
+
+(format t "~%~c[1;33mRunning Tests~c[0m~%" #\Esc #\Esc)
+(when (not (style-checker-test:run-all-tests))
+ (format t "~c[1;31mFailed tests!~c[0m~%" #\Esc #\Esc)
+ (sb-ext:exit :code 1))
+
+(format t "~%~c[1;33mChecking Style~c[0m~%" #\Esc #\Esc)
+(when (not (syntax-checker:pretty-print-check-directory "src"))
+ (format t "~c[1;31mFailed style check!~c[0m~%" #\Esc #\Esc)
+ (sb-ext:exit :code 1))
+
+(format t "~c[1;32mSuccess!~c[0m~%" #\Esc #\Esc)
+(sb-ext:exit :code 0)
diff --git a/deps/style-checker-test.internal.asd b/deps/style-checker-test.internal.asd
new file mode 120000 (symlink)
index 0000000..17a3b85
--- /dev/null
@@ -0,0 +1 @@
+../src/test/style-checker-test.asd
\ No newline at end of file
diff --git a/deps/style-checker.internal.asd b/deps/style-checker.internal.asd
new file mode 120000 (symlink)
index 0000000..531c337
--- /dev/null
@@ -0,0 +1 @@
+../src/main/style-checker.asd
\ No newline at end of file
diff --git a/deps/tarpit/cl-ppcre.tar.gz b/deps/tarpit/cl-ppcre.tar.gz
new file mode 100644 (file)
index 0000000..67d6e15
Binary files /dev/null and b/deps/tarpit/cl-ppcre.tar.gz differ
diff --git a/deps/tarpit/sbcl-1.2.6-x86-64-linux-binary.tar.bz2 b/deps/tarpit/sbcl-1.2.6-x86-64-linux-binary.tar.bz2
new file mode 100644 (file)
index 0000000..9d09cb4
Binary files /dev/null and b/deps/tarpit/sbcl-1.2.6-x86-64-linux-binary.tar.bz2 differ
index 3ed785e2a1d54431d26fb36cbf26e0488e0340d3..f5bc95d3fda5eaa44bf9f3653b5a7747babc8c1a 100644 (file)
@@ -1,8 +1,20 @@
+; The systems are split up into two because travis will run more smoothly
+; if we use a custom built sbcl that has all the deps pre-loaded since
+; we are sure those will work just fine :)
+;
+; You should link to this file in your systems directory, or however you
+; handle your asdf configurations.  Then just (asdf:load-system :clnl)
+;
+; There's probably a better way, but I don't know it
+
+(asdf:defsystem style-checker.internal
+ :serial t
+ :components ((:file "package") (:file "syntax-checker")))
+
 (asdf:defsystem style-checker
  :name "Style Checker"
  :version "0.1"
  :maintainer "Frank Duncan (frank@kank.com)"
  :author "Frank Duncan (frank@kank.com)"
  :serial t
- :components ((:file "package") (:file "syntax-checker"))
- :depends-on (:cl-ppcre))
+ :depends-on (:cl-ppcre :style-checker.internal))
index 1190818bd2bea72a1a1e4cf09e639a01f743ed95..79cf0f53ca41a6bcb9e37fb2f57a0105bc1ab962 100644 (file)
   (let ((seq (make-sequence sequence-type (file-length str)))) (read-sequence seq str) seq)))
 
 (defun check-file (file)
+ "CHECK-FILE FILE => RESULT
+
+  RESULT: SUCCESS-RESULT | FAILURE-RESULT
+  SUCCESS-RESULT: (:success FILENAME)
+  FAILURE-RESULT: (:success FILENAME MSG LINE-NO COL-NO)
+
+ARGUMENTS AND VALUES
+
+  FILE: a pathname
+  FILENAME: the file this check was run on
+  MSG: a string containing the failure message
+  LINE-NO: an integer, the line number on which the failure appeared
+  COL-NO: an integer, the column number on which the failure appeared
+
+DESCRIPTION:
+
+  CHECK-FILE runs all the checks against a file and returns
+  as soon as the first style error is found.
+
+EXAMPLES:
+
+  (check-file #P\"path/to/file.lisp\") => (:success \"path/to/file.lisp\")
+  (check-file #P\"path/to/error.lisp\") => (:failure \"path/to/error.lisp\" \"File cannot end with empty line\" 20 0)"
+
  (if (string= "package" (pathname-name file))
   (set-state :normal)
   (set-state :begin))
diff --git a/src/test/main.lisp b/src/test/main.lisp
new file mode 100644 (file)
index 0000000..3278681
--- /dev/null
@@ -0,0 +1,57 @@
+(in-package #:style-checker-test)
+
+(defvar *tests* nil)
+
+(defmacro deftest (filename success &optional msg line-no col-no)
+ `(push
+   (lambda ()
+    (let
+     ((green (format nil "~c[1;32m" #\Esc))
+      (red (format nil "~c[1;31m" #\Esc))
+      (result (syntax-checker:check-file ,filename)))
+     (cond
+      ((not (eql ,success (car result)))
+       (format t "~A- ~A failed, expected ~A and got ~A~c[0m~%"
+        red ,filename ,success (car result) #\Esc))
+      ((and (eql :failure ,success) (string/= ,msg (third result)))
+       (format t "~A- ~A failed, expected msg ~A and got msg ~A~c[0m~%"
+        red ,filename ,msg (third result) #\Esc))
+      ((and (eql :failure ,success) (/= ,line-no (fourth result)))
+       (format t "~A- ~A failed, expected line ~A and got line ~A~c[0m~%"
+        red ,filename ,line-no (fourth result) #\Esc))
+      ((and (eql :failure ,success) (/= ,col-no (fifth result)))
+       (format t "~A- ~A failed, expected column ~A and got column ~A~c[0m~%"
+        red ,filename ,col-no (fifth result) #\Esc))
+      (t (format t "~A- ~A passed ~c[0m~%" green ,filename #\Esc) t))))
+   *tests*))
+
+; This really is just here to check against regressions
+(defun run-all-tests ()
+ (let
+  ((results (mapcar #'funcall *tests*)))
+  (every #'identity results)))
+
+(deftest #P"resources/commentneedsspace.lisp" :failure "Multiline top level forms must be separated by a space" 6 0)
+(deftest #P"resources/emptylineatend.lisp" :failure "Must not end with empty line" 8 0)
+(deftest #P"resources/good.lisp" :success)
+(deftest #P"resources/goodcomment.lisp" :success)
+(deftest #P"resources/hangingcloseparens1.lisp" :failure "No hanging close parens" 11 0)
+(deftest #P"resources/hangingcloseparens2.lisp" :failure "No hanging close parens" 12 1)
+(deftest #P"resources/internalsymbols.lisp" :failure "No internal symbols from other packages" 6 22)
+(deftest #P"resources/invalidindent1.lisp" :failure "All form elements must be indented equally" 9 5)
+(deftest #P"resources/invalidindent2.lisp" :failure "All form elements must be indented equally" 11 6)
+(deftest #P"resources/longform.lisp" :failure "Forms can't be over 50 lines long" 117 60)
+(deftest #P"resources/longline.lisp" :failure "Line longer than 120 characters" 2 0)
+(deftest #P"resources/newlineafteropenparens.lisp" :failure "No new line after opening form" 11 5)
+(deftest #P"resources/nopackage.lisp" :failure "Must begin with in-package form" 0 0)
+(deftest #P"resources/package.lisp" :success)
+(deftest #P"resources/spaceafteropenparens.lisp" :failure "No space after opening parens" 11 5)
+(deftest #P"resources/tabs.lisp" :failure "Must not use tabs" 4 0)
+(deftest #P"resources/toplevelindented.lisp" :failure "Top level forms must begin on first column" 3 1)
+(deftest #P"resources/twoemptylines.lisp" :failure "Must not have two empty lines in a row" 2 0)
+(deftest #P"resources/twoemptylineswithcomment.lisp" :failure "Must not have two empty lines in a row" 8 0)
+(deftest #P"resources/twoinpackage.lisp" :failure "Only one in-package per file" 9 0)
+(deftest #P"resources/twospaces.lisp" :failure "Only one space between items of a form" 8 6)
+(deftest #P"resources/unspacedforms.lisp" :failure "Multiline top level forms must be separated by a space" 4 0)
+(deftest #P"resources/whitespaceendline.lisp" :failure "No whitespace at end of line" 4 106)
+(deftest #P"resources/whitespacelines.lisp" :failure "No whitespace only lines" 1 1)
diff --git a/src/test/package.lisp b/src/test/package.lisp
new file mode 100644 (file)
index 0000000..26eb90c
--- /dev/null
@@ -0,0 +1,2 @@
+(defpackage #:style-checker-test (:use :common-lisp)
+ (:export :run-all-tests))
diff --git a/src/test/style-checker-test.asd b/src/test/style-checker-test.asd
new file mode 100644 (file)
index 0000000..4b2cce3
--- /dev/null
@@ -0,0 +1,12 @@
+; For why this is the way it is, see src/main/style-checker.asd
+(asdf:defsystem style-checker-test.internal
+  :components ((:file "package")
+               (:file "main")))
+
+(asdf:defsystem style-checker-test
+  :name "Experiment Tests"
+  :version "0.0.1"
+  :maintainer "Frank Duncan (frank@kank.com)"
+  :author "Frank Duncan (frank@kank.com)"
+  :serial t
+  :depends-on (:style-checker style-checker-test.internal))