This commit is contained in:
ed 2021-06-04 19:35:08 +02:00
parent c533da9129
commit 7d20eb202a
6 changed files with 71 additions and 24 deletions

View file

@ -228,21 +228,19 @@ class VFS(object):
for f in [{"vp": v, "ap": a, "st": n[1]} for v, a, n in files]: for f in [{"vp": v, "ap": a, "st": n[1]} for v, a, n in files]:
yield f yield f
def user_tree(self, uname, readable=False, writable=False, admin=False): def user_tree(self, uname, readable, writable, admin):
ret = [] is_readable = False
opt1 = readable and (uname in self.uread or "*" in self.uread) if uname in self.uread or "*" in self.uread:
opt2 = writable and (uname in self.uwrite or "*" in self.uwrite) readable.append(self.vpath)
if admin: is_readable = True
if opt1 and opt2:
ret.append(self.vpath) if uname in self.uwrite or "*" in self.uwrite:
else: writable.append(self.vpath)
if opt1 or opt2: if is_readable:
ret.append(self.vpath) admin.append(self.vpath)
for _, vn in sorted(self.nodes.items()): for _, vn in sorted(self.nodes.items()):
ret.extend(vn.user_tree(uname, readable, writable, admin)) vn.user_tree(uname, readable, writable, admin)
return ret
class AuthSrv(object): class AuthSrv(object):

View file

@ -153,10 +153,8 @@ class HttpCli(object):
pwd = uparam.get("pw") pwd = uparam.get("pw")
self.uname = self.auth.iuser.get(pwd, "*") self.uname = self.auth.iuser.get(pwd, "*")
if self.uname: self.rvol, self.wvol, self.avol = [[], [], []]
self.rvol = self.auth.vfs.user_tree(self.uname, readable=True) self.auth.vfs.user_tree(self.uname, self.rvol, self.wvol, self.avol)
self.wvol = self.auth.vfs.user_tree(self.uname, writable=True)
self.avol = self.auth.vfs.user_tree(self.uname, True, True, True)
ua = self.headers.get("user-agent", "") ua = self.headers.get("user-agent", "")
self.is_rclone = ua.startswith("rclone/") self.is_rclone = ua.startswith("rclone/")

34
scripts/profile.py Normal file
View file

@ -0,0 +1,34 @@
#!/usr/bin/env python3
import sys
sys.path.insert(0, ".")
cmd = sys.argv[1]
if cmd == "cpp":
from copyparty.__main__ import main
argv = ["__main__", "-v", "srv::r", "-v", "../../yt:yt:r"]
main(argv=argv)
elif cmd == "test":
from unittest import main
argv = ["__main__", "discover", "-s", "tests"]
main(module=None, argv=argv)
else:
raise Exception()
# import dis; print(dis.dis(main))
# macos:
# option1) python3.9 -m pip install --user -U vmprof==0.4.9
# option2) python3.9 -m pip install --user -U https://github.com/vmprof/vmprof-python/archive/refs/heads/master.zip
#
# python -m vmprof -o prof --lines ./scripts/profile.py test
# linux: ~/.local/bin/vmprofshow prof tree | grep -vF '[1m 0.'
# macos: ~/Library/Python/3.9/bin/vmprofshow prof tree | grep -vF '[1m 0.'
# win: %appdata%\..\Roaming\Python\Python39\Scripts\vmprofshow.exe prof tree

View file

@ -10,12 +10,11 @@ import pprint
import tarfile import tarfile
import tempfile import tempfile
import unittest import unittest
from argparse import Namespace from argparse import Namespace
from copyparty.authsrv import AuthSrv
from copyparty.httpcli import HttpCli
from tests import util as tu from tests import util as tu
from copyparty.authsrv import AuthSrv
from copyparty.httpcli import HttpCli
def hdr(query): def hdr(query):

View file

@ -7,13 +7,12 @@ import json
import shutil import shutil
import tempfile import tempfile
import unittest import unittest
from textwrap import dedent from textwrap import dedent
from argparse import Namespace from argparse import Namespace
from copyparty.authsrv import AuthSrv
from copyparty import util
from tests import util as tu from tests import util as tu
from copyparty.authsrv import AuthSrv
from copyparty import util
class Cfg(Namespace): class Cfg(Namespace):

View file

@ -1,17 +1,36 @@
import os import os
import sys
import time import time
import shutil import shutil
import jinja2 import jinja2
import tempfile import tempfile
import platform
import subprocess as sp import subprocess as sp
from copyparty.util import Unrecv
WINDOWS = platform.system() == "Windows"
ANYWIN = WINDOWS or sys.platform in ["msys"]
MACOS = platform.system() == "Darwin"
J2_ENV = jinja2.Environment(loader=jinja2.BaseLoader) J2_ENV = jinja2.Environment(loader=jinja2.BaseLoader)
J2_FILES = J2_ENV.from_string("{{ files|join('\n') }}") J2_FILES = J2_ENV.from_string("{{ files|join('\n') }}")
def nah(*a, **ka):
return False
if MACOS:
import posixpath
posixpath.islink = nah
os.path.islink = nah
# 25% faster; until any tests do symlink stuff
from copyparty.util import Unrecv
def runcmd(*argv): def runcmd(*argv):
p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE) p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = p.communicate() stdout, stderr = p.communicate()