summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@yahoo.com>2017-01-10 22:59:49 +0100
committerJoel Klinghed <the_jk@yahoo.com>2017-01-10 23:03:12 +0100
commit3b109d366f5cc60efb66a88263e1f092900578cb (patch)
treed3434ace230bee2f39ccaf945c9c16b73929ab7c /bin
parentbabdbc6b0a4c3c803996ef4a057846ef461e0a21 (diff)
Add a cache for gradle output
Diffstat (limited to 'bin')
-rw-r--r--bin/flycheck-android-java.py106
1 files changed, 80 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))