Beispiel #1
0
        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);
        }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
        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);
                }
            }
        }
Beispiel #4
0
        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);
        }