in src/issues/stateManager.ts [379:431]
private setMilestones(folderManager: FolderRepositoryManager): Promise<MilestoneItem[]> {
return new Promise(async resolve => {
const now = new Date();
const skipMilestones: string[] = vscode.workspace
.getConfiguration(ISSUES_CONFIGURATION)
.get(IGNORE_MILESTONES_CONFIGURATION, []);
const milestones = await folderManager.getMilestones(
{ fetchNextPage: false },
skipMilestones.indexOf(NO_MILESTONE) < 0,
);
let mostRecentPastTitleTime: Date | undefined = undefined;
const milestoneDateMap: Map<string, Date> = new Map();
const milestonesToUse: MilestoneItem[] = [];
// The number of milestones is expected to be very low, so two passes through is negligible
for (let i = 0; i < milestones.items.length; i++) {
const item: MilestoneItem = milestones.items[i] as MilestoneItem;
item.uri = folderManager.repository.rootUri;
const milestone = milestones.items[i].milestone;
if ((item.issues && item.issues.length <= 0) || skipMilestones.indexOf(milestone.title) >= 0) {
continue;
}
milestonesToUse.push(item);
let milestoneDate = milestone.dueOn ? new Date(milestone.dueOn) : undefined;
if (!milestoneDate) {
milestoneDate = new Date(this.removeDateExcludeStrings(milestone.title));
if (isNaN(milestoneDate.getTime())) {
milestoneDate = new Date(milestone.createdAt!);
}
}
if (
milestoneDate < now &&
(mostRecentPastTitleTime === undefined || milestoneDate > mostRecentPastTitleTime)
) {
mostRecentPastTitleTime = milestoneDate;
}
milestoneDateMap.set(milestone.id ? milestone.id : milestone.title, milestoneDate);
}
milestonesToUse.sort((a: MilestoneModel, b: MilestoneModel): number => {
const dateA = milestoneDateMap.get(a.milestone.id ? a.milestone.id : a.milestone.title)!;
const dateB = milestoneDateMap.get(b.milestone.id ? b.milestone.id : b.milestone.title)!;
if (mostRecentPastTitleTime && dateA >= mostRecentPastTitleTime && dateB >= mostRecentPastTitleTime) {
return dateA <= dateB ? -1 : 1;
} else {
return dateA >= dateB ? -1 : 1;
}
});
this._onDidChangeIssueData.fire();
resolve(milestonesToUse);
});
}