diff --git a/Tesses.CrossLang.PackageServer/src/pages/index.tcross b/Tesses.CrossLang.PackageServer/src/pages/index.tcross
index d6e9835..00f4d02 100644
--- a/Tesses.CrossLang.PackageServer/src/pages/index.tcross
+++ b/Tesses.CrossLang.PackageServer/src/pages/index.tcross
@@ -32,6 +32,7 @@ func Pages.Index(ctx)
API
Commit {commit.Remove(8)}
+
This website does not use cookies, unless you log in.
diff --git a/Tesses.CrossLang.Shell/src/add-dependency.tcross b/Tesses.CrossLang.Shell/src/add-dependency.tcross
new file mode 100644
index 0000000..490d226
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/add-dependency.tcross
@@ -0,0 +1,40 @@
+func Tesses.CrossLang.Shell.AddDependency(dd)
+{
+ //crosslang add-dependency Tesses.CrossLang.Markup --version=1.0.0.0-prod
+
+ if(dd.Arguments.Length > 1)
+ {
+
+ var name = dd.Arguments[1];
+ var version = null;
+ each(var opt : dd.Options)
+ {
+ if(opt.Key == "version")
+ version = opt.Value;
+ }
+ if(!FS.Local.FileExists("cross.json"))
+ {
+ Console.WriteLine("The current directory does not have a project");
+ return 1;
+ }
+
+ if(version == null)
+ {
+ var pm = Tesses.CrossLang.PackageManager();
+ version = pm.GetLatest(name);
+ }
+ if(version == null)
+ {
+ Console.WriteLine("Could not get version");
+ return 1;
+ }
+ else
+ {
+ var data = Json.Decode(FS.ReadAllText(FS.Local,"cross.json"));
+ if(TypeOf(data.dependencies) != "List") data.dependencies=[];
+ data.dependencies.Add({name,version});
+ FS.WriteAllText(FS.Local,"cross.json",Json.Encode(data,true));
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/add-project.tcross b/Tesses.CrossLang.Shell/src/add-project.tcross
new file mode 100644
index 0000000..503488b
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/add-project.tcross
@@ -0,0 +1,61 @@
+func Tesses.CrossLang.Shell.AddProject(dd)
+{
+ //crosslang add-project /path/to/project
+
+ if(dd.Arguments.Count > 1)
+ {
+ var dep = dd.Arguments[1];
+ if(FS.Local.DirectoryExists(dep))
+ {
+ var path = Path.FromString(dep) / "cross.json";
+ var pathStr = FS.MakeFull(dep).CollapseRelativeParents().ToString();
+ if(FS.Local.FileExists(path))
+ {
+ if(FS.Local.FileExists("cross.json"))
+ {
+ var f = FS.ReadAllText(FS.Local,"cross.json");
+ var json = Json.Decode(f);
+ if(TypeOf(json.project_dependencies) == "List")
+ {
+ each(var item : json.project_dependencies)
+ {
+ var _path = FS.MakeFull(item).CollapseRelativeParents().ToString();
+
+ if(_path == pathStr)
+ {
+ Console.WriteLine($"The project {dep} already exists in cross.json.");
+
+ return 0;
+ }
+ }
+ json.project_dependencies.Add(dep);
+ }
+ else
+ {
+ json.project_dependencies = [dep];
+
+ }
+ Console.WriteLine($"Added project {dep} to cross.json.");
+ FS.WriteAllText(FS.Local, "cross.json", Json.Encode(json,true));
+ return 0;
+ }
+ else
+ {
+ Console.WriteLine("The current directory does not have a project");
+ return 1;
+ }
+ }
+ else
+ {
+ Console.WriteLine($"The project file {path} does not exist");
+ return 1;
+ }
+ }
+ else
+ {
+ Console.WriteLine("The project directory does not exist");
+ return 1;
+ }
+ }
+ return 1;
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/configdir.tcross b/Tesses.CrossLang.Shell/src/configdir.tcross
new file mode 100644
index 0000000..7e49b4e
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/configdir.tcross
@@ -0,0 +1,5 @@
+func Tesses.CrossLang.Shell.ConfigDir(dd)
+{
+ Console.WriteLine(Env.CrossLangConfig);
+ return 0;
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/install-tool.tcross b/Tesses.CrossLang.Shell/src/install-tool.tcross
new file mode 100644
index 0000000..26ba327
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/install-tool.tcross
@@ -0,0 +1,128 @@
+func Tesses.CrossLang.Shell.InstallTool(dd)
+{
+ //crosslang install-tool Tesses.CrossLang.Tool.SomeTool --version=1.0.0.0-prod
+ var toolsDir = Env.CrossLangConfig / "Tools";
+
+ var offline=false;
+ var buildPath = ".";
+ var nobuild=false;
+ var output=.;
+ each(var flag : dd.Flags)
+ {
+ if(flag == "offline")
+ {
+ offline = true;
+ }
+ else if(flag == "help")
+ {
+ Console.WriteLine("USAGE: crosslang install-tool [flags-and-options]");
+ Console.WriteLine("USAGE: crosslang install-tool [PackageName] [flags-and-options]");
+ Console.WriteLine("FLAGS:");
+ Console.WriteLine("offline: build with no internet (don't fetch files)");
+ Console.WriteLine("help: this help");
+ Console.WriteLine("nobuild: don't build, just install (irrelevant if you specify a PackageName)");
+ Console.WriteLine();
+ Console.WriteLine("OPTIONS:");
+ Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config (irrelevant if you specify a PackageName)");
+ Console.WriteLine("version=1.0.0.0-prod: specify the package version (irrelevant if you don't specify a PackageName)");
+ Console.WriteLine();
+ Console.WriteLine("ARGUMENTS:");
+ Console.WriteLine("PackageName: the package name of a tool you want to download and install, if not specified we install the tool from the current directory");
+ return 0;
+ }
+ else if(flag == "nobuild")
+ {
+ nobuild=true;
+ }
+ }
+
+ if(dd.Arguments.Length == 1)
+ {
+
+ var conf = "";
+ each(var option : dd.Options)
+ {
+ if(option.Key == "conf")
+ {
+ conf = option.Value;
+ }
+ }
+
+ if(FS.Local.FileExists("cross.json"))
+ {
+ var proj = Json.Decode(FS.ReadAllText(FS.Local,"cross.json"));
+ var name = TypeOf(proj.info.toolname) == "String" ? proj.info.toolname : proj.name;
+
+ if(proj.info.type != "tool")
+ {
+ Console.WriteLine("The project is not a tool");
+ return 1;
+ }
+ if(TypeOf(name) != "String")
+ {
+ Console.WriteLine("The tool does not have a name");
+ return 1;
+ }
+ var toolDir = toolsDir / name;
+ FS.Local.CreateDirectory(toolDir);
+ var toolFile = toolDir / name + ".crvm";
+
+ if(nobuild)
+ {
+ var nameVer = $"{proj.name}-{proj.version}.crvm";
+ var buildDir = TypeOf(proj.bin_directory) == "String" ? proj.bin_directory : "bin";
+
+ output = ./buildDir/nameVer;
+ if(!FS.Local.FileExists(output))
+ {
+ Console.WriteLine($"ERROR: file {output} does not exist.");
+ return 1;
+ }
+
+ }
+ else
+ {
+ var pm = Tesses.CrossLang.PackageManager();
+ pm.Offline = offline;
+ var bt = Tesses.CrossLang.BuildTool(pm);
+ bt.Config = conf;
+ output = bt.BuildProject(buildPath).Output;
+ }
+
+ func CopyCRVM(src,dest)
+ {
+ 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();
+ Console.WriteLine($"{src} -> {dest}");
+ }
+ if(FS.Local.FileExists(dest)) return;
+ copyFile(src,dest);
+
+
+ var srcStrm = FS.Local.OpenFile(src,"rb");
+ var crvm = VM.LoadExecutable(srcStrm);
+
+ srcStrm.Close();
+ each(var dep : crvm.Dependencies)
+ {
+ var name = $"{dep.Name}-{dep.Version.ToString()}.crvm";
+ CopyCRVM(src.GetParent()/name, dest.GetParent()/name);
+ }
+ }
+ CopyCRVM(output,toolFile);
+ return 0;
+ }
+ else
+ {
+
+ Console.WriteLine("The current directory does not have a project");
+ return 1;
+ }
+ }
+ return 0;
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/login.tcross b/Tesses.CrossLang.Shell/src/login.tcross
new file mode 100644
index 0000000..bc898b9
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/login.tcross
@@ -0,0 +1,117 @@
+func Tesses.CrossLang.Shell.Login(dd)
+{
+ var accounts = [];
+
+
+ if(FS.Local.FileExists(Env.CrossLangConfig / "auth.json"))
+ {
+ accounts = Json.Decode(FS.ReadAllText(FS.Local,Env.CrossLangConfig / "auth.json"));
+ if(TypeOf(accounts) != "List") accounts = [];
+ }
+
+ //crosslang login local https://cpkg.tesseslanguage.com/
+ //crosslang login [NAME] [HOST] [TOKEN]
+
+
+
+
+ if(dd.Arguments.Length < 3)
+ {
+ //not valid
+ }
+ else if(dd.Arguments.Length == 3)
+ {
+ //name server-url
+
+ var name = dd.Arguments[1];
+
+ var host = dd.Arguments[2];
+
+ Console.Write("Email: ");
+ var email = Console.ReadLine();
+ Console.Write("Password: ");
+
+ var echo = Console.Echo;
+ Console.Echo = false;
+ var password = Console.ReadLine();
+ Console.Echo = echo;
+ Console.WriteLine();
+
+ var accountRequest = {
+ email,
+ password
+ };
+
+ var req = {
+ Method="POST",
+ Body = Net.Http.TextHttpRequestBody(accountRequest.ToString(),"application/json")
+ };
+
+ var http = Net.Http.MakeRequest($"{host.TrimEnd('/')}/api/v1/login",req);
+ if(http.StatusCode == 401 && http.ResponseHeaders.TryGetFirst("Content-Type") == "application/json")
+ {
+
+ var json = Json.Decode(http.ReadAsString());
+ Console.WriteLined($"Failed to login, reason={json.reason}");
+ return 1;
+ }
+ else if(http.ResponseHeaders.TryGetFirst("Content-Type") == "application/json")
+ {
+ var json = Json.Decode(http.ReadAsString());
+
+
+
+ var hasSet=false;
+ each(var ents : accounts)
+ {
+ if(ents.name == name)
+ {
+ ents.host = host;
+ ents.token = json.token;
+ hasSet=true;
+ }
+ }
+ if(!hasSet)
+ {
+ accounts.Add({
+ name,
+ host,
+ token = json.token
+ });
+ }
+
+ FS.WriteAllText(FS.Local,Env.CrossLangConfig / "auth.json",Json.Encode(accounts));
+ Console.WriteLine("Logged in successfully");
+
+ }
+ }
+ else if(dd.Arguments.Length == 4)
+ {
+ var name = dd.Arguments[1];
+
+ var host = dd.Arguments[2];
+ var token = dd.Arguments[3];
+
+ var hasSet=false;
+ each(var ents : accounts)
+ {
+ if(ents.name == name)
+ {
+ ents.host = host;
+ ents.token = token;
+ hasSet=true;
+ }
+ }
+ if(!hasSet)
+ {
+ accounts.Add({
+ name,
+ host,
+ token
+ });
+ }
+
+ FS.WriteAllText(FS.Local,Env.CrossLangConfig / "auth.json",Json.Encode(accounts));
+ Console.WriteLine("Added session successfully");
+ }
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/s b/Tesses.CrossLang.Shell/src/s
index d05a567..ec57b98 100644
--- a/Tesses.CrossLang.Shell/src/s
+++ b/Tesses.CrossLang.Shell/src/s
@@ -15,410 +15,13 @@
if(commandName == "install-tool")
{
- //crosslang install-tool Tesses.CrossLang.Tool.SomeTool --version=1.0.0.0-prod
- var toolsDir = Env.CrossLangConfig / "Tools";
- var offline=false;
- var buildPath = ".";
- var nobuild=false;
- var output=.;
- each(var flag : dd.Flags)
- {
- if(flag == "offline")
- {
- offline = true;
- }
- else if(flag == "help")
- {
- Console.WriteLine("USAGE: crosslang install-tool [flags-and-options]");
- Console.WriteLine("USAGE: crosslang install-tool [PackageName] [flags-and-options]");
- Console.WriteLine("FLAGS:");
- Console.WriteLine("offline: build with no internet (don't fetch files)");
- Console.WriteLine("help: this help");
- Console.WriteLine("nobuild: don't build, just install (irrelevant if you specify a PackageName)");
- Console.WriteLine();
- Console.WriteLine("OPTIONS:");
- Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config (irrelevant if you specify a PackageName)");
- Console.WriteLine("version=1.0.0.0-prod: specify the package version (irrelevant if you don't specify a PackageName)");
- Console.WriteLine();
- Console.WriteLine("ARGUMENTS:");
- Console.WriteLine("PackageName: the package name of a tool you want to download and install, if not specified we install the tool from the current directory");
- return 0;
- }
- else if(flag == "nobuild")
- {
- nobuild=true;
- }
- }
-
- if(dd.Arguments.Length == 1)
- {
-
- var conf = "";
- each(var option : dd.Options)
- {
- if(option.Key == "conf")
- {
- conf = option.Value;
- }
- }
-
- if(FS.Local.FileExists("cross.json"))
- {
- var proj = Json.Decode(FS.ReadAllText(FS.Local,"cross.json"));
- var name = TypeOf(proj.info.toolname) == "String" ? proj.info.toolname : proj.name;
-
- if(proj.info.type != "tool")
- {
- Console.WriteLine("The project is not a tool");
- return 1;
- }
- if(TypeOf(name) != "String")
- {
- Console.WriteLine("The tool does not have a name");
- return 1;
- }
- var toolDir = toolsDir / name;
- FS.Local.CreateDirectory(toolDir);
- var toolFile = toolDir / name + ".crvm";
-
- if(nobuild)
- {
- var nameVer = $"{proj.name}-{proj.version}.crvm";
- var buildDir = TypeOf(proj.bin_directory) == "String" ? proj.bin_directory : "bin";
-
- output = ./buildDir/nameVer;
- if(!FS.Local.FileExists(output))
- {
- Console.WriteLine($"ERROR: file {output} does not exist.");
- return 1;
- }
-
- }
- else
- {
- var pm = Tesses.CrossLang.PackageManager();
- pm.Offline = offline;
- var bt = Tesses.CrossLang.BuildTool(pm);
- bt.Config = conf;
- output = bt.BuildProject(buildPath).Output;
- }
-
- func CopyCRVM(src,dest)
- {
- 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();
- Console.WriteLine($"{src} -> {dest}");
- }
- if(FS.Local.FileExists(dest)) return;
- copyFile(src,dest);
-
-
- var srcStrm = FS.Local.OpenFile(src,"rb");
- var crvm = VM.LoadExecutable(srcStrm);
-
- srcStrm.Close();
- each(var dep : crvm.Dependencies)
- {
- var name = $"{dep.Name}-{dep.Version.ToString()}.crvm";
- CopyCRVM(src.GetParent()/name, dest.GetParent()/name);
- }
- }
- CopyCRVM(output,toolFile);
- return 0;
- }
- else
- {
-
- Console.WriteLine("The current directory does not have a project");
- return 1;
- }
- }
}
else if(commandName == "console")
{
//crosslang console myfavoriteapp
}
- else if(commandName == "tool")
- {
-
- var dir = Env.CrossLangConfig / "Tools";
- if(dd.Arguments.Length == 1)
- {
- Console.WriteLine("List of tools:");
- each(var item : FS.Local.EnumeratePaths(dir))
- {
- Console.WriteLine(Tesses.CrossLang.GetNameAndDescription(item / item.GetFileName() + ".crvm"));
- }
- return 0;
- }
- }
- else if(commandName == "tool-test")
- {
- var pm = Tesses.CrossLang.PackageManager();
- pm.Offline = false;
- var bt = Tesses.CrossLang.BuildTool(pm);
-
- var proj=bt.BuildProject(".");
-
- var output = proj.Output;
-
- var env = VM.CreateEnvironment({});
- env.RegisterEverything();
- env.LockRegister();
-
- env.LoadFileWithDependencies(FS.Local,output);
- var myArgs = [];
- for(var i = 1; i < dd.Arguments.Count; i++)
- {
- myArgs.Add(dd.Arguments[i]);
- }
- return env.GetDictionary().RunTool({
- Arguments=myArgs,
- Options = dd.Options,
- Flags = dd.Flags,
- ToolName = proj.Info.toolname
- });
- }
- else if(commandName == "add-project")
- {
- //crosslang add-project /path/to/project
-
- if(dd.Arguments.Count > 1)
- {
- var dep = dd.Arguments[1];
- if(FS.Local.DirectoryExists(dep))
- {
- var path = Path.FromString(dep) / "cross.json";
- var pathStr = FS.MakeFull(dep).CollapseRelativeParents().ToString();
- if(FS.Local.FileExists(path))
- {
- if(FS.Local.FileExists("cross.json"))
- {
- var f = FS.ReadAllText(FS.Local,"cross.json");
- var json = Json.Decode(f);
- if(TypeOf(json.project_dependencies) == "List")
- {
- each(var item : json.project_dependencies)
- {
- var _path = FS.MakeFull(item).CollapseRelativeParents().ToString();
-
- if(_path == pathStr)
- {
- Console.WriteLine($"The project {dep} already exists in cross.json.");
-
- return 0;
- }
- }
- json.project_dependencies.Add(dep);
- }
- else
- {
- json.project_dependencies = [dep];
-
- }
- Console.WriteLine($"Added project {dep} to cross.json.");
- FS.WriteAllText(FS.Local, "cross.json", Json.Encode(json,true));
- return 0;
- }
- else
- {
- Console.WriteLine("The current directory does not have a project");
- return 1;
- }
- }
- else
- {
- Console.WriteLine($"The project file {path} does not exist");
- return 1;
- }
- }
- else
- {
- Console.WriteLine("The project directory does not exist");
- return 1;
- }
- }
- return 1;
- }
- else if(commandName == "add-dependency")
- {
- //crosslang add-dependency Tesses.CrossLang.Markup --version=1.0.0.0-prod
-
- if(dd.Arguments.Length > 1)
- {
-
- var name = dd.Arguments[1];
- var version = null;
- each(var opt : dd.Options)
- {
- if(opt.Key == "version")
- version = opt.Value;
- }
- if(!FS.Local.FileExists("cross.json"))
- {
- Console.WriteLine("The current directory does not have a project");
- return 1;
- }
-
- if(version == null)
- {
- var pm = Tesses.CrossLang.PackageManager();
- version = pm.GetLatest(name);
- }
- if(version == null)
- {
- Console.WriteLine("Could not get version");
- return 1;
- }
- else
- {
- var data = Json.Decode(FS.ReadAllText(FS.Local,"cross.json"));
- if(TypeOf(data.dependencies) != "List") data.dependencies=[];
- data.dependencies.Add({name,version});
- FS.WriteAllText(FS.Local,"cross.json",Json.Encode(data,true));
- }
- }
-
- }
- else if(commandName == "upload-package")
- {
- //crosslang upload-package [--host=HOST --token=TOKEN] [--session=NAME] [PACKAGE_FILE]
- var host=null;
- var token=null;
- var session=null;
- var package=null;
- var nobuild=false;
- each(var option : dd.Options)
- {
- if(option.Key == "host")
- {
- host = option.Value;
- }
- if(option.Key == "token")
- {
- token = option.Value;
- }
- if(option.Key == "session")
- {
- session = option.Value;
- }
- }
- if(dd.Arguments.Length > 1)
- {
- package = dd.Arguments[1];
- }
- else {
- if(nobuild)
- {
- throw {Type="NotImplementedException", Message="nobuild on upload-package is not implemented",ToString=(this)=>$"{this.Type} on line: {this.Line}: {this.Message}"};
- }
- else {
-
- var pm = Tesses.CrossLang.PackageManager();
- pm.Offline = false;
- var bt = Tesses.CrossLang.BuildTool(pm);
- bt.Config = "";
- bt.AllowFullCompTime = false;
- package = bt.BuildProject(".").Output;
- }
- }
-
- if(TypeOf(host) != "String" || TypeOf(token) != "String")
- {
- if(FS.Local.FileExists(Env.CrossLangConfig / "auth.json"))
- {
- var json = Json.Decode(FS.ReadAllText(FS.Local,Env.CrossLangConfig / "auth.json"));
- if(json.Length == 0)
- {
- Console.WriteLine("The auth.json file is empty, use crosslang login to login");
- return 1;
- }
- else if(json.Length == 1)
- {
- host = json[0].host;
- token = json[0].token;
- }
- else {
- if(TypeOf(session) != "String")
- {
- Console.WriteLine("Multiple entries in auth.json file, session is ambiguous.");
- Console.WriteLine("Sessions:");
- each(var item : json)
- {
- Console.WriteLine($"{item.name}: {item.host}");
- }
- return 1;
- }
- else {
- var found=false;
- each(var item : json)
- {
- if(item.name == session)
- {
- found=true;
- host = item.host;
- token = item.token;
- break;
- }
- }
- if(!found) {
- Console.WriteLine($"Could not find session with name: {session}");
- return 1;
- }
- }
- }
- }
- else { Console.WriteLine("No auth.json file, use crosslang login to login"); return 1;}
- }
-
- if(TypeOf(host) != "String" || TypeOf(token) != "String")
- {
- Console.WriteLine("You are not logged in, use crosslang login to login");
- return 1;
- }
- var strm = FS.Local.OpenFile(package,"rb");
- if(strm == null)
- {
- Console.WriteLine("Could not open file");
- return 1;
- }
- var req = {
- Method="PUT",
- RequestHeaders = [
- {Key= "Authorization",Value=$"Bearer {token}"}
- ],
- Body = Net.Http.StreamHttpRequestBody(strm,"application/crvm")
- };
- var http = Net.Http.MakeRequest($"{host.TrimEnd('/')}/api/v1/upload",req);
-
-
- if(http.StatusCode == 204)
- {
- Console.WriteLine("Uploaded package successfully");
- }
- else if(http.ResponseHeaders.TryGetFirst("Content-Type") == "application/json")
- {
- var json = Json.Decode(http.ReadAsString());
- Console.WriteLine($"Failed to upload package, {json.reason.TrimEnd('.')}.");
- }
- else {
- Console.WriteLine($"Failed to upload package.");
- }
- strm.Close();
- }
- else if(commandName == "login")
- {
- //crosslang login local https://cpkg.tesseslanguage.com/
- //crosslang login [NAME] [HOST] [TOKEN]
-
- }
- else if(commandName == "configdir")
- {
- Console.WriteLine(Env.CrossLangConfig);
- }
\ No newline at end of file
+
+
+
+
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/tool-test.tcross b/Tesses.CrossLang.Shell/src/tool-test.tcross
new file mode 100644
index 0000000..792092e
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/tool-test.tcross
@@ -0,0 +1,27 @@
+func Tesses.CrossLang.Shell.ToolTest(dd)
+{
+ var pm = Tesses.CrossLang.PackageManager();
+ pm.Offline = false;
+ var bt = Tesses.CrossLang.BuildTool(pm);
+
+ var proj=bt.BuildProject(".");
+
+ var output = proj.Output;
+
+ var env = VM.CreateEnvironment({});
+ env.RegisterEverything();
+ env.LockRegister();
+
+ env.LoadFileWithDependencies(FS.Local,output);
+ var myArgs = [];
+ for(var i = 1; i < dd.Arguments.Count; i++)
+ {
+ myArgs.Add(dd.Arguments[i]);
+ }
+ return env.GetDictionary().RunTool({
+ Arguments=myArgs,
+ Options = dd.Options,
+ Flags = dd.Flags,
+ ToolName = proj.Info.toolname
+ });
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/tools.tcross b/Tesses.CrossLang.Shell/src/tools.tcross
new file mode 100644
index 0000000..6db8ff6
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/tools.tcross
@@ -0,0 +1,13 @@
+func Tesses.CrossLang.Shell.Tool(dd)
+{
+ var dir = Env.CrossLangConfig / "Tools";
+ if(dd.Arguments.Length == 1)
+ {
+ Console.WriteLine("List of tools:");
+ each(var item : FS.Local.EnumeratePaths(dir))
+ {
+ Console.WriteLine(Tesses.CrossLang.GetNameAndDescription(item / item.GetFileName() + ".crvm"));
+ }
+ return 0;
+ }
+}
\ No newline at end of file
diff --git a/Tesses.CrossLang.Shell/src/upload-package.tcross b/Tesses.CrossLang.Shell/src/upload-package.tcross
new file mode 100644
index 0000000..46beb1c
--- /dev/null
+++ b/Tesses.CrossLang.Shell/src/upload-package.tcross
@@ -0,0 +1,126 @@
+func Tesses.CrossLang.Shell.UploadPackage(dd)
+{
+ //crosslang upload-package [--host=HOST --token=TOKEN] [--session=NAME] [PACKAGE_FILE]
+ var host=null;
+ var token=null;
+ var session=null;
+ var package=null;
+ var nobuild=false;
+ each(var option : dd.Options)
+ {
+ if(option.Key == "host")
+ {
+ host = option.Value;
+ }
+ if(option.Key == "token")
+ {
+ token = option.Value;
+ }
+ if(option.Key == "session")
+ {
+ session = option.Value;
+ }
+ }
+ if(dd.Arguments.Length > 1)
+ {
+ package = dd.Arguments[1];
+ }
+ else {
+ if(nobuild)
+ {
+ throw {Type="NotImplementedException", Message="nobuild on upload-package is not implemented",ToString=(this)=>$"{this.Type} on line: {this.Line}: {this.Message}"};
+ }
+ else {
+
+ var pm = Tesses.CrossLang.PackageManager();
+ pm.Offline = false;
+ var bt = Tesses.CrossLang.BuildTool(pm);
+ bt.Config = "";
+ bt.AllowFullCompTime = false;
+ package = bt.BuildProject(".").Output;
+ }
+ }
+
+ if(TypeOf(host) != "String" || TypeOf(token) != "String")
+ {
+ if(FS.Local.FileExists(Env.CrossLangConfig / "auth.json"))
+ {
+ var json = Json.Decode(FS.ReadAllText(FS.Local,Env.CrossLangConfig / "auth.json"));
+ if(json.Length == 0)
+ {
+ Console.WriteLine("The auth.json file is empty, use crosslang login to login");
+ return 1;
+ }
+ else if(json.Length == 1)
+ {
+ host = json[0].host;
+ token = json[0].token;
+ }
+ else {
+ if(TypeOf(session) != "String")
+ {
+ Console.WriteLine("Multiple entries in auth.json file, session is ambiguous.");
+ Console.WriteLine("Sessions:");
+ each(var item : json)
+ {
+ Console.WriteLine($"{item.name}: {item.host}");
+ }
+ return 1;
+ }
+ else {
+ var found=false;
+ each(var item : json)
+ {
+ if(item.name == session)
+ {
+ found=true;
+ host = item.host;
+ token = item.token;
+ break;
+ }
+ }
+ if(!found) {
+ Console.WriteLine($"Could not find session with name: {session}");
+ return 1;
+ }
+ }
+ }
+ }
+ else { Console.WriteLine("No auth.json file, use crosslang login to login"); return 1;}
+ }
+
+ if(TypeOf(host) != "String" || TypeOf(token) != "String")
+ {
+ Console.WriteLine("You are not logged in, use crosslang login to login");
+ return 1;
+ }
+ var strm = FS.Local.OpenFile(package,"rb");
+ if(strm == null)
+ {
+ Console.WriteLine("Could not open file");
+ return 1;
+ }
+ var req = {
+ Method="PUT",
+ RequestHeaders = [
+ {Key= "Authorization",Value=$"Bearer {token}"}
+ ],
+ Body = Net.Http.StreamHttpRequestBody(strm,"application/crvm")
+ };
+ var http = Net.Http.MakeRequest($"{host.TrimEnd('/')}/api/v1/upload",req);
+
+
+ if(http.StatusCode == 204)
+ {
+ Console.WriteLine("Uploaded package successfully");
+ }
+ else if(http.ResponseHeaders.TryGetFirst("Content-Type") == "application/json")
+ {
+ var json = Json.Decode(http.ReadAsString());
+ Console.WriteLine($"Failed to upload package, {json.reason.TrimEnd('.')}.");
+ }
+ else {
+ Console.WriteLine($"Failed to upload package.");
+ }
+ strm.Close();
+}
\ No newline at end of file