You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.8 KiB
79 lines
2.8 KiB
#!/usr/bin/env python3 |
|
|
|
import os |
|
import argparse |
|
|
|
def touch(trigger): |
|
# 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 fp: |
|
fp.write("") |
|
|
|
|
|
def main(): |
|
parser = argparse.ArgumentParser( |
|
description='This script will walk the specified directory and write the file specified \ |
|
with the list of all sub-directories found. If to the output file already \ |
|
exists, the file will only be updated in case sub-directories has been added \ |
|
or removed since previous invocation.') |
|
|
|
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() |
|
|
|
dirlist = [] |
|
if args.create_links is not None: |
|
if not os.path.exists(args.create_links): |
|
os.makedirs(args.create_links) |
|
directory = args.directory |
|
symlink = args.create_links + os.path.sep + directory.replace(os.path.sep, '_') |
|
if not os.path.exists(symlink): |
|
os.symlink(directory, symlink) |
|
dirlist.extend(symlink) |
|
else: |
|
dirlist.extend(args.directory) |
|
dirlist.extend(os.linesep) |
|
for root, dirs, _ in os.walk(args.directory, topdown=True): |
|
dirs.sort() |
|
for subdir in dirs: |
|
if args.create_links is not None: |
|
directory = os.path.join(root, subdir) |
|
symlink = args.create_links + os.path.sep + directory.replace(os.path.sep, '_') |
|
if not os.path.exists(symlink): |
|
os.symlink(directory, symlink) |
|
dirlist.extend(symlink) |
|
else: |
|
dirlist.extend(os.path.join(root, subdir)) |
|
dirlist.extend(os.linesep) |
|
|
|
new = ''.join(dirlist) |
|
existing = '' |
|
|
|
if os.path.exists(args.out_file): |
|
with open(args.out_file, 'r') as fp: |
|
existing = fp.read() |
|
|
|
if new != existing: |
|
with open(args.out_file, 'w') as fp: |
|
fp.write(new) |
|
else: |
|
with open(args.out_file, 'w') as fp: |
|
fp.write(new) |
|
|
|
# Always touch trigger file to ensure json files are updated |
|
touch(args.trigger_file) |
|
|
|
if __name__ == "__main__": |
|
main()
|
|
|