?? main.hx
字號:
package tools.haxelib;enum Answer { Yes; No; Always;}class SiteProxy extends haxe.remoting.Proxy<tools.haxelib.SiteApi> {}class Progress extends neko.io.Output { var o : neko.io.Output; var cur : Int; var max : Int; var start : Float; public function new(o) { this.o = o; cur = 0; start = haxe.Timer.stamp(); } function bytes(n) { cur += n; if( max == null ) neko.Lib.print(cur+" bytes\r"); else neko.Lib.print(cur+"/"+max+" ("+Std.int((cur*100.0)/max)+"%)\r"); } public override function writeChar(c) { o.writeChar(c); bytes(1); } public override function writeBytes(s,p,l) { var r = o.writeBytes(s,p,l); bytes(r); return r; } public override function close() { super.close(); o.close(); var time = haxe.Timer.stamp() - start; var speed = (cur / time) / 1024; time = Std.int(time * 10) / 10; speed = Std.int(speed * 10) / 10; neko.Lib.print("Download complete : "+cur+" bytes in "+time+"s ("+speed+"KB/s)\n"); } public override function prepare(m) { max = m; }}class ProgressIn extends neko.io.Input { var i : neko.io.Input; var pos : Int; var tot : Int; public function new( i, tot ) { this.i = i; this.pos = 0; this.tot = tot; } public override function readChar() { var c = i.readChar(); doRead(1); return c; } public override function readBytes(buf,pos,len) { var k = i.readBytes(buf,pos,len); doRead(k); return k; } function doRead( nbytes : Int ) { pos += nbytes; neko.Lib.print( Std.int((pos * 100.0) / tot) + "%\r" ); }}class Main { static var VERSION = 103; static var REPNAME = "lib"; static var SERVER = { host : "lib.haxe.org", port : 80, dir : "", url : "index.n" }; var argcur : Int; var args : Array<String>; var commands : List<{ name : String, doc : String, f : Void -> Void }>; var siteUrl : String; var site : SiteProxy; function new() { args = neko.Sys.args(); commands = new List(); addCommand("install",install,"install a given project"); addCommand("list",list,"list all installed projects"); addCommand("upgrade",upgrade,"upgrade all installed projects"); addCommand("remove",remove,"remove a given project/version"); addCommand("set",set,"set the current version for a project"); addCommand("search",search,"list projects matching a word"); addCommand("info",info,"list informations on a given project"); addCommand("user",user,"list informations on a given user"); addCommand("register",register,"register a new user"); addCommand("submit",submit,"submit or update a project package"); addCommand("setup",setup,"set the haxelib repository path"); addCommand("config",config,"print the repository path"); addCommand("path",path,"give paths to libraries"); addCommand("run",run,"run the specified project with parameters"); addCommand("test",test,"install the specified package localy"); siteUrl = "http://"+SERVER.host+":"+SERVER.port+"/"+SERVER.dir; site = new SiteProxy(haxe.remoting.Connection.urlConnect(siteUrl+SERVER.url).api); } function param( name, ?passwd ) { if( args.length > argcur ) return args[argcur++]; neko.Lib.print(name+" : "); if( passwd ) { var s = new StringBuf(); var c; while( (c = neko.io.File.getChar(false)) != 13 ) s.addChar(c); print(""); return s.toString(); } return neko.io.File.stdin().readLine(); } function ask( question ) { while( true ) { neko.Lib.print(question+" [y/n/a] ? "); switch( neko.io.File.stdin().readLine() ) { case "n": return No; case "y": return Yes; case "a": return Always; } } return null; } function paramOpt() { if( args.length > argcur ) return args[argcur++]; return null; } function addCommand( name, f, doc ) { commands.add({ name : name, doc : doc, f : f }); } function usage() { var vmin = Std.string(VERSION % 100); var ver = Std.int(VERSION/100) + "." + if( vmin.length == 1 ) "0"+vmin else vmin; print("Haxe Library Manager "+ver+" - (c)2006 Motion-Twin"); print(" Usage : haxelib [command] [options]"); print(" Commands :"); for( c in commands ) print(" "+c.name+" : "+c.doc); neko.Sys.exit(1); } function process() { var debug = false; argcur = 0; if( args[argcur] == "-debug" ) { argcur++; debug = true; } var cmd = args[argcur++]; if( cmd == null ) usage(); for( c in commands ) if( c.name == cmd ) { try { c.f(); } catch( e : Dynamic ) { if( e == "std@host_resolve" ) { print("Host "+SERVER.host+" was not found"); print("Please ensure that your internet connection is on"); print("If you don't have an internet connection or if you are behing a proxy"); print("please download manually the file from http://lib.haxe.org/files"); print("and run 'haxelib test <file>' to install the Library."); neko.Sys.exit(1); } if( debug ) neko.Lib.rethrow(e); print(Std.string(e)); neko.Sys.exit(1); } return; } print("Unknown command "+cmd); usage(); } // ---- COMMANDS -------------------- function search() { var word = param("Search word"); var l = site.search(word); for( s in l ) print(s.name); print(l.length+" projects found"); } function info() { var prj = param("Project name"); var inf = site.infos(prj); print("Name: "+inf.name); print("Desc: "+inf.desc); print("Website: "+inf.website); print("License: "+inf.license); print("Owner: "+inf.owner); print("Version: "+inf.curversion); print("Releases: "); if( inf.versions.length == 0 ) print(" (no version released yet)"); for( v in inf.versions ) print(" "+v.date+" "+v.name+" : "+v.comments); } function user() { var uname = param("User name"); var inf = site.user(uname); print("Id: "+inf.name); print("Name: "+inf.fullname); print("Mail: "+inf.email); print("Projects: "); if( inf.projects.length == 0 ) print(" (no projects)"); for( p in inf.projects ) print(" "+p); } function register() { doRegister(param("User")); print("Registration successful"); } function doRegister(name) { var email = param("Email"); var fullname = param("Fullname"); var pass = param("Password",true); var pass2 = param("Confirm",true); if( pass != pass2 ) throw "Password does not match"; pass = haxe.Md5.encode(pass); site.register(name,pass,email,fullname); return pass; } function submit() { var file = param("Package"); var data = neko.io.File.getContent(file); var zip = neko.zip.File.readZip(new neko.io.StringInput(data)); var infos = Datas.readInfos(zip); var user = infos.developers.first(); var password; if( site.isNewUser(user) ) { print("This is your first submission as '"+user+"'"); print("Please enter the following informations for registration"); password = doRegister(user); } else { if( infos.developers.length > 1 ) user = param("User"); password = haxe.Md5.encode(param("Password",true)); if( !site.checkPassword(user,password) ) throw "Invalid password for "+user; } site.checkDeveloper(infos.project,user); // check dependencies validity for( d in infos.dependencies ) { var infos = site.infos(d.project); if( d.version == "" ) continue; var found = false; for( v in infos.versions ) if( v.name == d.version ) { found = true; break; } if( !found ) throw "Project "+d.project+" does not have version "+d.version; } // query a submit id that will identify the file var id = site.getSubmitId(); // directly send the file data over Http var h = new haxe.Http("http://"+SERVER.host+":"+SERVER.port+"/"+SERVER.url); h.onError = function(e) { throw e; }; h.onData = print; h.fileTransfert("file",id,new ProgressIn(new neko.io.StringInput(data),data.length),data.length); print("Sending data.... "); h.request(true); // ask the server to register the sent file var msg = site.processSubmit(id,user,password); print(msg); } function install() { var prj = param("Project name"); var inf = site.infos(prj); if( inf.curversion == null ) throw "This project has not yet released a version"; var reqversion = paramOpt(); var version = if( reqversion != null ) reqversion else inf.curversion; var found = false; for( v in inf.versions ) if( v.name == version ) { found = true; break; } if( !found ) throw "No such version "+version; doInstall(inf.name,version,version == inf.curversion); } function doInstall( project, version, setcurrent ) { var rep = getRepository(); // check if exists already if( neko.FileSystem.exists(rep+Datas.safe(project)+"/"+Datas.safe(version)) ) { print("You already have "+project+" version "+version+" installed"); setCurrent(project,version,true); return; } // download to temporary file var filename = Datas.fileName(project,version); var filepath = rep+filename; var out = neko.io.File.write(filepath,true); var progress = new Progress(out);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -