| #!/usr/bin/env python3 |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| """Write subfolder list to a file |
| |
| This script will walk the specified directory and write the file specified with |
| the list of all sub-directories found. If the output file already exists, the |
| file will only be updated in case sub-directories have been added or removed |
| since the previous invocation. |
| |
| """ |
| |
| import os |
| import argparse |
| |
| |
| def parse_args(): |
| """Parse command line arguments and options""" |
| parser = argparse.ArgumentParser( |
| description=__doc__, |
| formatter_class=argparse.RawDescriptionHelpFormatter) |
| |
| parser.add_argument('-d', '--directory', required=True, |
| help='Directory to walk for sub-directory discovery') |
| parser.add_argument('-c', '--create-links', required=False, |
| help='Create links for each directory found in \ |
| directory given') |
| parser.add_argument('-o', '--out-file', required=True, |
| help='File to write containing a list of all \ |
| directories found') |
| parser.add_argument('-t', '--trigger-file', required=False, |
| help='Trigger file to be be touched to re-run CMake') |
| |
| args = parser.parse_args() |
| |
| return args |
| |
| |
| def get_subfolder_list(directory, create_links=None): |
| """Return subfolder list of a directory""" |
| dirlist = [] |
| |
| if create_links is not None: |
| if not os.path.exists(create_links): |
| os.makedirs(create_links) |
| symbase = os.path.basename(directory) |
| symlink = create_links + os.path.sep + symbase |
| if not os.path.exists(symlink): |
| os.symlink(directory, symlink) |
| dirlist.append(symlink) |
| else: |
| dirlist.append(directory) |
| |
| for root, dirs, _ in os.walk(directory, topdown=True): |
| dirs.sort() |
| for subdir in dirs: |
| if create_links is not None: |
| targetdirectory = os.path.join(root, subdir) |
| reldir = os.path.relpath(targetdirectory, directory) |
| linkname = symbase + '_' + reldir.replace(os.path.sep, '_') |
| symlink = create_links + os.path.sep + linkname |
| if not os.path.exists(symlink): |
| os.symlink(targetdirectory, symlink) |
| dirlist.append(symlink) |
| else: |
| dirlist.append(os.path.join(root, subdir)) |
| |
| return dirlist |
| |
| |
| def gen_out_file(out_file, dirs): |
| """Generate file with the list of directories |
| |
| File won't be updated if it already exists and has the same content |
| |
| """ |
| dirs_nl = "\n".join(dirs) + "\n" |
| |
| if os.path.exists(out_file): |
| with open(out_file, 'r', encoding="utf-8") as out_file_fo: |
| out_file_dirs = out_file_fo.read() |
| |
| if out_file_dirs == dirs_nl: |
| return |
| |
| with open(out_file, 'w', encoding="utf-8") as out_file_fo: |
| out_file_fo.writelines(dirs_nl) |
| |
| |
| def touch(trigger): |
| """Touch the trigger file |
| |
| If no trigger file is provided then do a return. |
| |
| """ |
| if trigger is None: |
| return |
| |
| if os.path.exists(trigger): |
| os.utime(trigger, None) |
| else: |
| with open(trigger, 'w') as trigger_fo: |
| trigger_fo.write("") |
| |
| |
| def main(): |
| """Parse command line arguments and take respective actions""" |
| args = parse_args() |
| |
| dirs = get_subfolder_list(args.directory, args.create_links) |
| gen_out_file(args.out_file, dirs) |
| |
| # Always touch trigger file to ensure json files are updated |
| touch(args.trigger_file) |
| |
| |
| if __name__ == "__main__": |
| main() |