BrinkerVII icon

cmd.py

BrinkerVII | PRO | 02/12/20 08:46:43 PM UTC | 0 ⭐ | 288 👁️ | Never ⏰ | []
Python |

2.62 KB

|

None

|

0 👍

/

0 👎

import os
import subprocess
import sys
 
DELIMITER = " "
HOME = os.environ[list(filter(lambda k: k.lower() == "userprofile", os.environ.keys()))[0]]
os.environ["HOME"] = HOME
 
os.chdir(HOME)
 
 
class State:
    running = True
 
 
def cwd_name():
    cwd = os.getcwd()
    if cwd == os.environ["HOME"]:
        return "~"
 
    return os.path.basename(cwd)
 
 
def cmd_exit():
    State.running = False
    print("Goodbye")
 
 
def cmd_pwd():
    print(os.path.abspath(os.getcwd()))
 
 
def cmd_ls():
    cwd = os.path.abspath(os.getcwd())
    print(f"Listing the contents of {cwd}\n")
 
    listing = os.listdir(cwd)
 
    if len(listing) > 0:
        for file in listing:
            path = os.path.join(cwd, file)
            stat = os.stat(path)
 
            type_str = "?"
            if os.path.isfile(path):
                type_str = "f"
 
            elif os.path.isdir(path):
                type_str = "d"
 
            print(f"{type_str} {file if len(file) < 60 else file[:57] + '...'} ({stat.st_size / 1024 / 1024} MiB)")
 
    else:
        print("Directory is empty!", file=sys.stderr)
 
 
def cmd_cd(target):
    cwd = os.path.abspath(os.getcwd())
    target_path = os.path.join(cwd, target)
    target_path = os.path.abspath(target_path)
 
    if os.path.exists(target_path):
        os.chdir(target_path)
        return
 
    possible_targets = list(filter(lambda path: path.startswith(target), os.listdir(cwd)))
 
    if len(possible_targets) > 1:
        print(f"Multiple possible targets to cd into:{str(possible_targets)}", file=sys.stderr)
        return
 
    if len(possible_targets) == 1:
        cmd_cd(possible_targets[0])
        return
 
    print(f"Could not cd to {target}, it does not exist!", file=sys.stderr)
 
 
def cmd_cat(*files):
    output = []
    for file in files:
        path = os.path.join(os.path.abspath(os.getcwd()), file)
 
        with open(path, "rb") as fp:
            output.append(fp.read().decode("UTF-8"))
 
    print("".join(output))
 
 
BUILTIN_COMMANDS = {
    "exit": cmd_exit,
    "pwd": cmd_pwd,
    "ls": cmd_ls,
    "dir": cmd_ls,
    "cd": cmd_cd,
    "cat": cmd_cat
}
 
while State.running:
    prompt = f"{cwd_name()} -> "
    command = input(prompt).split(DELIMITER)
    command, arguments = command[0], command[1:]
 
    if not command:
        continue
 
    else:
        try:
            if command in BUILTIN_COMMANDS:
                BUILTIN_COMMANDS[command](*arguments)
 
            else:
                subprocess.check_call([command, *arguments])
 
        except Exception as e:
            print(e, file=sys.stderr)

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎