mirror of
https://onedev.site.tesses.net/crosslang/crosslangextras
synced 2026-02-09 01:25:46 +00:00
First commit
This commit is contained in:
136
Tesses.CrossLang.BuildEssentials/src/PackageManager.tcross
Normal file
136
Tesses.CrossLang.BuildEssentials/src/PackageManager.tcross
Normal file
@@ -0,0 +1,136 @@
|
||||
func Tesses.CrossLang.PackageManager()
|
||||
{
|
||||
func ParseFileName(name)
|
||||
{
|
||||
|
||||
var index = name.LastIndexOf('.');
|
||||
if(index == -1) throw "We expect an extension";
|
||||
if(name.Substring(index) != ".crvm") throw "We expect the extension .crvm";
|
||||
name = name.Substring(0,index);
|
||||
//Name-VERSION-[dev|alpha|beta|prod]
|
||||
|
||||
var lastIndex = name.LastIndexOf('-');
|
||||
var verStage = name.Substring(lastIndex+1);
|
||||
var versionStr = verStage;
|
||||
if(verStage == "dev" || verStage == "alpha" || verStage == "beta" || verStage == "prod")
|
||||
{
|
||||
var lastIndex2 = name.LastIndexOf('-', lastIndex-1);
|
||||
return {
|
||||
Name = name.Substring(0,lastIndex2),
|
||||
Version = name.Substring(lastIndex2+1)
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
return {
|
||||
Name = name.Substring(0,lastIndex),
|
||||
Version = name.Substring(lastIndex+1)
|
||||
};
|
||||
}
|
||||
}
|
||||
var configRoot = Path.FromString(Env.Config) / "Tesses" / "CrossLang";
|
||||
var packageCache = configRoot / "PackageCache";
|
||||
FS.Local.CreateDirectory(packageCache);
|
||||
func FileReadByteArray(fs,path)
|
||||
{
|
||||
var f = fs.OpenFile(path,"rb");
|
||||
var ms = FS.MemoryStream(true);
|
||||
f.CopyTo(ms);
|
||||
var buff = ms.GetBytes();
|
||||
f.Close();
|
||||
return buff;
|
||||
}
|
||||
func FileReadString (fs,path) {
|
||||
var buff = FileReadByteArray(fs,path).ToString();
|
||||
ms.Close();
|
||||
return text;
|
||||
}
|
||||
return {
|
||||
Offline = false,
|
||||
ParseFileName,
|
||||
GetPackageServers = ()=>{
|
||||
var packageConfigFile = configRoot / "package_servers.json";
|
||||
if(FS.Local.RegularFileExists(packageConfigFile))
|
||||
{
|
||||
return Json.Decode(FileReadString(FS.Local, packageConfigFile));
|
||||
}
|
||||
return ["https://cpkg.tesseslanguage.com/"];
|
||||
},
|
||||
GetPackage = (this,name, version) =>
|
||||
{
|
||||
var v = Tesses.CrossLang.Version.Parse(version);
|
||||
var useCache = v.Stage != Tesses.CrossLang.Version.Dev;
|
||||
var pkgFile = packageCache / name / v.ToString();
|
||||
if(useCache && FS.Local.RegularFileExists(pkgFile))
|
||||
{
|
||||
return FileReadByteArray(FS.Local,pkgFile);
|
||||
}
|
||||
if(this.Offline) return null;
|
||||
|
||||
each(var item : this.GetPackageServers())
|
||||
{
|
||||
//https://cpkg.tesseslanguage.com/api/v1/download?name=MyPackage&version=1.0.0.0-prod
|
||||
var uri = $"{item.TrimEnd('/')}/api/v1/download?name={Net.Http.UrlEncode(name)}&version={Net.Http.UrlEncode(version)}";
|
||||
var req = Net.Http.MakeRequest(uri);
|
||||
if(req.StatusCode == 200)
|
||||
{
|
||||
var strm = FS.MemoryStream(true);
|
||||
req.CopyToStream(strm);
|
||||
|
||||
if(useCache) {
|
||||
FS.Local.CreateDirectory(packageCache / name);
|
||||
var f = FS.Local.OpenFile(pkgFile,"wb");
|
||||
strm.Seek(0,0);
|
||||
strm.CopyTo(f);
|
||||
f.Close();
|
||||
}
|
||||
var data = strm.GetBytes();
|
||||
strm.Close();
|
||||
req.Close();
|
||||
return data;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
GetLatest = (this,name) => {
|
||||
var pkgServers = this.GetPackageServers();
|
||||
if(this.Offline || pkgServers.Count == 0)
|
||||
{
|
||||
//user has declared they are offline or don't have packageServers look through packages locally
|
||||
var version = Tesses.CrossLang.Version.Create(0,0,0,0,0);
|
||||
var configRoot = Path.FromString(Env.Config) / "Tesses" / "CrossLang";
|
||||
var dir = configRoot / "PackageCache" / name;
|
||||
if(FS.Local.DirectoryExists(dir))
|
||||
each(var f : FS.Local.EnumeratePaths(dir))
|
||||
{
|
||||
var v = Tesses.CrossLang.Version.Parse(f.GetFileName());
|
||||
if(v >= version)
|
||||
{
|
||||
version = v;
|
||||
}
|
||||
}
|
||||
|
||||
if(version.VersionInt == 0) return null;
|
||||
return version.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
each(var item : pkgServers)
|
||||
{
|
||||
var uri = $"{item.TrimEnd('/')}/api/v1/latest?name={Net.Http.UrlEncode(name)}";
|
||||
var req = Net.Http.MakeRequest(uri);
|
||||
if(req.StatusCode == 200)
|
||||
{
|
||||
var res0 = req.ReadAsString();
|
||||
|
||||
var res = Json.Decode(res0);
|
||||
req.Close();
|
||||
return res.version;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
227
Tesses.CrossLang.BuildEssentials/src/buildtool.tcross
Normal file
227
Tesses.CrossLang.BuildEssentials/src/buildtool.tcross
Normal file
@@ -0,0 +1,227 @@
|
||||
func Tesses.CrossLang.BuildTool(pm)
|
||||
{
|
||||
func copyFile(src,dest)
|
||||
{
|
||||
var src = FS.Local.OpenFile(src,"rb");
|
||||
var dest = FS.Local.OpenFile(dest, "wb");
|
||||
src.CopyTo(dest);
|
||||
src.Close();
|
||||
dest.Close();
|
||||
}
|
||||
|
||||
return {
|
||||
DirectoriesCompiled = [],
|
||||
FileReadString = (fs,path) =>{
|
||||
var f = fs.OpenFile(path,"rb");
|
||||
var ms = FS.MemoryStream(true);
|
||||
f.CopyTo(ms);
|
||||
var text = ms.GetBytes().ToString();
|
||||
f.Close();
|
||||
ms.Close();
|
||||
return text;
|
||||
},
|
||||
GetPackageDependencies = (this,name,version,dir)=>{
|
||||
var dep = pm.GetPackage(name,version);
|
||||
if(TypeOf(dep) == "Null") throw $"Package {name} with version {version} does not exist";
|
||||
var pkgPath = dir / $"{name}-{version}.crvm";
|
||||
var strm = FS.Local.OpenFile(pkgPath,"wb");
|
||||
strm.WriteBlock(dep,0,dep.Count);
|
||||
strm.Close();
|
||||
var ms = MemoryStream(true);
|
||||
ms.WriteBlock(dep,0,dep.Count);
|
||||
ms.Seek(0,0);
|
||||
var package = Tesses.CrossLang.CrossVMFile();
|
||||
package.Load(ms);
|
||||
ms.Close();
|
||||
|
||||
var deps = [];
|
||||
|
||||
each(var dep : package.Dependencies)
|
||||
{
|
||||
deps.Add(this.GetPackageDependencies(dep.Name, dep.Version, dir));
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
Name = name,
|
||||
Version = version,
|
||||
Info = package.Info,
|
||||
Dependencies = deps,
|
||||
Output = pkgPath
|
||||
};
|
||||
},
|
||||
BuildProject = (this,projectDirectory)=>{
|
||||
|
||||
var dir = FS.MakeFull(projectDirectory);
|
||||
var dirStr = dir.ToString();
|
||||
|
||||
each(var item : this.DirectoriesCompiled)
|
||||
{
|
||||
if(item.Path == dirStr) return item.Data;
|
||||
}
|
||||
|
||||
var crossConf = dir / "cross.json";
|
||||
if(FS.Local.FileExists(crossConf))
|
||||
{
|
||||
var configData = Json.Decode(this.FileReadString(FS.Local,crossConf));
|
||||
var info = {type = "console"};
|
||||
var name = "out";
|
||||
var version = "1.0.0.0-prod";
|
||||
var outputDir = "bin";
|
||||
var objDir = "obj";
|
||||
var srcDir = "src";
|
||||
var resDir = "res";
|
||||
if(TypeOf(configData.name) != "Undefined")
|
||||
name = configData.name;
|
||||
|
||||
if(TypeOf(configData.version) != "Undefined")
|
||||
version = configData.version;
|
||||
if(TypeOf(configData.bin_directory) != "Undefined")
|
||||
outputDir = configData.bin_directory;
|
||||
|
||||
if(TypeOf(configData.obj_directory) != "Undefined")
|
||||
outputDir = configData.obj_directory;
|
||||
if(TypeOf(configData.source_directory) != "Undefined")
|
||||
srcDir = configData.source_directory;
|
||||
if(TypeOf(configData.resource_directory) != "Undefined")
|
||||
resDir = configData.resource_directory;
|
||||
if(TypeOf(configData.info) != "Undefined")
|
||||
info = configData.info;
|
||||
|
||||
FS.Local.CreateDirectory(dir / outputDir);
|
||||
|
||||
FS.Local.CreateDirectory(dir / objDir / "packages");
|
||||
|
||||
FS.Local.CreateDirectory(dir/resDir);
|
||||
|
||||
var dependencies = [];
|
||||
if(TypeOf(configData.project_dependencies) == "List")
|
||||
{
|
||||
each(var dep : configData.project_dependencies)
|
||||
{
|
||||
dependencies.Add(this.BuildProject(dep));
|
||||
}
|
||||
}
|
||||
var sources = [];
|
||||
if(TypeOf(configData.dependencies) == "List")
|
||||
{
|
||||
each(var dep : configData.project_dependencies)
|
||||
{
|
||||
dependencies.Add(this.GetPackageDependencies(dep.Name,dep.Version,dir / objDir / "packages"));
|
||||
}
|
||||
}
|
||||
|
||||
each(var item : this.DirectoriesCompiled)
|
||||
{
|
||||
if(item.Path == dirStr) return item.Data;
|
||||
}
|
||||
|
||||
|
||||
func walk_for_compiling(item,dir2)
|
||||
{
|
||||
if(item.Info.type == "compile_tool")
|
||||
{
|
||||
var newDir = dir / objDir / $"{item.Name}-{item.Version}";
|
||||
FS.Local.CreateDirectory(newDir);
|
||||
var newFile = newDir / $"{item.Name}-{item.Version}.crvm";
|
||||
|
||||
copyFile(item.Output, newFile);
|
||||
each(var item2 : item.Dependencies)
|
||||
{
|
||||
walk_for_compiling(item2, newDir);
|
||||
}
|
||||
//we need to load this
|
||||
var env = VM.CreateEnvironment({});
|
||||
env.RegisterEverything();
|
||||
env.LockRegister();
|
||||
|
||||
env.LoadFileWithDependencies(FS.Local,newFile);
|
||||
env.GetDictionary().RunTool({
|
||||
Project = FS.SubdirFilesystem(FS.Local, dir),
|
||||
ProjectInfo = info,
|
||||
GeneratedSource = sources
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
copyFile(item.Output, dir2 / $"{item.Name}-{item.Version}.crvm");
|
||||
each(var item2 : item.Dependencies)
|
||||
{
|
||||
walk_for_compiling(item2, dir2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var file_deps = [];
|
||||
|
||||
each(var dep : dependencies)
|
||||
{
|
||||
if(dep.Info.type == "lib")
|
||||
{
|
||||
file_deps.Add({
|
||||
Name = dep.Name,
|
||||
Version = dep.Version
|
||||
});
|
||||
}
|
||||
walk_for_compiling(dep,dir / outputDir);
|
||||
}
|
||||
|
||||
func walk_for_source(sourceDir)
|
||||
{
|
||||
each(var file : FS.Local.EnumeratePaths(sourceDir))
|
||||
{
|
||||
if(FS.Local.RegularFileExists(file))
|
||||
{
|
||||
var src = {
|
||||
FileName = file.ToString(),
|
||||
Source = this.FileReadString(FS.Local, file)
|
||||
};
|
||||
sources.Add(src);
|
||||
}
|
||||
else if(FS.Local.DirectoryExists(file))
|
||||
{
|
||||
walk_for_source(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
walk_for_source(dir / srcDir);
|
||||
|
||||
|
||||
var output = $"{name}-{version}.crvm";
|
||||
var outFile = FS.Local.OpenFile(dir / outputDir / output,"wb");
|
||||
|
||||
var result = VM.Compile({
|
||||
Name = name,
|
||||
Version = version,
|
||||
Sources = sources,
|
||||
Info = Json.Encode(info),
|
||||
ResourceFileSystem = FS.SubdirFilesystem(FS.Local, dir / resDir),
|
||||
Dependencies = file_deps,
|
||||
Output = outFile
|
||||
});
|
||||
|
||||
outFile.Close();
|
||||
if(!result.Success)
|
||||
{
|
||||
throw result.Reason;
|
||||
}
|
||||
|
||||
var myData = {
|
||||
Name = name,
|
||||
Version = version,
|
||||
Info = info,
|
||||
Output = dir / outputDir / output,
|
||||
Dependencies = dependencies
|
||||
};
|
||||
this.DirectoriesCompiled.Add({
|
||||
Path = dirStr,
|
||||
Data = myData
|
||||
});
|
||||
|
||||
return myData;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
149
Tesses.CrossLang.BuildEssentials/src/crossvmfile.tcross
Normal file
149
Tesses.CrossLang.BuildEssentials/src/crossvmfile.tcross
Normal file
@@ -0,0 +1,149 @@
|
||||
func Tesses.CrossLang.CrossVMFile()
|
||||
{
|
||||
return {
|
||||
Info = "",
|
||||
Name = "",
|
||||
Version = "",
|
||||
Dependencies = [],
|
||||
Chunks = [],
|
||||
Strings = [],
|
||||
Functions = [],
|
||||
Resources = [],
|
||||
Sections = [],
|
||||
Ensure = (this,strm,buff,len) =>{
|
||||
if(strm.ReadBlock(buff,0,len) != len)
|
||||
throw $"Could not read {len} byte(s)";
|
||||
},
|
||||
EnsureInt = (this,strm)=>{
|
||||
var buff = ByteArray(4);
|
||||
this.Ensure(strm,buff,4);
|
||||
var number = 0;
|
||||
number |= buff[0] << 24;
|
||||
number |= buff[1] << 16;
|
||||
number |= buff[2] << 8;
|
||||
number |= buff[3];
|
||||
return number;
|
||||
},
|
||||
EnsureString = (this,strm)=>{
|
||||
var len = this.EnsureInt(strm);
|
||||
var buff = ByteArray(len);
|
||||
this.Ensure(strm, buff,len);
|
||||
return buff.ToString();
|
||||
},
|
||||
GetString = (this,strm)=>{
|
||||
var index = this.EnsureInt(strm);
|
||||
if(index < this.Strings.Count) return this.Strings[index];
|
||||
throw $"{index} is not less than {this.Strings.Count}";
|
||||
},
|
||||
Read = (this,stream)=>{
|
||||
var header = ByteArray(8);
|
||||
this.Ensure(stream, header, header.Count);
|
||||
|
||||
var hdrStr = header.ToString();
|
||||
if(hdrStr != "TCROSSVM") throw "Invalid TCrossVM image.";
|
||||
|
||||
this.Ensure(stream, header, 5);
|
||||
|
||||
var version = Tesses.CrossLang.Version.FromBytes(header, 0);
|
||||
|
||||
if(version > Tesses.CrossLang.Version.Current) throw "Runtime is too old.";
|
||||
this.Ensure(stream, header, 5);
|
||||
|
||||
|
||||
this.Version = Tesses.CrossLang.Version.FromBytes(header,0);
|
||||
|
||||
var sec = ByteArray(4);
|
||||
var sectionCount = this.EnsureInt(stream);
|
||||
|
||||
|
||||
for(var i = 0; i < sectionCount; i++)
|
||||
{
|
||||
|
||||
this.Ensure(stream, sec, sec.Count);
|
||||
hdrStr = sec.ToString();
|
||||
var tableLength = this.EnsureInt(stream);
|
||||
if(hdrStr == "NAME")
|
||||
{
|
||||
this.Name = this.GetString(stream);
|
||||
}
|
||||
else if(hdrStr == "INFO")
|
||||
{
|
||||
this.Info = this.GetString(stream);
|
||||
}
|
||||
else if(hdrStr == "DEPS")
|
||||
{
|
||||
var _name = this.GetString(stream);
|
||||
this.Ensure(stream, header, 5);
|
||||
var _version = Tesses.CrossLang.Version.FromBytes(header,0);
|
||||
this.Dependencies.Add({
|
||||
Name = _name,
|
||||
Version = _version
|
||||
});
|
||||
}
|
||||
else if(hdrStr == "RESO")
|
||||
{
|
||||
var resource = ByteArray(tableLength);
|
||||
this.Ensure(stream,resource,resource.Count);
|
||||
this.Resources.Add(resource);
|
||||
}
|
||||
else if(hdrStr == "CHKS")
|
||||
{
|
||||
var chunkCount = this.EnsureInt(stream);
|
||||
for(var j = 0; j < chunkCount; j++)
|
||||
{
|
||||
var _args = [];
|
||||
var _argCount = this.EnsureInt(stream);
|
||||
for(var k = 0; k < _argCount; k++)
|
||||
{
|
||||
_args.Add(this.GetString(stream));
|
||||
}
|
||||
var _code = ByteArray(this.EnsureInt(stream));
|
||||
this.Ensure(stream,_code,_code.Count);
|
||||
var chunk = {
|
||||
Arguments = _args,
|
||||
Code = _code
|
||||
};
|
||||
this.Chunks.Add(chunk);
|
||||
}
|
||||
}
|
||||
else if(hdrStr == "FUNS")
|
||||
{
|
||||
var funLen = this.EnsureInt(stream);
|
||||
for(var j = 0; j < funLen; j++)
|
||||
{
|
||||
var fnPartsCount = this.EnsureInt(stream);
|
||||
var documentation = "";
|
||||
var fnParts = [];
|
||||
for(var k = 0; k < fnPartsCount; k++)
|
||||
{
|
||||
if(k == 0) documentation = this.GetString(stream);
|
||||
else fnParts.Add(this.GetString(stream));
|
||||
}
|
||||
var fnId = this.EnsureInt(stream);
|
||||
this.Functions.Add({
|
||||
Documentation=documentation,
|
||||
FunctionNameParts = fnParts,
|
||||
Closure = fnId
|
||||
});
|
||||
}
|
||||
}
|
||||
else if(hdrStr == "STRS")
|
||||
{
|
||||
var strcnt = this.EnsureInt(stream);
|
||||
for(var j = 0; j < strcnt; j++)
|
||||
{
|
||||
this.Strings.Add(this.EnsureString(stream));
|
||||
}
|
||||
}
|
||||
else {
|
||||
var data = ByteArray(tableLength);
|
||||
this.Ensure(stream,data,data.Count);
|
||||
this.Sections.Add({
|
||||
Name=hdrStr,
|
||||
Data = data
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
103
Tesses.CrossLang.BuildEssentials/src/version.tcross
Normal file
103
Tesses.CrossLang.BuildEssentials/src/version.tcross
Normal file
@@ -0,0 +1,103 @@
|
||||
func Tesses.CrossLang.Version.Create(major,minor,patch,build,stage)
|
||||
{
|
||||
return {
|
||||
Major = major,
|
||||
Minor = minor,
|
||||
Patch = patch,
|
||||
Build = build,
|
||||
Stage = stage,
|
||||
getBuildAsInt = (this)=>{
|
||||
return ((this.Build & 0x3FFF) << 2) | ((this.Stage & 0x03));
|
||||
},
|
||||
getVersionInt = (this)=>{
|
||||
return ((this.Major & 0xFF) << 32) | ((this.Minor & 0xFF) << 24)
|
||||
| ((this.Patch & 0xFF) << 16) | (this.BuildAsInt & 0xFFFF);
|
||||
},
|
||||
operator< = (this,right)=>{
|
||||
return this.VersionInt < right.VersionInt;
|
||||
},
|
||||
operator> = (this,right)=>{
|
||||
return this.VersionInt > right.VersionInt;
|
||||
},
|
||||
operator== = (this,right)=>{
|
||||
return this.VersionInt == right.VersionInt;
|
||||
},
|
||||
operator<= = (this,right)=>{
|
||||
return this.VersionInt <= right.VersionInt;
|
||||
},
|
||||
operator>= = (this,right)=>{
|
||||
return this.VersionInt >= right.VersionInt;
|
||||
},
|
||||
operator!= = (this,right)=>{
|
||||
return this.VersionInt != right.VersionInt;
|
||||
},
|
||||
ToString = (this) => {
|
||||
var stage = this.Stage == 0 ? "dev" : this.Stage == 1 ? "alpha" : this.Stage == 2 ? "beta" : "prod";
|
||||
return $"{this.Major & 0xFF}.{this.Minor & 0xFF}.{this.Patch & 0xFF}.{this.Build & 0x3FFF}-{stage}";
|
||||
},
|
||||
ToBytes = (this, buff, off) => {
|
||||
if((buff.Count - offset) < 5) throw "Not long enough";
|
||||
buff[off] = this.Major;
|
||||
buff[off+1] = this.Minor;
|
||||
buff[off+2] = this.Patch;
|
||||
var b = this.BuildAsInt;
|
||||
buff[off+3] = (b >> 8) & 0xFF;
|
||||
buff[off+4] = b & 0xFF;
|
||||
}
|
||||
};
|
||||
}
|
||||
func Tesses.CrossLang.Version.FromBytes(buffer, offset)
|
||||
{
|
||||
|
||||
if((buffer.Count - offset) < 5) throw "Not long enough";
|
||||
|
||||
var major = buffer[offset];
|
||||
var minor = buffer[offset+1];
|
||||
var patch = buffer[offset+2];
|
||||
|
||||
var buildI = (buffer[offset+3] << 8) | (buffer[offset+4]);
|
||||
|
||||
var build = (buildI >> 2);
|
||||
|
||||
|
||||
var stage = buildI & 0x03;
|
||||
|
||||
var b = Tesses.CrossLang.Version.Create(major,minor,patch,build,stage);
|
||||
return b;
|
||||
}
|
||||
func Tesses.CrossLang.Version.CreateEmpty()
|
||||
{
|
||||
return Tesses.CrossLang.Version.Create(1,0,0,0,Tesses.CrossLang.Version.Prod);
|
||||
}
|
||||
func Tesses.CrossLang.Version.Parse(ver)
|
||||
{
|
||||
var mySplit = ver.Split("-",false,2);
|
||||
var version = 3;
|
||||
if(mySplit.Count >= 1)
|
||||
{
|
||||
if(mySplit.Count == 2)
|
||||
{
|
||||
if(mySplit[1] == "dev") version = 0;
|
||||
else if(mySplit[1] == "alpha") version = 1;
|
||||
else if(mySplit[2] == "beta") version = 2;
|
||||
}
|
||||
var vpart = mySplit[0].Split(".",false,4);
|
||||
var major = 1;
|
||||
var minor = 0;
|
||||
var patch = 0;
|
||||
var build = 0;
|
||||
|
||||
if(vpart.Count >= 1) major = ParseLong(vpart[0]); if(TypeOf(major) != "Long") major = 1;
|
||||
if(vpart.Count >= 2) minor = ParseLong(vpart[1]); if(TypeOf(minor) != "Long") minor = 0;
|
||||
if(vpart.Count >= 3) patch = ParseLong(vpart[2]); if(TypeOf(patch) != "Long") patch = 0;
|
||||
if(vpart.Count >= 4) build = ParseLong(vpart[3]); if(TypeOf(build) != "Long") build = 0;
|
||||
|
||||
return Tesses.CrossLang.Version.Create(major,minor,patch,build,version);
|
||||
}
|
||||
}
|
||||
Tesses.CrossLang.Version.Dev = 0;
|
||||
Tesses.CrossLang.Version.Alpha = 1;
|
||||
Tesses.CrossLang.Version.Beta = 2;
|
||||
Tesses.CrossLang.Version.Prod = 3;
|
||||
|
||||
Tesses.CrossLang.Version.Current = Tesses.CrossLang.Version.Create(1,0,0,0,Tesses.CrossLang.Version.Prod);
|
||||
Reference in New Issue
Block a user