Mercurial Hosting > luan
changeset 746:293c397e8dee
improve zip
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Jul 2016 19:36:02 -0600 |
parents | 9c1f28b26395 |
children | d3a1e9a48a94 |
files | core/src/luan/modules/Io.luan core/src/luan/modules/IoLuan.java lucene/src/luan/modules/lucene/Lucene.luan |
diffstat | 3 files changed, 45 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/core/src/luan/modules/Io.luan Wed Jul 13 21:27:23 2016 -0600 +++ b/core/src/luan/modules/Io.luan Thu Jul 14 19:36:02 2016 -0600 @@ -8,7 +8,6 @@ M.read_console_line = IoLuan.read_console_line M.schemes = IoLuan.newSchemes() M.uri = IoLuan.uri -M.zip = IoLuan.zip M.stdin = IoLuan.defaultStdin.table() M.socket_server = IoLuan.socket_server M.stdout = IoLuan.textWriter(System.out)
--- a/core/src/luan/modules/IoLuan.java Wed Jul 13 21:27:23 2016 -0600 +++ b/core/src/luan/modules/IoLuan.java Thu Jul 14 19:36:02 2016 -0600 @@ -312,6 +312,41 @@ return binaryWriter(new BufferedOutputStream(outputStream())); } + public void zip(LuanState luan,String basePath,String... filePaths) throws LuanException, IOException { + if( filePaths.length == 0 ) { + File file = new File(basePath).getCanonicalFile(); + filePaths = new String[]{file.toString()}; + basePath = file.getParent(); + } + if( !basePath.endsWith("/") ) + basePath += '/'; + ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream())); + zip(out,basePath,filePaths); + out.close(); + } + + private static void zip(ZipOutputStream out,String basePath,String[] filePaths) throws LuanException, IOException { + for( String filePath : filePaths ) { + File file = new File(filePath); + if( file.isDirectory() ) { + String[] children = file.list(); + for( int i=0; i<children.length; i++ ) { + children[i] = filePath + "/" + children[i]; + } + zip(out,basePath,children); + } else { + if( !filePath.startsWith(basePath) ) + throw new LuanException(filePath+" not in "+basePath); + String relPath = filePath.substring(basePath.length()); + out.putNextEntry(new ZipEntry(relPath)); + InputStream in = new FileInputStream(file); + Utils.copyAll(in,out); + in.close(); + out.closeEntry(); + } + } + } + @Override public LuanTable table() { LuanTable tbl = super.table(); try { @@ -324,6 +359,9 @@ tbl.rawPut( "binary_writer", new LuanJavaFunction( LuanIO.class.getMethod( "binary_writer" ), this ) ); + tbl.rawPut( "zip", new LuanJavaFunction( + LuanIO.class.getMethod( "zip", LuanState.class, String.class, new String[0].getClass() ), this + ) ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } @@ -779,7 +817,7 @@ return tbl; } */ - +/* // files maps zip name to uri public static void zip(LuanState luan,String zipUri,LuanTable files) throws LuanException, IOException { Object obj = uri(luan,zipUri,null).rawGet("java"); @@ -808,7 +846,7 @@ } out.close(); } - +*/ // security
--- a/lucene/src/luan/modules/lucene/Lucene.luan Wed Jul 13 21:27:23 2016 -0600 +++ b/lucene/src/luan/modules/lucene/Lucene.luan Thu Jul 14 19:36:02 2016 -0600 @@ -5,8 +5,10 @@ local type = Luan.type or error() local Html = require "luan:Html.luan" local Io = require "luan:Io.luan" +local uri = Io.uri or error() local String = require "luan:String.luan" local matches = String.matches or error() +local Table = require "luan:Table.luan" local LuceneIndex = require "java:luan.modules.lucene.LuceneIndex" local NumberFieldParser = require "java:luan.modules.lucene.queryparser.NumberFieldParser" local StringFieldParser = require "java:luan.modules.lucene.queryparser.StringFieldParser" @@ -105,9 +107,10 @@ index.snapshot( function(dir,file_names) local t = {} for _, file_name in ipairs(file_names) do - t[file_name] = "file:"..dir.."/"..file_name + t[#t+1] = dir.."/"..file_name end - Io.zip(zip_file,t) + local base = uri("file:"..dir).parent().to_string() + uri(zip_file).zip(base,Table.unpack(t)) end ) end