#!/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()