from os import listdir from os.path import isdir from posixpath import join import sys import os LIMIT = int(sys.argv[1]) SHOW_ALL = sys.argv[2] == 't' ROOTS = sys.argv[3:] STDOUT = sys.stdout # special workaround for windows platforms # the default `join' implementation cannot quite deal with windows # paths in the form of "C:/A/B" & "C:/A/B/C", joining them as # "C:/A/B/C:/A/B/C" # it can, however, be "tricked" into doing the right thing by adding # a slash to the start of the paths # go figure if sys.platform == 'win32': def join_dirs(d1, d2, full_path=False): missing_slash = False if not d1.startswith("/"): missing_slash = True d1 = "/" + d1 # full_path is only True when the second argument is # another absolute path if full_path and not d2.startswith("/"): missing_slash = True d2 = "/" + d2 joined = join(d1, d2) if missing_slash: # still need to return the joined path without the # leading slash, the way it looked originally return joined[1:] else: return joined else: def join_dirs(d1, d2, *_): return join(d1, d2) if LIMIT <= 0: exit(0) def dir_content(path): """ returns the content of given path, excluding unreadable files and dotfiles (unless SHOW_ALL is True) """ ret = [] for item in listdir(path): full_path = join_dirs(path, item) if os.access(full_path, os.R_OK) and (SHOW_ALL or item[0] != '.'): ret.append(full_path) return ret def main(): STDOUT.write("#s(hash-table size 10 test equal rehash-size 1.5 rehash-threshold 0.8125 data (") for root in ROOTS: STDOUT.write(f'"{root}"') dirs = [d for d in dir_content(root) if isdir(d)] STDOUT.write("(") for current_dir in dirs: content = dir_content(current_dir) collapsed = current_dir steps = [] depth = 0 while True: if len(content) == 1 and isdir(content[0]): single_path = content[0] collapsed = join_dirs(collapsed, single_path, True) content = dir_content(collapsed) depth += 1 steps.append(single_path) if depth >= LIMIT: break else: break if depth > 0 and not ('"' in collapsed or '\\' in collapsed): final_dir = steps[-1] display_suffix = final_dir[len(current_dir):] STDOUT.write("(" + '"' + display_suffix + '" ' + '"' + current_dir + '" ' + '"' + '" "'.join(steps) + '")') nothing_to_flatten = False STDOUT.write(")") # close hash table again STDOUT.write("))") main()