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