private void RemoveLabel(GitHubEventRepository repository, GitHubEventLabel label)
            {
                var index = _indexService.Index;

                if (index is null)
                {
                    return;
                }

                var crawledRepo = index.Repos.SingleOrDefault(r => r.Id == repository.Id);

                if (crawledRepo is null)
                {
                    return;
                }

                var crawledLabel = crawledRepo.Labels.SingleOrDefault(l => l.Id == label.Id);

                if (crawledLabel is null)
                {
                    return;
                }

                crawledRepo.Labels = crawledRepo.Labels.CopyAndRemove(crawledLabel);

                var removedTrieTerms = new[] { $"label:{crawledLabel.Name}" };

                foreach (var issue in crawledRepo.Issues.Values)
                {
                    RemoveTrieTerms(issue, removedTrieTerms);
                }

                _indexService.NotifyIndexChanged();
            }
            private CrawledLabel GetOrCreateLabel(GitHubEventRepository repository, GitHubEventLabel label)
            {
                var index = _indexService.Index;

                Debug.Assert(index is not null);

                var crawledRepo = index.Repos.SingleOrDefault(r => r.Id == repository.Id);

                Debug.Assert(crawledRepo is not null);

                var matchingLabels = crawledRepo.Labels.Where(l => l.Id == label.Id).ToArray();

                if (matchingLabels.Length == 0)
                {
                    return(CreateLabel(crawledRepo, label));
                }

                if (matchingLabels.Length > 1)
                {
                    var label1 = matchingLabels[0];
                    var label2 = matchingLabels[1];
                    _logger.LogError("In repo {org}/{repo} multiple labels have id {labelId}: '{label1Name}', '{label2Name}'", crawledRepo.Org, crawledRepo.Name, label.Id, label1.Name, label2.Name);
                }

                return(matchingLabels[0]);
            }
            private static CrawledLabel CreateLabel(CrawledRepo crawledRepo, GitHubEventLabel label)
            {
                var crawledLabel = new CrawledLabel();

                crawledLabel.Id = label.Id;
                UpdateLabel(label, crawledLabel);

                crawledRepo.Labels = crawledRepo.Labels.CopyAndAdd(crawledLabel);

                return(crawledLabel);
            }
            private void UpdateLabel(GitHubEventRepository repository, GitHubEventLabel label)
            {
                var index = _indexService.Index;

                if (index is null)
                {
                    return;
                }

                var crawledRepo = index.Repos.SingleOrDefault(r => r.Id == repository.Id);

                if (crawledRepo is null)
                {
                    return;
                }

                var crawledLabel = crawledRepo.Labels.SingleOrDefault(l => l.Id == label.Id);

                if (crawledLabel is null)
                {
                    return;
                }

                var oldName = crawledLabel.Name;

                UpdateLabel(label, crawledLabel);

                var newName = crawledLabel.Name;

                if (!string.Equals(oldName, newName, StringComparison.OrdinalIgnoreCase))
                {
                    var removedTrieTerms = new[] { $"label:{oldName}" };
                    var addedTrieTerms   = new[] { $"label:{newName}" };

                    foreach (var issue in crawledRepo.Issues.Values)
                    {
                        RemoveTrieTerms(issue, removedTrieTerms);
                        AddTrieTerms(issue, addedTrieTerms);
                    }
                }

                _indexService.NotifyIndexChanged();
            }
            private void AddLabel(GitHubEventRepository repository, GitHubEventLabel label)
            {
                var index = _indexService.Index;

                if (index is null)
                {
                    return;
                }

                var crawledRepo = index.Repos.SingleOrDefault(r => r.Id == repository.Id);

                if (crawledRepo is null)
                {
                    return;
                }

                CreateLabel(crawledRepo, label);

                _indexService.NotifyIndexChanged();
            }
 private static void UpdateLabel(GitHubEventLabel label, CrawledLabel crawledLabel)
 {
     crawledLabel.ColorText   = label.Color;
     crawledLabel.Description = label.Description;
     crawledLabel.Name        = label.Name;
 }
            protected override void ProcessLabelMessage(GitHubEventMessage message, GitHubEventRepository repository, GitHubEventLabel label, GitHubEventLabelAction action)
            {
                switch (action)
                {
                case GitHubEventLabelAction.Created:
                    AddLabel(repository, label);
                    break;

                case GitHubEventLabelAction.Edited:
                    UpdateLabel(repository, label);
                    break;

                case GitHubEventLabelAction.Deleted:
                    RemoveLabel(repository, label);
                    break;
                }
            }