Browse Source

added list update remove

Nicolas Cannasse 19 years ago
parent
commit
bf9deced04
1 changed files with 98 additions and 16 deletions
  1. 98 16
      std/tools/haxelib/Main.hx

+ 98 - 16
std/tools/haxelib/Main.hx

@@ -73,8 +73,9 @@ class Main {
 		args = neko.Sys.args();
 		commands = new List();
 		addCommand("install",install,"install a given project");
-//		addCommand("list",list,"list all installed projects");
-//		addCommand("update",update,"update all installed projects");
+		addCommand("list",list,"list all installed projects");
+		addCommand("update",update,"update all installed projects");
+		addCommand("remove",remove,"remove a given project/version");
 		addCommand("search",search,"list projects matching a word");
 		addCommand("infos",infos,"list informations on a given project");
 		addCommand("user",user,"list informations on a given user");
@@ -92,6 +93,12 @@ class Main {
 		return neko.io.File.stdin().readLine();
 	}
 
+	function paramOpt() {
+		if( args.length > argcur )
+			return args[argcur++];
+		return null;
+	}
+
 	function addCommand( name, f, doc ) {
 		commands.add({ name : name, doc : doc, f : f });
 	}
@@ -163,8 +170,11 @@ class Main {
 		print("Please enter the following informations for registration");
 		var email = param("Email");
 		var fullname = param("Fullname");
-		var pass = haxe.Md5.encode(param("Password"));
-		param("Enter to Confirm");
+		var pass = param("Password");
+		var pass2 = param("Confirm");
+		if( pass != pass2 )
+			throw "Password does not match";
+		pass = haxe.Md5.encode(pass);
 		site.register(name,pass,email,fullname);
 		return pass;
 	}
@@ -218,7 +228,7 @@ class Main {
 		var inf = site.infos(prj);
 		if( inf.curversion == null )
 			throw "This project has not yet released a version";
-		var reqversion = if( args.length > argcur ) args[argcur++] else null;
+		var reqversion = paramOpt();
 		var version = if( reqversion != null ) reqversion else inf.curversion;
 		var found = false;
 		for( v in inf.versions )
@@ -228,25 +238,25 @@ class Main {
 			}
 		if( !found )
 			throw "No such version "+version;
+		doInstall(inf.name,version,version == inf.curversion);
+	}
 
+	function doInstall( project, version, setcurrent ) {
 		var rep = getRepository();
 
 		// create/delete directories first
-		var project = rep+Datas.safe(inf.name);
-		safeDir(project);
-		project += "/";
-		var target = project+Datas.safe(version);
+		var pdir = rep+Datas.safe(project);
+		safeDir(pdir);
+		pdir += "/";
+		var target = pdir+Datas.safe(version);
 		if( !safeDir(target) ) {
-			if( reqversion == null )
-				print(inf.name+" is up-to-date");
-			else
-				print("You already have "+inf.name+" version "+reqversion+" installed");
+			print("You already have "+project+" version "+version+" installed");
 			return;
 		}
 		target += "/";
 
 		// download to temporary file
-		var filename = Datas.fileName(inf.name,version);
+		var filename = Datas.fileName(project,version);
 		var filepath = rep+filename;
 		var out = neko.io.File.write(filepath,true);
 		var progress = new Progress(out);
@@ -305,8 +315,8 @@ class Main {
 		}
 
 		// set current version
-		if( version == inf.curversion ) {
-			var f = neko.io.File.write(project+".current",true);
+		if( setcurrent ) {
+			var f = neko.io.File.write(pdir+".current",true);
 			f.write(version);
 			f.close();
 			print("  Current version is now "+version);
@@ -371,6 +381,78 @@ class Main {
 		print(getRepository());
 	}
 
+	function list() {
+		var rep = getRepository();
+		for( p in neko.FileSystem.readDirectory(rep) ) {
+			var versions = neko.FileSystem.readDirectory(rep+p);
+			var current = neko.io.File.getContent(rep+p+"/.current");
+			versions.remove(".current");
+			for( i in 0...versions.length )
+				if( versions[i] == current ) {
+					versions[i] = "["+current+"]";
+					break;
+				}
+			print(p + ": "+versions.join(" "));
+		}
+	}
+
+	function update() {
+		var rep = getRepository();
+		var prompt = true;
+		var update = false;
+		for( p in neko.FileSystem.readDirectory(rep) ) {
+			var current = neko.io.File.getContent(rep+p+"/.current");
+			print("Checking "+p);
+			var inf = site.infos(p);
+			if( inf.curversion != current ) {
+				if( prompt ) {
+					var answer;
+					do {
+						neko.Lib.print("Update "+p+" to "+inf.curversion+" [y/n/a] ? ");
+						answer = neko.io.File.stdin().readLine();
+					} while( answer != "y" && answer != "n" && answer != "a" );
+					if( answer == "n" )
+						continue;
+					if( answer == "a" )
+						prompt = false;
+				}
+				doInstall(p,inf.curversion,true);
+				update = true;
+			}
+		}
+		if( update )
+			print("Done");
+		else
+			print("All projects are up-to-date");
+	}
+
+	function deleteRec(dir) {
+		for( p in neko.FileSystem.readDirectory(dir) ) {
+			var path = dir+"/"+p;
+			if( neko.FileSystem.isDirectory(path) )
+				deleteRec(path);
+			else
+				neko.FileSystem.deleteFile(path);
+		}
+		neko.FileSystem.deleteDirectory(dir);
+	}
+
+	function remove() {
+		var prj = param("Project");
+		var version = paramOpt();
+		var rep = getRepository();
+		var pdir = rep + Datas.safe(prj);
+
+		if( version == null ) {
+			if( !neko.FileSystem.exists(pdir) )
+				throw "Project "+prj+" is not installed";
+			deleteRec(pdir);
+			print("Project "+prj+" removed");
+			return;
+		}
+
+	}
+
 	// ----------------------------------
 
 	static function print(str) {