@@ -538,24 +538,86 @@ object ZipOpTests extends TestSuite {
538538 assert(file2Content == " Content of file2" )
539539 }
540540
541- test(" unzipDirectoryEnsureExecutablePermission " ) - prep { wd =>
541+ test(" unzipDirectoriesWithoutReadOrExecute " ) - prep { wd =>
542542 if (! scala.util.Properties .isWin) {
543- val zipFileName = " zipDirExecutable"
544- val source = wd / " folder1"
545- val dir = source / " dir"
543+ def zip_ (sources : Seq [(os.Path , os.PermSet )], root : os.Path , dest : os.Path ): os.Path = {
544+ import os .{shaded_org_apache_tools_zip => apache }
546545
547- os.makeDir(dir)
548- val perms = os.perms(dir )
549- os.perms.set(dir, perms - PosixFilePermission . OWNER_EXECUTE )
546+ val zipOut = new apache. ZipOutputStream (
547+ java.nio.file. Files .newOutputStream(dest.toNIO )
548+ )
550549
551- val zipped = os.zip(
552- dest = wd / s " $zipFileName.zip " ,
553- sources = Seq (source)
550+ try {
551+ sources.foreach { case (p, perms) =>
552+ val name = p.subRelativeTo(root).toString + (if (os.isDir(p)) " /" else " " )
553+
554+ val fileType = apache.PermissionUtils .FileType .of(p.toNIO)
555+ val mode = apache.PermissionUtils .modeFromPermissions(perms.toSet(), fileType)
556+ val fis = if (os.isDir(p))
557+ None
558+ else Some (os.read.inputStream(p))
559+
560+ val zipEntry = new apache.ZipEntry (name)
561+ zipEntry.setUnixMode(mode)
562+
563+ try {
564+ zipOut.putNextEntry(zipEntry)
565+ fis.foreach(os.Internals .transfer(_, zipOut, close = false ))
566+ zipOut.closeEntry()
567+ } finally {
568+ fis.foreach(_.close())
569+ }
570+ }
571+ zipOut.finish()
572+ } finally {
573+ zipOut.close()
574+ }
575+
576+ dest
577+ }
578+
579+ def walk_ (p : os.Path ): geny.Generator [os.Path ] = {
580+ if (os.isDir(p))
581+ os.list.stream(p) ++ os.list.stream(p).flatMap(walk_)
582+ else geny.Generator ()
583+ }
584+
585+ import java .nio .file .attribute .PosixFilePermission ._
586+
587+ val zipFileName = " zipDirNoReadExecute"
588+ val source = wd / " dirNoReadExecute"
589+ val dir = source / " dir"
590+ val nested = dir / " nested"
591+ val file = nested / " file.txt"
592+
593+ os.makeDir.all(nested)
594+ os.write(file, " Contents of file.txt" )
595+
596+ val readAndExecute = os.PermSet .fromSet(java.util.Set .of(
597+ OWNER_READ ,
598+ OWNER_EXECUTE ,
599+ GROUP_READ ,
600+ GROUP_EXECUTE ,
601+ OTHERS_READ ,
602+ OTHERS_EXECUTE
603+ ))
604+
605+ val filesToZip : Seq [(os.Path , os.PermSet )] =
606+ Seq (dir, nested, file)
607+ .map(p => (p, if (os.isDir(p)) os.perms(p) -- readAndExecute else os.perms(p)))
608+
609+ val zipped = zip_(filesToZip, source, wd / s " $zipFileName.zip " )
610+ val unzipped = os.unzip(
611+ zipped,
612+ dest = wd / zipFileName
554613 )
555614
556- val unzipped = os.unzip(zipped, dest = wd / zipFileName)
557- assert(os.perms(unzipped / " dir" ).contains(PosixFilePermission .OWNER_EXECUTE ))
558- assert(os.perms(unzipped / " dir" ) == perms)
615+ walk_(unzipped).foreach { p =>
616+ os.perms.set(p, os.perms(p) + OWNER_READ + OWNER_EXECUTE )
617+ }
618+
619+ assert(os.walk(unzipped).map(_.subRelativeTo(unzipped)) ==
620+ os.walk(source).map(_.subRelativeTo(source)))
559621 }
560622 }
561623 }
0 commit comments