forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			366 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			366 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | import sys.FileSystem; | ||
|  | 
 | ||
|  | class PathManager | ||
|  | { | ||
|  |    private static var directoryCache = new Map<String,Bool>(); | ||
|  |    private static var haxelibPaths = new Map<String,String>(); | ||
|  |     | ||
|  |    public static function combine(firstPath:String, secondPath:String):String | ||
|  |    { | ||
|  |       if (firstPath == null || firstPath == "") | ||
|  |       {    | ||
|  |          return secondPath;   | ||
|  |       } | ||
|  |       else if (secondPath != null && secondPath != "" && secondPath!=".") | ||
|  |       { | ||
|  |          if (BuildTool.isWindows) | ||
|  |          { | ||
|  |             if (secondPath.indexOf (":") == 1) | ||
|  |             { | ||
|  |                return secondPath; | ||
|  |             } | ||
|  |          } | ||
|  |          else | ||
|  |          { | ||
|  |             if (secondPath.substr (0, 1) == "/") | ||
|  |             { | ||
|  |                return secondPath; | ||
|  |             } | ||
|  |          } | ||
|  |           | ||
|  |          var firstSlash = (firstPath.substr(-1) == "/" || firstPath.substr(-1) == "\\"); | ||
|  |          var secondSlash = (secondPath.substr(0, 1) == "/" || secondPath.substr(0, 1) == "\\"); | ||
|  |           | ||
|  |          if (firstSlash && secondSlash) | ||
|  |          { | ||
|  |             return firstPath + secondPath.substr(1); | ||
|  |          } | ||
|  |          else if (!firstSlash && !secondSlash) | ||
|  |          { | ||
|  |             return firstPath + "/" + secondPath; | ||
|  |          } | ||
|  |          else | ||
|  |          { | ||
|  |             return firstPath + secondPath; | ||
|  |          } | ||
|  |       } | ||
|  |       else | ||
|  |       { | ||
|  |          return firstPath; | ||
|  |       } | ||
|  |    } | ||
|  |     | ||
|  |    public static function escape(path:String):String | ||
|  |    {   | ||
|  |       if (!BuildTool.isWindows) | ||
|  |       {   | ||
|  |          path = StringTools.replace(path, "\\ ", " "); | ||
|  |          path = StringTools.replace(path, " ", "\\ "); | ||
|  |          path = StringTools.replace(path, "\\'", "'"); | ||
|  |          path = StringTools.replace(path, "'", "\\'");    | ||
|  |       } | ||
|  |       else | ||
|  |       {   | ||
|  |          path = StringTools.replace(path, "^,", ","); | ||
|  |          path = StringTools.replace(path, ",", "^,");  | ||
|  |       } | ||
|  |       return expand(path); | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function expand(path:String):String | ||
|  |    {   | ||
|  |       if (path == null) | ||
|  |       { | ||
|  |          path = ""; | ||
|  |       } | ||
|  |        | ||
|  |       if (!BuildTool.isWindows) | ||
|  |       { | ||
|  |          if (StringTools.startsWith(path, "~/")) | ||
|  |          { | ||
|  |             path = Sys.getEnv("HOME") + "/" + path.substr(2);   | ||
|  |          } | ||
|  |       } | ||
|  |        | ||
|  |       return path; | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function getHaxelib (haxelib:String, version:String = "", validate:Bool = true, clearCache:Bool = false):String | ||
|  |    {    | ||
|  |       var name = haxelib; | ||
|  |       if (version != "") | ||
|  |       { | ||
|  |          name += ":" + version; | ||
|  |       } | ||
|  |        | ||
|  |       if (clearCache) | ||
|  |       { | ||
|  |          haxelibPaths.remove(name);  | ||
|  |       } | ||
|  |        | ||
|  |       if (!haxelibPaths.exists(name)) | ||
|  |       { | ||
|  |          var cache = Log.verbose; | ||
|  |          Log.verbose = false; | ||
|  |          var output = ""; | ||
|  |           | ||
|  |          try | ||
|  |          { | ||
|  |             output = ProcessManager.runProcess(Sys.getEnv ("HAXEPATH"), "haxelib", [ "path", name ], true, false); | ||
|  |          } | ||
|  |          catch (e:Dynamic) {} | ||
|  |           | ||
|  |          Log.verbose = cache; | ||
|  |           | ||
|  |          var lines = output.split("\n"); | ||
|  |          var result = ""; | ||
|  |          var re = new EReg("^-D " + haxelib + "(=.*)?$", ""); //matches "-D hxcpp=3.1.0" or "-D hxcpp", but not "-D hxcpp-extras" | ||
|  |          for (i in 1...lines.length) | ||
|  |          { | ||
|  |             if (re.match(StringTools.trim(lines[i]))) | ||
|  |             { | ||
|  |                result = StringTools.trim(lines[i - 1]); | ||
|  |             } | ||
|  |          } | ||
|  |           | ||
|  |          if (result == "") | ||
|  |          {    | ||
|  |             for (line in lines) | ||
|  |             { | ||
|  |                if (line != "" && line.substr(0, 1) != "-") | ||
|  |                { | ||
|  |                   try | ||
|  |                   { | ||
|  |                      if (FileSystem.exists(line)) | ||
|  |                      { | ||
|  |                         result = line; | ||
|  |                      } | ||
|  |                   } | ||
|  |                   catch (e:Dynamic) {} | ||
|  |                } | ||
|  |             } | ||
|  |          } | ||
|  |           | ||
|  |          if (validate) | ||
|  |          { | ||
|  |             if (result == "") | ||
|  |             { | ||
|  |                if (output.indexOf("does not have") > -1) | ||
|  |                { | ||
|  |                   var directoryName = ""; | ||
|  |                   if (BuildTool.isWindows) | ||
|  |                   { | ||
|  |                      directoryName = "Windows"; | ||
|  |                   } | ||
|  |                   else if (BuildTool.isMac) | ||
|  |                   { | ||
|  |                      directoryName = BuildTool.is64 ? "Mac64" : "Mac";  | ||
|  |                   } | ||
|  |                   else | ||
|  |                   { | ||
|  |                      directoryName = BuildTool.is64 ? "Linux64" : "Linux"; | ||
|  |                   } | ||
|  |                    | ||
|  |                   Log.error ("haxelib \"" + haxelib + "\" does not have an \"ndll/" + directoryName + "\" directory"); | ||
|  |                } | ||
|  |                else | ||
|  |                { | ||
|  |                   if (version != "") | ||
|  |                   { | ||
|  |                      Log.error("Could not find haxelib \"" + haxelib + "\" version \"" + version + "\", does it need to be installed?"); | ||
|  |                   } | ||
|  |                   else | ||
|  |                   { | ||
|  |                      Log.error("Could not find haxelib \"" + haxelib + "\", does it need to be installed?"); | ||
|  |                   } | ||
|  |                } | ||
|  |             } | ||
|  |          } | ||
|  |          if ( result!="" ) | ||
|  |          { | ||
|  |             var rootPath = result; | ||
|  |             var depth = 0; | ||
|  |             while( FileSystem.exists(rootPath) && FileSystem.isDirectory(rootPath) && depth<10 ) | ||
|  |             { | ||
|  |                if (FileSystem.exists(rootPath + "/haxelib.json")) | ||
|  |                { | ||
|  |                    result = rootPath; | ||
|  |                    break; | ||
|  |                } | ||
|  |                depth++; | ||
|  |                rootPath = haxe.io.Path.directory(rootPath); | ||
|  |             } | ||
|  |          } | ||
|  |          haxelibPaths.set(name,result); | ||
|  |       } | ||
|  |        | ||
|  |       return haxelibPaths.get(name); | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function isAbsolute(path:String):Bool | ||
|  |    { | ||
|  |       if (BuildTool.isWindows) | ||
|  |       { | ||
|  |          if (path != null && path.length > 2 && path.charAt(1) == ":" && (path.charAt(2) == "\\" || path.charAt(2) == "/")) | ||
|  |          { | ||
|  |             return true; | ||
|  |          } | ||
|  |       } | ||
|  |       else | ||
|  |       { | ||
|  |          if (StringTools.startsWith(path, "/") || StringTools.startsWith(path, "\\")) | ||
|  |          { | ||
|  |             return true; | ||
|  |          } | ||
|  |       } | ||
|  |       return false; | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function mkdir(directory:String, skipFilePart=false):Void | ||
|  |    { | ||
|  |       directory = StringTools.replace(directory, "\\", "/"); | ||
|  |       var total = ""; | ||
|  |        | ||
|  |       if (directory.substr(0, 1) == "/") | ||
|  |       { | ||
|  |          total = "/";    | ||
|  |       } | ||
|  |        | ||
|  |       var parts = directory.split("/"); | ||
|  |       if (skipFilePart && parts.length>0) | ||
|  |          parts.pop(); | ||
|  |        | ||
|  |       if (parts.length > 0 && parts[0].indexOf(":") > -1) | ||
|  |       { | ||
|  |          total = parts.shift(); | ||
|  |       } | ||
|  |        | ||
|  |       for (part in parts) | ||
|  |       { | ||
|  |          if (part != "." && part != "") | ||
|  |          { | ||
|  |             if (total != "" && total != "/") | ||
|  |             { | ||
|  |                total += "/";   | ||
|  |             } | ||
|  |              | ||
|  |             total += part; | ||
|  |              | ||
|  |             if (!directoryCache.exists (total)) | ||
|  |             { | ||
|  |                //directoryCache.set(total, true); | ||
|  |                if (!FileSystem.exists(total)) | ||
|  |                { | ||
|  |                   Log.info("", " - \x1b[1mCreating directory:\x1b[0m " + total); | ||
|  |                   FileSystem.createDirectory(total); | ||
|  |                } | ||
|  |             } | ||
|  |          } | ||
|  |       } | ||
|  |        | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function removeDirectory(directory:String):Void | ||
|  |    { | ||
|  |       if (FileSystem.exists(directory)) | ||
|  |       { | ||
|  |          var files; | ||
|  |          try | ||
|  |          { | ||
|  |             files = FileSystem.readDirectory(directory); | ||
|  |          } | ||
|  |          catch (e:Dynamic) | ||
|  |          {    | ||
|  |             return;   | ||
|  |          } | ||
|  |           | ||
|  |          for (file in FileSystem.readDirectory(directory)) | ||
|  |          {    | ||
|  |             var path = directory + "/" + file; | ||
|  |             try | ||
|  |             {    | ||
|  |                if (FileSystem.isDirectory(path)) | ||
|  |                {    | ||
|  |                   removeDirectory(path); | ||
|  |                } | ||
|  |                else | ||
|  |                { | ||
|  |                   FileSystem.deleteFile(path); | ||
|  |                } | ||
|  |             } | ||
|  |             catch (e:Dynamic) {} | ||
|  |          } | ||
|  |           | ||
|  |          Log.info("", " - \x1b[1mRemoving directory:\x1b[0m " + directory); | ||
|  |           | ||
|  |          try | ||
|  |          {    | ||
|  |             FileSystem.deleteDirectory(directory); | ||
|  |          } | ||
|  |          catch (e:Dynamic) {} | ||
|  |       } | ||
|  |    } | ||
|  | 
 | ||
|  |    static public function removeFile(file:String) | ||
|  |    { | ||
|  |       if (FileSystem.exists(file)) | ||
|  |       { | ||
|  |          Log.info("", " - \x1b[1mRemoving file:\x1b[0m " + file); | ||
|  |          FileSystem.deleteFile(file); | ||
|  |       } | ||
|  |    } | ||
|  | 
 | ||
|  |    static public function removeFilesWithExtension(inExt:String) | ||
|  |    { | ||
|  |       var contents = FileSystem.readDirectory("."); | ||
|  |       for(item in contents) | ||
|  |       { | ||
|  |          if (item.length > inExt.length && item.substr(item.length-inExt.length)==inExt) | ||
|  |             removeFile(item); | ||
|  |       } | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function resetDirectoryCache():Void | ||
|  |    { | ||
|  |       directoryCache = new Map<String,Bool>(); | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function standardize(path:String, trailingSlash:Bool = false):String | ||
|  |    { | ||
|  |       path = StringTools.replace (path, "\\", "/"); | ||
|  |       path = StringTools.replace (path, "//", "/"); | ||
|  |       path = StringTools.replace (path, "//", "/"); | ||
|  |        | ||
|  |       if (!trailingSlash && StringTools.endsWith(path, "/")) | ||
|  |       {    | ||
|  |          path = path.substr(0, path.length - 1); | ||
|  |       } | ||
|  |       else if (trailingSlash && !StringTools.endsWith(path, "/")) | ||
|  |       {    | ||
|  |          path += "/";   | ||
|  |       } | ||
|  |        | ||
|  |       return path; | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function clean(path:String) | ||
|  |    { | ||
|  |       var result = new Array<String>(); | ||
|  |       for(part in standardize(path).split("/")) | ||
|  |       { | ||
|  |          if (part!=".") | ||
|  |          { | ||
|  |             if (part=="..") | ||
|  |             { | ||
|  |                if (result.length==0) | ||
|  |                   Log.error("Bad relative path " + path); | ||
|  |                result.pop(); | ||
|  |             } | ||
|  |             else | ||
|  |                result.push(part); | ||
|  |          } | ||
|  |       } | ||
|  |       return result.join("/"); | ||
|  |    } | ||
|  | } |