query: Move CLI to utils/query.py
Call with python3 -m utils.query
This commit is contained in:
parent
6a071ff590
commit
0dcf9d4197
4 changed files with 68 additions and 120 deletions
|
|
@ -142,8 +142,8 @@ ____
|
|||
|
||||
Verify that the queries work:
|
||||
|
||||
$ ./elixir/query.py v4.10 ident raw_spin_unlock_irq C
|
||||
$ ./elixir/query.py v4.10 file /kernel/sched/clock.c
|
||||
$ python3 -m utils.query ident v4.10 raw_spin_unlock_irq C
|
||||
$ python3 -m utils.query file v4.10 /kernel/sched/clock.c
|
||||
|
||||
NOTE: `v4.10` can be replaced with any other tag.
|
||||
NOTE: Don't forget to activate the virtual environment!
|
||||
|
|
|
|||
|
|
@ -182,6 +182,9 @@ class BsdDB:
|
|||
def close(self):
|
||||
self.db.close()
|
||||
|
||||
def __len__(self):
|
||||
return self.db.stat()["nkeys"]
|
||||
|
||||
class DB:
|
||||
def __init__(self, dir, readonly=True, dtscomp=False, shared=False):
|
||||
if os.path.isdir(dir):
|
||||
|
|
|
|||
118
elixir/query.py
118
elixir/query.py
|
|
@ -79,85 +79,6 @@ class Query:
|
|||
def close(self):
|
||||
self.db.close()
|
||||
|
||||
def query(self, cmd, *args):
|
||||
if cmd == 'versions':
|
||||
return self.get_versions()
|
||||
|
||||
elif cmd == 'latest':
|
||||
return self.get_latest_tag()
|
||||
|
||||
elif cmd == 'type':
|
||||
version = args[0]
|
||||
path = args[1]
|
||||
return self.get_file_type(version, path)
|
||||
|
||||
elif cmd == 'exist':
|
||||
version = args[0]
|
||||
path = args[1]
|
||||
return self.file_exists(version, path)
|
||||
|
||||
elif cmd == 'dir':
|
||||
version = args[0]
|
||||
path = args[1]
|
||||
return self.get_dir_contents(version, path)
|
||||
|
||||
elif cmd == 'file':
|
||||
version = args[0]
|
||||
path = args[1]
|
||||
return self.get_tokenized_file(version, path)
|
||||
|
||||
elif cmd == 'family':
|
||||
# Get the family of a given file
|
||||
filename = args[0]
|
||||
|
||||
return lib.getFileFamily(filename)
|
||||
|
||||
elif cmd == 'dts-comp':
|
||||
return self.supports_dts_comp()
|
||||
|
||||
elif cmd == 'dts-comp-exists':
|
||||
ident = args[0]
|
||||
return self.dts_comp_exists(ident)
|
||||
|
||||
elif cmd == 'keys':
|
||||
# Return all keys of a given database
|
||||
# /!\ This can take a while /!\
|
||||
|
||||
name = args[0]
|
||||
|
||||
if name == 'vars':
|
||||
return self.db.vars.get_keys()
|
||||
elif name == 'blob':
|
||||
return self.db.blob.get_keys()
|
||||
elif name == 'hash':
|
||||
return self.db.hash.get_keys()
|
||||
elif name == 'file':
|
||||
return self.db.file.get_keys()
|
||||
elif name == 'vers':
|
||||
return self.db.vers.get_keys()
|
||||
elif name == 'defs':
|
||||
return self.db.defs.get_keys()
|
||||
elif name == 'refs':
|
||||
return self.db.refs.get_keys()
|
||||
elif name == 'docs':
|
||||
return self.db.docs.get_keys()
|
||||
elif name == 'comps' and self.dts_comp_support:
|
||||
return self.db.comps.get_keys()
|
||||
elif name == 'comps_docs' and self.dts_comp_support:
|
||||
return self.db.comps_docs.get_keys()
|
||||
else:
|
||||
return []
|
||||
|
||||
elif cmd == 'ident':
|
||||
version = args[0]
|
||||
ident = args[1]
|
||||
family = args[2]
|
||||
|
||||
return self.search_ident(version, ident, family)
|
||||
|
||||
else:
|
||||
return 'Unknown subcommand: ' + cmd + '\n'
|
||||
|
||||
# Get state of dts_comp_support
|
||||
def supports_dts_comp(self):
|
||||
return self.dts_comp_support
|
||||
|
|
@ -416,42 +337,3 @@ class Query:
|
|||
|
||||
return symbol_definitions, symbol_references, symbol_doccomments
|
||||
|
||||
|
||||
def cmd_ident(q, version, ident, family, **kwargs):
|
||||
symbol_definitions, symbol_references, symbol_doccomments = q.search_ident(version, ident, family)
|
||||
print("Symbol Definitions:")
|
||||
for symbol_definition in symbol_definitions:
|
||||
print(symbol_definition)
|
||||
|
||||
print("\nSymbol References:")
|
||||
for symbol_reference in symbol_references:
|
||||
print(symbol_reference)
|
||||
|
||||
print("\nDocumented in:")
|
||||
for symbol_doccomment in symbol_doccomments:
|
||||
print(symbol_doccomment)
|
||||
|
||||
def cmd_file(q, version, path, **kwargs):
|
||||
code = q.get_tokenized_file(version, path)
|
||||
print(code)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import argparse
|
||||
|
||||
query = Query(lib.getDataDir(), lib.getRepoDir())
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("version", help="The version of the project", type=str, default="latest")
|
||||
subparsers = parser.add_subparsers()
|
||||
|
||||
ident_subparser = subparsers.add_parser('ident', help="Get definitions and references of an identifier")
|
||||
ident_subparser.add_argument('ident', type=str, help="The name of the identifier")
|
||||
ident_subparser.add_argument('family', type=str, help="The file family requested")
|
||||
ident_subparser.set_defaults(func=cmd_ident, q=query)
|
||||
|
||||
file_subparser = subparsers.add_parser('file', help="Get a source file")
|
||||
file_subparser.add_argument('path', type=str, help="The path of the source file")
|
||||
file_subparser.set_defaults(func=cmd_file, q=query)
|
||||
|
||||
args = parser.parse_args()
|
||||
args.func(**vars(args))
|
||||
|
|
|
|||
63
utils/query.py
Normal file
63
utils/query.py
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
from elixir.query import Query
|
||||
from elixir import lib
|
||||
|
||||
def cmd_stats(q, **kwargs):
|
||||
print("Versions: ", len(q.db.vers))
|
||||
print("Blobs: ", len(q.db.blob))
|
||||
if len(q.db.blob) != len(q.db.hash) or len(q.db.hash) != len(q.db.file):
|
||||
print("Warning, number of blobs, hashes or files is not equal")
|
||||
print("Definitions: ", len(q.db.defs))
|
||||
print("References: ", len(q.db.refs))
|
||||
|
||||
def cmd_versions(q, **kwargs):
|
||||
for major in q.get_versions().values():
|
||||
for minor in major.values():
|
||||
for v in minor:
|
||||
print(v)
|
||||
|
||||
def cmd_ident(q, version, ident, family, **kwargs):
|
||||
symbol_definitions, symbol_references, symbol_doccomments = q.search_ident(version, ident, family)
|
||||
print("Symbol Definitions:")
|
||||
for symbol_definition in symbol_definitions:
|
||||
print(symbol_definition)
|
||||
|
||||
print("\nSymbol References:")
|
||||
for symbol_reference in symbol_references:
|
||||
print(symbol_reference)
|
||||
|
||||
print("\nDocumented in:")
|
||||
for symbol_doccomment in symbol_doccomments:
|
||||
print(symbol_doccomment)
|
||||
|
||||
def cmd_file(q, version, path, **kwargs):
|
||||
code = q.get_tokenized_file(version, path)
|
||||
print(code)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import argparse
|
||||
|
||||
query = Query(lib.getDataDir(), lib.getRepoDir())
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
subparsers = parser.add_subparsers(required=True)
|
||||
|
||||
ident_subparser = subparsers.add_parser('stats', help="Get basic database stats")
|
||||
ident_subparser.set_defaults(func=cmd_stats, q=query)
|
||||
|
||||
ident_subparser = subparsers.add_parser('versions', help="Get list of versions in the project")
|
||||
ident_subparser.set_defaults(func=cmd_versions, q=query)
|
||||
|
||||
ident_subparser = subparsers.add_parser('ident', help="Get definitions and references of an identifier")
|
||||
ident_subparser.add_argument("version", help="The version of the project", type=str, default="latest")
|
||||
ident_subparser.add_argument('ident', type=str, help="The name of the identifier")
|
||||
ident_subparser.add_argument('family', type=str, help="The file family requested")
|
||||
ident_subparser.set_defaults(func=cmd_ident, q=query)
|
||||
|
||||
file_subparser = subparsers.add_parser('file', help="Get a source file")
|
||||
file_subparser.add_argument("version", help="The version of the project", type=str, default="latest")
|
||||
file_subparser.add_argument('path', type=str, help="The path of the source file")
|
||||
file_subparser.set_defaults(func=cmd_file, q=query)
|
||||
|
||||
args = parser.parse_args()
|
||||
args.func(**vars(args))
|
||||
|
||||
Loading…
Reference in a new issue