Browse Source

completed submit.

Nicolas Cannasse 19 years ago
parent
commit
c25375fc38

+ 27 - 3
std/tools/haxelib/Datas.hx

@@ -1,5 +1,7 @@
 package tools.haxlib;
 
+import neko.zip.File;
+
 typedef UserInfos = {
 	var name : String;
 	var fullname : String;
@@ -8,13 +10,13 @@ typedef UserInfos = {
 }
 
 typedef VersionInfos = {
+	var date : String;
 	var name : String;
 	var comments : String;
 }
 
 typedef LibraryInfos = {
 	var name : String;
-	var fullname : String;
 	var desc : String;
 	var url : String;
 	var owner : String;
@@ -34,7 +36,11 @@ typedef XmlInfos = {
 class Datas {
 
 
-	public static var XML = "haxlib.xml";
+	static var XML = "haxlib.xml";
+
+	public static var REPOSITORY = "files";
+	public static var alphanum = ~/^[A-Za-z0-9_.-]+$/;
+
 
 	static function requiredAttribute( x : Xml, name ) {
 		var v = x.get(name);
@@ -57,14 +63,32 @@ class Datas {
 		return v.nodeValue;
 	}
 
-	public static function readInfos( xmldata : String ) : XmlInfos {
+	public static function fileName( lib : String, ver : String ) {
+		return lib.split(".").join("-")+"-"+ver.split(".").join("-")+".zip";
+	}
+
+	public static function readInfos( zip : List<ZipEntry> ) : XmlInfos {
+		var xmldata = null;
+		for( f in zip )
+			if( StringTools.endsWith(f.fileName,XML) ) {
+				xmldata = neko.zip.File.unzip(f);
+				break;
+			}
+		if( xmldata == null )
+			throw XML+" not found in package";
 		var x = Xml.parse(xmldata).firstElement();
 		var lib = requiredAttribute(x,"name");
+		if( lib.length < 3 || !alphanum.match(lib) )
+			throw "Library name must contain at least 3 characters and only AZaz09_.- characters";
 		var url = requiredAttribute(x,"url");
 		var user = requiredAttribute(requiredNode(x,"user"),"name");
+		if( user.length < 3 || !alphanum.match(user) )
+			throw "User name must contain at least 3 characters and only AZaz09_.- characters";
 		var desc = requiredText(requiredNode(x,"description"));
 		var vnode = requiredNode(x,"version");
 		var version = requiredAttribute(vnode,"name");
+		if( version.length < 1 || !alphanum.match(version) )
+			throw "Version name must contain at least 1 character and only AZaz09_.- characters";
 		var vdesc = requiredText(vnode);
 		return {
 			lib : lib,

+ 11 - 20
std/tools/haxelib/Main.hx

@@ -69,25 +69,23 @@ class Main {
 		var word = param("Search word");
 		var l = site.search(word);
 		for( s in l )
-			print(s.fullname+" ("+s.name+")");
+			print(s.name);
 		print(l.length+" libraries found");
 	}
 
 	function infos() {
 		var prj = param("Library name");
 		var inf = site.infos(prj);
-		print("Id: "+inf.name);
-		print("Name: "+inf.fullname);
-		print("Dec: "+inf.desc);
+		print("Name: "+inf.name);
+		print("Desc: "+inf.desc);
 		print("Website: "+inf.url);
 		print("Owner: "+inf.owner);
-		print("Versions: ");
+		print("Version: "+inf.curversion);
+		print("Releases: ");
 		if( inf.versions.length == 0 )
 			print("  (no version released yet)");
-		for( v in inf.versions ) {
-			var cur = if( v.name == inf.curversion ) " *" else "  ";
-			print(cur+v.name+" : "+v.comments);
-		}
+		for( v in inf.versions )
+			print("   "+v.date+" "+v.name+" : "+v.comments);
 	}
 
 	function user() {
@@ -118,15 +116,7 @@ class Main {
 		var file = param("Package");
 		var data = neko.io.File.getContent(file);
 		var zip = neko.zip.File.read(new neko.io.StringInput(data));
-		var xmldata = null;
-		for( f in zip )
-			if( StringTools.endsWith(f.fileName,Datas.XML) ) {
-				xmldata = neko.zip.File.unzip(f);
-				break;
-			}
-		if( xmldata == null )
-			throw Datas.XML+" not found in package";
-		var infos = Datas.readInfos(xmldata);
+		var infos = Datas.readInfos(zip);
 		var password;
 		site.checkLibOwner(infos.lib,infos.user);
 		if( site.isNewUser(infos.user) )
@@ -150,6 +140,7 @@ class Main {
 		s.write("\r\n");
 		var pos = 0;
 		var bufsize = 1;
+		print("Sending data.... ");
 		while( pos < data.length ) {
 			s.write(data.substr(pos,bufsize));
 			pos += bufsize;
@@ -157,10 +148,10 @@ class Main {
 		}
 		s.shutdown(false,true);
 		s.input.readAll();
-		neko.Lib.print("Done!\n");
 		s.close();
 
-		site.processSubmit(id,password);
+		var msg = site.processSubmit(id,password);
+		print(msg);
 	}
 
 	// ----------------------------------

+ 6 - 4
std/tools/haxelib/Site.hx

@@ -7,8 +7,8 @@ class Site {
 
 	static var CWD = neko.Web.getCwd();
 	static var DB_FILE = CWD+"haxlib.db";
-	public static var TMP_DIR = CWD+"tmp/";
-	public static var REP_DIR = CWD+"files/";
+	public static var TMP_DIR = CWD+"tmp";
+	public static var REP_DIR = CWD+Datas.REPOSITORY;
 
 	static function setup() {
 		SiteDb.create(db);
@@ -23,9 +23,11 @@ class Site {
 	static function run() {
 		if( !neko.FileSystem.exists(TMP_DIR) )
 			neko.FileSystem.createDirectory(TMP_DIR);
+		if( !neko.FileSystem.exists(REP_DIR) )
+			neko.FileSystem.createDirectory(REP_DIR);
 
 		var server = new haxe.remoting.Server();
-		var log = neko.io.File.write(TMP_DIR+"log.txt",false);
+		var log = neko.io.File.append(TMP_DIR+"/log.txt",false);
 		var api =
 		server.setPrivatePrefix("db");
 		server.setLogger(log.write);
@@ -41,7 +43,7 @@ class Site {
 		}
 		var sid = Std.parseInt(neko.Web.getParams().get("submit"));
 		if( sid != null ) {
-			var file = neko.io.File.write(TMP_DIR+sid,true);
+			var file = neko.io.File.write(TMP_DIR+"/"+sid+".tmp",true);
 			var data = neko.Web.getPostData();
 			file.write(data);
 			file.close();

+ 67 - 26
std/tools/haxelib/SiteApi.hx

@@ -6,32 +6,29 @@ class SiteApi {
 
 	var db : neko.db.Connection;
 
-	static var alphanum = ~/^[A-Za-z0-9_-]+$/;
-
 	public function new( db ) {
 		this.db = db;
 	}
 
-	public function search( word : String ) : List<{ name : String, fullname : String }> {
+	public function search( word : String ) : List<{ name : String }> {
 		return Lib.manager.containing(word);
 	}
 
-	public function infos( prj : String ) : LibraryInfos {
-		var p = Lib.manager.search({ name : prj }).first();
-		if( p == null )
-			throw "No such library : "+prj;
-		var vl = Version.manager.search({ library : p.id });
+	public function infos( lib : String ) : LibraryInfos {
+		var l = Lib.manager.search({ name : lib }).first();
+		if( l == null )
+			throw "No such library : "+lib;
+		var vl = Version.manager.search({ library : l.id });
 		var versions = new Array();
 		for( v in vl )
-			versions.push({ name : v.name, comments : v.comments });
+			versions.push({ name : v.name, comments : v.comments, date : v.date });
 		return {
-			name : p.name,
-			fullname : p.fullname,
-			curversion : if( p.version == null ) null else p.version.name,
-			desc : p.description,
+			name : l.name,
+			curversion : if( l.version == null ) null else l.version.name,
+			desc : l.description,
 			versions : versions,
-			owner : p.owner.name,
-			url : p.website,
+			owner : l.owner.name,
+			url : l.website,
 		};
 	}
 
@@ -52,7 +49,7 @@ class SiteApi {
 	}
 
 	public function register( name : String, pass : String, mail : String, fullname : String ) : Bool {
-		if( !alphanum.match(name) )
+		if( !Datas.alphanum.match(name) )
 			throw "Invalid user name, please use alphanumeric characters";
 		var u = new User();
 		u.name = name;
@@ -84,22 +81,66 @@ class SiteApi {
 		return Std.string(Std.random(100000000));
 	}
 
-	public function processSubmit( id : String, pass : String ) : Void {
-		var path = Site.TMP_DIR+Std.parseInt(id);
+	public function processSubmit( id : String, pass : String ) : String {
+		var path = Site.TMP_DIR+"/"+Std.parseInt(id)+".tmp";
+
 		var file = try neko.io.File.read(path,true) catch( e : Dynamic ) throw "Invalid file id #"+id;
 		var zip = try neko.zip.File.read(file) catch( e : Dynamic ) { file.close(); neko.Lib.rethrow(e); };
 		file.close();
 
-		var xmldata = null;
-		for( f in zip )
-			if( StringTools.endsWith(f.fileName,Datas.XML) ) {
-				xmldata = neko.zip.File.unzip(f);
-				break;
+		var infos = Datas.readInfos(zip);
+		var u = User.manager.search({ name : infos.user }).first();
+		if( u == null || u.pass != pass )
+			throw "Invalid username or password";
+
+		var l = Lib.manager.search({ name : infos.lib }).first();
+		if( l == null ) {
+			l = new Lib();
+			l.name = infos.lib;
+			l.description = infos.desc;
+			l.website = infos.url;
+			l.owner = u;
+			l.insert();
+			neko.FileSystem.deleteFile(path);
+			return "Project added : submit one more time to send a first version";
+		}
+
+		// check owner
+		if( l.owner != u )
+			throw "Invalid owner";
+
+		// update public infos
+		var update = false;
+		if( infos.desc != l.description || l.website != infos.url ) {
+			l.description = infos.desc;
+			l.website = infos.url;
+			l.update();
+			update = true;
+			neko.FileSystem.deleteFile(path);
+			return "Project infos updated : submit one more time to send a new version";
+		}
+
+		// check version
+		var vl = Version.manager.search({ library : l.id });
+		for( v in vl )
+			if( v.name == infos.version ) {
+				neko.FileSystem.deleteFile(path);
+				return "This version is already commited, please change version number";
 			}
-		if( xmldata == null )
-			throw Datas.XML+" not found in package";
 
-		var infos = Datas.readInfos(xmldata);
+		neko.FileSystem.rename(path,Site.REP_DIR+"/"+Datas.fileName(l.name,infos.version));
+
+		var v = new Version();
+		v.library = l;
+		v.name = infos.version;
+		v.comments = infos.versionDesc;
+		v.downloads = 0;
+		v.date = Date.now().toString();
+		v.insert();
+
+		l.version = v;
+		l.update();
+		return "Version "+v.name+" (id#"+v.id+") added";
 	}
 
 }

+ 7 - 9
std/tools/haxelib/SiteDb.hx

@@ -25,7 +25,6 @@ class Lib extends neko.db.Object {
 
 	public var id : Int;
 	public var name : String;
-	public var fullname : String;
 	public var description : String;
 	public var website : String;
 	public var owner(dynamic,dynamic) : User;
@@ -36,7 +35,7 @@ class Lib extends neko.db.Object {
 class Version extends neko.db.Object {
 
 	static function RELATIONS() {
-		return [{ key : "pid", prop : "library", manager : Lib.manager }];
+		return [{ key : "library", prop : "library", manager : Lib.manager }];
 	}
 
 	public static var manager = new neko.db.Manager<Version>(Version);
@@ -44,9 +43,9 @@ class Version extends neko.db.Object {
 	public var id : Int;
 	public var library(dynamic,dynamic) : Lib;
 	public var name : String;
+	public var date : String; // sqlite does not have a proper 'date' type
 	public var comments : String;
 	public var downloads : Int;
-	public var data : String;
 
 }
 
@@ -54,7 +53,7 @@ class LibraryManager extends neko.db.Manager<Lib> {
 
 	public function containing( word ) {
 		word = quote("%"+word+"%");
-		return results("SELECT name, fullname FROM Lib WHERE name LIKE "+word+" OR fullname LIKE "+word+" OR description LIKE "+word);
+		return results("SELECT name FROM Lib WHERE name LIKE "+word+" OR description LIKE "+word);
 	}
 
 }
@@ -77,8 +76,7 @@ class SiteDb {
 			CREATE TABLE Lib (
 				id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
 				owner INTEGER NOT NULL,
-				name VARCHAR(16) NOT NULL UNIQUE,
-				fullname VARCHAR(50) NOT NULL,
+				name VARCHAR(32) NOT NULL UNIQUE,
 				description TEXT NOT NULL,
 				website VARCHAR(100) NOT NULL,
 				version INT
@@ -90,9 +88,9 @@ class SiteDb {
 				id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
 				library INTEGER NOT NULL,
 				downloads INTEGER NOT NULL,
-				name VARCHAR(20) NOT NULL,
-				comments TEXT NOT NULL,
-				data BLOB NOT NULL
+				date VARCHAR(19) NOT NULL,
+				name VARCHAR(32) NOT NULL,
+				comments TEXT NOT NULL
 			)
 		");
 	}