Browse Source

synched with github

Nicolas Cannasse 12 years ago
parent
commit
723b7aa687
3 changed files with 39 additions and 282 deletions
  1. 8 3
      std/tools/haxelib/Data.hx
  2. 17 25
      std/tools/haxelib/Main.hx
  3. 14 254
      std/tools/haxelib/SiteApi.hx

+ 8 - 3
std/tools/haxelib/Data.hx

@@ -54,7 +54,7 @@ typedef Infos = {
 	var website : String;
 	var desc : String;
 	var license : String;
-	var version : SemVer;
+	var version : String;
 	var versionComments : String;
 	var developers : List<String>;
 	var tags : List<String>;
@@ -121,6 +121,11 @@ class Data {
 			case TClass(Array):
 			default: throw 'invalid type for contributors';
 		}
+		switch Type.typeof(doc.version) {
+			case TClass(String):
+				SemVer.ofString(doc.version);
+			default: throw 'version must be defined as string';
+		}
 		switch Type.typeof(doc.tags) {
 			case TClass(Array), TNull:
 			default: throw 'tags must be defined as array';
@@ -165,7 +170,7 @@ class Data {
 			project : project,
 			website : doc.url,
 			desc : doc.description,
-			version : SemVer.ofString(doc.version),
+			version : doc.version,
 			versionComments : doc.releasenote,
 			license : doc.license,
 			tags : tags,
@@ -174,4 +179,4 @@ class Data {
 		};
 	}
 
-}
+}

+ 17 - 25
std/tools/haxelib/Main.hx

@@ -21,6 +21,7 @@
  */
 package tools.haxelib;
 
+import haxe.io.Path;
 import haxe.zip.Reader;
 import sys.io.File;
 import sys.io.Process;
@@ -139,7 +140,7 @@ class Main {
 		addCommand("list", list, "list all installed libraries", false);
 		addCommand("upgrade", upgrade, "upgrade all installed libraries");
 		addCommand("update", update, "update a single library");
-		addCommand("updateself", updateSelf, "update haxelib itself");
+		addCommand("selfupdate", updateSelf, "update haxelib itself");
 		addCommand("remove", remove, "remove a given library/version", false);
 		addCommand("set", set, "set the current version for a library", false);
 		addCommand("search", search, "list libraries matching a word");
@@ -171,9 +172,11 @@ class Main {
 		Sys.print(name+" : ");
 		if( passwd ) {
 			var s = new StringBuf();
-			var c;
-			while( (c = Sys.getChar(false)) != 13 )
-				s.addChar(c);
+			do switch Sys.getChar(false) {
+				case 10, 13: break;
+				case c: s.addChar(c);
+			}
+			while (true);
 			print("");
 			return s.toString();
 		}
@@ -699,8 +702,10 @@ class Main {
 			print("haxelib is up to date");
 		switch tryBuild() {
 			case None:
-				var haxepath = Sys.getEnv("HAXEPATH"),
-					win = Sys.systemName() == "Windows";
+				var win = Sys.systemName() == "Windows";
+				var haxepath = 
+					if (win) Sys.getEnv("HAXEPATH");
+					else new Path(new Process('which', ['haxelib']).stdout.readAll().toString()).dir + '/';
 					
 				if (haxepath == null) 
 					throw 'HAXEPATH environment variable not defined';
@@ -712,21 +717,8 @@ class Main {
 						}
 				
 				if (win) {
-					var file = '$haxepath/haxelib.n';
-					var p = new Process(
-						'haxe', 
-						[
-							'-neko', file, 
-							'-lib', 'haxelib_client', 
-							'-main', 'tools.haxelib.Main', 
-						]
-					);
-					if (p.exitCode() == 0) {
-						var p = new Process('nekotools', ['boot', file]);
-						if (p.exitCode() != 0) 
-							throw 'Error booting haxelib :' + p.stderr.readAll().toString();
-					}
-					else throw 'Error rebuilding haxelib: ' + p.stderr.readAll().toString();
+					File.saveContent('update.hxml', '-lib haxelib_client\n--run tools.haxelib.Rebuild');
+					Sys.println('Please run haxe update.hxml');
 				}
 				else {
 					var p = new Process('haxelib', ['path', 'haxelib_client']);
@@ -740,13 +732,13 @@ class Main {
 								args.push('-cp "$arg"');
 						};
 						
-						var file = '$haxepath/haxelib.sh';
+						var file = haxepath+'haxelib';
 						try File.saveContent(
 							file,
-							'#!\nhaxe --run -main tools.haxelib.Main '+args.join(' ')
+							'#!\nhaxe '+args.join(' ')+' --run tools.haxelib.Main $@'
 						)
 						catch (e:Dynamic) 
-							throw 'Error writing file $file. Please ensure you have write permissions. Error message ' + Std.string(e);
+							throw 'Error writing file $file. Please ensure you have write permissions. \n  ' + Std.string(e);
 					}
 					else throw p.stdout.readAll();
 				}
@@ -1065,4 +1057,4 @@ class Main {
 		new Main().process();
 	}
 
-}
+}

+ 14 - 254
std/tools/haxelib/SiteApi.hx

@@ -20,261 +20,21 @@
  * DEALINGS IN THE SOFTWARE.
  */
 package tools.haxelib;
-import tools.haxelib.Data;
-#if haxelib_site
-import tools.haxelib.SiteDb;
-#end
-
-class SiteApi {
-
-	var db : sys.db.Connection;
-
-	public function new( db ) {
-		this.db = db;
-	}
-
-	public function search( word : String ) : List<{ id : Int, name : String }> {
-		return Project.manager.containing(word);
-	}
-
-	public function infos( project : String ) : ProjectInfos {
-		var p = Project.manager.search({ name : project }).first();
-		if( p == null )
-			throw "No such Project : "+project;
-		var vl = Version.manager.search({ project : p.id });
-		var versions = new Array();
-		for( v in vl )
-			versions.push({ name : v.name, comments : v.comments, date : v.date });
-		return {
-			name : p.name,
-			curversion : if( p.version == null ) null else p.version.name,
-			desc : p.description,
-			versions : versions,
-			owner : p.owner.name,
-			website : p.website,
-			license : p.license,
-			tags : Tag.manager.search({ project : p.id }).map(function(t) return t.tag),
-		};
-	}
-
-	public function user( name : String ) : UserInfos {
-		var u = User.manager.search({ name : name }).first();
-		if( u == null )
-			throw "No such user : "+name;
-		var pl = Project.manager.search({ owner : u.id });
-		var projects = new Array();
-		for( p in pl )
-			projects.push(p.name);
-		return {
-			name : u.name,
-			fullname : u.fullname,
-			email : u.email,
-			projects : projects,
-		};
-	}
-
-	public function register( name : String, pass : String, mail : String, fullname : String ) : Bool {
-		if( !Data.alphanum.match(name) )
-			throw "Invalid user name, please use alphanumeric characters";
-		if( name.length < 3 )
-			throw "User name must be at least 3 characters";
-		var u = new User();
-		u.name = name;
-		u.pass = pass;
-		u.email = mail;
-		u.fullname = fullname;
-		u.insert();
-		return null;
-	}
-
-	public function isNewUser( name : String ) : Bool {
-		return User.manager.search({ name : name }).first() == null;
-	}
-
-	public function checkDeveloper( prj : String, user : String ) : Void {
-		var p = Project.manager.search({ name : prj }).first();
-		if( p == null )
-			return;
-		for( d in Developer.manager.search({ project : p.id }) )
-			if( d.user.name == user )
-				return;
-		throw "User '"+user+"' is not a developer of project '"+prj+"'";
-	}
-
-	public function checkPassword( user : String, pass : String ) : Bool {
-		var u = User.manager.search({ name : user }).first();
-		return u != null && u.pass == pass;
-	}
-
-	public function getSubmitId() : String {
-		return Std.string(Std.random(100000000));
-	}
-
-	public function processSubmit( id : String, user : String, pass : String ) : String {
-		var path = Site.TMP_DIR+"/"+Std.parseInt(id)+".tmp";
-
-		var file = try sys.io.File.read(path,true) catch( e : Dynamic ) throw "Invalid file id #"+id;
-		var zip = try haxe.zip.Reader.readZip(file) catch( e : Dynamic ) { file.close(); neko.Lib.rethrow(e); };
-		file.close();
-
-		var infos = Data.readInfos(zip,true);
-		var u = User.manager.search({ name : user }).first();
-		if( u == null || u.pass != pass )
-			throw "Invalid username or password";
 
-		var devs = infos.developers.map(function(user) {
-			var u = User.manager.search({ name : user }).first();
-			if( u == null )
-				throw "Unknown user '"+user+"'";
-			return u;
-		});
-
-		var tags = Lambda.array(infos.tags);
-		tags.sort(Reflect.compare);
-
-		var p = Project.manager.search({ name : infos.project }).first();
-
-		// create project if needed
-		if( p == null ) {
-			p = new Project();
-			p.name = infos.project;
-			p.description = infos.desc;
-			p.website = infos.website;
-			p.license = infos.license;
-			p.owner = u;
-			p.insert();
-			for( u in devs ) {
-				var d = new Developer();
-				d.user = u;
-				d.project = p;
-				d.insert();
-			}
-			for( tag in tags ) {
-				var t = new Tag();
-				t.tag = tag;
-				t.project = p;
-				t.insert();
-			}
-		}
-
-		// check submit rights
-		var pdevs = Developer.manager.search({ project : p.id });
-		var isdev = false;
-		for( d in pdevs )
-			if( d.user.id == u.id ) {
-				isdev = true;
-				break;
-			}
-		if( !isdev )
-			throw "You are not a developer of this project";
-
-		var otags = Tag.manager.search({ project : p.id });
-		var curtags = otags.map(function(t) return t.tag).join(":");
-
-		// update public infos
-		if( infos.desc != p.description || p.website != infos.website || p.license != infos.license || pdevs.length != devs.length || tags.join(":") != curtags ) {
-			if( u.id != p.owner.id )
-				throw "Only project owner can modify project infos";
-			p.description = infos.desc;
-			p.website = infos.website;
-			p.license = infos.license;
-			p.update();
-			if( pdevs.length != devs.length ) {
-				for( d in pdevs )
-					d.delete();
-				for( u in devs ) {
-					var d = new Developer();
-					d.user = u;
-					d.project = p;
-					d.insert();
-				}
-			}
-			if( tags.join(":") != curtags ) {
-				for( t in otags )
-					t.delete();
-				for( tag in tags ) {
-					var t = new Tag();
-					t.tag = tag;
-					t.project = p;
-					t.insert();
-				}
-			}
-		}
-
-		// look for current version
-		var current = null;
-		var vstr = infos.version.toString();
-		for( v in Version.manager.search({ project : p.id }) )
-			if( v.name == vstr ) {
-				current = v;
-				break;
-			}
-
-		// update documentation
-		var doc = null;
-		var docXML = Data.readDoc(zip);
-		if( docXML != null ) {
-			var p = new haxe.rtti.XmlParser();
-			p.process(Xml.parse(docXML).firstElement(),null);
-			p.sort();
-			var roots = new Array();
-			for( x in p.root )
-				switch( x ) {
-				case TPackage(name,_,_):
-					switch( name ) {
-					case "flash","flash8","sys","cs","java","flash9","haxe","js","neko","cpp","php","tools": // don't include haXe core types
-					default: roots.push(x);
-					}
-				default:
-					// don't include haXe root types
-				}
-			var s = new haxe.Serializer();
-			s.useEnumIndex = true;
-			s.useCache = true;
-			s.serialize(roots);
-			doc = s.toString();
-		}
-
-		// update file
-		var target = Site.REP_DIR+"/"+Data.fileName(p.name,infos.version);
-		if( current != null ) sys.FileSystem.deleteFile(target);
-		sys.FileSystem.rename(path,target);
-
-		// update existing version
-		if( current != null ) {
-			current.documentation = doc;
-			current.comments = infos.versionComments;
-			current.update();
-			return "Version "+current.name+" (id#"+current.id+") updated";
-		}
-
-		// add new version
-		var v = new Version();
-		v.project = p;
-		v.name = infos.version;
-		v.comments = infos.versionComments;
-		v.downloads = 0;
-		v.date = Date.now().toString();
-		v.documentation = doc;
-		v.insert();
-
-		p.version = v;
-		p.update();
-		return "Version "+v.name+" (id#"+v.id+") added";
-	}
-
-	public function postInstall( project : String, version : String ) {
-		var p = Project.manager.search({ name : project }).first();
-		if( p == null )
-			throw "No such Project : "+project;
-		var v = Version.manager.search({ project : p.id, name : version }).first();
-		if( v == null )
-			throw "No such Version : "+version;
-		v.downloads++;
-		v.update();
-		p.downloads++;
-		p.update();
-	}
+import tools.haxelib.Data;
 
+interface SiteApi {
+	public function search( word : String ) : List<{ id : Int, name : String }>;
+	public function infos( project : String ) : ProjectInfos;
+	public function user( name : String ) : UserInfos;
+	public function register( name : String, pass : String, mail : String, fullname : String ) : Bool;
+	public function isNewUser( name : String ) : Bool;
+	public function checkDeveloper( prj : String, user : String ) : Void;
+	public function checkPassword( user : String, pass : String ) : Bool;
+	public function getSubmitId() : String;
+	
+	public function processSubmit( id : String, user : String, pass : String ) : String;
+
+	public function postInstall( project : String, version : String):Void;
 }