public async Task HandleEvent(string gitHubEvent)
        {
            var payload =
                new Octokit.Internal.SimpleJsonSerializer().Deserialize <PullRequestEventPayload>(gitHubEvent);

            logger.LogInformation(
                "Quantifying pull request: {pullRequestUrl}|{pullRequestId}|{sha}",
                payload.PullRequest.HtmlUrl,
                payload.PullRequest.Id,
                payload.PullRequest.Head.Sha);
            telemetry.RecordMetric(
                "PullRequest-QuantifyRequest",
                1);

            var quantifierResult = await QuantifyPullRequest(payload);

            logger.LogInformation(
                "Quantified pull request: {pullRequestUrl}|{pullRequestId}|{sha}|" +
                "{label}|{formula}|{absoluteLinesAdded}|{absoluteLinesDeleted}|" +
                "{quantifiedLinesAdded}|{quantifiedLinesDeleted}|" +
                "{percentileAddition}|{percentileDeletion}|{formulaPercentile}",
                payload.PullRequest.HtmlUrl,
                payload.PullRequest.Id,
                payload.PullRequest.Head.Sha,
                quantifierResult.Label,
                quantifierResult.Formula,
                quantifierResult.QuantifierInput.Changes.Sum(c => c.AbsoluteLinesAdded),
                quantifierResult.QuantifierInput.Changes.Sum(c => c.AbsoluteLinesDeleted),
                quantifierResult.QuantifiedLinesAdded,
                quantifierResult.QuantifiedLinesDeleted,
                quantifierResult.PercentileAddition,
                quantifierResult.PercentileDeletion,
                quantifierResult.FormulaPercentile);
        }
        public async System.Threading.Tasks.Task <IActionResult> HandlerForPushAsync(string?id, JsonElement data)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Octokit.Internal.IJsonSerializer _jsonSerializer = new Octokit.Internal.SimpleJsonSerializer();
            var issueEvent = _jsonSerializer.Deserialize <IssueEventPayload>(data.ToString());

            // get the values from the payload data
            var issueNumber    = issueEvent.Issue.Number;
            var installationId = (int)issueEvent.Installation.Id;
            var owner          = issueEvent.Repository.Owner.Login;
            var repo           = issueEvent.Repository;

            if (installationId != _options.Value.InstallationId)
            {
                return(BadRequest("Invalid github webhook installation id"));
            }

            IGitHubClient installationClient = await _gitHubClientFactory.GetGitHubInstallationClient();

            if (issueEvent.Action != "labeled")
            {
                return(Ok());
            }

            var label = data.GetProperty("label").GetString("name");

            await _issueSubscription.TryAddLabel(new IssueReference(repo.Owner.Login, repo.Name, issueNumber, issueEvent.Issue.Id, issueEvent.Issue.NodeId), label, DateTime.UtcNow);

            return(Ok());
        }
Exemple #3
0
 public async Task<List<Language>> GetLanguages()
 {
     var data = await BlobCache.LocalMachine.DownloadUrl(LanguagesUrl, absoluteExpiration: DateTimeOffset.Now.AddDays(1));
     var serializer = new Octokit.Internal.SimpleJsonSerializer();
     var decodedData = Encoding.UTF8.GetString(data, 0, data.Length);
     return serializer.Deserialize<List<Language>>(decodedData);
 }
Exemple #4
0
 public async Task<ShowcaseRepositories> GetShowcaseRepositories(string showcaseSlug)
 {
     var url = string.Format(ShowcaseUrl, showcaseSlug);
     var data = await BlobCache.LocalMachine.DownloadUrl(url, absoluteExpiration: DateTimeOffset.Now.AddDays(1));
     var serializer = new Octokit.Internal.SimpleJsonSerializer();
     var decodedData = Encoding.UTF8.GetString(data, 0, data.Length);
     return serializer.Deserialize<ShowcaseRepositories>(decodedData);
 }
        public Task HandleEvent(string gitHubEvent)
        {
            var payload =
                new Octokit.Internal.SimpleJsonSerializer().Deserialize <InstallationRepositoriesEventPayload>(gitHubEvent);

            // todo call handle clone,stats
            return(Task.CompletedTask);
        }
Exemple #6
0
        public async Task <List <Language> > GetLanguages()
        {
            var data = await BlobCache.LocalMachine.DownloadUrl(LanguagesUrl, absoluteExpiration : DateTimeOffset.Now.AddDays(1));

            var serializer  = new Octokit.Internal.SimpleJsonSerializer();
            var decodedData = Encoding.UTF8.GetString(data, 0, data.Length);

            return(serializer.Deserialize <List <Language> >(decodedData));
        }
Exemple #7
0
        public async Task <ShowcaseRepositories> GetShowcaseRepositories(string showcaseSlug)
        {
            var url  = string.Format(ShowcaseUrl, showcaseSlug);
            var data = await BlobCache.LocalMachine.DownloadUrl(url, absoluteExpiration : DateTimeOffset.Now.AddDays(1));

            var serializer  = new Octokit.Internal.SimpleJsonSerializer();
            var decodedData = Encoding.UTF8.GetString(data, 0, data.Length);

            return(serializer.Deserialize <ShowcaseRepositories>(decodedData));
        }
Exemple #8
0
 public async Task<List<Octokit.Repository>> GetTrendingRepositories(string since, string language = null)
 {
     var query = "?since=" + since;
     if (!string.IsNullOrEmpty(language))
         query += string.Format("&language={0}", language);
     var data = await BlobCache.LocalMachine.DownloadUrl(TrendingUrl + query, absoluteExpiration: DateTimeOffset.Now.AddHours(1));
     var serializer = new Octokit.Internal.SimpleJsonSerializer();
     var decodedData = Encoding.UTF8.GetString(data, 0, data.Length);
     return serializer.Deserialize<List<Octokit.Repository>>(decodedData);
 }
Exemple #9
0
        public async Task <IActionResult> PostWebook([FromHeader(Name = "X-GitHub-Event")] string @event
                                                     , [FromHeader(Name = "X-GitHub-Delivery")] string delivery
                                                     , [FromHeader(Name = "X-Hub-Signature")] string signature
                                                     , [FromServices] IAppGithubExporterCli cli, [FromServices] ILoggingService remoteLogger)
        {
            byte[] body;
            string json;

            await using (var ms = new MemoryStream())
            {
                await Request.Body.CopyToAsync(ms);

                body = ms.ToArray();
                json = Encoding.UTF8.GetString(body);
            }
            var secret = _configuration.GetValue <string>("GithubApp:WebhookEventSecret");

            if (null != secret)
            {
                HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes(secret));
                string   calculatedSignature =
                    $"sha1={string.Concat(hmac.ComputeHash(body).Select(x => x.ToString("x2")))}".ToLower();
                if (signature?.ToLower() != calculatedSignature)
                {
                    return(new BadRequestObjectResult("Signature mismatch"));
                }
            }

            var serializer = new Octokit.Internal.SimpleJsonSerializer();

            _logger.LogInformation("{event} content: {json}", @event.ToLower(), json);
            switch (@event?.ToLower())
            {
            case "ping":
                var ping = serializer.Deserialize <PingEvent>(json);
                _logger.LogInformation($"PINGed by {ping?.Sender?.Login}");
                break;

            case "marketplace_purchase":
                var purchase = serializer.Deserialize <MarketplacePurchaseEvent>(json);
                var document = purchase.ToSetupLogDocument(@event?.ToLower(), cli.RequestId,
                                                           cli.AppName, delivery?.ToLower());
                await remoteLogger.ReportSetupLog(document);

                break;

            default:
                _logger.LogError("Unknown webhook event: `{event}`", @event);
                break;
            }
            return(new OkResult());
        }
Exemple #10
0
        public async Task <List <Octokit.Repository> > GetTrendingRepositories(string since, string language = null)
        {
            var query = "?since=" + since;

            if (!string.IsNullOrEmpty(language))
            {
                query += string.Format("&language={0}", language);
            }
            var data = await BlobCache.LocalMachine.DownloadUrl(TrendingUrl + query, absoluteExpiration : DateTimeOffset.Now.AddHours(1));

            var serializer  = new Octokit.Internal.SimpleJsonSerializer();
            var decodedData = Encoding.UTF8.GetString(data, 0, data.Length);

            return(serializer.Deserialize <List <Octokit.Repository> >(decodedData));
        }
        public async Task <IList <Octokit.Repository> > GetTrendingRepositories(string since, string language = null)
        {
            var query = "?since=" + Uri.EscapeDataString(since);

            if (!string.IsNullOrEmpty(language))
            {
                query += string.Format("&language={0}", Uri.EscapeDataString(language));
            }

            var client     = new HttpClient();
            var serializer = new Octokit.Internal.SimpleJsonSerializer();
            var msg        = await client.GetAsync(TrendingUrl + query).ConfigureAwait(false);

            var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);

            return(serializer.Deserialize <List <Octokit.Repository> >(content));
        }
        public Task HandleEvent(string gitHubEvent)
        {
            var payload =
                new Octokit.Internal.SimpleJsonSerializer().Deserialize <InstallationEventPayload>(gitHubEvent);

            logger.LogInformation(
                "Installation event: {accountId} | {accountLogin} | {accountUrl} | {accountType} | " +
                "{action} | {repositorySelection} | {repositories}",
                payload.Installation.Account.Id,
                payload.Installation.Account.Login,
                payload.Installation.Account.Url,
                payload.Installation.Account.Type.ToString(),
                payload.Action,
                payload.Installation.RepositorySelection,
                payload.Repositories != null ? string.Join(" , ", payload.Repositories.Select(r => r.FullName)) : string.Empty);
            telemetry.RecordMetric(
                "Installation-Event",
                1,
                ("Action", payload.Action));

            return(Task.CompletedTask);
        }
        public async Task HandleEvent(string gitHubEvent)
        {
            var payload =
                new Octokit.Internal.SimpleJsonSerializer().Deserialize <InstallationEventPayload>(gitHubEvent);

            if (Enum.TryParse(
                    payload.Action,
                    true,
                    out GitHubEventActions parsedAction) && parsedAction != GitHubEventActions.Created)
            {
                logger.LogInformation("Ignoring installation event with {action} action", payload.Action);
                return;
            }

            logger.LogInformation("Handling installation event for {account}", payload.Installation.Account.Login);
            foreach (var payloadRepository in payload.Repositories)
            {
                if (payloadRepository.Fork)
                {
                    logger.LogInformation(
                        "Ignoring forked repository {account}/{repository}",
                        payload.Installation.Account.Login,
                        payloadRepository.Name);
                    continue;
                }

                var repoDirectory = Guid.NewGuid().ToString();
                var clonePath     = fileSystem.Path.Combine(fileSystem.Path.GetTempPath(), repoDirectory);

                try
                {
                    var dnsSafeHost         = new Uri(payload.Installation.HtmlUrl).DnsSafeHost;
                    var gitHubClientAdapter =
                        await gitHubClientAdapterFactory.GetGitHubClientAdapterAsync(
                            payload.Installation.Id,
                            dnsSafeHost);

                    var installationToken = gitHubClientAdapter.Credentials.Password;
                    logger.LogInformation(
                        "Cloning repository {account}/{repository}",
                        payload.Installation.Account.Login,
                        payloadRepository.Name);
                    Repository.Clone(
                        $"https://*****:*****@{dnsSafeHost}/{payload.Installation.Account.Login}/{payloadRepository.Name}.git",
                        clonePath);

                    await Tools.QuantifyRepositories.Program.Main(new[] { "-repoPath", clonePath });

                    using var streamReader = new StreamReader(fileSystem.Path.Combine(clonePath, $"{repoDirectory}_QuantifierResults.csv"));
                    using var csv          = new CsvReader(streamReader, CultureInfo.InvariantCulture);
                    csv.Context.RegisterClassMap <CommitStatsMap>();
                    var commitStats = csv.GetRecords <CommitStats>();
                    commitStats = commitStats.Select(
                        r =>
                    {
                        r.PartitionKey = $"{payload.Installation.Account.Login}-{payloadRepository.Name}";
                        r.RowKey       = r.CommitSha1;
                        return(r);
                    }).ToList();
                    var commitStatsMap = commitStats.ToDictionary(c => c.CommitSha1);

                    // get all closed pull requests
                    var closedPrs = await gitHubClientAdapter.GetClosedPullRequestsAsync(payloadRepository.Id);

                    foreach (var pr in closedPrs)
                    {
                        var prLeadTime = pr.MergedAt?.Subtract(pr.CreatedAt);
                        if (prLeadTime != null && commitStatsMap.TryGetValue(pr.MergeCommitSha, out var commitStat))
                        {
                            commitStat.PullRequestLeadTime = (TimeSpan)prLeadTime;
                            commitStat.PullRequestId       = pr.Id;
                            commitStat.PullRequestAuthor   = pr.User.Login;
                        }
                    }

                    // upload only the commits for which there was a PR
                    var commitStatsToUpload = commitStatsMap.Values.Where(c => c.PullRequestId != 0).ToList();

                    logger.LogInformation(
                        "Calculated {commitCount} commits to upload for {account}/{repository}",
                        commitStatsToUpload.Count,
                        payload.Installation.Account.Login,
                        payloadRepository.Name);
                    await blobStorage.CreateTableAsync(nameof(CommitStats));

                    await blobStorage.InsertOrReplaceTableEntitiesAsync(nameof(CommitStats), commitStatsToUpload);
                }
                catch (Exception e)
                {
                    logger.LogError(
                        e,
                        "Error during processing installation event for {account}/{repository}",
                        payload.Installation.Account.Login,
                        payloadRepository.Name);
                    throw;
                }
                finally
                {
                    fileSystem.DeleteDirectory(clonePath);
                }
            }
        }