From d63e2f9ad091cda8562d3b5119491866aaf1f07a Mon Sep 17 00:00:00 2001 From: "Elf M. Sternberg" Date: Wed, 27 May 2015 20:13:40 -0700 Subject: [PATCH] Map where filter needed. --- pre-commit | 132 +++++++++++++++++++++++++++-------------------------- 1 file changed, 68 insertions(+), 64 deletions(-) diff --git a/pre-commit b/pre-commit index 31948eb..7547dd2 100755 --- a/pre-commit +++ b/pre-commit @@ -9,9 +9,9 @@ ; below. (def *config-path* (os.path.join (.get os.environ "GIT_DIR" "./.git") "pccs")) -(def *modified* (.compile re "^[MA]\s+(?P.*)$")) +(def *git-modified-pattern* (.compile re "^[MA]\s+(?P.*)$")) -(def *checks* +(def *checks* [ ; { ; "output" "Checking for debugger commands in Javascript..." @@ -58,105 +58,110 @@ ] ) -(defn get-git-value [cmd] +(defn get-git-response [cmd] (let [[fullcmd (+ ["git"] cmd)] - [process (subprocess.Popen fullcmd - :stdout subprocess.PIPE + [process (subprocess.Popen fullcmd + :stdout subprocess.PIPE :stderr subprocess.PIPE)] [(, out err) (.communicate process)]] (, out err process.returncode))) (defn run-git-command [cmd] (let [[fullcmd (+ ["git"] cmd)]] - (subprocess.call fullcmd - :stdout subprocess.PIPE + (subprocess.call fullcmd + :stdout subprocess.PIPE :stderr subprocess.PIPE))) -(defn get-shell-value [fullcmd] - (let [[process (subprocess.Popen fullcmd - :stdout subprocess.PIPE - :stderr subprocess.PIPE +(defn get-shell-response [fullcmd] + (let [[process (subprocess.Popen fullcmd + :stdout subprocess.PIPE + :stderr subprocess.PIPE :shell True)] [(, out err) (.communicate process)]] (, out err process.returncode))) (defn derive-max-code [code-pairs] - (reduce - (fn [m i] (if (> (abs (get i 0)) (abs m)) (get i 0) m)) + (reduce + (fn [m i] (if (> (abs (get i 0)) (abs m)) (get i 0) m)) code-pairs 0)) - + (defn derive-message-bodies [code-pairs] (lmap (fn [i] (get i 1)) code-pairs)) -(defn matches-file [filename match-files] - (any (map (fn [match-file] (-> (.compile re match-file) - (.match filename))) - match-files))) - -; Hy is overeager to return an iterators which is consumed during -; later traversal. lmap returns a concrete list instead. - (defn lmap (pred iter) (list (map pred iter))) +(defn encode-shell-messages [prefix messages] + (lmap (fn [line] (.format "{}{}" prefix (.decode line "utf-8"))) + (.splitlines messages))) + (defn run-external-checker [filename check] - (let [[cmd (-> (get check "command") (.format - :filename filename - :config_path *config-path*))] - [(, out err returncode) (get-shell-value cmd)]] - (if (or (and out (= (.get check "error_condition" "error") "output")) - err + (let [[cmd (-> (get check "command") + (.format + :filename filename + :config_path *config-path*))] + [(, out err returncode) (get-shell-response cmd)]] + (if (or (and out (= (.get check "error_condition" "error") "output")) + err (not (= returncode 0))) - (let [[prefix (if (get check "print_filename") - (.format "\t{}:" filename) + (let [[prefix (if (get check "print_filename") + (.format "\t{}:" filename) "\t")] - [output (+ - (lmap (fn [line] (.format "{}{}" prefix (.decode line "utf-8"))) - (.splitlines out)) - (if err [err] []))]] + [output (+ (encode-shell-messages prefix out) + (if err (encode-shell-messages prefix err) []))]] [(or returncode 1) output]) [0 []]))) +(defn matches-file [filename match-files] + (any (map (fn [match-file] (-> (.compile re match-file) + (.match filename))) + match-files))) + (defn check-scan-wanted [filename check] - (cond [(and (in "match_files" check) + (cond [(and (in "match_files" check) (not (matches-file filename (get check "match_files")))) false] - [(and (in "ignore_files" check) + [(and (in "ignore_files" check) (matches-file filename (get check "ignore_files"))) false] [true true])) +(defn tap [x] (print x) x) + (defn check-files [filenames check] - (let [[filenames-to-check - (lmap (fn [filename] (check-scan-wanted filename check)) filenames)] - [scan-results - (lmap (fn [filename] + (let [[filenames-to-check + (filter (fn [filename] (check-scan-wanted filename check)) filenames)] + [results-of-checks + (lmap (fn [filename] (run-external-checker filename check)) filenames-to-check)] - [messages (+ [(get check "output")] (derive-message-bodies scan-results))]] - [(derive-max-code scan-results) messages])) + [messages (+ [(get check "output")] + (derive-message-bodies results-of-checks))]] + [(derive-max-code results-of-checks) messages])) (defn gather-all-filenames [] - (let [[build-filenames - (fn [filenames] - (map + (let [[build-filenames + (fn [filenames] + (map (fn [f] (os.path.join (get filenames 0) f)) (get filenames 2)))]] - (list (flatten (list-comp (build-filenames o) [o (.walk os ".")]))))) - -; I removed the originally recommended "-u" command from stash; it was -; "cleaning up" far too zealously, deleting my node_modules directory + (list + (flatten + (list-comp (build-filenames o) [o (.walk os ".")]))))) (defn gather-staged-filenames [against] - (let [[(, out err returncode) - (get-git-value ["diff-index" "--name-status" against])] + (let [[(, out err returncode) + (get-git-response ["diff-index" "--name-status" against])] [lines (.splitlines out)] - [matcher (fn [line] (.match *modified* (.decode line "utf-8")))]] - (list (filter - (fn [x] (not (= x ""))) - (list-comp (.group match "name") [match (map matcher lines)] match))))) + [matcher + (fn [line] + (.match *git-modified-pattern* (.decode line "utf-8")))]] + (list + (filter + (fn [x] (not (= x ""))) + (list-comp (.group match "name") [match (map matcher lines)] match))))) -(defn scan-files [scan-all-files against] - (do +(defn run-checks-for [scan-all-files against] + (do (run-git-command ["stash" "--keep-index"]) - (let [[filenames-to-scan - (if scan-all-files - (gather-all-filenames) + (let [[filenames-to-scan + (if scan-all-files + (gather-all-filenames) (gather-staged-filenames against))] [results-of-scan (lmap (fn [check] (check-files filenames-to-scan check)) *checks*)] @@ -167,13 +172,12 @@ (run-git-command ["reset" "--hard"]) (run-git-command ["stash" "pop" "--quiet" "--index"]) exit-code)))) - + (defn get-head-tag [] (let [[empty-repository-hash "4b825dc642cb6eb9a060e54bf8d69288fbee4904"] - [(, out err returncode) (get-git-value ["rev-parse" "--verify HEAD"])]] + [(, out err returncode) (get-git-response ["rev-parse" "--verify HEAD"])]] (if err empty-repository-hash "HEAD"))) (defmain [&rest args] (let [[scan-all-files (and (> (len args) 1) (= (get args 2) "--all-files"))]] - (sys.exit (scan-files scan-all-files (get-head-tag))))) - + (sys.exit (run-checks-for scan-all-files (get-head-tag)))))