Merge changes I5f3b98aa,I6077d014,I276dbb46
* changes:
sourcedr: Remove incomplete sourcedr
sourcedr: Add missing __init__.py
sourcedr: Move sub-projects to parent directory
diff --git a/vndk/tools/definition-tool/tools/update_dataset_auto.py b/vndk/tools/definition-tool/tools/update_dataset_auto.py
index 4527044..39504a7 100755
--- a/vndk/tools/definition-tool/tools/update_dataset_auto.py
+++ b/vndk/tools/definition-tool/tools/update_dataset_auto.py
@@ -13,8 +13,7 @@
__file__, '..', 'update_dataset.py'))
LIST_VNDK_MODULE = os.path.abspath(os.path.join(
- __file__, '..', '..', '..', 'sourcedr', 'sourcedr', 'blueprint',
- 'list_vndk_module.py'))
+ __file__, '..', '..', '..', 'sourcedr', 'blueprint', 'list_vndk_module.py'))
def update_eligible_list(path, make_vars, module_info):
diff --git a/vndk/tools/sourcedr/README.md b/vndk/tools/sourcedr/README.md
index da9ed79..aad530b 100644
--- a/vndk/tools/sourcedr/README.md
+++ b/vndk/tools/sourcedr/README.md
@@ -1,64 +1,8 @@
-# Source Deps Reviewer
+# Source Dr.
-## Synopsis
+This is a collection of source tree analysis tools.
-This is a tool for labeling dependencies with a web interface.
-
-Basically, it greps the specified directory for the given pattern,
-and let human reviewers label their dependencies, even code dependencies,
-which are code segments that are highly related to the specific pattern.
-
-## Installation and Dependencies
-
-This tool depends on [codesearch](https://github.com/google/codesearch)
-to generate regular expression index, please install them with:
-
-```
-$ go get github.com/google/codesearch/cmd/cindex
-$ go get github.com/google/codesearch/cmd/csearch
-```
-
-This tool depends on several Python packages,
-
-```
-$ pip install -e .
-```
-
-To run functional test, please do
-
-```
-$ pip install -e .[dev]
-```
-
-Prism, a code syntax highlighter is used.
-It can be found at https://github.com/PrismJS/prism
-
-## Usage
-
-Initialize a project:
-
-```
-sourcedr init --source-dir [android-src] [project-dir]
-```
-
-Scan the codebase:
-
-```
-sourcedr scan
-```
-
-If there are occurrences that are not reviewed, then review the occurrences
-with:
-
-```
-sourcedr review
-```
-
-Open browser and visit [http://localhost:5000](http://localhost:5000).
-
-
-## Testing
-
-```
-$ python3 sourcedr/functional_tests.py
-```
+- [blueprint](blueprint) analyzes Android.bp and the dependencies between the
+ modules.
+- [ninja](ninja) analyzes `$(OUT)/combined-${target}.ninja`, which contains all
+ file dependencies.
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/.gitignore b/vndk/tools/sourcedr/blueprint/.gitignore
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/.gitignore
rename to vndk/tools/sourcedr/blueprint/.gitignore
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/.pylintrc b/vndk/tools/sourcedr/blueprint/.pylintrc
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/.pylintrc
rename to vndk/tools/sourcedr/blueprint/.pylintrc
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/analyze_manifest_split.py b/vndk/tools/sourcedr/blueprint/analyze_manifest_split.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/analyze_manifest_split.py
rename to vndk/tools/sourcedr/blueprint/analyze_manifest_split.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/blueprint.py b/vndk/tools/sourcedr/blueprint/blueprint.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/blueprint.py
rename to vndk/tools/sourcedr/blueprint/blueprint.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/check_vndk_dep.py b/vndk/tools/sourcedr/blueprint/check_vndk_dep.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/check_vndk_dep.py
rename to vndk/tools/sourcedr/blueprint/check_vndk_dep.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/list_vndk_module.py b/vndk/tools/sourcedr/blueprint/list_vndk_module.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/list_vndk_module.py
rename to vndk/tools/sourcedr/blueprint/list_vndk_module.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/__init__.py b/vndk/tools/sourcedr/blueprint/tests/__init__.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/__init__.py
rename to vndk/tools/sourcedr/blueprint/tests/__init__.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/run_tests.sh b/vndk/tools/sourcedr/blueprint/tests/run_tests.sh
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/run_tests.sh
rename to vndk/tools/sourcedr/blueprint/tests/run_tests.sh
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/test_ast.py b/vndk/tools/sourcedr/blueprint/tests/test_ast.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/test_ast.py
rename to vndk/tools/sourcedr/blueprint/tests/test_ast.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/test_evaluate_default.py b/vndk/tools/sourcedr/blueprint/tests/test_evaluate_default.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/test_evaluate_default.py
rename to vndk/tools/sourcedr/blueprint/tests/test_evaluate_default.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/test_lexer.py b/vndk/tools/sourcedr/blueprint/tests/test_lexer.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/test_lexer.py
rename to vndk/tools/sourcedr/blueprint/tests/test_lexer.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/test_module_path.py b/vndk/tools/sourcedr/blueprint/tests/test_module_path.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/test_module_path.py
rename to vndk/tools/sourcedr/blueprint/tests/test_module_path.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/test_parser.py b/vndk/tools/sourcedr/blueprint/tests/test_parser.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/test_parser.py
rename to vndk/tools/sourcedr/blueprint/tests/test_parser.py
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/testdata/example/MockBuild.txt b/vndk/tools/sourcedr/blueprint/tests/testdata/example/MockBuild.txt
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/testdata/example/MockBuild.txt
rename to vndk/tools/sourcedr/blueprint/tests/testdata/example/MockBuild.txt
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/testdata/example/bar/MockBuild.txt b/vndk/tools/sourcedr/blueprint/tests/testdata/example/bar/MockBuild.txt
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/testdata/example/bar/MockBuild.txt
rename to vndk/tools/sourcedr/blueprint/tests/testdata/example/bar/MockBuild.txt
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/tests/testdata/example/foo/MockBuild.txt b/vndk/tools/sourcedr/blueprint/tests/testdata/example/foo/MockBuild.txt
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/tests/testdata/example/foo/MockBuild.txt
rename to vndk/tools/sourcedr/blueprint/tests/testdata/example/foo/MockBuild.txt
diff --git a/vndk/tools/sourcedr/sourcedr/blueprint/vndk.py b/vndk/tools/sourcedr/blueprint/vndk.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/blueprint/vndk.py
rename to vndk/tools/sourcedr/blueprint/vndk.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/list_installed_file_from_source.py b/vndk/tools/sourcedr/ninja/list_installed_file_from_source.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/list_installed_file_from_source.py
rename to vndk/tools/sourcedr/ninja/list_installed_file_from_source.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/list_installed_module_under_source.py b/vndk/tools/sourcedr/ninja/list_installed_module_under_source.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/list_installed_module_under_source.py
rename to vndk/tools/sourcedr/ninja/list_installed_module_under_source.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/list_ninja_build_dep.py b/vndk/tools/sourcedr/ninja/list_ninja_build_dep.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/list_ninja_build_dep.py
rename to vndk/tools/sourcedr/ninja/list_ninja_build_dep.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/list_source_file.py b/vndk/tools/sourcedr/ninja/list_source_file.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/list_source_file.py
rename to vndk/tools/sourcedr/ninja/list_source_file.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/ninja.py b/vndk/tools/sourcedr/ninja/ninja.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/ninja.py
rename to vndk/tools/sourcedr/ninja/ninja.py
diff --git a/vndk/tools/sourcedr/sourcedr/tests/__init__.py b/vndk/tools/sourcedr/ninja/tests/__init__.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/tests/__init__.py
rename to vndk/tools/sourcedr/ninja/tests/__init__.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/run_tests.sh b/vndk/tools/sourcedr/ninja/tests/run_tests.sh
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/run_tests.sh
rename to vndk/tools/sourcedr/ninja/tests/run_tests.sh
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/test_ninja.py b/vndk/tools/sourcedr/ninja/tests/test_ninja.py
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/test_ninja.py
rename to vndk/tools/sourcedr/ninja/tests/test_ninja.py
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_after_good.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/bad_after_good.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_after_good.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/bad_after_good.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_non_trivial.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/bad_non_trivial.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_non_trivial.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/bad_non_trivial.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_path.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/bad_path.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_path.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/bad_path.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_trivial.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/bad_trivial.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/bad_trivial.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/bad_trivial.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/build.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/build.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/build.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/build.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/default.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/default.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/default.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/default.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/global_binding.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/global_binding.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/global_binding.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/global_binding.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/include.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/include.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/include.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/include.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/pool.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/pool.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/pool.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/pool.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/rule.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/rule.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/rule.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/rule.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/sub.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/sub.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/sub.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/sub.ninja
diff --git a/vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/subninja.ninja b/vndk/tools/sourcedr/ninja/tests/testdata/subninja.ninja
similarity index 100%
rename from vndk/tools/sourcedr/sourcedr/ninja/tests/testdata/subninja.ninja
rename to vndk/tools/sourcedr/ninja/tests/testdata/subninja.ninja
diff --git a/vndk/tools/sourcedr/requirements.txt b/vndk/tools/sourcedr/requirements.txt
deleted file mode 100644
index 9ef2006..0000000
--- a/vndk/tools/sourcedr/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-flask
-Flask-testing
diff --git a/vndk/tools/sourcedr/runtest.py b/vndk/tools/sourcedr/runtest.py
deleted file mode 100755
index 7a3e440..0000000
--- a/vndk/tools/sourcedr/runtest.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python3
-
-"""Unit tests and functional tests runner."""
-
-import argparse
-import os
-import unittest
-
-
-TESTS_DIR = os.path.join(os.path.dirname(__file__), 'sourcedr', 'tests')
-
-
-def main():
- """ Find and run unit tests and functional tests."""
-
- parser = argparse.ArgumentParser()
- parser.add_argument('--verbose', '-v', action='store_true')
- args = parser.parse_args()
-
- verbosity = 2 if args.verbose else 1
-
- loader = unittest.TestLoader()
- tests = loader.discover(TESTS_DIR, 'test_*.py')
- runner = unittest.runner.TextTestRunner(verbosity=verbosity)
- runner.run(tests)
-
-if __name__ == '__main__':
- main()
diff --git a/vndk/tools/sourcedr/setup.py b/vndk/tools/sourcedr/setup.py
deleted file mode 100755
index 7e37600..0000000
--- a/vndk/tools/sourcedr/setup.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python3
-
-from setuptools import setup
-
-setup(
- name='sourcedr',
- version='1.0',
- description='Shared Libs Deps Review Tool',
- url='https://android.googlesource.com/platform/development/+'
- '/master/vndk/tools/source-deps-reviewer/',
- packages=['sourcedr'],
- package_data={
- 'sourcedr': [
- 'defaults/pattern_db.csv',
- 'defaults/sourcedr.json',
- 'static/css/main.css',
- 'static/js/main.js',
- 'static/prism/css/prism.css',
- 'static/prism/js/prism.js',
- ],
- },
- install_requires=['flask'],
- extras_require={
- 'dev': [
- 'flask_testing'
- ],
- },
- entry_points={
- 'console_scripts': [
- 'sourcedr = sourcedr.commands:main',
- ],
- }
-)
diff --git a/vndk/tools/sourcedr/sourcedr/__init__.py b/vndk/tools/sourcedr/sourcedr/__init__.py
deleted file mode 100644
index e5a0d9b..0000000
--- a/vndk/tools/sourcedr/sourcedr/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-#!/usr/bin/env python3
diff --git a/vndk/tools/sourcedr/sourcedr/codesearch.py b/vndk/tools/sourcedr/sourcedr/codesearch.py
deleted file mode 100644
index b3c9703..0000000
--- a/vndk/tools/sourcedr/sourcedr/codesearch.py
+++ /dev/null
@@ -1,324 +0,0 @@
-#!/usr/bin/env python3
-
-"""Code indexing and searching utilities.
-
-This module will build n-gram file index with codesearch_ and use the index as
-a bloom filter to find the regular expression pattern.
-
-In addition, language-specific filters are provided to ignore matchings in
-string literals or comments in the source code.
-
-.. _codesearch: https://github.com/google/codesearch
-"""
-
-import collections
-import os
-import re
-import subprocess
-
-
-class ClikeFilter(object):
- def __init__(self, skip_literals=True, skip_comments=True):
- self.file_exts = (b'.c', b'.cpp', b'.cc', b'.cxx', b'.h', b'.hpp',
- b'.hxx', b'.java')
- self.skip_literals = skip_literals
- self.skip_comments = skip_comments
-
- def process(self, code):
- if self.skip_comments:
- # Remove // comments.
- code = re.sub(b'//[^\\r\\n]*[\\r\\n]', b'', code)
- # Remove matched /* */ comments.
- code = re.sub(b'/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/', b'', code)
- if self.skip_literals:
- # Remove matching quotes.
- code = re.sub(b'"(?:\\\\?.)*?"', b'', code)
- code = re.sub(b'\'(?:\\\\?.)*?\'', b'', code)
- return code
-
- def get_span(self, code):
- span = []
- if self.skip_comments:
- # Remove // comments.
- p = re.compile(b'//[^\\r\\n]*[\\r\\n]')
- for m in p.finditer(code):
- span.append(m.span())
- # Remove matched /* */ comments.
- p = re.compile(b'/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/')
- for m in p.finditer(code):
- span.append(m.span())
- if self.skip_literals:
- # Remove matching quotes.
- p = re.compile(b'"(?:\\\\?.)*?"')
- for m in p.finditer(code):
- span.append(m.span())
- p = re.compile(b'\'(?:\\\\?.)*?\'')
- for m in p.finditer(code):
- span.append(m.span())
- return span
-
-class PyFilter(object):
- def __init__(self, skip_literals=True, skip_comments=True):
- self.file_exts = (b'.py',)
- self.skip_literals = skip_literals
- self.skip_comments = skip_comments
-
- def process(self, code):
- if self.skip_comments:
- # Remove # comments
- code = re.sub(b'#[^\\r\\n]*[\\r\\n]', b'', code)
- if self.skip_literals:
- # Remove matching quotes.
- code = re.sub(b'"(?:\\\\?.)*?"', b'', code)
- code = re.sub(b'\'(?:\\\\?.)*?\'', b'', code)
- return code
-
- def get_span(self, code):
- span = []
- if self.skip_comments:
- # Remove # comments.
- p = re.compile(b'#[^\\r\\n]*[\\r\\n]')
- for m in p.finditer(code):
- span.append(m.span())
- if self.skip_literals:
- # Remove matching quotes.
- p = re.compile(b'"(?:\\\\?.)*?"')
- for m in p.finditer(code):
- span.append(m.span())
- p = re.compile(b'\'(?:\\\\?.)*?\'')
- for m in p.finditer(code):
- span.append(m.span())
- return span
-
-class AssemblyFilter(object):
- def __init__(self, skip_literals=True, skip_comments=True):
- self.file_exts = (b'.s', b'.S')
- self.skip_literals = skip_literals
- self.skip_comments = skip_comments
-
- def process(self, code):
- if self.skip_comments:
- # Remove @ comments
- code = re.sub(b'@[^\\r\\n]*[\\r\\n]', b'', code)
- # Remove // comments.
- code = re.sub(b'//[^\\r\\n]*[\\r\\n]', b'', code)
- # Remove matched /* */ comments.
- code = re.sub(b'/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/', b'', code)
- return code
-
- def get_span(self, code):
- span = []
- if self.skip_comments:
- # Remove # comments.
- p = re.compile(b'@[^\\r\\n]*[\\r\\n]')
- for m in p.finditer(code):
- span.append(m.span())
- # Remove // comments
- p = re.compile(b'//[^\\r\\n]*[\\r\\n]')
- for m in p.finditer(code):
- span.append(m.span())
- # Remove matched /* */ comments
- p = re.compile(b'/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/')
- for m in p.finditer(code):
- span.append(m.span())
- return span
-
-class MkFilter(object):
- def __init__(self, skip_literals=True, skip_comments=True):
- self.file_exts = (b'.mk',)
- self.skip_literals = skip_literals
- self.skip_comments = skip_comments
-
- def process(self, code):
- if self.skip_comments:
- # Remove # comments
- code = re.sub(b'#[^\\r\\n]*[\\r\\n]', b'', code)
- return code
-
- def get_span(self, code):
- span = []
- if self.skip_comments:
- # Remove # comments.
- p = re.compile(b'#[^\\r\\n]*[\\r\\n]')
- for m in p.finditer(code):
- span.append(m.span())
- return span
-
-class BpFilter(object):
- def __init__(self, skip_literals=True, skip_comments=True):
- self.file_exts = (b'.bp',)
- self.skip_literals = skip_literals
- self.skip_comments = skip_comments
-
- def process(self, code):
- if self.skip_comments:
- # Remove // comments
- code = re.sub(b'//[^\\r\\n]*[\\r\\n]', b'', code)
- return code
-
- def get_span(self, code):
- span = []
- if self.skip_comments:
- # Remove // comments.
- p = re.compile(b'//[^\\r\\n]*[\\r\\n]')
- for m in p.finditer(code):
- span.append(m.span())
- return span
-
-class PathFilter(object):
- def __init__(self, file_ext_black_list=tuple(),
- file_name_black_list=tuple(),
- path_component_black_list=tuple()):
- self.file_ext_black_list = set(
- x.encode('utf-8') for x in file_ext_black_list)
- self.file_name_black_list = set(
- x.encode('utf-8') for x in file_name_black_list)
- self.path_component_black_list = set(
- x.encode('utf-8') for x in path_component_black_list)
-
- def should_skip(self, path):
- file_name = os.path.basename(path)
- file_ext = os.path.splitext(file_name)[1]
-
- if file_ext.lower() in self.file_ext_black_list:
- return True
- if file_name in self.file_name_black_list:
- return True
- return any(patt in path for patt in self.path_component_black_list)
-
-class CodeSearch(object):
- DEFAULT_NAME = 'csearchindex'
-
- @classmethod
- def get_default_path(cls, project_dir):
- return os.path.join(project_dir, 'tmp', cls.DEFAULT_NAME)
-
- def __init__(self, root_dir, index_file_path, path_filter=None):
- self.path = os.path.abspath(index_file_path)
- self._root_dir = os.path.abspath(root_dir)
- self._env = dict(os.environ)
- self._env['CSEARCHINDEX'] = self.path
- self._filters = {}
- self._path_filter = PathFilter() if path_filter is None else path_filter
-
- def _run_cindex(self, options):
- subprocess.check_call(['cindex'] + options, env=self._env,
- cwd=self._root_dir, stdout=subprocess.DEVNULL,
- stderr=subprocess.DEVNULL)
-
- def _run_csearch(self, options):
- if not os.path.exists(self.path):
- raise ValueError('Failed to find ' + self.path)
- return subprocess.check_output(['csearch'] + options, env=self._env,
- cwd=self._root_dir,
- stderr=subprocess.DEVNULL)
-
- def add_filter(self, lang_filter):
- for ext in lang_filter.file_exts:
- self._filters[ext] = lang_filter
-
- def add_default_filters(self, skip_literals=True, skip_comments=True):
- self.add_filter(ClikeFilter(skip_literals, skip_comments))
- self.add_filter(AssemblyFilter(skip_literals, skip_comments))
- self.add_filter(PyFilter(skip_literals, skip_comments))
- self.add_filter(MkFilter(skip_literals, skip_comments))
- self.add_filter(BpFilter(skip_literals, skip_comments))
-
- def build_index(self, remove_existing_index=True):
- if remove_existing_index and os.path.exists(self.path):
- with contextlib.suppress(FileNotFoundError):
- os.remove(self.path)
- os.makedirs(os.path.dirname(self.path), exist_ok=True)
- self._run_cindex([self._root_dir])
-
- def _sanitize_code(self, file_path):
- with open(file_path, 'rb') as f:
- code = f.read()
- file_name = os.path.basename(file_path)
- f, ext = os.path.splitext(file_name)
- try:
- code = self._filters[ext].process(code)
- except KeyError:
- pass
- return code
-
- def _remove_prefix(self, raw_grep):
- ret = b''
- patt = re.compile(b'([^:]+):(\\d+):(.*)$')
- for line in raw_grep.split(b'\n'):
- match = patt.match(line)
- if not match:
- continue
- file_path = os.path.relpath(match.group(1),
- self._root_dir.encode('utf-8'))
- line_no = match.group(2)
- code = match.group(3)
- ret += file_path + b':' + line_no + b':' + code + b'\n'
- return ret
-
- def process_grep(self, raw_grep, pattern, is_regex):
- pattern = pattern.encode('utf-8')
- if not is_regex:
- pattern = re.escape(pattern)
- # Limit pattern not to match exceed a line
- # Since grep may get multiple patterns in a single entry
- pattern = re.compile(pattern + b'[^\\n\\r]*(?:\\n|\\r|$)')
-
- patt = re.compile(b'([^:]+):(\\d+):(.*)$')
- suspect = collections.defaultdict(list)
- for line in raw_grep.split(b'\n'):
- match = patt.match(line)
- if not match:
- continue
-
- file_path = match.group(1)
- line_no = match.group(2)
- code = match.group(3)
-
- if self._path_filter.should_skip(file_path):
- continue
-
- abs_file_path = os.path.join(self._root_dir.encode('utf-8'),
- file_path)
- # Check if any pattern can be found after sanitize_code
- if not pattern.search(self._sanitize_code(abs_file_path)):
- continue
- suspect[abs_file_path].append((file_path, line_no, code))
-
- suspect = sorted(suspect.items())
-
- processed = b''
- for file_path, entries in suspect:
- with open(file_path, 'rb') as f:
- code = f.read()
- # deep filter
- file_name = os.path.basename(file_path)
- f, ext = os.path.splitext(file_name)
- try:
- span = self._filters[ext].get_span(code)
- except KeyError:
- span = []
-
- matchers = [m for m in pattern.finditer(code)]
- for i, matcher in enumerate(matchers):
- if not span or all(span_ent[0] > matcher.start() or
- span_ent[1] <= matcher.start()
- for span_ent in span):
- processed += (entries[i][0] + b':' +
- entries[i][1] + b':' +
- entries[i][2] + b'\n')
-
- return processed
-
- def raw_grep(self, pattern):
- try:
- return self._remove_prefix(self._run_csearch(['-n', pattern]))
- except subprocess.CalledProcessError as e:
- if e.output == b'':
- return b''
- raise
-
- def raw_search(self, pattern, is_regex):
- if not is_regex:
- pattern = re.escape(pattern)
- return self.raw_grep(pattern)
diff --git a/vndk/tools/sourcedr/sourcedr/commands/__init__.py b/vndk/tools/sourcedr/sourcedr/commands/__init__.py
deleted file mode 100644
index 3a77a6b..0000000
--- a/vndk/tools/sourcedr/sourcedr/commands/__init__.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python3
-
-"""Parser for command line options."""
-
-import argparse
-import sys
-
-from sourcedr.commands import collect, init, scan, review
-
-
-def main():
- """Register sub-commands, parse command line options, and delegate."""
-
- parser = argparse.ArgumentParser()
- subparsers = parser.add_subparsers(dest='subcmd')
- commands = {}
-
- def _register_subcmd(name, init_argparse):
- commands[name] = init_argparse(subparsers)
-
- _register_subcmd('init', init.init_argparse)
- _register_subcmd('scan', scan.init_argparse)
- _register_subcmd('review', review.init_argparse)
- _register_subcmd('collect', collect.init_argparse)
-
- args = parser.parse_args()
-
- try:
- func = commands[args.subcmd]
- except KeyError:
- parser.print_help()
- sys.exit(1)
-
- sys.exit(func(args))
-
-
-if __name__ == '__main__':
- main()
diff --git a/vndk/tools/sourcedr/sourcedr/commands/collect.py b/vndk/tools/sourcedr/sourcedr/commands/collect.py
deleted file mode 100644
index a3b5922..0000000
--- a/vndk/tools/sourcedr/sourcedr/commands/collect.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python3
-
-"""`sourcedr collect` command."""
-
-import json
-import os
-
-from sourcedr.project import Project
-from sourcedr.map import (
- link_build_dep_and_review_data, load_build_dep_ninja, load_review_data)
-
-
-def init_argparse(parsers):
- """Initialize argument parser for `sourcedr collect`."""
- parser = parsers.add_parser('collect', help='Open web-based review UI')
- parser.add_argument('input', help='Ninja file')
- parser.add_argument('--ninja-deps')
- parser.add_argument('--project-dir', default='.')
- parser.add_argument('-o', '--output', required=True)
- return run
-
-
-def run(args):
- project_dir = os.path.expanduser(args.project_dir)
- project = Project(project_dir)
-
- # Load build dependency file
- try:
- dep = load_build_dep_ninja(args.input, project.source_dir,
- args.ninja_deps)
- except IOError:
- print('error: Failed to open build dependency file:', args.input,
- file=sys.stderr)
- sys.exit(1)
-
- # Load review data
- table = load_review_data(project.review_db.path)
-
- # Link build dependency file and review data
- res = link_build_dep_and_review_data(dep, table)
-
- # Write the output file
- with open(args.output, 'w') as f:
- json.dump(res, f, sort_keys=True, indent=4)
-
-if __name__ == '__main__':
- main()
diff --git a/vndk/tools/sourcedr/sourcedr/commands/init.py b/vndk/tools/sourcedr/sourcedr/commands/init.py
deleted file mode 100644
index e44812d..0000000
--- a/vndk/tools/sourcedr/sourcedr/commands/init.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python3
-
-"""`sourcedr init` command."""
-
-import os
-import sys
-
-from sourcedr.project import Project
-
-
-def _is_dir_empty(path):
- """Determine whether the given path is an empty directory."""
- return len(os.listdir(path)) == 0
-
-
-def init_argparse(parsers):
- """Initialize argument parser for `sourcedr init`."""
- parser = parsers.add_parser('init', help='Start a new review project')
- parser.add_argument('--project-dir', default='.')
- parser.add_argument('--android-root', required=True,
- help='Android source tree root directory')
- return run
-
-
-def run(args):
- """Main function for `sourcedr init`."""
-
- if args.project_dir == '.' and not _is_dir_empty(args.project_dir):
- print('error: Current working directory is not an empty directory.',
- file=sys.stderr)
-
- project_dir = os.path.expanduser(args.project_dir)
- source_dir = os.path.expanduser(args.android_root)
-
- Project.get_or_create_project_dir(project_dir, source_dir)
diff --git a/vndk/tools/sourcedr/sourcedr/commands/review.py b/vndk/tools/sourcedr/sourcedr/commands/review.py
deleted file mode 100644
index 190183a..0000000
--- a/vndk/tools/sourcedr/sourcedr/commands/review.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python3
-
-"""`sourcedr review` command."""
-
-import os
-
-from sourcedr.project import Project
-from sourcedr.server import create_app
-
-
-def init_argparse(parsers):
- """Initialize argument parser for `sourcedr init`."""
- parser = parsers.add_parser('review', help='Open web-based review UI')
- parser.add_argument('--project-dir', default='.')
- parser.add_argument('--rebuild-csearch-index', action='store_true',
- help='Re-build the existing csearch index file')
- return run
-
-
-def run(args):
- """Main function for `sourcedr init`."""
- project_dir = os.path.expanduser(args.project_dir)
-
- project = Project(project_dir)
- project.update_csearch_index(args.rebuild_csearch_index)
- project.update_review_db()
-
- app = create_app(project)
- app.run()
diff --git a/vndk/tools/sourcedr/sourcedr/commands/scan.py b/vndk/tools/sourcedr/sourcedr/commands/scan.py
deleted file mode 100644
index 6bc5e81..0000000
--- a/vndk/tools/sourcedr/sourcedr/commands/scan.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env python3
-
-"""`sourcedr scan` command."""
-
-
-def init_argparse(parsers):
- """Initialize argument parser for `sourcedr scan`."""
- parsers.add_parser('scan', help='Scan all pattern occurrences')
- return run
-
-
-def run(_):
- """Main function for `sourcedr scan`."""
- print('error: Need human review. Run: `sourcedr review`')
diff --git a/vndk/tools/sourcedr/sourcedr/defaults/pattern_db.csv b/vndk/tools/sourcedr/sourcedr/defaults/pattern_db.csv
deleted file mode 100644
index e5cfc12..0000000
--- a/vndk/tools/sourcedr/sourcedr/defaults/pattern_db.csv
+++ /dev/null
@@ -1 +0,0 @@
-1,\bdlopen\b
diff --git a/vndk/tools/sourcedr/sourcedr/defaults/sourcedr.json b/vndk/tools/sourcedr/sourcedr/defaults/sourcedr.json
deleted file mode 100644
index e2fe014..0000000
--- a/vndk/tools/sourcedr/sourcedr/defaults/sourcedr.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "source_dir": "",
- "file_ext_blacklist": [
- ".1",
- ".ac",
- ".cmake",
- ".html",
- ".info",
- ".la",
- ".m4",
- ".map",
- ".md",
- ".py",
- ".rst",
- ".sh",
- ".sym",
- ".txt",
- ".xml"
- ],
- "file_name_blacklist": [
- "CHANGES.0",
- "ChangeLog",
- "config.h.in",
- "configure",
- "configure.in",
- "configure.linaro",
- "libtool"
- ],
- "path_component_blacklist": [
- ".git",
- ".repo",
- "autom4te.cache",
- "binutils",
- "dejagnu",
- "llvm/Config/Config"
- ]
-}
diff --git a/vndk/tools/sourcedr/sourcedr/map.py b/vndk/tools/sourcedr/sourcedr/map.py
deleted file mode 100644
index b9d8af9..0000000
--- a/vndk/tools/sourcedr/sourcedr/map.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env python3
-
-"""This command maps source file review results to compiled binaries.
-"""
-
-import argparse
-import collections
-import itertools
-import json
-import os
-import sys
-
-from sourcedr import ninja
-from sourcedr.review_db import ReviewDB
-
-
-def load_build_dep_graph(graph):
- # Collect all shared libraries
- shared_libs = set()
- for key, value in graph.items():
- if key.split('.')[-1] == 'so':
- shared_libs.add(key)
- for v in value:
- if v.split('.')[-1] == 'so':
- shared_libs.add(v)
-
- # Collect transitive closures
- dep = {}
- for s in shared_libs:
- visited = set()
- stack = [s]
- while stack:
- v = stack.pop()
- if v not in visited:
- visited.add(v)
- try:
- stack.extend(x for x in graph[v]
- if x not in visited and not x.endswith('.so')
- and not x.endswith('.toc'))
- except KeyError:
- pass
- visited.remove(s)
- dep[s] = visited
-
- return dep
-
-
-def load_build_dep_ninja(ninja_path, work_dir, ninja_deps=None):
- manifest = ninja.Parser().parse(ninja_path, 'utf-8', ninja_deps)
- graph = collections.defaultdict(set)
- for build in manifest.builds:
- for path in itertools.chain(build.explicit_outs, build.implicit_outs):
- ins = graph[path]
- ins.update(build.explicit_ins)
- ins.update(build.implicit_ins)
- ins.update(build.depfile_implicit_ins)
- return load_build_dep_graph(graph)
-
-
-def load_build_dep_file(fp):
- return load_build_dep_graph(json.load(fp))
-
-
-def load_build_dep_file_from_path(path):
- with open(path, 'r') as fp:
- return load_build_dep_file(fp)
-
-
-def load_review_data(path):
- table = collections.defaultdict(list)
- review_db = ReviewDB(path, None)
- for key, item in review_db.data.items():
- table[key.split(':')[0]] += item[0]
- return table
-
-
-def link_build_dep_and_review_data(dep, table):
- res = collections.defaultdict(list)
- for out, ins in dep.items():
- try:
- res[out] += table[out]
- except KeyError:
- pass
-
- for in_file in ins:
- try:
- res[out] += table[in_file]
- except KeyError:
- pass
- return res
diff --git a/vndk/tools/sourcedr/sourcedr/pattern_db.py b/vndk/tools/sourcedr/sourcedr/pattern_db.py
deleted file mode 100644
index b86ae94..0000000
--- a/vndk/tools/sourcedr/sourcedr/pattern_db.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python3
-
-
-import os
-
-
-class PatternDB(object):
- """Pattern database for patterns to be searched in the source tree.
- """
-
- DEFAULT_NAME = 'pattern_db.csv'
-
-
- @classmethod
- def get_default_path(cls, project_dir):
- return os.path.join(project_dir, cls.DEFAULT_NAME)
-
-
- def __init__(self, path):
- self.path = path
- self.data = self._load()
-
-
- def _load(self):
- with open(self.path, 'r') as f:
- patterns = []
- is_regexs = []
- for line in f:
- line = line.rstrip('\n')
- sp = line.split(',')
- is_regexs.append(sp[0])
- patterns.append(','.join(sp[1:]))
- return (patterns, is_regexs)
-
-
- def load(self):
- self.data = self._load()
- return self.data
-
-
- def save_new_pattern(self, patt, is_regex):
- """Add a pattern to the database."""
- with open(self.path, 'a') as f:
- f.write(str(int(is_regex)) + ',' + patt + '\n')
diff --git a/vndk/tools/sourcedr/sourcedr/project.py b/vndk/tools/sourcedr/sourcedr/project.py
deleted file mode 100644
index f6115bd..0000000
--- a/vndk/tools/sourcedr/sourcedr/project.py
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/env python3
-
-"""SourceDR project configurations and databases.
-
-`Project` class holds configuration files, review databases, pattern databases,
-and `codesearch` index files.
-"""
-
-import collections
-import json
-import os
-import shutil
-
-from sourcedr.codesearch import CodeSearch, PathFilter
-from sourcedr.pattern_db import PatternDB
-from sourcedr.review_db import ReviewDB
-from sourcedr.utils import LockedFile
-
-
-class Config(object):
- """SourceDR project configuration file."""
-
- DEFAULT_NAME = 'sourcedr.json'
-
- _PATH_TRAVERSAL_ATTRS = (
- 'file_ext_blacklist', 'file_name_blacklist',
- 'path_component_blacklist')
-
-
- @classmethod
- def get_default_path(cls, project_dir):
- """Get the default path of the configuration file under a project
- directory."""
- return os.path.join(project_dir, cls.DEFAULT_NAME)
-
-
- def __init__(self, path):
- self.path = path
-
- self.source_dir = None
- self.file_ext_blacklist = set()
- self.file_name_blacklist = set()
- self.path_component_blacklist = set()
-
-
- def load(self):
- """Load the project configuration from the JSON file."""
- with open(self.path, 'r') as config_fp:
- config_json = json.load(config_fp)
- for key, value in config_json.items():
- if key == 'source_dir':
- self.source_dir = value
- elif key in self._PATH_TRAVERSAL_ATTRS:
- setattr(self, key, set(value))
- else:
- raise ValueError('unknown config name: ' + key)
-
-
- def save(self):
- """Save the project configuration to the JSON file."""
- with LockedFile(self.path, 'x') as config_fp:
- config = collections.OrderedDict()
- config['source_dir'] = self.source_dir
- for key in self._PATH_TRAVERSAL_ATTRS:
- config[key] = sorted(getattr(self, key))
- json.dump(config, config_fp, indent=2)
-
-
-class Project(object):
- """SourceDR project configuration files and databases."""
-
- def __init__(self, project_dir):
- """Load a project from a given project directory."""
-
- project_dir = os.path.abspath(project_dir)
- self.project_dir = project_dir
-
- if not os.path.isdir(project_dir):
- raise ValueError('project directory not found: ' + project_dir)
-
- # Load configuration files
- config_path = Config.get_default_path(project_dir)
- self.config = Config(config_path)
- self.config.load()
-
- # Recalculate source directory
- self.source_dir = os.path.abspath(
- os.path.join(project_dir, self.config.source_dir))
-
- # csearchindex file
- path_filter = PathFilter(self.config.file_ext_blacklist,
- self.config.file_name_blacklist,
- self.config.path_component_blacklist)
- csearch_index_path = CodeSearch.get_default_path(project_dir)
- self.codesearch = CodeSearch(self.source_dir, csearch_index_path,
- path_filter)
- self.codesearch.add_default_filters()
-
- # Review database file
- review_db_path = ReviewDB.get_default_path(project_dir)
- self.review_db = ReviewDB(review_db_path, self.codesearch)
-
- # Pattern database file
- pattern_db_path = PatternDB.get_default_path(project_dir)
- self.pattern_db = PatternDB(pattern_db_path)
-
- # Sanity checks
- self._check_source_dir()
- self._check_lock_files()
-
-
- def update_csearch_index(self, remove_existing_index):
- """Create or update codesearch index."""
- self.codesearch.build_index(remove_existing_index)
-
-
- def update_review_db(self):
- """Update the entries in the review database."""
- patterns, is_regexs = self.pattern_db.load()
- self.review_db.find(patterns, is_regexs)
-
-
- def _check_source_dir(self):
- """Check the availability of the source directory."""
- if not os.path.isdir(self.source_dir):
- raise ValueError('source directory not found: ' + self.source_dir)
-
-
- def _check_lock_files(self):
- """Check whether there are some lock files."""
- for path in (self.config.path, self.review_db.path,
- self.pattern_db.path):
- if LockedFile.is_locked(path):
- raise ValueError('file locked: ' + path)
-
-
- @classmethod
- def create_project_dir(cls, project_dir, source_dir):
- """Create a directory for a new project and setup default
- configurations."""
-
- if not os.path.isdir(source_dir):
- raise ValueError('source directory not found: ' + source_dir)
-
- os.makedirs(project_dir, exist_ok=True)
-
- # Compute the relative path between project_dir and source_dir
- project_dir = os.path.abspath(project_dir)
- source_dir = os.path.relpath(os.path.abspath(source_dir), project_dir)
-
- # Copy default files
- defaults_dir = os.path.join(os.path.dirname(__file__), 'defaults')
- for name in (Config.DEFAULT_NAME, PatternDB.DEFAULT_NAME):
- shutil.copyfile(os.path.join(defaults_dir, name),
- os.path.join(project_dir, name))
-
- # Update the source directory in the configuration file
- config_path = Config.get_default_path(project_dir)
- config = Config(config_path)
- config.load()
- config.source_dir = source_dir
- config.save()
-
- return Project(project_dir)
-
-
- @classmethod
- def get_or_create_project_dir(cls, project_dir, source_dir):
- config_file_path = Config.get_default_path(project_dir)
- if os.path.exists(config_file_path):
- return Project(project_dir)
- else:
- return cls.create_project_dir(project_dir, source_dir)
diff --git a/vndk/tools/sourcedr/sourcedr/review_db.py b/vndk/tools/sourcedr/sourcedr/review_db.py
deleted file mode 100644
index d72965f..0000000
--- a/vndk/tools/sourcedr/sourcedr/review_db.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/env python3
-
-import json
-import os
-import re
-
-
-class ReviewDB(object):
- DEFAULT_NAME = 'review_db.json'
-
-
- @classmethod
- def get_default_path(cls, project_dir):
- return os.path.join(project_dir, cls.DEFAULT_NAME)
-
-
- def __init__(self, path, codesearch):
- self.path = path
- self._cs = codesearch
- try:
- self.data = self._load_data()
- except FileNotFoundError:
- self.data = {}
-
-
- # patterns and is_regexs are lists
- def find(self, patterns, is_regexs):
- # they shouldn't be empty
- assert patterns and is_regexs
- processed = b''
- for pattern, is_regex in zip(patterns, is_regexs):
- if not is_regex:
- pattern = re.escape(pattern)
- raw_grep = self._cs.raw_grep(pattern)
- if raw_grep == b'':
- continue
- processed += self._cs.process_grep(raw_grep, pattern, is_regex)
- self.to_json(processed)
-
-
- def add_pattern(self, pattern, is_regex):
- if not is_regex:
- pattern = re.escape(pattern)
- raw_grep = self._cs.raw_grep(pattern)
- if raw_grep == b'':
- return
- processed = self._cs.process_grep(raw_grep, pattern, is_regex)
- self.add_to_json(processed)
-
-
- def to_json(self, processed):
- data = {}
- patt = re.compile('([^:]+):(\\d+):(.*)$')
- for line in processed.decode('utf-8').split('\n'):
- match = patt.match(line)
- if not match:
- continue
- data[line] = ([], [])
-
- # if old data exists, perform merge
- if os.path.exists(self.path):
- data.update(self._load_data())
-
- self._save_data(data)
- self.data = self._load_data()
-
-
- def add_to_json(self, processed):
- # Load all matched grep.
- data = self._load_data()
- patt = re.compile('([^:]+):(\\d+):(.*)$')
- for line in processed.decode('utf-8').split('\n'):
- match = patt.match(line)
- if not match:
- continue
- data[line] = ([], [])
-
- self._save_data(data)
- self.data = self._load_data()
-
-
- def add_label(self, label, deps, codes):
- self.data[label] = (deps, codes)
- self._save_data(self.data)
-
-
- def _save_data(self, data):
- with open(self.path, 'w') as data_fp:
- json.dump(data, data_fp, sort_keys=True, indent=4)
-
-
- def _load_data(self):
- with open(self.path, 'r') as data_fp:
- return json.load(data_fp)
diff --git a/vndk/tools/sourcedr/sourcedr/server.py b/vndk/tools/sourcedr/sourcedr/server.py
deleted file mode 100644
index 5469efe..0000000
--- a/vndk/tools/sourcedr/sourcedr/server.py
+++ /dev/null
@@ -1,165 +0,0 @@
-#!/usr/bin/env python3
-
-import collections
-import functools
-import json
-import os
-import re
-
-from flask import (
- Blueprint, Flask, current_app, jsonify, render_template, request)
-
-
-codereview = Blueprint('codereview', '__name__', 'templates')
-
-
-# whether the code segment is exactly in file
-def same(fl, code, source_dir):
- fl = os.path.join(source_dir, fl)
- with open(fl, 'r') as f:
- fc = f.read()
- return code in fc
-
-
-# check if the file needes to be reiewed again
-def check(codes, source_dir):
- ret = []
- for item in codes:
- fl = item.split(':')[0]
- code = item[len(fl) + 1:]
- ret.append(same(fl, code, source_dir))
- return ret
-
-
-@codereview.route('/get_started')
-def _get_started():
- project = current_app.config.project
- source_dir = project.source_dir
- review_db = project.review_db
-
- lst, done= [], []
- for key, item in sorted(review_db.data.items()):
- lst.append(key)
- if item[0]:
- done.append(all(check(item[1], source_dir)))
- else:
- done.append(False)
-
- pattern_lst = project.pattern_db.load()[0]
- abs_path = os.path.abspath(source_dir)
-
- return jsonify(lst=json.dumps(lst),
- done=json.dumps(done),
- pattern_lst=json.dumps(pattern_lst),
- path_prefix=os.path.join(abs_path, ''))
-
-
-@codereview.route('/load_file')
-def _load_file():
- project = current_app.config.project
- source_dir = project.source_dir
- review_db = project.review_db
-
- path = request.args.get('path')
-
- if path not in review_db.data.keys():
- print('No such entry', path)
- return jsonify(result='')
- deps, codes = review_db.data[path]
-
- return jsonify(deps=json.dumps(deps), codes=json.dumps(codes),
- okays=json.dumps(check(codes, source_dir)))
-
-
-@codereview.route('/get_file')
-def _get_file():
- path = request.args.get('path')
- path = os.path.join(current_app.config.project.source_dir, path)
-
- if not os.path.exists(path):
- return jsonify(result='No such file')
- with open(path, 'r') as f:
- code = f.read()
-
- return jsonify(result=code)
-
-
-@codereview.route('/save_all')
-def _save_all():
- label = request.args.get('label')
- deps = json.loads(request.args.get('deps'))
- codes = json.loads(request.args.get('codes'))
-
- project = current_app.config.project
- review_db = project.review_db
- review_db.add_label(label, deps, codes)
-
- return jsonify(result='done')
-
-
-# This function add pattern to grep
-@codereview.route('/add_pattern')
-def _add_pattern():
- patt = request.args.get('pattern')
- is_regex = request.args.get('is_regex')
- engine = current_app.config.project.review_db
- engine.add_pattern(patt, is_regex)
-
- project = current_app.config.project
- project.pattern_db.save_new_pattern(patt, is_regex)
- return jsonify(result='done')
-
-
-# This function does a temporary grep to the directory
-# Not adding the result to database
-@codereview.route('/temporary_search')
-def _temporary_search():
- path = request.args.get('path')
- patt = request.args.get('pattern')
- is_regex = request.args.get('is_regex')
- codesearch = current_app.config.project.codesearch
- result = codesearch.raw_search(patt, is_regex).decode('utf-8')
- dic = collections.defaultdict(list)
- patt = re.compile('([^:]+):(\\d+):(.*)$')
- for line in result.split('\n'):
- match = patt.match(line)
- if not match:
- continue
-
- file_path = match.group(1)
- line_no = match.group(2)
- code = match.group(3)
- dic[file_path].append((line_no, code))
-
- def compare(item1, item2):
- key1, value1 = item1
- key2, value2 = item2
- cnt1 = os.path.commonprefix([path, key1]).count('/')
- cnt2 = os.path.commonprefix([path, key2]).count('/')
- e1 = os.path.relpath(key1, path).count('/')
- e2 = os.path.relpath(key2, path).count('/')
- # prefer smaller edit distance
- if e1 < e2: return -1
- if e2 < e1: return 1
- # prefer deeper common ancestor
- if cnt1 > cnt2: return -1
- if cnt2 > cnt1: return 1
- # lexicographical order
- if key1 < key2: return -1
- if key2 < key1: return 1
- return 0
-
- result = sorted(dic.items(), key=functools.cmp_to_key(compare))
- return jsonify(result=json.dumps(result))
-
-
-@codereview.route('/')
-def render():
- return render_template('index.html')
-
-
-def create_app(project):
- app = Flask(__name__)
- app.register_blueprint(codereview)
- app.config.project = project
- return app
diff --git a/vndk/tools/sourcedr/sourcedr/static/css/main.css b/vndk/tools/sourcedr/sourcedr/static/css/main.css
deleted file mode 100644
index 11bb7bc..0000000
--- a/vndk/tools/sourcedr/sourcedr/static/css/main.css
+++ /dev/null
@@ -1,26 +0,0 @@
-h3, h4 {
- display: inline-block;
-}
-
-pre {
- white-space: pre-wrap; /* Since CSS 2.1 */
- white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
- white-space: -pre-wrap; /* Opera 4-6 */
- white-space: -o-pre-wrap; /* Opera 7 */
- word-wrap: break-word; /* Internet Explorer 5.5+ */
- background-color: #ffffff;
- margin: 0;
-}
-
-@media (min-width: 768px) {
- .modal-xl {
- width: 90%;
- max-width:1200px;
- }
-}
-
-.affix {
- top:50px;
- right:0;
- position:fixed;
-}
diff --git a/vndk/tools/sourcedr/sourcedr/static/js/main.js b/vndk/tools/sourcedr/sourcedr/static/js/main.js
deleted file mode 100644
index e805705..0000000
--- a/vndk/tools/sourcedr/sourcedr/static/js/main.js
+++ /dev/null
@@ -1,333 +0,0 @@
-(function () {
- 'use strict';
-
- var ccounter = 0;
- var counter = 0;
- var current_item = null;
-
- // make item list sortable
- $( function() {
- $("#item_list").sortable();
- $("#item_list").disableSelection();
- });
-
- function moveToTop(index) {
- if (index == 0) {
- return;
- }
- let target = $('#item_list').children().eq(index);
- let tp = $('#item_list').children().eq(0);
- let old_offset = target.position();
- tp.before(target);
- let new_offset = target.position();
- let tmp = target.clone().appendTo('#item_list')
- .css('position', 'absolute')
- .css('left', old_offset.left)
- .css('top', old_offset.top);
- target.hide();
- let new_pos = {'top': new_offset.top, 'left': new_offset.left};
- tmp.animate(new_pos, 'slow', function() {
- target.show();
- tmp.remove();
- });
- }
-
- function getSelText() {
- let txt = window.getSelection();
- $('#selected_text').val(txt);
- $('#code_file_path').val($('#browsing_file_path').text());
- return txt;
- }
-
- function taskHtml(text, cnt) {
- return '<li><span class="display" id="dep' + cnt + '">' + text +
- '</span>' + '<input type="text" class="edit" style="display:none"/>' +
- '<input type="submit" class="delete" value="X">' +'</li>';
- }
-
- function codeHtml(text, cnt, okay) {
- return (okay? '<li>' : '<li style="color:red;">') +
- '<span id="code' + cnt + '">' + text +
- '</span><input type="submit" class="delete" value="X">' + '</li>';
- }
-
- function itemHtml(done, text) {
- let atag = document.createElement('a');
- atag.innerText = text;
- if (done) {
- atag.className = 'list-group-item list-group-item-success';
- } else {
- atag.className = 'list-group-item list-group-item-danger';
- }
- let pretag = document.createElement('pre');
- pretag.appendChild(atag);
- pretag.onclick = setItem;
- return pretag;
- }
-
- function grepResultHtml(items) {
- let ret = document.createElement('p');
- for (let i = 0; i < items.length; i++) {
- let path = document.createElement('span');
- path.style.color = 'purple';
- path.style.fontSize = '20px';
- path.innerHTML = items[i][0];
- ret.appendChild(path);
- ret.appendChild(document.createElement('br'));
- for (let j = 0; j < items[0][1].length; j++) {
- let line_no = items[i][1][j][0];
- let content = items[i][1][j][1];
- let line_html = document.createElement('font');
- line_html.style.color = 'green';
- line_html.style.fontSize = '18px';
- line_html.innerHTML = line_no + ':';
- ret.appendChild(line_html);
- let content_html = document.createElement('span');
- content_html.style.fontSize = '18px';
- content_html.appendChild(document.createTextNode(content));
- ret.appendChild(content_html);
- ret.appendChild(document.createElement('br'));
- }
- }
- return ret;
- }
-
- function enterTask() {
- let text = $('#enter_deps').val();
- $('#deps_list').append(taskHtml(text, counter));
- $('.delete').click(function () {
- $(this).parent().remove();
- });
- counter++;
- return false;
- }
-
- function setTask(deps) {
- $('#deps_list').empty();
- counter = 0;
- let len = deps.length;
- for (let i = 0; i < len; i++) {
- let text = deps[i];
- $('#deps_list').append(taskHtml(text, counter));
- $('.delete').click(function () {
- $(this).parent().remove();
- });
- counter++;
- }
- }
-
- function enterCode() {
- let text = $('#code_file_path').val() + ':' + $('#selected_text').val();
- $('#code_list').append(codeHtml(text, ccounter, true));
- $('.delete').click(function () {
- $(this).parent().remove();
- });
- ccounter++;
- return false;
- }
-
- function setCode(codes, okays) {
- $('#code_list').empty();
- ccounter = 0;
- let len = codes.length;
- for (let i = 0; i < len; i++) {
- let text = codes[i];
- $('#code_list').append(codeHtml(text, ccounter, okays[i]));
- $('.delete').click(function () {
- $(this).parent().remove();
- });
- ccounter++;
- }
- }
-
- $(document).ready(onLoad);
-
- function onLoad() {
- $.getJSON('/get_started', {
- }, function (data) {
- $('#item_list').empty();
- $('#pattern_list').empty();
-
- const lst = JSON.parse(data.lst);
- const done = JSON.parse(data.done);
- const pattern_lst = JSON.parse(data.pattern_lst);
- let len = done.length;
- for (let i = 0; i < len; i++) {
- $('#item_list').append(itemHtml(done[i], lst[i]));
- }
- len = pattern_lst.length;
- for (let i = 0; i < len; i++) {
- $('#pattern_list').append('<li>' + pattern_lst[i] + '</li>');
- }
- $('#path_prefix').text(data.path_prefix);
- });
- }
-
- function saveAll() {
- let path = $('#file_path').text();
- let line_no = $('#line_no').text();
-
- let deps = new Array();
- for (let i = 0; i < counter; i++) {
- if ($('#dep' + i).length) {
- deps.push($('#dep' + i).text());
- }
- }
- let codes = new Array();
- for (let i = 0; i < ccounter; i++) {
- if ($('#code' + i).length) {
- codes.push($('#code' + i).text());
- }
- }
-
- if (path == '' || line_no == '') {
- return false;
- }
- if (deps.length > 0) {
- current_item.className = 'list-group-item list-group-item-success';
- } else {
- current_item.className = 'list-group-item list-group-item-danger';
- }
- $.getJSON('/save_all', {
- label: $(current_item).text(),
- deps: JSON.stringify(deps),
- codes: JSON.stringify(codes)
- });
- let target = $(current_item).text().split(':')[2];
- let children = $('#item_list')[0].children;
- let len = children.length;
- for (let i = 0; i < len; i++) {
- let tt = children[i].getElementsByTagName('a')[0].innerHTML;
- if (tt == $(current_item).text()) {
- continue;
- }
- if (children[i].getElementsByTagName('a')[0].className ==
- 'list-group-item list-group-item-success' ) {
- continue;
- }
- let content = tt.split(':')[2];
- if (content == target) {
- moveToTop(i);
- }
- }
- return false;
- }
-
- function setBrowsingFile(path) {
- $('#browsing_file_path').text(path);
- $.getJSON('/get_file', {
- path: path
- }, function (data) {
- $('#browsing_file').children().first().text(data.result);
- let obj = $('#browsing_file').children().first();
- Prism.highlightElement($('#code')[0]);
- });
- }
-
- function setHighlightLine(line_no) {
- $('#browsing_file').attr('data-line', line_no);
- }
-
- function setGotoPatternLine(line_no) {
- $('#goto_pattern_line').attr('href', '#browsing_file.' + line_no);
- }
-
- function unsetHighlightLine() {
- $('#browsing_file').removeAttr('data-line');
- // Add this line to ensure that all highlight divs are removed
- $('.line-highlight').remove();
- }
-
- function removeAnchor() {
- // Remove the # from the hash,
- // as different browsers may or may not include it
- var hash = location.hash.replace('#','');
- if (hash != '') {
- // Clear the hash in the URL
- location.hash = '';
- }
- };
-
- function setItem(evt) {
- removeAnchor();
- let item = evt.target;
- current_item = item;
- let name = $(item).text().split(':');
- let file = name[0];
- let line_no = name[1];
- $('#file_path').text(file);
- $('#line_no').text(line_no);
-
- $.getJSON('/load_file', {
- path: $(item).text()
- }, function (data) {
- let deps = JSON.parse(data.deps);
- let codes = JSON.parse(data.codes);
- let okays = JSON.parse(data.okays);
- setTask(deps);
- setCode(codes, okays);
- });
-
- setBrowsingFile(file);
- setHighlightLine(line_no);
- setGotoPatternLine(line_no);
- $('#selected_text').val('');
- $('#code_file_path').val('');
- $('#enter_deps').val('');
- $('html,body').scrollTop(0);
- return false;
- }
-
- $('#go_form').submit(function () {
- // get all the inputs into an array.
- const $inputs = $('#go_form :input');
- let values = {};
- $inputs.each(function () {
- values[this.name] = $(this).val();
- });
- let path = $('input[name="browsing_path"]').val();
- setBrowsingFile(path);
- unsetHighlightLine();
- return false;
- });
-
- $('#add_pattern').submit(function () {
- const $inputs = $('#add_pattern :input');
- let values = {};
- $inputs.each(function () {
- values[this.name] = $(this).val();
- });
- $.getJSON('/add_pattern', {
- pattern: values['pattern'],
- is_regex: $('#is_regex').is(':checked') ? 1 : 0
- });
- return true;
- });
-
- $('#temporary_search').submit(function() {
- const $inputs = $('#temporary_search :input');
- let values = {};
- $inputs.each(function () {
- values[this.name] = $(this).val();
- });
- $('#modal_title').text(values['pattern']);
- $.getJSON('/temporary_search', {
- path: $('#file_path').text(),
- pattern: values['pattern'],
- is_regex: $('#is_regex2').is(':checked') ? 1 : 0
- }, function (data) {
- $('#modal_body').append(grepResultHtml(JSON.parse(data.result)));
- $('#myModal').modal('show');
- });
- return false;
- });
- // clear previous html code in modal on hide
- $('#myModal').on('hidden.bs.modal', function () {
- $('#modal_body').empty();
- })
-
- $('#add_deps').submit(enterTask);
- $('#add_code').submit(enterCode);
- $('#save_all').submit(saveAll);
- $('#get_selection').click(getSelText);
-})();
diff --git a/vndk/tools/sourcedr/sourcedr/static/prism/MODULE_LICENSE_MIT b/vndk/tools/sourcedr/sourcedr/static/prism/MODULE_LICENSE_MIT
deleted file mode 100644
index e69de29..0000000
--- a/vndk/tools/sourcedr/sourcedr/static/prism/MODULE_LICENSE_MIT
+++ /dev/null
diff --git a/vndk/tools/sourcedr/sourcedr/static/prism/css/prism.css b/vndk/tools/sourcedr/sourcedr/static/prism/css/prism.css
deleted file mode 100644
index c4af645..0000000
--- a/vndk/tools/sourcedr/sourcedr/static/prism/css/prism.css
+++ /dev/null
@@ -1,308 +0,0 @@
-/* http://prismjs.com/download.html?themes=prism-coy&languages=clike+c&plugins=line-highlight+line-numbers */
-/**
- * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML
- * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);
- * @author Tim Shedor
- */
-
-code[class*="language-"],
-pre[class*="language-"] {
- color: black;
- background: none;
- font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.5;
-
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
-
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
-}
-
-/* Code blocks */
-pre[class*="language-"] {
- position: relative;
- margin: .5em 0;
- box-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf;
- border-left: 10px solid #358ccb;
- background-color: #fdfdfd;
- background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%);
- background-size: 3em 3em;
- background-origin: content-box;
- overflow: visible;
- padding: 0;
-}
-
-code[class*="language"] {
- max-height: inherit;
- height: 100%;
- padding: 0 1em;
- display: block;
- overflow: auto;
-}
-
-/* Margin bottom to accomodate shadow */
-:not(pre) > code[class*="language-"],
-pre[class*="language-"] {
- background-color: #fdfdfd;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin-bottom: 1em;
-}
-
-/* Inline code */
-:not(pre) > code[class*="language-"] {
- position: relative;
- padding: .2em;
- border-radius: 0.3em;
- color: #c92c2c;
- border: 1px solid rgba(0, 0, 0, 0.1);
- display: inline;
- white-space: normal;
-}
-
-pre[class*="language-"]:before,
-pre[class*="language-"]:after {
- content: '';
- z-index: -2;
- display: block;
- position: absolute;
- bottom: 0.75em;
- left: 0.18em;
- width: 40%;
- height: 20%;
- max-height: 13em;
- box-shadow: 0px 13px 8px #979797;
- -webkit-transform: rotate(-2deg);
- -moz-transform: rotate(-2deg);
- -ms-transform: rotate(-2deg);
- -o-transform: rotate(-2deg);
- transform: rotate(-2deg);
-}
-
-:not(pre) > code[class*="language-"]:after,
-pre[class*="language-"]:after {
- right: 0.75em;
- left: auto;
- -webkit-transform: rotate(2deg);
- -moz-transform: rotate(2deg);
- -ms-transform: rotate(2deg);
- -o-transform: rotate(2deg);
- transform: rotate(2deg);
-}
-
-.token.comment,
-.token.block-comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: #7D8B99;
-}
-
-.token.punctuation {
- color: #5F6364;
-}
-
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.function-name,
-.token.constant,
-.token.symbol,
-.token.deleted {
- color: #c92c2c;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.function,
-.token.builtin,
-.token.inserted {
- color: #2f9c0a;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.token.variable {
- color: #a67f59;
- background: rgba(255, 255, 255, 0.5);
-}
-
-.token.atrule,
-.token.attr-value,
-.token.keyword,
-.token.class-name {
- color: #1990b8;
-}
-
-.token.regex,
-.token.important {
- color: #e90;
-}
-
-.language-css .token.string,
-.style .token.string {
- color: #a67f59;
- background: rgba(255, 255, 255, 0.5);
-}
-
-.token.important {
- font-weight: normal;
-}
-
-.token.bold {
- font-weight: bold;
-}
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
-
-.namespace {
- opacity: .7;
-}
-
-@media screen and (max-width: 767px) {
- pre[class*="language-"]:before,
- pre[class*="language-"]:after {
- bottom: 14px;
- box-shadow: none;
- }
-
-}
-
-/* Plugin styles */
-.token.tab:not(:empty):before,
-.token.cr:before,
-.token.lf:before {
- color: #e0d7d1;
-}
-
-/* Plugin styles: Line Numbers */
-pre[class*="language-"].line-numbers {
- padding-left: 0;
-}
-
-pre[class*="language-"].line-numbers code {
- padding-left: 3.8em;
-}
-
-pre[class*="language-"].line-numbers .line-numbers-rows {
- left: 0;
-}
-
-/* Plugin styles: Line Highlight */
-pre[class*="language-"][data-line] {
- padding-top: 0;
- padding-bottom: 0;
- padding-left: 0;
-}
-pre[data-line] code {
- position: relative;
- padding-left: 4em;
-}
-pre .line-highlight {
- margin-top: 0;
-}
-
-pre[data-line] {
- position: relative;
- padding: 1em 0 1em 3em;
-}
-
-.line-highlight {
- position: absolute;
- left: 0;
- right: 0;
- padding: inherit 0;
- margin-top: 1em; /* Same as .prism’s padding-top */
-
- background: hsla(24, 20%, 50%,.08);
- background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
-
- pointer-events: none;
-
- line-height: inherit;
- white-space: pre;
-}
-
- .line-highlight:before,
- .line-highlight[data-end]:after {
- content: attr(data-start);
- position: absolute;
- top: .4em;
- left: .6em;
- min-width: 1em;
- padding: 0 .5em;
- background-color: hsla(24, 20%, 50%,.4);
- color: hsl(24, 20%, 95%);
- font: bold 65%/1.5 sans-serif;
- text-align: center;
- vertical-align: .3em;
- border-radius: 999px;
- text-shadow: none;
- box-shadow: 0 1px white;
- }
-
- .line-highlight[data-end]:after {
- content: attr(data-end);
- top: auto;
- bottom: .4em;
- }
-
-pre.line-numbers {
- position: relative;
- padding-left: 3.8em;
- counter-reset: linenumber;
-}
-
-pre.line-numbers > code {
- position: relative;
-}
-
-.line-numbers .line-numbers-rows {
- position: absolute;
- pointer-events: none;
- top: 0;
- font-size: 100%;
- left: -3.8em;
- width: 3em; /* works for line-numbers below 1000 lines */
- letter-spacing: -1px;
- border-right: 1px solid #999;
-
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
-}
-
- .line-numbers-rows > span {
- pointer-events: none;
- display: block;
- counter-increment: linenumber;
- }
-
- .line-numbers-rows > span:before {
- content: counter(linenumber);
- color: #999;
- display: block;
- padding-right: 0.8em;
- text-align: right;
- }
diff --git a/vndk/tools/sourcedr/sourcedr/static/prism/js/prism.js b/vndk/tools/sourcedr/sourcedr/static/prism/js/prism.js
deleted file mode 100644
index 743a225..0000000
--- a/vndk/tools/sourcedr/sourcedr/static/prism/js/prism.js
+++ /dev/null
@@ -1,824 +0,0 @@
-/* http://prismjs.com/download.html?themes=prism-coy&languages=clike+c&plugins=line-highlight+line-numbers */
-var _self = (typeof window !== 'undefined')
- ? window // if in browser
- : (
- (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
- ? self // if in worker
- : {} // if in node js
- );
-
-/**
- * Prism: Lightweight, robust, elegant syntax highlighting
- * MIT license http://www.opensource.org/licenses/mit-license.php/
- * @author Lea Verou http://lea.verou.me
- */
-
-var Prism = (function(){
-
-// Private helper vars
-var lang = /\blang(?:uage)?-(\w+)\b/i;
-var uniqueId = 0;
-
-var _ = _self.Prism = {
- manual: _self.Prism && _self.Prism.manual,
- util: {
- encode: function (tokens) {
- if (tokens instanceof Token) {
- return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
- } else if (_.util.type(tokens) === 'Array') {
- return tokens.map(_.util.encode);
- } else {
- return tokens.replace(/&/g, '&').replace(/</g, '<').replace(/\u00a0/g, ' ');
- }
- },
-
- type: function (o) {
- return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
- },
-
- objId: function (obj) {
- if (!obj['__id']) {
- Object.defineProperty(obj, '__id', { value: ++uniqueId });
- }
- return obj['__id'];
- },
-
- // Deep clone a language definition (e.g. to extend it)
- clone: function (o) {
- var type = _.util.type(o);
-
- switch (type) {
- case 'Object':
- var clone = {};
-
- for (var key in o) {
- if (o.hasOwnProperty(key)) {
- clone[key] = _.util.clone(o[key]);
- }
- }
-
- return clone;
-
- case 'Array':
- // Check for existence for IE8
- return o.map && o.map(function(v) { return _.util.clone(v); });
- }
-
- return o;
- }
- },
-
- languages: {
- extend: function (id, redef) {
- var lang = _.util.clone(_.languages[id]);
-
- for (var key in redef) {
- lang[key] = redef[key];
- }
-
- return lang;
- },
-
- /**
- * Insert a token before another token in a language literal
- * As this needs to recreate the object (we cannot actually insert before keys in object literals),
- * we cannot just provide an object, we need anobject and a key.
- * @param inside The key (or language id) of the parent
- * @param before The key to insert before. If not provided, the function appends instead.
- * @param insert Object with the key/value pairs to insert
- * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
- */
- insertBefore: function (inside, before, insert, root) {
- root = root || _.languages;
- var grammar = root[inside];
-
- if (arguments.length == 2) {
- insert = arguments[1];
-
- for (var newToken in insert) {
- if (insert.hasOwnProperty(newToken)) {
- grammar[newToken] = insert[newToken];
- }
- }
-
- return grammar;
- }
-
- var ret = {};
-
- for (var token in grammar) {
-
- if (grammar.hasOwnProperty(token)) {
-
- if (token == before) {
-
- for (var newToken in insert) {
-
- if (insert.hasOwnProperty(newToken)) {
- ret[newToken] = insert[newToken];
- }
- }
- }
-
- ret[token] = grammar[token];
- }
- }
-
- // Update references in other language definitions
- _.languages.DFS(_.languages, function(key, value) {
- if (value === root[inside] && key != inside) {
- this[key] = ret;
- }
- });
-
- return root[inside] = ret;
- },
-
- // Traverse a language definition with Depth First Search
- DFS: function(o, callback, type, visited) {
- visited = visited || {};
- for (var i in o) {
- if (o.hasOwnProperty(i)) {
- callback.call(o, i, o[i], type || i);
-
- if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
- visited[_.util.objId(o[i])] = true;
- _.languages.DFS(o[i], callback, null, visited);
- }
- else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
- visited[_.util.objId(o[i])] = true;
- _.languages.DFS(o[i], callback, i, visited);
- }
- }
- }
- }
- },
- plugins: {},
-
- highlightAll: function(async, callback) {
- var env = {
- callback: callback,
- selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
- };
-
- _.hooks.run("before-highlightall", env);
-
- var elements = env.elements || document.querySelectorAll(env.selector);
-
- for (var i=0, element; element = elements[i++];) {
- _.highlightElement(element, async === true, env.callback);
- }
- },
-
- highlightElement: function(element, async, callback) {
- // Find language
- var language, grammar, parent = element;
-
- while (parent && !lang.test(parent.className)) {
- parent = parent.parentNode;
- }
-
- if (parent) {
- language = (parent.className.match(lang) || [,''])[1].toLowerCase();
- grammar = _.languages[language];
- }
-
- // Set language on the element, if not present
- element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
-
- // Set language on the parent, for styling
- parent = element.parentNode;
-
- if (/pre/i.test(parent.nodeName)) {
- parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
- }
-
- var code = element.textContent;
-
- var env = {
- element: element,
- language: language,
- grammar: grammar,
- code: code
- };
-
- _.hooks.run('before-sanity-check', env);
-
- if (!env.code || !env.grammar) {
- if (env.code) {
- _.hooks.run('before-highlight', env);
- env.element.textContent = env.code;
- _.hooks.run('after-highlight', env);
- }
- _.hooks.run('complete', env);
- return;
- }
-
- _.hooks.run('before-highlight', env);
-
- if (async && _self.Worker) {
- var worker = new Worker(_.filename);
-
- worker.onmessage = function(evt) {
- env.highlightedCode = evt.data;
-
- _.hooks.run('before-insert', env);
-
- env.element.innerHTML = env.highlightedCode;
-
- callback && callback.call(env.element);
- _.hooks.run('after-highlight', env);
- _.hooks.run('complete', env);
- };
-
- worker.postMessage(JSON.stringify({
- language: env.language,
- code: env.code,
- immediateClose: true
- }));
- }
- else {
- env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
-
- _.hooks.run('before-insert', env);
-
- env.element.innerHTML = env.highlightedCode;
-
- callback && callback.call(element);
-
- _.hooks.run('after-highlight', env);
- _.hooks.run('complete', env);
- }
- },
-
- highlight: function (text, grammar, language) {
- var tokens = _.tokenize(text, grammar);
- return Token.stringify(_.util.encode(tokens), language);
- },
-
- matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
- var Token = _.Token;
-
- for (var token in grammar) {
- if(!grammar.hasOwnProperty(token) || !grammar[token]) {
- continue;
- }
-
- if (token == target) {
- return;
- }
-
- var patterns = grammar[token];
- patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
-
- for (var j = 0; j < patterns.length; ++j) {
- var pattern = patterns[j],
- inside = pattern.inside,
- lookbehind = !!pattern.lookbehind,
- greedy = !!pattern.greedy,
- lookbehindLength = 0,
- alias = pattern.alias;
-
- if (greedy && !pattern.pattern.global) {
- // Without the global flag, lastIndex won't work
- var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
- pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
- }
-
- pattern = pattern.pattern || pattern;
-
- // Don’t cache length as it changes during the loop
- for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
-
- var str = strarr[i];
-
- if (strarr.length > text.length) {
- // Something went terribly wrong, ABORT, ABORT!
- return;
- }
-
- if (str instanceof Token) {
- continue;
- }
-
- pattern.lastIndex = 0;
-
- var match = pattern.exec(str),
- delNum = 1;
-
- // Greedy patterns can override/remove up to two previously matched tokens
- if (!match && greedy && i != strarr.length - 1) {
- pattern.lastIndex = pos;
- match = pattern.exec(text);
- if (!match) {
- break;
- }
-
- var from = match.index + (lookbehind ? match[1].length : 0),
- to = match.index + match[0].length,
- k = i,
- p = pos;
-
- for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {
- p += strarr[k].length;
- // Move the index i to the element in strarr that is closest to from
- if (from >= p) {
- ++i;
- pos = p;
- }
- }
-
- /*
- * If strarr[i] is a Token, then the match starts inside another Token, which is invalid
- * If strarr[k - 1] is greedy we are in conflict with another greedy pattern
- */
- if (strarr[i] instanceof Token || strarr[k - 1].greedy) {
- continue;
- }
-
- // Number of tokens to delete and replace with the new match
- delNum = k - i;
- str = text.slice(pos, p);
- match.index -= pos;
- }
-
- if (!match) {
- if (oneshot) {
- break;
- }
-
- continue;
- }
-
- if(lookbehind) {
- lookbehindLength = match[1].length;
- }
-
- var from = match.index + lookbehindLength,
- match = match[0].slice(lookbehindLength),
- to = from + match.length,
- before = str.slice(0, from),
- after = str.slice(to);
-
- var args = [i, delNum];
-
- if (before) {
- ++i;
- pos += before.length;
- args.push(before);
- }
-
- var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);
-
- args.push(wrapped);
-
- if (after) {
- args.push(after);
- }
-
- Array.prototype.splice.apply(strarr, args);
-
- if (delNum != 1)
- _.matchGrammar(text, strarr, grammar, i, pos, true, token);
-
- if (oneshot)
- break;
- }
- }
- }
- },
-
- tokenize: function(text, grammar, language) {
- var strarr = [text];
-
- var rest = grammar.rest;
-
- if (rest) {
- for (var token in rest) {
- grammar[token] = rest[token];
- }
-
- delete grammar.rest;
- }
-
- _.matchGrammar(text, strarr, grammar, 0, 0, false);
-
- return strarr;
- },
-
- hooks: {
- all: {},
-
- add: function (name, callback) {
- var hooks = _.hooks.all;
-
- hooks[name] = hooks[name] || [];
-
- hooks[name].push(callback);
- },
-
- run: function (name, env) {
- var callbacks = _.hooks.all[name];
-
- if (!callbacks || !callbacks.length) {
- return;
- }
-
- for (var i=0, callback; callback = callbacks[i++];) {
- callback(env);
- }
- }
- }
-};
-
-var Token = _.Token = function(type, content, alias, matchedStr, greedy) {
- this.type = type;
- this.content = content;
- this.alias = alias;
- // Copy of the full string this token was created from
- this.length = (matchedStr || "").length|0;
- this.greedy = !!greedy;
-};
-
-Token.stringify = function(o, language, parent) {
- if (typeof o == 'string') {
- return o;
- }
-
- if (_.util.type(o) === 'Array') {
- return o.map(function(element) {
- return Token.stringify(element, language, o);
- }).join('');
- }
-
- var env = {
- type: o.type,
- content: Token.stringify(o.content, language, parent),
- tag: 'span',
- classes: ['token', o.type],
- attributes: {},
- language: language,
- parent: parent
- };
-
- if (env.type == 'comment') {
- env.attributes['spellcheck'] = 'true';
- }
-
- if (o.alias) {
- var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
- Array.prototype.push.apply(env.classes, aliases);
- }
-
- _.hooks.run('wrap', env);
-
- var attributes = Object.keys(env.attributes).map(function(name) {
- return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"';
- }).join(' ');
-
- return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';
-
-};
-
-if (!_self.document) {
- if (!_self.addEventListener) {
- // in Node.js
- return _self.Prism;
- }
- // In worker
- _self.addEventListener('message', function(evt) {
- var message = JSON.parse(evt.data),
- lang = message.language,
- code = message.code,
- immediateClose = message.immediateClose;
-
- _self.postMessage(_.highlight(code, _.languages[lang], lang));
- if (immediateClose) {
- _self.close();
- }
- }, false);
-
- return _self.Prism;
-}
-
-//Get current script and highlight
-var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
-
-if (script) {
- _.filename = script.src;
-
- if (document.addEventListener && !_.manual && !script.hasAttribute('data-manual')) {
- if(document.readyState !== "loading") {
- if (window.requestAnimationFrame) {
- window.requestAnimationFrame(_.highlightAll);
- } else {
- window.setTimeout(_.highlightAll, 16);
- }
- }
- else {
- document.addEventListener('DOMContentLoaded', _.highlightAll);
- }
- }
-}
-
-return _self.Prism;
-
-})();
-
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = Prism;
-}
-
-// hack for components to work correctly in node.js
-if (typeof global !== 'undefined') {
- global.Prism = Prism;
-}
-;
-Prism.languages.clike = {
- 'comment': [
- {
- pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
- lookbehind: true
- },
- {
- pattern: /(^|[^\\:])\/\/.*/,
- lookbehind: true
- }
- ],
- 'string': {
- pattern: /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
- greedy: true
- },
- 'class-name': {
- pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
- lookbehind: true,
- inside: {
- punctuation: /(\.|\\)/
- }
- },
- 'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
- 'boolean': /\b(true|false)\b/,
- 'function': /[a-z0-9_]+(?=\()/i,
- 'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
- 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
- 'punctuation': /[{}[\];(),.:]/
-};
-
-Prism.languages.c = Prism.languages.extend('clike', {
- 'keyword': /\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,
- 'operator': /\-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*\/]/,
- 'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i
-});
-
-Prism.languages.insertBefore('c', 'string', {
- 'macro': {
- // allow for multiline macro definitions
- // spaces after the # character compile fine with gcc
- pattern: /(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,
- lookbehind: true,
- alias: 'property',
- inside: {
- // highlight the path of the include statement as a string
- 'string': {
- pattern: /(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,
- lookbehind: true
- },
- // highlight macro directives as keywords
- 'directive': {
- pattern: /(#\s*)\b(define|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,
- lookbehind: true,
- alias: 'keyword'
- }
- }
- },
- // highlight predefined macros as constants
- 'constant': /\b(__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|stdin|stdout|stderr)\b/
-});
-
-delete Prism.languages.c['class-name'];
-delete Prism.languages.c['boolean'];
-
-(function(){
-
-if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
- return;
-}
-
-function $$(expr, con) {
- return Array.prototype.slice.call((con || document).querySelectorAll(expr));
-}
-
-function hasClass(element, className) {
- className = " " + className + " ";
- return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(className) > -1
-}
-
-// Some browsers round the line-height, others don't.
-// We need to test for it to position the elements properly.
-var isLineHeightRounded = (function() {
- var res;
- return function() {
- if(typeof res === 'undefined') {
- var d = document.createElement('div');
- d.style.fontSize = '13px';
- d.style.lineHeight = '1.5';
- d.style.padding = 0;
- d.style.border = 0;
- d.innerHTML = ' <br /> ';
- document.body.appendChild(d);
- // Browsers that round the line-height should have offsetHeight === 38
- // The others should have 39.
- res = d.offsetHeight === 38;
- document.body.removeChild(d);
- }
- return res;
- }
-}());
-
-function getOffsetById(id) {
- var element = document.getElementById(id);
- var bodyRect = document.body.getBoundingClientRect();
- var elemRect = element.getBoundingClientRect();
- var elementOffset = elemRect.top - bodyRect.top;
- return elementOffset;
-}
-
-function highlightLines(pre, lines, classes) {
- var ranges = lines.replace(/\s+/g, '').split(',');
- var offset = getOffsetById('browsing_file');
-
- var parseMethod = isLineHeightRounded() ? parseInt : parseFloat;
- var lineHeight = parseMethod(getComputedStyle(pre).lineHeight);
-
- for (var i=0, range; range = ranges[i++];) {
- range = range.split('-');
-
- var start = +range[0],
- end = +range[1] || start;
-
- var line = document.createElement('div');
-
- line.textContent = Array(end - start + 2).join(' \n');
- line.setAttribute('aria-hidden', 'true');
- line.className = (classes || '') + ' line-highlight';
-
- //if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers
- if(!hasClass(pre, 'line-numbers')) {
- line.setAttribute('data-start', start);
-
- if(end > start) {
- line.setAttribute('data-end', end);
- }
- }
-
- line.style.top = (getOffsetById('line_no' + start) - offset) + 'px';
-
- //allow this to play nicely with the line-numbers plugin
- if(hasClass(pre, 'line-numbers')) {
- //need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning
- pre.appendChild(line);
- } else {
- (pre.querySelector('code') || pre).appendChild(line);
- }
- }
-}
-
-function applyHash() {
- var hash = location.hash.slice(1);
-
- // Remove pre-existing temporary lines
- $$('.temporary.line-highlight').forEach(function (line) {
- line.parentNode.removeChild(line);
- });
-
- var range = (hash.match(/\.([\d,-]+)$/) || [,''])[1];
-
- if (!range || document.getElementById(hash)) {
- return;
- }
-
- var id = hash.slice(0, hash.lastIndexOf('.')),
- pre = document.getElementById(id);
-
- if (!pre) {
- return;
- }
-
- if (!pre.hasAttribute('data-line')) {
- pre.setAttribute('data-line', '');
- }
-
- highlightLines(pre, range, 'temporary ');
-
- document.querySelector('.temporary.line-highlight').scrollIntoView();
-}
-
-var fakeTimer = 0; // Hack to limit the number of times applyHash() runs
-
-Prism.hooks.add('before-sanity-check', function(env) {
- var pre = env.element.parentNode;
- var lines = pre && pre.getAttribute('data-line');
-
- if (!pre || !lines || !/pre/i.test(pre.nodeName)) {
- return;
- }
-
- /*
- * Cleanup for other plugins (e.g. autoloader).
- *
- * Sometimes <code> blocks are highlighted multiple times. It is necessary
- * to cleanup any left-over tags, because the whitespace inside of the <div>
- * tags change the content of the <code> tag.
- */
- var num = 0;
- $$('.line-highlight', pre).forEach(function (line) {
- num += line.textContent.length;
- line.parentNode.removeChild(line);
- });
-
- // Remove extra whitespace
- if (num && /^( \n)+$/.test(env.code.slice(-num))) {
- env.code = env.code.slice(0, -num);
- }
-});
-
-Prism.hooks.add('complete', function (env) {
- if (!env.code) {
- return;
- }
-
- // works only for <code> wrapped inside <pre> (not inline)
- var pre = env.element.parentNode;
- var clsReg = /\s*\bline-numbers\b\s*/;
- if (
- !pre || !/pre/i.test(pre.nodeName) ||
- // Abort only if nor the <pre> nor the <code> have the class
- (!clsReg.test(pre.className) && !clsReg.test(env.element.className))
- ) {
- return;
- }
-
- if (env.element.querySelector(".line-numbers-rows")) {
- // Abort if line numbers already exists
- return;
- }
-
- if (clsReg.test(env.element.className)) {
- // Remove the class "line-numbers" from the <code>
- env.element.className = env.element.className.replace(clsReg, '');
- }
- if (!clsReg.test(pre.className)) {
- // Add the class "line-numbers" to the <pre>
- pre.className += ' line-numbers';
- }
-
- var match = env.code.match(/\n(?!$)/g);
- var linesNum = match ? match.length + 1 : 1;
- var lineNumbersWrapper;
-
- var lines = '';
- for (let i = 1; i < linesNum + 1; i++) {
- lines += '<span id="line_no' + i + '"></span>';
- }
-
- lineNumbersWrapper = document.createElement('span');
- lineNumbersWrapper.setAttribute('aria-hidden', 'true');
- lineNumbersWrapper.className = 'line-numbers-rows';
- lineNumbersWrapper.innerHTML = lines;
-
- if (pre.hasAttribute('data-start')) {
- pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
- }
-
- env.element.appendChild(lineNumbersWrapper);
-
-});
-
-Prism.hooks.add('complete', function(env) {
- var pre = env.element.parentNode;
- var lines = pre && pre.getAttribute('data-line');
-
- if (!pre || !lines || !/pre/i.test(pre.nodeName)) {
- return;
- }
-
- clearTimeout(fakeTimer);
-
- highlightLines(pre, lines);
-
- fakeTimer = setTimeout(applyHash, 1);
-});
-
-if(window.addEventListener) {
- window.addEventListener('hashchange', applyHash);
-}
-
-})();
-
-(function() {
-
-if (typeof self === 'undefined' || !self.Prism || !self.document) {
- return;
-}
-
-}());
diff --git a/vndk/tools/sourcedr/sourcedr/templates/index.html b/vndk/tools/sourcedr/sourcedr/templates/index.html
deleted file mode 100644
index f03ced3..0000000
--- a/vndk/tools/sourcedr/sourcedr/templates/index.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <title>Source Deps Reviewer</title>
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
- <link rel="stylesheet" href="static/prism/css/prism.css"/>
- <link rel="stylesheet" href="static/css/main.css"/>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <!-- Added for sortable list -->
- <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
-</head>
-<body>
-
-<div class="container-fluid">
- <div class="row content">
- <h2 style="padding-left:20px;">Code review tool</h2>
- <ol id="item_list" class="col-sm-3"></ol>
-
- <div class="col-sm-5">
- <h3>Browsing:</h3>
- <pre><h4 id="browsing_file_path"></h4></pre><br>
- <form id="go_form">
- <div class="input-group" style="margin-bottom:10px;">
- <span class="input-group-addon" id="path_prefix"></span>
- <input type="text" class="form-control" name="browsing_path" placeholder="Enter file path here" aria-describedby="path_prefix">
- </div>
- <input class="btn btn-primary" type="submit" name="go" value="GO"/>
- <a class="btn btn-link" id="goto_pattern_line">goto pattern line</a>
- <pre id="browsing_file" class="line-numbers"><code id="code" class="language-C" style="display:inline-block;"></code></pre>
- </form>
- </div>
- <br>
-
- <div class="col-sm-4" data-spy="affix">
-
- <div class="well">
- <h3>Temporary search</h3>
- <form id="temporary_search" class="input-group" style="padding-left:20px;">
- <span class="input-group-addon">is regex</span>
- <span class="input-group-addon">
- <input type="checkbox" name="is_regex2" id="is_regex2">
- </span>
- <input type="text" name="pattern" class="form-control">
- </form>
- <h3>Add patterns to grep</h3>
- <form id="add_pattern" class="input-group" style="padding-left:20px;">
- <span class="input-group-addon">is regex</span>
- <span class="input-group-addon">
- <input type="checkbox" name="is_regex" id="is_regex">
- </span>
- <input type="text" name="pattern" class="form-control">
- </form>
- <ul id="pattern_list"></ul>
- </div>
- <div class="well">
- <h3>File labeling:</h3>
- <pre style="padding-left:20px;"><h4 id="file_path"></h4></pre>
- <h3>Pattern line number:</h3>
- <h3 id="line_no"></h3><br>
- <h3>Library Dependencies</h3>
- <form id="add_deps" class="input-group">
- <input type="text" class="form-control" id="enter_deps" placeholder="Fill in * if undetermined"/>
- <span class="input-group-btn">
- <input class="btn btn-secondary" type="submit" value="Add"/>
- </span>
- </form>
- <ul id="deps_list"></ul>
- <h3>Code Dependencies</h3>
- <form id="add_code">
- <input class="btn btn-secondary" type="button" id="get_selection" value="Get selection"/>
- <input class="btn btn-secondary" type="submit" id="add_code" value="Add"/><br>
- <input type="text" id="code_file_path" style="margin: 0px; width: 100%;"/>
- <textarea id="selected_text" name="selectedtext" rows="5" style="margin: 0px; width: 100%; height: 106px;"></textarea>
- </form>
- <ul id="code_list"></ul>
- <form id="save_all">
- <input class="btn btn-secondary" type="submit" value="Save All"/>
- </form>
- </div>
- </div>
- </div>
-</div>
-
-<!-- Modal -->
-<div class="modal fade" id="myModal" role="dialog">
- <div class="modal-dialog modal-xl">
- <!-- Modal content-->
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal">×</button>
- <h4 id="modal_title" class="modal-title"></h4>
- </div>
- <div id="modal_body" class="modal-body">
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
- </div>
- </div>
- </div>
-</div>
-
-<script type="text/javascript" src="static/js/main.js"></script>
-<!-- for code prettyify -->
-<script src="static/prism/js/prism.js"></script>
-
-</body>
-</html>
-
diff --git a/vndk/tools/sourcedr/sourcedr/tests/test_map.py b/vndk/tools/sourcedr/sourcedr/tests/test_map.py
deleted file mode 100644
index c30a898..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/test_map.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import unittest
-
-from sourcedr.map import (
- link_build_dep_and_review_data, load_build_dep_file_from_path,
- load_build_dep_ninja, load_review_data)
-
-
-TESTDATA_DIR = os.path.join(os.path.dirname(__file__), 'testdata')
-
-
-class MapTest(unittest.TestCase):
- MAP_TESTDATA_DIR = os.path.join(TESTDATA_DIR, 'map')
- DEP_PATH = os.path.join(MAP_TESTDATA_DIR, 'build_dep.json')
- REVIEW_DB_PATH = os.path.join(MAP_TESTDATA_DIR, 'data.json')
- NINJA_PATH = os.path.join(MAP_TESTDATA_DIR, 'build.ninja')
- NINJA_DEP_PATH = os.path.join(MAP_TESTDATA_DIR, 'ninja_deps')
-
-
- def test_load_build_dep_file(self):
- dep = load_build_dep_file_from_path(self.DEP_PATH)
-
- self.assertIn('liba.so', dep)
- self.assertIn('libb.so', dep)
- self.assertIn('libc.so', dep)
-
- self.assertSetEqual({'a.h', 'a1.c', 'a1.o', 'a2.c', 'a2.o'},
- dep['liba.so'])
- self.assertSetEqual({'a.h', 'b.c', 'b.o'}, dep['libb.so'])
- self.assertSetEqual({'c.c', 'c.o'}, dep['libc.so'])
-
-
- def test_load_build_dep_ninja(self):
- dep = load_build_dep_ninja(self.NINJA_PATH, self.MAP_TESTDATA_DIR,
- self.NINJA_DEP_PATH)
-
- self.assertIn('liba.so', dep)
- self.assertIn('libb.so', dep)
- self.assertIn('libc.so', dep)
-
- self.assertSetEqual({'a.h', 'a1.c', 'a1.o', 'a2.c', 'a2.o'},
- dep['liba.so'])
- self.assertSetEqual({'a.h', 'b.c', 'b.o'}, dep['libb.so'])
- self.assertSetEqual({'c.c', 'c.o'}, dep['libc.so'])
-
-
- def test_load_review_data(self):
- data = load_review_data(self.REVIEW_DB_PATH)
- self.assertIn('a.h', data)
- self.assertEqual(['libx.so'], data['a.h'])
-
-
- def test_link_build_dep_and_review_data(self):
- dep = load_build_dep_file_from_path(self.DEP_PATH)
- data = load_review_data(self.REVIEW_DB_PATH)
- result = link_build_dep_and_review_data(dep, data)
-
- self.assertIn('liba.so', result)
- self.assertIn('libb.so', result)
- self.assertIn('libc.so', result)
-
- self.assertEqual(['libx.so'], result['liba.so'])
- self.assertEqual(['libx.so'], result['libb.so'])
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/vndk/tools/sourcedr/sourcedr/tests/test_project.py b/vndk/tools/sourcedr/sourcedr/tests/test_project.py
deleted file mode 100644
index 10afc5a..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/test_project.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import tempfile
-import unittest
-
-from sourcedr.project import Config
-
-
-TESTDATA_DIR = os.path.join(os.path.dirname(__file__), 'testdata')
-
-
-class ConfigTest(unittest.TestCase):
- PROJECT_DIR = os.path.join(TESTDATA_DIR, 'project')
- CONFIG_PATH = os.path.join(PROJECT_DIR, Config.DEFAULT_NAME)
-
-
- def test_load(self):
- config = Config(self.CONFIG_PATH)
- config.load()
- self.assertEqual('path/to/android/src', config.source_dir)
-
-
- def test_save(self):
- with tempfile.TemporaryDirectory(prefix='test_sourcedr_') as tmp_dir:
- config_path = Config.get_default_path(tmp_dir)
- config = Config(config_path)
- config.source_dir = 'path/to/android/src'
- config.save()
- with open(config_path, 'r') as actual_fp:
- actual = actual_fp.read().strip()
- with open(self.CONFIG_PATH, 'r') as expected_fp:
- expected = expected_fp.read().strip()
- self.assertEqual(actual, expected)
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/vndk/tools/sourcedr/sourcedr/tests/test_review_db.py b/vndk/tools/sourcedr/sourcedr/tests/test_review_db.py
deleted file mode 100644
index d1cdc09..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/test_review_db.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import unittest
-
-from sourcedr.codesearch import CodeSearch
-from sourcedr.review_db import ReviewDB
-
-
-TESTDATA_DIR = os.path.join(os.path.dirname(__file__), 'testdata')
-ANDROID_DIR = os.path.join(TESTDATA_DIR, 'android_src')
-
-
-class ReviewDBTest(unittest.TestCase):
- def setUp(self):
- self.csearch_index_path = 'csearchindex'
- self.review_db_path = ReviewDB.DEFAULT_NAME
-
-
- def tearDown(self):
- os.remove(self.csearch_index_path)
- os.remove(self.review_db_path)
-
-
- def test_preprocess(self):
- codesearch = CodeSearch(ANDROID_DIR, self.csearch_index_path)
- codesearch.build_index()
- review_db = ReviewDB(ReviewDB.DEFAULT_NAME, codesearch)
- review_db.find(patterns=['dlopen'], is_regexs=[False])
- self.assertTrue(os.path.exists(ReviewDB.DEFAULT_NAME))
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/vndk/tools/sourcedr/sourcedr/tests/test_server.py b/vndk/tools/sourcedr/sourcedr/tests/test_server.py
deleted file mode 100644
index 9a8a46f..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/test_server.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python3
-
-import json
-import os
-import tempfile
-import unittest
-
-import flask_testing
-
-from sourcedr.project import Project
-from sourcedr.review_db import ReviewDB
-from sourcedr.server import create_app
-
-
-TESTDATA_DIR = os.path.join(os.path.dirname(__file__), 'testdata')
-ANDROID_DIR = os.path.join(TESTDATA_DIR, 'android_src')
-
-
-class ViewTest(flask_testing.TestCase):
- def create_app(self):
- self.tmp_dir = tempfile.TemporaryDirectory(prefix='test_sourcedr_')
- project = Project.get_or_create_project_dir(
- self.tmp_dir.name, ANDROID_DIR)
- project.update_csearch_index(True)
- self.project = project
-
- app = create_app(project)
- app.config['TESTING'] = True
- self.app = app
- return app
-
-
- def setUp(self):
- review_db = self.project.review_db
- review_db.find(patterns=['dlopen'], is_regexs=[False])
-
-
- def tearDown(self):
- self.tmp_dir.cleanup()
-
-
- def test_get_file(self):
- test_arg = 'example.c'
- response = self.client.get('/get_file',
- query_string=dict(path=test_arg))
- ret = response.json['result']
- with open(os.path.join(ANDROID_DIR, test_arg), 'r') as f:
- self.assertEqual(ret, f.read())
-
-
- def test_load_file(self):
- test_arg = 'dlopen/test.c'
- test_arg += ':10: handle = dlopen("libm.so.6", RTLD_LAZY);'
- response = self.client.get('/load_file',
- query_string=dict(path=test_arg))
- deps = json.loads(response.json['deps'])
- codes = json.loads(response.json['codes'])
- with open(self.project.review_db.path, 'r') as f:
- cdata = json.load(f)
-
- self.assertEqual(deps, cdata[test_arg][0])
- self.assertEqual(codes, cdata[test_arg][1])
-
-
- def test_save_all(self):
- label = os.path.abspath('sourcedr/test/dlopen/test.c')
- label += ':10: handle = dlopen("libm.so.6", RTLD_LAZY);'
- test_arg = {
- 'label': label,
- 'deps': json.dumps(['this_is_a_test.so']),
- 'codes': json.dumps(['arr_0', 'arr_1'])
- }
- response = self.client.get('/save_all', query_string=test_arg)
- cdata = ReviewDB(self.project.review_db.path, None).data
- self.assertEqual(['this_is_a_test.so'], cdata[test_arg['label']][0])
- self.assertEqual(['arr_0', 'arr_1'], cdata[test_arg['label']][1])
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/build.ninja b/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/build.ninja
deleted file mode 100644
index 2cc71de..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/build.ninja
+++ /dev/null
@@ -1,15 +0,0 @@
-rule cc
- command = gcc -c -o $out $in -MMD -MF $out.d
- deps = gcc
- depfile = $out.d
-
-rule ld
- command = gcc -o $out $in
-
-build example.o: cc example.c
-
-build example.so: ld example.o
-
-build dlopen/test.o: cc dlopen/test.c
-
-build dlopen/test.so: ld dlopen/test.o
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/dlopen/test.c b/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/dlopen/test.c
deleted file mode 100644
index c305569..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/dlopen/test.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <dlfcn.h>
-
-int main(int argc, char **argv) {
- void *handle;
- double (*cosine)(double);
- char *error;
-
- handle = dlopen("libm.so.6", RTLD_LAZY);
- if (!handle) {
- fputs (dlerror(), stderr);
- exit(1);
- }
-
- cosine = dlsym(handle, "cos");
- if ((error = dlerror()) != NULL) {
- fputs(error, stderr);
- exit(1);
- }
-
- printf ("%f\n", (*cosine)(2.0));
- dlclose(handle);
-}
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/example.c b/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/example.c
deleted file mode 100644
index f8e329f..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/example.c
+++ /dev/null
@@ -1,10 +0,0 @@
-int main() {
- printf("This is a simple testing file\n");
- int dlopen_analysis = 1;
- "This line with dlopen shouldn't be found"
- /*
- * This dlopen shouldn't be found
- */
- dlopen("dlopen");
- handle = dlopen("libm.so.6", RTLD_LAZY);
-}
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/example.txt b/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/example.txt
deleted file mode 100644
index 27f787e..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/android_src/example.txt
+++ /dev/null
@@ -1 +0,0 @@
-dlopen() in .txt file should not be matched
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/build.ninja b/vndk/tools/sourcedr/sourcedr/tests/testdata/map/build.ninja
deleted file mode 100644
index 5f732ac..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/build.ninja
+++ /dev/null
@@ -1,21 +0,0 @@
-rule cc
- command = gcc -c -o $out $in -MMD -MF $out.d
- deps = gcc
- depfile = $out.d
-
-rule ld
- command = gcc -o $out $in
-
-build liba.so: ld a1.o a2.o
-
-build libb.so: ld b.o
-
-build libc.so: ld c.o
-
-build a1.o: cc a1.c
-
-build a2.o: cc a2.c
-
-build b.o: cc b.c
-
-build c.o: cc c.c
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/build_dep.json b/vndk/tools/sourcedr/sourcedr/tests/testdata/map/build_dep.json
deleted file mode 100644
index d8b6f49..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/build_dep.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "liba.so": ["libb.so", "libc.so", "a1.o", "a2.o"],
- "libb.so": ["b.o"],
- "libc.so": ["c.o"],
- "a1.o": ["a.h", "a1.c"],
- "a2.o": ["a.h", "a2.c"],
- "b.o": ["a.h", "b.c"],
- "c.o": ["c.c"]
-}
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/data.json b/vndk/tools/sourcedr/sourcedr/tests/testdata/map/data.json
deleted file mode 100644
index 0d1bfe2..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/data.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "a.h:2:dlopen(\"libx.so\",": [
- ["libx.so"],
- ["a.h:2:dlopen(\"libx.so\","]
- ]
-}
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/ninja_deps b/vndk/tools/sourcedr/sourcedr/tests/testdata/map/ninja_deps
deleted file mode 100644
index 78414b3..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/map/ninja_deps
+++ /dev/null
Binary files differ
diff --git a/vndk/tools/sourcedr/sourcedr/tests/testdata/project/sourcedr.json b/vndk/tools/sourcedr/sourcedr/tests/testdata/project/sourcedr.json
deleted file mode 100644
index e9126d8..0000000
--- a/vndk/tools/sourcedr/sourcedr/tests/testdata/project/sourcedr.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "source_dir": "path/to/android/src",
- "file_ext_blacklist": [],
- "file_name_blacklist": [],
- "path_component_blacklist": []
-}
diff --git a/vndk/tools/sourcedr/sourcedr/utils.py b/vndk/tools/sourcedr/sourcedr/utils.py
deleted file mode 100644
index 168e437..0000000
--- a/vndk/tools/sourcedr/sourcedr/utils.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env python3
-
-"""Utility functions or classes."""
-
-import os
-
-
-class LockedFile(object): # pylint: disable=too-few-public-methods
- """Open a file with `.lock` file and rename it if everything goes well."""
-
-
- def __init__(self, path, mode):
- assert 'x' in mode
- self._path = path
- self._mode = mode
- self._fp = None
-
-
- def __enter__(self):
- """Open the file at the specified path and with specified mode."""
- self._fp = open(self._get_locked_path(self._path), self._mode)
- return self._fp
-
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- """Close the file object and rename the file if there are no
- exceptions."""
- self._fp.close()
- self._fp = None
- if exc_val is None:
- os.rename(self._get_locked_path(self._path), self._path)
-
-
- @classmethod
- def _get_locked_path(cls, path):
- """Get the file path for the `.lock` file."""
- return path + '.lock'
-
-
- @classmethod
- def is_locked(cls, path):
- """Check whether a path is locked."""
- return os.path.exists(cls._get_locked_path(path))