#!/usr/bin/env python3

# Copyright (C) 2024 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

'''
Lists all modules in the given directory or its decendant directories, as cached
in module-info.json. If any build change is made, and it should be reflected in
the output, you should run 'refreshmod' first.
'''

import sys
sys.dont_write_bytecode = True

import argparse
import os

import modinfo


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('path')
    parser.add_argument('--no-recurse', '-n', action='store_true',
                        help='Do not include modules defined in subdirs of path')
    args = parser.parse_args()
    should_recurse = not args.no_recurse

    d = os.path.normpath(args.path)
    # Fix absolute path to be relative to build top
    if os.path.isabs(d):
        base = os.environ.get('ANDROID_BUILD_TOP')
        if base:
            base = os.path.normpath(base) + os.path.sep
            if d.startswith(base):
                d = d[len(base):]

    prefix = d + os.path.sep

    module_info = modinfo.ReadModuleInfo()

    results = set()
    for m in module_info.values():
        for path in m.get('path', []):
            if path == d or (should_recurse and path.startswith(prefix)):
                name = m.get('module_name')
                if name:
                    results.add(name)

    for name in sorted(results):
        print(name)

if __name__ == "__main__":
    main()
