changeset 761:99356cfde2f0

remove horrible java zip
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 20 Jul 2016 01:52:20 -0600
parents 2a91bde4e1e1
children 3f461f85243d
files core/src/luan/modules/IoLuan.java lucene/src/luan/modules/lucene/Lucene.luan
diffstat 2 files changed, 30 insertions(+), 90 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/modules/IoLuan.java	Tue Jul 19 19:15:02 2016 -0600
+++ b/core/src/luan/modules/IoLuan.java	Wed Jul 20 01:52:20 2016 -0600
@@ -32,9 +32,6 @@
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
 import luan.Luan;
 import luan.LuanState;
 import luan.LuanTable;
@@ -228,25 +225,6 @@
 			}
 		}
 
-		public void unzip(Object path) throws IOException, LuanException {
-			File pathFile = objToFile(path);
-			if( pathFile==null )
-				throw new LuanException( "bad argument #1 to 'unzip' (string or file table expected)" );
-			ZipInputStream in = new ZipInputStream(new BufferedInputStream(inputStream()));
-			ZipEntry entry;
-			while( (entry = in.getNextEntry()) != null ) {
-				if( entry.isDirectory() )
-					continue;
-				File file = new File(pathFile,entry.getName());
-				file.getParentFile().mkdirs();
-				OutputStream out = new FileOutputStream(file);
-				Utils.copyAll(in,out);
-				out.close();
-				file.setLastModified(entry.getTime());
-			}
-			in.close();
-		}
-
 		public LuanTable table() {
 			LuanTable tbl = new LuanTable();
 			try {
@@ -272,9 +250,6 @@
 				tbl.rawPut( "exists", new LuanJavaFunction(
 					LuanIn.class.getMethod( "exists" ), this
 				) );
-				tbl.rawPut( "unzip", new LuanJavaFunction(
-					LuanIn.class.getMethod( "unzip", Object.class ), this
-				) );
 			} catch(NoSuchMethodException e) {
 				throw new RuntimeException(e);
 			}
@@ -351,55 +326,6 @@
 			return binaryWriter(new BufferedOutputStream(outputStream()));
 		}
 
-		public void zip(LuanState luan,Object basePathObj,LuanTable filePathList) throws LuanException, IOException {
-			File basePathFile = objToFile(basePathObj);
-			if( basePathFile==null )
-				throw new LuanException( "bad argument #1 to 'zip' (string or file table expected)" );
-			String[] filePaths;
-			if( filePathList==null ) {
-				File file = basePathFile.getCanonicalFile();
-				filePaths = new String[]{file.toString()};
-				basePathFile = file.getParentFile();
-			} else {
-				List list = filePathList.asList();
-				filePaths = new String[list.size()];
-				for( int i=0; i<filePaths.length; i++ ) {
-					Object obj = list.get(i);
-					if( !(obj instanceof String) )
-						throw new LuanException("file paths must be strings");
-					filePaths[i] = (String)obj;
-				}
-			}
-			String basePath = basePathFile.toString() + '/';
-			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());
-					ZipEntry entry = new ZipEntry(relPath);
-					entry.setTime(file.lastModified());
-					out.putNextEntry(entry);
-					InputStream in = new FileInputStream(file);
-					Utils.copyAll(in,out);
-					in.close();
-					out.closeEntry();
-				}
-			}
-		}
-
 		@Override public LuanTable table() {
 			LuanTable tbl = super.table();
 			try {
@@ -412,9 +338,6 @@
 				tbl.rawPut( "binary_writer", new LuanJavaFunction(
 					LuanIO.class.getMethod( "binary_writer" ), this
 				) );
-				tbl.rawPut( "zip", new LuanJavaFunction(
-					LuanIO.class.getMethod( "zip", LuanState.class, Object.class, LuanTable.class ), this
-				) );
 			} catch(NoSuchMethodException e) {
 				throw new RuntimeException(e);
 			}
@@ -725,7 +648,7 @@
 			add( schemes, "https", LuanState.class, String.class, LuanTable.class );
 			add( schemes, "luan", LuanState.class, String.class );
 			add( schemes, "stdin", LuanState.class );
-			add( schemes, "os", String.class );
+			add( schemes, "os", LuanState.class, String.class, LuanTable.class );
 		} catch(NoSuchMethodException e) {
 			throw new RuntimeException(e);
 		}
@@ -818,10 +741,22 @@
 
 
 	public static final class LuanOs extends LuanIO {
+		private final String cmd;
 		private final Process proc;
 
-		private LuanOs(String cmd) throws IOException {
-			this.proc = Runtime.getRuntime().exec(cmd);
+		private LuanOs(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
+			this.cmd = cmd;
+			File dir = null;
+			if( options != null ) {
+				Map map = options.asMap(luan);
+				Object obj = map.remove("dir");
+				dir = objToFile(obj);
+				if( dir==null )
+					throw new LuanException( "bad option 'dir' (string or file table expected)" );
+				if( !map.isEmpty() )
+					throw new LuanException( "unrecognized options: "+map );
+			}
+			this.proc = Runtime.getRuntime().exec(cmd,null,dir);
 		}
 
 		@Override public InputStream inputStream() throws IOException {
@@ -855,7 +790,7 @@
 			int exitVal = proc.exitValue();
 			if( exitVal != 0 ) {
 				Reader err = new InputStreamReader(proc.getErrorStream());
-				String error = Utils.readAll(err);
+				String error = "error in: "+cmd+"\n"+Utils.readAll(err);
 				err.close();
 				throw new LuanException(error);
 			}
@@ -880,8 +815,8 @@
 		}
 	}
 
-	public static LuanTable os(String cmd) throws IOException {
-		return new LuanOs(cmd).table();
+	public static LuanTable os(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
+		return new LuanOs(luan,cmd,options).table();
 	}
 
 
--- a/lucene/src/luan/modules/lucene/Lucene.luan	Tue Jul 19 19:15:02 2016 -0600
+++ b/lucene/src/luan/modules/lucene/Lucene.luan	Wed Jul 20 01:52:20 2016 -0600
@@ -103,13 +103,16 @@
 	end
 
 	function index.zip(zip_file)
-		index.snapshot( function(dir,file_names)
-			local t = {}
+		index.snapshot( function(dir_path,file_names)
+			zip_file.delete()
+			local zip_path = zip_file.canonical().to_string()
+			local dir = uri("file:"..dir_path)
+			local dir_name = dir.name()
+			local options = {dir=dir.parent()}
 			for _, file_name in ipairs(file_names) do
-				t[#t+1] = dir.."/"..file_name
+				local cmd = "zip "..zip_path.." "..dir_name.."/"..file_name
+				Io.uri("os:"..cmd,options).read_text()
 			end
-			local base = uri("file:"..dir).parent().to_string()
-			zip_file.zip(base,t)
 		end )
 	end
 
@@ -120,7 +123,7 @@
 			index.zip(before_restore)
 			java_index.close()
 			lucene_dir.delete()
-			zip_file.unzip(lucene_dir.parent().to_string())
+			Io.uri("os:unzip "..zip_file.canonical().to_string(),{dir=lucene_dir.parent()}).read_text()
 			java_index.reopen()
 		end )
 	end
@@ -140,7 +143,9 @@
 
 		function Rpc.functions.lucene_restore(password,zip_file)
 			Io.password == password or error "wrong password"
-			index.restore(zip_file)
+			local backup_zip = uri("file:"..index.dir).parent().child("backup.zip")
+			backup_zip.write(zip_file)
+			index.restore(backup_zip)
 		end
 
 	else