public static void Main(string[] args) { if (InnerSpaceAPI.InnerSpace.BuildNumber == 0) { return; } if (!(args.Length == 4 || args.Length == 5)) { InnerSpace.Echo("Invalid number of arguments"); return; } String path = args[3]; String repo = args[2]; Queue<String> repoPaths; if (!Path.IsPathRooted(args[3])) { path = InnerSpace.Path + "\\" + path; } if (File.Exists(path + "\\ShaTree.JSON")) { GitHubShaTree = JsonConvert.DeserializeObject<ShaTree>(File.ReadAllText(path + "\\ShaTree.JSON")); } else { GitHubShaTree = new ShaTree(); } if (repo.IndexOf('/') > 0) { repoPaths = new Queue<string>(repo.Split(new char[] { '/' })); repo = repoPaths.Dequeue(); } else { repoPaths = new Queue<string>(); } GitHubClient = new WebClient(); GitHubClientFiles = new WebClient(); String GitHubData; JObject GitHubJSON; String GitHubURL; String GitHubSha; InnerSpace.Echo(String.Format("Updating {0} {1} {2} in directory {3}", args[0], args[1], args[2], args[3])); GitHubClient.Headers.Add("Accept: application/vnd.github.v3+json"); GitHubData = GitHubClient.DownloadString(String.Format("https://api.github.com/repos/{0}/{1}/git/refs/heads/{2}", args[0], args[1], repo)); GitHubJSON = JObject.Parse(GitHubData); GitHubURL = (String)GitHubJSON["object"]["url"]; GitHubClient.Headers.Add("Accept: application/vnd.github.v3+json"); GitHubData = GitHubClient.DownloadString(GitHubURL); GitHubJSON = JObject.Parse(GitHubData); GitHubURL = (String)GitHubJSON["tree"]["url"]; GitHubSha = (String)GitHubJSON["tree"]["sha"]; foreach (String repoPath in repoPaths) { GitHubClient.Headers.Add("Accept: application/vnd.github.v3+json"); GitHubData = GitHubClient.DownloadString(GitHubURL); GitHubJSON = JObject.Parse(GitHubData); foreach (JToken file in GitHubJSON["tree"]) { if ((String)file["path"] == repoPath) { if ((String)file["type"] == "tree") { GitHubURL = (String)file["url"]; GitHubSha = (String)file["sha"]; } else { if (GitHubShaTree.TreeSha != (String)file["sha"]) { UpdateFile(path + "\\" + (String)file["path"], (String)file["url"]); InnerSpace.Echo((String)file["path"] + " Downloaded"); GitHubShaTree.TreeSha = (String)file["sha"]; } GitHubSha = GitHubShaTree.TreeSha; } break; } } } if (GitHubShaTree.TreeSha != GitHubSha) { GitHubShaTree.TreeSha = GitHubSha; RecursiveTree(path, GitHubURL, GitHubShaTree); } File.WriteAllText(path + "\\ShaTree.JSON", JsonConvert.SerializeObject(GitHubShaTree)); InnerSpace.Echo(String.Format("{0} {1} {2} Updated in directory {3}", args[0], args[1], args[2], args[3])); if (args.Length == 5) { LavishScript.Events.ExecuteEvent(args[4], new string[]{Updated.ToString().ToUpper()}); } }
static void RecursiveTree(String path, String url, ShaTree ThisShaTree) { String TreeData; JObject TreeJSON; Directory.CreateDirectory(path); GitHubClient.Headers.Add("Accept: application/vnd.github.v3+json"); TreeData = GitHubClient.DownloadString(url); TreeJSON = JObject.Parse(TreeData); foreach (JToken file in TreeJSON["tree"]) { if ((String)file["type"] == "tree") { if (!ThisShaTree.SubTrees.ContainsKey((String)file["path"])) { ThisShaTree.SubTrees.Add((String)file["path"], new ShaTree()); } if (ThisShaTree.SubTrees[(String)file["path"]].TreeSha != (String)file["sha"]) { ThisShaTree.SubTrees[(String)file["path"]].TreeSha = (String)file["sha"]; RecursiveTree(path + "\\" + (String)file["path"], (String)file["url"], ThisShaTree.SubTrees[(String)file["path"]]); } } else { if (((String)file["path"])[0] != '.') { if (!ThisShaTree.FileShas.ContainsKey((String)file["path"])) { ThisShaTree.FileShas.Add((String)file["path"], ""); } if (ThisShaTree.FileShas[(String)file["path"]] != (String)file["sha"]) { ThisShaTree.FileShas[(String)file["path"]] = (String)file["sha"]; UpdateFile(path + "\\" + (String)file["path"], (String)file["url"]); InnerSpace.Echo((String)file["path"] + " Downloaded"); } } } } }