private setMilestones()

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