mirror of
https://github.com/9001/copyparty.git
synced 2025-08-17 09:02:15 -06:00
tar/zip: use volume name as toplevel fallback
This commit is contained in:
parent
f5191973df
commit
fdd6f3b4a6
|
@ -578,6 +578,7 @@ class VFS(object):
|
||||||
|
|
||||||
def zipgen(
|
def zipgen(
|
||||||
self,
|
self,
|
||||||
|
vpath: str,
|
||||||
vrem: str,
|
vrem: str,
|
||||||
flt: set[str],
|
flt: set[str],
|
||||||
uname: str,
|
uname: str,
|
||||||
|
@ -589,7 +590,7 @@ class VFS(object):
|
||||||
|
|
||||||
# if multiselect: add all items to archive root
|
# if multiselect: add all items to archive root
|
||||||
# if single folder: the folder itself is the top-level item
|
# if single folder: the folder itself is the top-level item
|
||||||
folder = "" if flt or not wrap else (vrem.split("/")[-1].lstrip(".") or "top")
|
folder = "" if flt or not wrap else (vpath.split("/")[-1].lstrip(".") or "top")
|
||||||
|
|
||||||
g = self.walk(folder, vrem, [], uname, [[True, False]], dots, scandir, False)
|
g = self.walk(folder, vrem, [], uname, [[True, False]], dots, scandir, False)
|
||||||
for _, _, vpath, apath, files, rd, vd in g:
|
for _, _, vpath, apath, files, rd, vd in g:
|
||||||
|
|
|
@ -884,6 +884,7 @@ class HttpCli(object):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
fgen = vn.zipgen(
|
fgen = vn.zipgen(
|
||||||
|
rem,
|
||||||
rem,
|
rem,
|
||||||
set(),
|
set(),
|
||||||
self.uname,
|
self.uname,
|
||||||
|
@ -1669,7 +1670,7 @@ class HttpCli(object):
|
||||||
items = [unquotep(x) for x in items if items]
|
items = [unquotep(x) for x in items if items]
|
||||||
|
|
||||||
self.parser.drop()
|
self.parser.drop()
|
||||||
return self.tx_zip(k, v, vn, rem, items, self.args.ed)
|
return self.tx_zip(k, v, "", vn, rem, items, self.args.ed)
|
||||||
|
|
||||||
def handle_post_json(self) -> bool:
|
def handle_post_json(self) -> bool:
|
||||||
try:
|
try:
|
||||||
|
@ -2656,7 +2657,14 @@ class HttpCli(object):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def tx_zip(
|
def tx_zip(
|
||||||
self, fmt: str, uarg: str, vn: VFS, rem: str, items: list[str], dots: bool
|
self,
|
||||||
|
fmt: str,
|
||||||
|
uarg: str,
|
||||||
|
vpath: str,
|
||||||
|
vn: VFS,
|
||||||
|
rem: str,
|
||||||
|
items: list[str],
|
||||||
|
dots: bool,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
if self.args.no_zip:
|
if self.args.no_zip:
|
||||||
raise Pebkac(400, "not enabled")
|
raise Pebkac(400, "not enabled")
|
||||||
|
@ -2699,7 +2707,7 @@ class HttpCli(object):
|
||||||
self.send_headers(None, mime=mime, headers={"Content-Disposition": cdis})
|
self.send_headers(None, mime=mime, headers={"Content-Disposition": cdis})
|
||||||
|
|
||||||
fgen = vn.zipgen(
|
fgen = vn.zipgen(
|
||||||
rem, set(items), self.uname, False, dots, not self.args.no_scandir
|
vpath, rem, set(items), self.uname, dots, False, not self.args.no_scandir
|
||||||
)
|
)
|
||||||
# for f in fgen: print(repr({k: f[k] for k in ["vp", "ap"]}))
|
# for f in fgen: print(repr({k: f[k] for k in ["vp", "ap"]}))
|
||||||
bgen = packer(self.log, fgen, utf8="utf" in uarg, pre_crc="crc" in uarg)
|
bgen = packer(self.log, fgen, utf8="utf" in uarg, pre_crc="crc" in uarg)
|
||||||
|
@ -3503,7 +3511,7 @@ class HttpCli(object):
|
||||||
for k in ["zip", "tar"]:
|
for k in ["zip", "tar"]:
|
||||||
v = self.uparam.get(k)
|
v = self.uparam.get(k)
|
||||||
if v is not None:
|
if v is not None:
|
||||||
return self.tx_zip(k, v, vn, rem, [], self.args.ed)
|
return self.tx_zip(k, v, self.vpath, vn, rem, [], self.args.ed)
|
||||||
|
|
||||||
fsroot, vfs_ls, vfs_virt = vn.ls(
|
fsroot, vfs_ls, vfs_virt = vn.ls(
|
||||||
rem, self.uname, not self.args.no_scandir, [[True, False], [False, True]]
|
rem, self.uname, not self.args.no_scandir, [[True, False], [False, True]]
|
||||||
|
|
|
@ -122,7 +122,7 @@ class TestHttpCli(unittest.TestCase):
|
||||||
tar = tarfile.open(fileobj=io.BytesIO(b)).getnames()
|
tar = tarfile.open(fileobj=io.BytesIO(b)).getnames()
|
||||||
except:
|
except:
|
||||||
tar = []
|
tar = []
|
||||||
tar = [x[4:] if x.startswith("top/") else x for x in tar]
|
tar = [x.split("/", 1)[1] for x in tar]
|
||||||
tar = ["/".join([y for y in [top, durl, x] if y]) for x in tar]
|
tar = ["/".join([y for y in [top, durl, x] if y]) for x in tar]
|
||||||
tar = [[x] + self.can_rw(x) for x in tar]
|
tar = [[x] + self.can_rw(x) for x in tar]
|
||||||
tar_ok = [x[0] for x in tar if x[1]]
|
tar_ok = [x[0] for x in tar if x[1]]
|
||||||
|
|
Loading…
Reference in a new issue