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()); }
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); }
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); }
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)); }
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 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 <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()); }
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); } } }