89 lines
2.1 KiB
Python
89 lines
2.1 KiB
Python
|
# not that pretty, but needs it to be pretty fast
|
||
|
import os
|
||
|
from shutil import which
|
||
|
|
||
|
|
||
|
IGNORE = ["go", "parallels", "tmp", "library"]
|
||
|
MAX_DEPTH = 5
|
||
|
|
||
|
|
||
|
def subdirs(path):
|
||
|
return [d for d in os.listdir(path) if not d.startswith(".") and os.path.isdir(os.path.join(path, d))]
|
||
|
|
||
|
|
||
|
def gen_aliases(dirs, prefix="", subpath=""):
|
||
|
if len(dirs) == 0:
|
||
|
return {}
|
||
|
|
||
|
aliases = {}
|
||
|
|
||
|
for d in dirs:
|
||
|
if " " in d:
|
||
|
# who uses spaces in directory names anyway?
|
||
|
continue
|
||
|
|
||
|
for i in range(1, len(d)):
|
||
|
k = d.lower()[:i]
|
||
|
|
||
|
if i == len(d) - 1:
|
||
|
aliases[prefix + d.lower()] = os.path.join(subpath, d)
|
||
|
break
|
||
|
|
||
|
if all([dd == d or not dd.lower().startswith(k) for dd in dirs]) and not which(prefix + k):
|
||
|
aliases[prefix + k] = os.path.join(subpath, d)
|
||
|
break
|
||
|
|
||
|
return aliases
|
||
|
|
||
|
|
||
|
def process_dir(path, prefix="", depth=0):
|
||
|
if depth >= MAX_DEPTH:
|
||
|
return {}
|
||
|
|
||
|
if os.path.exists(os.path.join(path, ".git")):
|
||
|
# dont wanna go deepper into repo
|
||
|
return {}
|
||
|
|
||
|
if os.path.exists(os.path.join(path, ".hg")):
|
||
|
return {}
|
||
|
|
||
|
if os.path.exists(os.path.join(path, ".svn")):
|
||
|
return {}
|
||
|
|
||
|
if os.path.exists(os.path.join(path, ".venv")):
|
||
|
return {}
|
||
|
|
||
|
dirs = subdirs(path)
|
||
|
if depth == 0:
|
||
|
dirs = [d for d in dirs if all([i not in d.lower() for i in IGNORE])]
|
||
|
|
||
|
aliases = gen_aliases(dirs, prefix, path)
|
||
|
|
||
|
# we can go deeper
|
||
|
for pref, pth in aliases.copy().items():
|
||
|
aliases.update(process_dir(pth, pref, depth + 1))
|
||
|
|
||
|
return aliases
|
||
|
|
||
|
|
||
|
def gen_alias(alias_name, path):
|
||
|
cmd = f"cd {path}"
|
||
|
return "alias {}='{}'".format(alias_name, cmd)
|
||
|
|
||
|
|
||
|
|
||
|
print("Generating aliases...")
|
||
|
|
||
|
ALIASES = []
|
||
|
|
||
|
for alias_name, path in process_dir(os.path.expanduser("~")).items():
|
||
|
ALIASES.append(gen_alias(alias_name, path))
|
||
|
|
||
|
if not os.path.exists(os.path.expanduser("~/.cache")):
|
||
|
os.path.mkdir(os.path.expanduser("~/.cache"))
|
||
|
|
||
|
with open(os.path.expanduser("~/.cache/aliases"), "w") as f:
|
||
|
f.write("\n".join(ALIASES))
|
||
|
|
||
|
print("Done!")
|