public static async IAsyncEnumerable <JsonJiraIssue> GetIssuesAsync(JiraOptions opts) { var urlFormat = $"/rest/api/2/search?jql={Uri.EscapeDataString(opts.JqlQuery)}&fields={SearchFields}&startAt={{0}}"; var startAt = 0; var totalFetched = 0; var totalYielded = 0; var totalYieldedPaddingLength = 0; JsonJiraIssuePage jsonIssuePage; do { var jsonStr = await GetStringAsync(string.Format(urlFormat, startAt), opts); jsonIssuePage = JsonConvert.DeserializeObject <JsonJiraIssuePage>(jsonStr); startAt += jsonIssuePage.MaxResults; totalFetched += jsonIssuePage.Values.Count; if (totalYielded == 0) { totalYieldedPaddingLength = jsonIssuePage.Total.ToString().Length; } foreach (var issue in jsonIssuePage.Values) { issue.Changelog = await GetChangelog(issue.Key, opts); yield return(issue); totalYielded++; var totalYieldedPadded = totalYielded.ToString().PadLeft(totalYieldedPaddingLength, '0'); opts.Logger($"Fetched issue {totalYieldedPadded}/{jsonIssuePage.Total} named {issue.Key}"); } } while (!jsonIssuePage.IsLast && totalFetched < jsonIssuePage.Total); }
public static async Task <List <JsonJiraStatus> > GetStatusesAsync(JiraOptions opts) { var jsonStr = await GetStringAsync("/rest/api/2/status", opts); var jsonVersions = JsonConvert.DeserializeObject <List <JsonJiraStatus> >(jsonStr); opts.Logger($"Fetched {jsonVersions.Count} statuses"); return(jsonVersions); }
public static async Task <List <JsonJiraFixVersion> > GetVersionsAsync(JiraOptions opts) { var jsonStr = await GetStringAsync($"/rest/api/2/project/{opts.JiraProjectKey}/versions", opts); var jsonVersions = JsonConvert.DeserializeObject <List <JsonJiraFixVersion> >(jsonStr); var numericJsonVersions = jsonVersions.Where(IsNumericFixVersion).ToList(); opts.Logger($"Fetched {numericJsonVersions.Count} fix versions for project {opts.JiraProjectKey}"); return(numericJsonVersions); }
public static async Task Write(JiraOptions opts) { opts.Logger($"Results will be written to {opts.OutputFilePath}"); try { await using var fileStream = File.OpenWrite(opts.OutputFilePath); using var serializer = new JiraIssuesWriter(opts, fileStream); var issues = await JiraRepository.GetIssuesAsync(opts); serializer.Write(issues); } catch { QuietlyDeleteCreatedExcelPackage(opts); throw; } opts.Logger($"Done, exported file can be found at {opts.OutputFilePath}"); }