2016-05-28 22:06:29 +00:00
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
class _Ls:
|
2016-05-28 22:06:29 +00:00
|
|
|
def __repr__(self):
|
2016-05-31 21:10:12 +00:00
|
|
|
self.__call__()
|
|
|
|
return ""
|
2016-05-28 22:06:29 +00:00
|
|
|
|
|
|
|
def __call__(self, path="."):
|
2022-02-22 17:04:44 +00:00
|
|
|
l = list(os.ilistdir(path))
|
2016-05-28 22:06:29 +00:00
|
|
|
l.sort()
|
|
|
|
for f in l:
|
2022-02-22 17:04:44 +00:00
|
|
|
if f[1] == 0x4000: # stat.S_IFDIR
|
|
|
|
print(" <dir> %s" % f[0])
|
|
|
|
for f in l:
|
|
|
|
if f[1] != 0x4000:
|
|
|
|
if len(f) > 3:
|
|
|
|
print("% 9d %s" % (f[3], f[0]))
|
|
|
|
else:
|
|
|
|
print(" %s" % f[0])
|
|
|
|
try:
|
|
|
|
st = os.statvfs(path)
|
|
|
|
print("\n{:,d}k free".format(st[1] * st[3] // 1024))
|
|
|
|
except:
|
|
|
|
pass
|
2016-05-28 22:06:29 +00:00
|
|
|
|
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
class _Pwd:
|
2016-05-28 22:06:29 +00:00
|
|
|
def __repr__(self):
|
|
|
|
return os.getcwd()
|
|
|
|
|
|
|
|
def __call__(self):
|
|
|
|
return self.__repr__()
|
|
|
|
|
2021-05-27 05:50:04 +00:00
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
class _Clear:
|
2016-07-16 21:42:30 +00:00
|
|
|
def __repr__(self):
|
|
|
|
return "\x1b[2J\x1b[H"
|
|
|
|
|
|
|
|
def __call__(self):
|
|
|
|
return self.__repr__()
|
|
|
|
|
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
class _StdinCommand:
|
|
|
|
def __init__(self, command, args):
|
|
|
|
self.command = command
|
|
|
|
self.args = args.copy()
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
cur_args = []
|
|
|
|
for prompt, parser, default in self.args:
|
|
|
|
arg = input(prompt + ": ")
|
|
|
|
if arg == "":
|
|
|
|
if default is not None:
|
|
|
|
arg = default
|
|
|
|
else:
|
|
|
|
print(f"You must provide {prompt.lower()}")
|
|
|
|
return ""
|
|
|
|
else:
|
|
|
|
arg = parser(arg)
|
|
|
|
|
|
|
|
cur_args.append(arg)
|
|
|
|
|
|
|
|
self.command(*cur_args)
|
|
|
|
return ""
|
|
|
|
|
|
|
|
def __call__(self, *args):
|
|
|
|
self.command(*args)
|
|
|
|
|
|
|
|
|
|
|
|
def _head_func(f, n=10):
|
2016-05-28 22:06:29 +00:00
|
|
|
with open(f) as f:
|
|
|
|
for i in range(n):
|
|
|
|
l = f.readline()
|
2021-05-27 05:50:04 +00:00
|
|
|
if not l:
|
|
|
|
break
|
2016-05-28 22:06:29 +00:00
|
|
|
sys.stdout.write(l)
|
|
|
|
|
2021-05-27 05:50:04 +00:00
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
def _cat_func(f):
|
2016-05-28 22:06:29 +00:00
|
|
|
head(f, 1 << 30)
|
|
|
|
|
2021-05-27 05:50:04 +00:00
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
def _cp_func(s, t):
|
2022-02-22 17:04:44 +00:00
|
|
|
try:
|
|
|
|
if os.stat(t)[0] & 0x4000: # is directory
|
|
|
|
t = t.rstrip("/") + "/" + s
|
|
|
|
except OSError:
|
|
|
|
pass
|
|
|
|
buf = bytearray(512)
|
|
|
|
buf_mv = memoryview(buf)
|
|
|
|
with open(s, "rb") as s, open(t, "wb") as t:
|
|
|
|
while True:
|
|
|
|
n = s.readinto(buf)
|
|
|
|
if n <= 0:
|
|
|
|
break
|
|
|
|
t.write(buf_mv[:n])
|
|
|
|
|
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
def _newfile_func(path):
|
2016-05-30 18:07:49 +00:00
|
|
|
print("Type file contents line by line, finish with EOF (Ctrl+D).")
|
|
|
|
with open(path, "w") as f:
|
|
|
|
while 1:
|
|
|
|
try:
|
|
|
|
l = input()
|
|
|
|
except EOFError:
|
|
|
|
break
|
|
|
|
f.write(l)
|
|
|
|
f.write("\n")
|
|
|
|
|
2016-05-28 22:06:29 +00:00
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
def _rm_func(d, recursive=False): # Remove file or tree
|
2022-02-22 17:04:44 +00:00
|
|
|
try:
|
|
|
|
if (os.stat(d)[0] & 0x4000) and recursive: # Dir
|
|
|
|
for f in os.ilistdir(d):
|
|
|
|
if f[0] != "." and f[0] != "..":
|
2023-05-07 18:34:37 +00:00
|
|
|
rm("/".join((d, f[0])), True) # File or Dir
|
2022-02-22 17:04:44 +00:00
|
|
|
os.rmdir(d)
|
|
|
|
else: # File
|
|
|
|
os.remove(d)
|
|
|
|
except:
|
|
|
|
print("rm of '%s' failed" % d)
|
|
|
|
|
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
class _Man:
|
2016-07-03 12:50:46 +00:00
|
|
|
def __repr__(self):
|
2021-05-27 05:50:04 +00:00
|
|
|
return """
|
2016-06-12 16:02:03 +00:00
|
|
|
upysh is intended to be imported using:
|
|
|
|
from upysh import *
|
|
|
|
|
2016-07-03 12:50:46 +00:00
|
|
|
To see this help text again, type "man".
|
|
|
|
|
2016-05-28 22:06:29 +00:00
|
|
|
upysh commands:
|
2023-05-07 18:34:37 +00:00
|
|
|
clear, ls, ls(...), head(...)*, cat(...)*, newfile(...)*
|
2023-05-07 18:44:54 +00:00
|
|
|
cp('src', 'dest')*, mv('old', 'new')*, rm(name, recursive=False)*
|
2023-05-07 18:34:37 +00:00
|
|
|
pwd, cd(...)*, mkdir(...)*, rmdir(...)*
|
|
|
|
|
|
|
|
Most commands (marked with *) can be called interactively.
|
|
|
|
It means you don't have to type tons of brackets and quotes
|
|
|
|
(something alike what you expect from a normal shell),
|
|
|
|
to figure out this behavior just type cd or mv
|
2021-05-27 05:50:04 +00:00
|
|
|
"""
|
|
|
|
|
2016-06-12 16:00:37 +00:00
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
man = _Man()
|
|
|
|
pwd = _Pwd()
|
|
|
|
ls = _Ls()
|
|
|
|
clear = _Clear()
|
|
|
|
|
2023-05-07 19:00:20 +00:00
|
|
|
head = _StdinCommand(_head_func, [["Filename", str, None], ["Num of lines (default=10)", int, 10]])
|
2023-05-07 18:34:37 +00:00
|
|
|
|
|
|
|
cat = _StdinCommand(_cat_func, [["Filename", str, None]])
|
|
|
|
|
|
|
|
cp = _StdinCommand(_cp_func, [["Source", str, None], ["Target", str, None]])
|
|
|
|
|
|
|
|
newfile = _StdinCommand(_newfile_func, [["Filename", str, None]])
|
|
|
|
|
2023-05-07 19:00:20 +00:00
|
|
|
rm = _StdinCommand(_rm_func, [["Filename", str, None], ["Recursive (default=False)", bool, False]])
|
2023-05-07 18:34:37 +00:00
|
|
|
|
|
|
|
cd = _StdinCommand(os.chdir, [["Target", str, None]])
|
|
|
|
|
|
|
|
mkdir = _StdinCommand(os.mkdir, [["Directory name", str, None]])
|
|
|
|
|
|
|
|
mv = _StdinCommand(os.rename, [["Source", str, None], ["Target", str, None]])
|
2022-02-22 17:04:44 +00:00
|
|
|
|
2023-05-07 18:34:37 +00:00
|
|
|
rmdir = _StdinCommand(os.rmdir, [["Directory name", str, None]])
|
2016-07-03 12:50:46 +00:00
|
|
|
|
|
|
|
print(man)
|