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