diff options
| author | Joel Klinghed <the_jk@yahoo.com> | 2017-01-10 22:59:49 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@yahoo.com> | 2017-01-10 23:03:12 +0100 |
| commit | 3b109d366f5cc60efb66a88263e1f092900578cb (patch) | |
| tree | d3434ace230bee2f39ccaf945c9c16b73929ab7c | |
| parent | babdbc6b0a4c3c803996ef4a057846ef461e0a21 (diff) | |
Add a cache for gradle output
| -rw-r--r-- | bin/flycheck-android-java.py | 106 | ||||
| -rw-r--r-- | flycheck-android-experimental.el | 18 |
2 files changed, 98 insertions, 26 deletions
diff --git a/bin/flycheck-android-java.py b/bin/flycheck-android-java.py index 3f0f4bf..6f14425 100644 --- a/bin/flycheck-android-java.py +++ b/bin/flycheck-android-java.py @@ -7,21 +7,43 @@ import sys import tempfile import time -def find_dominating_file(dir, file): - """Find directory containing file.""" - if os.path.exists(os.path.join(dir, file)): - return dir - return find_dominating_file(os.path.dirname(dir), file) +def get_gradle_command_and_project_mtime(dir): + """Find top-project gradlew or fallback to using gradle on sub-project dir. +While iterating the paths, also check mtime on build.gradle files""" + topdir = dir + build_gradle = None + gradlew = None + mtime = -1 + while True: + test = os.path.join(topdir, 'build.gradle') + if os.path.exists(test): + if not build_gradle: + build_gradle = test -def get_gradle_command(dir): - """Find top-project gradlew or fallback to using gradle on sub-project dir.""" - topdir = find_dominating_file(dir, 'gradlew') - if topdir: - return [os.path.join(topdir, 'gradlew'), '-p', topdir] - topdir = find_dominating_file(dir, 'build.gradle') - if topdir: - return ['gradle', '-p', topdir] - return ['gradle'] + try: + m = os.path.getmtime(test) + if m > mtime: + mtime = m + except OSError: + pass + + test = os.path.join(topdir, 'gradlew') + if os.path.exists(test): + gradlew = test + break + + test = os.path.dirname(topdir) + if test == topdir: + break + topdir = test + + if gradlew: + cmd = [gradlew, '-p', topdir] + elif build_gradle: + cmd = ['gradle', '-p', os.path.dirname(build_gradle)] + else: + cmd = ['gradle'] + return (cmd, mtime) def filter_source_files(files): """Remove any item not looking like a Java source file.""" @@ -61,11 +83,31 @@ Otherwise return None.""" return files[0:i] + files[i + 1:] return None -def figure_out_java_compilation(sourcefile, tempfile): +def figure_out_java_compilation(sessiondir, sourcefile, tempfile): """Get options for Java compilation from gradle project and run javac.""" - cmd = get_gradle_command(os.path.dirname(sourcefile)) - cmd.extend(['-q', 'flycheckAndroidJava']) - output = subprocess.check_output(cmd, universal_newlines=True).split('\n') + (cmd, mtime) = get_gradle_command_and_project_mtime( + os.path.dirname(sourcefile)) + output = None + if sessiondir != None: + cachefile = os.path.join(sessiondir, 'gradle_output') + try: + if os.path.getmtime(cachefile) >= mtime: + with open(cachefile, 'r') as f: + output = f.read() + except (OSError, IOError): + pass + + if not output: + cmd.extend(['-q', 'flycheckAndroidJava']) + output = subprocess.check_output(cmd, universal_newlines=True) + if sessiondir != None: + try: + with open(cachefile, 'w') as f: + f.write(output) + except IOError: + pass + + output = output.split('\n') data = None for line in output: if line == '***': @@ -102,11 +144,23 @@ def figure_out_java_compilation(sourcefile, tempfile): data['args'], tempfile) return 0 -if len(sys.argv) == 3: - sys.exit(figure_out_java_compilation(os.path.abspath(sys.argv[1]), - sys.argv[2])) -elif len(sys.argv) == 2: - sys.exit(figure_out_java_compilation(os.path.abspath(sys.argv[1]), - sys.argv[1])) -else: - sys.exit(-1) +def main(argv): + sessiondir = None + + if len(sys.argv) == 4: + sessiondir = sys.argv[1] + sourcefile = sys.argv[2] + tempfile = sys.argv[3] + elif len(sys.argv) == 3: + sourcefile = sys.argv[1] + tempfile = sys.argv[2] + elif len(sys.argv) == 2: + sourcefile = sys.argv[1] + tempfile = sourcefile + else: + return -1 + + sourcefile = os.path.abspath(sourcefile) + return figure_out_java_compilation(sessiondir, sourcefile, tempfile) + +sys.exit(main(sys.argv)) diff --git a/flycheck-android-experimental.el b/flycheck-android-experimental.el index 00e0a4e..181b056 100644 --- a/flycheck-android-experimental.el +++ b/flycheck-android-experimental.el @@ -11,10 +11,14 @@ (require 'flycheck) +(defvar flycheck-android-sessiondir nil + "Session directory used for caching.") + (flycheck-define-checker android-java "Java syntax checker using javac." :command ("python" (eval (flycheck-android-find-tool "java")) + (eval (flycheck-android-get-sessiondir)) (eval buffer-file-name) source) :error-patterns @@ -37,6 +41,20 @@ TOOL=name of tool" (concat (file-name-directory (symbol-file 'flycheck-android-find-tool)) (file-name-as-directory "bin"))))) +(defun flycheck-android-remove-sessiondir () + "Delete session dir if it exists and unsets the variable." + (when flycheck-android-sessiondir + (delete-directory flycheck-android-sessiondir t) + (setq flycheck-android-sessiondir nil))) + +(defun flycheck-android-get-sessiondir () + "Return sessiondir if already set otherwise create and set it." + (or flycheck-android-sessiondir + (progn + (add-hook 'kill-emacs-hook 'flycheck-android-remove-sessiondir) + (setq flycheck-android-sessiondir + (make-temp-file "flycheck-android" t))))) + (add-to-list 'flycheck-checkers 'android-java) (provide 'flycheck-android-experimental) |
