public static async Task ProcessCleanupMessageAsync([QueueTrigger("cleanups")] MergeSet mergeSet, TextWriter log) { var sessionId = Guid.NewGuid(); foreach (var change in mergeSet.Changes) { try { if (change.Status.Equals(ChangeKind.Deleted)) { var repoPath = change.RepoPath; var outputBasePath = new DirectoryInfo(ConfigurationManager.AppSettings["HtmlPath"]).FullName; var htmlPath = Path.Combine(outputBasePath, change.RepoName); var file = change.Path.Replace(repoPath, htmlPath).Replace(".md", ".html"); await LogAsync($"Removing file '{file}'", sessionId, log); File.Delete(file); File.Delete($"{file}.meta"); await Helpers.QueueHelper.SendQueueMessage("search-indexes-remove", file); } } catch (Exception error) { await LogAsync($"Failure removing file '{change.Path}' with error '{error.Message}'", sessionId, log); } } await Helpers.QueueHelper.SendQueueMessage("toc-indexes", mergeSet); }
public static bool Start(BuildSet BuildSettings) { try { mset = new MergeSet().ConvertMergeSet(BuildSettings); Console.WriteLine("[+] Merging with an application binary..."); start_merge(); // Start merge return(true); } catch (StartMergeError) { return(false); } }
public static async Task ProcessTableOfContentsMessageAsync([QueueTrigger("toc-indexes")] MergeSet mergeSet, TextWriter log) { var sessionId = Guid.NewGuid(); var outputBasePath = new DirectoryInfo(ConfigurationManager.AppSettings["HtmlPath"]).FullName; var htmlPath = Path.Combine(outputBasePath, mergeSet.RepoName); await LogAsync($"Clearing Table of Content files.", sessionId, log); var tocFiles = Directory.GetFiles(htmlPath, "toc.generated.json", SearchOption.AllDirectories); foreach (var tocFile in tocFiles) { File.Delete(tocFile); } var contentDirectories = Directory.GetDirectories(htmlPath, "*", SearchOption.TopDirectoryOnly).ToList(); contentDirectories.Add(htmlPath); foreach (var contentDirectory in contentDirectories) { try { await LogAsync($"Indexing directory '{contentDirectory}' for Table of Contents", sessionId, log); List <Shared.Content.Node> toc = new List <Shared.Content.Node>(); if (File.Exists(Path.Combine(contentDirectory, "toc.generated.json"))) { toc = Newtonsoft.Json.JsonConvert.DeserializeObject <List <Shared.Content.Node> >(File.ReadAllText(Path.Combine(contentDirectory, "toc.generated.json"))); } toc.AddRange(GetTableOfContentsForDirectory(contentDirectory, outputBasePath)); File.WriteAllText(Path.Combine(contentDirectory, "toc.generated.json"), Newtonsoft.Json.JsonConvert.SerializeObject(toc)); } catch (Exception error) { await LogAsync($"Failure indexing directory '{contentDirectory}' with error '{error.Message}'", sessionId, log); } } }
public static async Task ProcessMergeMessageAsync([QueueTrigger("merges")] Shared.Merge merge, TextWriter log) { var sessionId = Guid.NewGuid(); var reposPath = new DirectoryInfo(ConfigurationManager.AppSettings["RepositoryPath"]).FullName; var repoPath = Path.Combine(reposPath, merge.RepositoryName); await LogAsync($"Merge message received for commit '{merge.CommitId}'.", sessionId, log); var mergeSet = new MergeSet() { RepoName = merge.RepositoryName, RepoPath = repoPath, Changes = new List <Node>() }; var cloneOptions = new CloneOptions() { CredentialsProvider = (_url, _user, _cred) => GetRepoCredentials(merge.PersonalAccessToken) }; if (!Directory.Exists(repoPath)) { await LogAsync($"Repo path not found, creating directory '{repoPath}'.", sessionId, log); await LogAsync($"Cloning repository '{merge.RemoteUrl}'.", sessionId, log); Directory.CreateDirectory(repoPath); var cloneResult = Repository.Clone(merge.RemoteUrl, repoPath, cloneOptions); var files = Directory.GetFiles(repoPath, "*", SearchOption.AllDirectories); foreach (var file in files) { var currentFileInfo = new FileInfo(file); if (currentFileInfo.Directory.FullName.Replace(repoPath, "").ToLower().StartsWith("\\.git")) { continue; } mergeSet.Changes.Add(new Node() { Path = file, Status = ChangeKind.Added }); } } else { await LogAsync($"Pulling from repository '{merge.RemoteUrl}'.", sessionId, log); Directory.CreateDirectory(repoPath); using (var repo = new Repository(repoPath)) { PullOptions options = new PullOptions() { FetchOptions = new FetchOptions() { CredentialsProvider = new CredentialsHandler( (url, usernameFromUrl, types) => GetRepoCredentials(merge.PersonalAccessToken)) } }; var lastCommit = repo.Head.Tip; var mergeResult = Commands.Pull(repo, GetRepoSignature(), options); var headCommit = repo.Branches["origin/master"].Commits.First(); var treeChanges = repo.Diff.Compare <TreeChanges>(lastCommit.Tree, headCommit.Tree); foreach (var treeChange in treeChanges) { if (treeChange.Status.Equals(ChangeKind.Renamed)) { mergeSet.Changes.Add(new Node() { Path = Path.Combine(repoPath, treeChange.OldPath), Status = ChangeKind.Deleted }); } ; mergeSet.Changes.Add(new Node() { Path = Path.Combine(repoPath, treeChange.Path), Status = treeChange.Status }); } } } using (var repo = new Repository(repoPath)) { mergeSet.Sha = repo.Head.Tip.Sha; mergeSet.Author = repo.Head.Tip.Author.Name; mergeSet.LastRevisionDate = repo.Head.Tip.Author.When; foreach (var change in mergeSet.Changes) { change.RepoName = mergeSet.RepoName; change.RepoPath = mergeSet.RepoPath; change.Revisions.Add(new Revision() { Sha = mergeSet.Sha, Author = mergeSet.Author, LastRevisionDate = mergeSet.LastRevisionDate }); if (change.Path.Replace(repoPath, "").ToLower().StartsWith("\\.git")) { continue; } await Helpers.QueueHelper.SendQueueMessage("renders", change); } } await Helpers.QueueHelper.SendQueueMessage("cleanups", mergeSet); }