resolve_java_srcs.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import os
  2. import argparse
  3. import re
  4. import sys
  5. def list_all_files(directory, prefix='/', hidden_files=False):
  6. result = []
  7. if os.path.exists(directory):
  8. for i in os.listdir(directory):
  9. abs_path = os.path.join(directory, i)
  10. result += (
  11. list_all_files(os.path.join(directory, abs_path), prefix + i + '/', hidden_files)
  12. if os.path.isdir(abs_path)
  13. else ([prefix + i] if (hidden_files or not i.startswith('.')) else [])
  14. )
  15. return result
  16. def pattern_to_regexp(p):
  17. return (
  18. '^'
  19. + ('/' if not p.startswith('**') else '')
  20. + re.escape(p)
  21. .replace(r'\*\*/', '[_DIR_]')
  22. .replace(r'\*', '[_FILE_]')
  23. .replace('[_DIR_]', '(.*/)?')
  24. .replace('[_FILE_]', '([^/]*)')
  25. + '$'
  26. )
  27. def resolve_java_srcs(srcdir, include_patterns, exclude_patterns, all_resources, resolve_kotlin=False):
  28. result = {'java': [], 'not_java': [], 'kotlin': []}
  29. include_patterns_normal, include_patterns_hidden, exclude_patterns_normal, exclude_patterns_hidden = [], [], [], []
  30. for vis, hid, patterns in (
  31. (include_patterns_normal, include_patterns_hidden, include_patterns),
  32. (exclude_patterns_normal, exclude_patterns_hidden, exclude_patterns),
  33. ):
  34. for pattern in patterns:
  35. if (pattern if pattern.find('/') == -1 else pattern.rsplit('/', 1)[1]).startswith('.'):
  36. hid.append(pattern)
  37. else:
  38. vis.append(pattern)
  39. re_patterns = map(pattern_to_regexp, vis + hid)
  40. if sys.platform in ('win32', 'darwin'):
  41. re_patterns = [re.compile(i, re.IGNORECASE) for i in re_patterns]
  42. else:
  43. re_patterns = [re.compile(i) for i in re_patterns]
  44. vis[:], hid[:] = re_patterns[: len(vis)], re_patterns[len(vis) :]
  45. for inc_patterns, exc_patterns, with_hidden_files in (
  46. (include_patterns_normal, exclude_patterns_normal, False),
  47. (include_patterns_hidden, exclude_patterns_hidden, True),
  48. ):
  49. for f in list_all_files(srcdir, hidden_files=with_hidden_files):
  50. excluded = False
  51. for exc_re in exc_patterns:
  52. if exc_re.match(f):
  53. excluded = True
  54. break
  55. if excluded:
  56. continue
  57. for inc_re in inc_patterns:
  58. if inc_re.match(f):
  59. s = os.path.normpath(f[1:])
  60. if all_resources or not (f.endswith('.java') or f.endswith('.kt')):
  61. result['not_java'].append(s)
  62. elif f.endswith('.java'):
  63. result['java'].append(os.path.join(srcdir, s))
  64. elif f.endswith('.kt') and resolve_kotlin:
  65. result['kotlin'].append(os.path.join(srcdir, s))
  66. else:
  67. result['not_java'].append(s)
  68. break
  69. return sorted(result['java']), sorted(result['not_java']), sorted(result['kotlin'])
  70. def resolve_sources_and_fill_filelists(
  71. directory,
  72. sources_file,
  73. resources_file,
  74. kotlin_sources_file,
  75. include_patterns,
  76. exclude_patterns,
  77. resolve_kotlin,
  78. append,
  79. all_resources,
  80. ):
  81. j, r, k = resolve_java_srcs(directory, include_patterns, exclude_patterns, all_resources, resolve_kotlin)
  82. mode = 'a' if append else 'w'
  83. open(sources_file, mode).writelines(i + '\n' for i in j)
  84. open(resources_file, mode).writelines(i + '\n' for i in r)
  85. if kotlin_sources_file:
  86. open(kotlin_sources_file, mode).writelines(i + '\n' for i in k + j)
  87. def cli_main(argv, force_skip_source_jars=False):
  88. parser = argparse.ArgumentParser()
  89. parser.add_argument('-d', '--directory', required=True)
  90. parser.add_argument('-s', '--sources-file', required=True)
  91. parser.add_argument('-r', '--resources-file', required=True)
  92. parser.add_argument('-k', '--kotlin-sources-file', default=None)
  93. parser.add_argument('--append', action='store_true', default=False)
  94. parser.add_argument('--all-resources', action='store_true', default=False)
  95. parser.add_argument('--resolve-kotlin', action='store_true', default=False)
  96. parser.add_argument('--include-patterns', nargs='*', default=[])
  97. parser.add_argument('--exclude-patterns', nargs='*', default=[])
  98. args = parser.parse_args(argv)
  99. if force_skip_source_jars and args.all_resources:
  100. return
  101. resolve_sources_and_fill_filelists(**vars(args))
  102. if __name__ == '__main__':
  103. cli_main(sys.argv[1:])