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(
|
||||
self,
|
||||
vpath: str,
|
||||
vrem: str,
|
||||
flt: set[str],
|
||||
uname: str,
|
||||
|
@ -589,7 +590,7 @@ class VFS(object):
|
|||
|
||||
# if multiselect: add all items to archive root
|
||||
# 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)
|
||||
for _, _, vpath, apath, files, rd, vd in g:
|
||||
|
|
|
@ -884,6 +884,7 @@ class HttpCli(object):
|
|||
return True
|
||||
|
||||
fgen = vn.zipgen(
|
||||
rem,
|
||||
rem,
|
||||
set(),
|
||||
self.uname,
|
||||
|
@ -1669,7 +1670,7 @@ class HttpCli(object):
|
|||
items = [unquotep(x) for x in items if items]
|
||||
|
||||
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:
|
||||
try:
|
||||
|
@ -2656,7 +2657,14 @@ class HttpCli(object):
|
|||
return ret
|
||||
|
||||
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:
|
||||
if self.args.no_zip:
|
||||
raise Pebkac(400, "not enabled")
|
||||
|
@ -2699,7 +2707,7 @@ class HttpCli(object):
|
|||
self.send_headers(None, mime=mime, headers={"Content-Disposition": cdis})
|
||||
|
||||
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"]}))
|
||||
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"]:
|
||||
v = self.uparam.get(k)
|
||||
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(
|
||||
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()
|
||||
except:
|
||||
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 = [[x] + self.can_rw(x) for x in tar]
|
||||
tar_ok = [x[0] for x in tar if x[1]]
|
||||
|
|
Loading…
Reference in a new issue