Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Anas Nashif | 3ae5262 | 2019-04-06 09:08:09 -0400 | [diff] [blame] | 2 | # SPDX-License-Identifier: Apache-2.0 |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 3 | |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 4 | """Write subfolder list to a file |
| 5 | |
| 6 | This script will walk the specified directory and write the file specified with |
| 7 | the list of all sub-directories found. If the output file already exists, the |
| 8 | file will only be updated in case sub-directories have been added or removed |
| 9 | since the previous invocation. |
| 10 | |
| 11 | """ |
| 12 | |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 13 | import os |
| 14 | import argparse |
| 15 | |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 16 | |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 17 | def parse_args(): |
| 18 | """Parse command line arguments and options""" |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 19 | parser = argparse.ArgumentParser( |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 20 | description=__doc__, |
| 21 | formatter_class=argparse.RawDescriptionHelpFormatter) |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 22 | |
| 23 | parser.add_argument('-d', '--directory', required=True, |
| 24 | help='Directory to walk for sub-directory discovery') |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 25 | parser.add_argument('-c', '--create-links', required=False, |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 26 | help='Create links for each directory found in \ |
| 27 | directory given') |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 28 | parser.add_argument('-o', '--out-file', required=True, |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 29 | help='File to write containing a list of all \ |
| 30 | directories found') |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 31 | parser.add_argument('-t', '--trigger-file', required=False, |
| 32 | help='Trigger file to be be touched to re-run CMake') |
| 33 | |
| 34 | args = parser.parse_args() |
| 35 | |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 36 | return args |
| 37 | |
| 38 | |
| 39 | def get_subfolder_list(directory, create_links=None): |
| 40 | """Return subfolder list of a directory""" |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 41 | dirlist = [] |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 42 | |
| 43 | if create_links is not None: |
| 44 | if not os.path.exists(create_links): |
| 45 | os.makedirs(create_links) |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 46 | symbase = os.path.basename(directory) |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 47 | symlink = create_links + os.path.sep + symbase |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 48 | if not os.path.exists(symlink): |
| 49 | os.symlink(directory, symlink) |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 50 | dirlist.append(symlink) |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 51 | else: |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 52 | dirlist.append(directory) |
| 53 | |
| 54 | for root, dirs, _ in os.walk(directory, topdown=True): |
Marc Herbert | d5b2834 | 2019-02-15 18:56:57 -0800 | [diff] [blame] | 55 | dirs.sort() |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 56 | for subdir in dirs: |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 57 | if create_links is not None: |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 58 | targetdirectory = os.path.join(root, subdir) |
| 59 | reldir = os.path.relpath(targetdirectory, directory) |
| 60 | linkname = symbase + '_' + reldir.replace(os.path.sep, '_') |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 61 | symlink = create_links + os.path.sep + linkname |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 62 | if not os.path.exists(symlink): |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 63 | os.symlink(targetdirectory, symlink) |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 64 | dirlist.append(symlink) |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 65 | else: |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 66 | dirlist.append(os.path.join(root, subdir)) |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 67 | |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 68 | return dirlist |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 69 | |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 70 | |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 71 | def gen_out_file(out_file, dirs): |
| 72 | """Generate file with the list of directories |
| 73 | |
| 74 | File won't be updated if it already exists and has the same content |
| 75 | |
| 76 | """ |
| 77 | dirs_nl = "\n".join(dirs) + "\n" |
| 78 | |
| 79 | if os.path.exists(out_file): |
| 80 | with open(out_file, 'r', encoding="utf-8") as out_file_fo: |
| 81 | out_file_dirs = out_file_fo.read() |
| 82 | |
| 83 | if out_file_dirs == dirs_nl: |
| 84 | return |
| 85 | |
| 86 | with open(out_file, 'w', encoding="utf-8") as out_file_fo: |
| 87 | out_file_fo.writelines(dirs_nl) |
| 88 | |
| 89 | |
| 90 | def touch(trigger): |
| 91 | """Touch the trigger file |
| 92 | |
| 93 | If no trigger file is provided then do a return. |
| 94 | |
| 95 | """ |
| 96 | if trigger is None: |
| 97 | return |
| 98 | |
| 99 | if os.path.exists(trigger): |
| 100 | os.utime(trigger, None) |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 101 | else: |
Ruslan Mstoi | ab20641 | 2020-07-01 16:11:08 +0300 | [diff] [blame] | 102 | with open(trigger, 'w') as trigger_fo: |
| 103 | trigger_fo.write("") |
| 104 | |
| 105 | |
| 106 | def main(): |
| 107 | """Parse command line arguments and take respective actions""" |
| 108 | args = parse_args() |
| 109 | |
| 110 | dirs = get_subfolder_list(args.directory, args.create_links) |
| 111 | gen_out_file(args.out_file, dirs) |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 112 | |
Torsten Rasmussen | 080e32e | 2018-06-14 22:27:17 +0200 | [diff] [blame] | 113 | # Always touch trigger file to ensure json files are updated |
| 114 | touch(args.trigger_file) |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 115 | |
Torsten Rasmussen | 2cf53b6 | 2020-04-22 08:06:07 +0200 | [diff] [blame] | 116 | |
Torsten Rasmussen | f38e388 | 2018-06-07 15:50:31 +0200 | [diff] [blame] | 117 | if __name__ == "__main__": |
| 118 | main() |