[Bugfix-795] Fix date comparison edge case (#816)
* Fix updatedAt and markedStaleOn date comparison * Delete accidental file * Refactor * Cleanup * cleanup
This commit is contained in:
parent
80962c1062
commit
8e8a0e6680
|
@ -742,7 +742,9 @@ class IssuesProcessor {
|
||||||
if (issue.markedStaleThisRun) {
|
if (issue.markedStaleThisRun) {
|
||||||
issueLogger.info(`marked stale this run, so don't check for updates`);
|
issueLogger.info(`marked stale this run, so don't check for updates`);
|
||||||
}
|
}
|
||||||
const issueHasUpdateSinceStale = new Date(issue.updated_at) > new Date(markedStaleOn);
|
// The issue.updated_at and markedStaleOn are not always exactly in sync (they can be off by a second or 2)
|
||||||
|
// isDateMoreRecentThan makes sure they are not the same date within a certain tolerance (15 seconds in this case)
|
||||||
|
const issueHasUpdateSinceStale = is_date_more_recent_than_1.isDateMoreRecentThan(new Date(issue.updated_at), new Date(markedStaleOn), 15);
|
||||||
issueLogger.info(`$$type has been updated since it was marked stale: ${logger_service_1.LoggerService.cyan(issueHasUpdateSinceStale)}`);
|
issueLogger.info(`$$type has been updated since it was marked stale: ${logger_service_1.LoggerService.cyan(issueHasUpdateSinceStale)}`);
|
||||||
// Should we un-stale this issue?
|
// Should we un-stale this issue?
|
||||||
if (shouldRemoveStaleWhenUpdated &&
|
if (shouldRemoveStaleWhenUpdated &&
|
||||||
|
@ -1965,12 +1967,25 @@ exports.getHumanizedDate = getHumanizedDate;
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
/// returns false if the dates are equal within the `equalityToleranceInSeconds` number of seconds
|
||||||
|
/// otherwise returns true if `comparedDate` is after `date`
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.isDateMoreRecentThan = void 0;
|
exports.isDateEqualTo = exports.isDateMoreRecentThan = void 0;
|
||||||
function isDateMoreRecentThan(date, comparedDate) {
|
function isDateMoreRecentThan(date, comparedDate, equalityToleranceInSeconds = 0) {
|
||||||
|
if (equalityToleranceInSeconds > 0) {
|
||||||
|
const areDatesEqual = isDateEqualTo(date, comparedDate, equalityToleranceInSeconds);
|
||||||
|
return !areDatesEqual && date > comparedDate;
|
||||||
|
}
|
||||||
return date > comparedDate;
|
return date > comparedDate;
|
||||||
}
|
}
|
||||||
exports.isDateMoreRecentThan = isDateMoreRecentThan;
|
exports.isDateMoreRecentThan = isDateMoreRecentThan;
|
||||||
|
function isDateEqualTo(date, otherDate, toleranceInSeconds) {
|
||||||
|
const timestamp = date.getTime();
|
||||||
|
const otherTimestamp = otherDate.getTime();
|
||||||
|
const deltaInSeconds = Math.abs(timestamp - otherTimestamp) / 1000;
|
||||||
|
return deltaInSeconds <= toleranceInSeconds;
|
||||||
|
}
|
||||||
|
exports.isDateEqualTo = isDateEqualTo;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
|
@ -673,8 +673,13 @@ export class IssuesProcessor {
|
||||||
issueLogger.info(`marked stale this run, so don't check for updates`);
|
issueLogger.info(`marked stale this run, so don't check for updates`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const issueHasUpdateSinceStale =
|
// The issue.updated_at and markedStaleOn are not always exactly in sync (they can be off by a second or 2)
|
||||||
new Date(issue.updated_at) > new Date(markedStaleOn);
|
// isDateMoreRecentThan makes sure they are not the same date within a certain tolerance (15 seconds in this case)
|
||||||
|
const issueHasUpdateSinceStale = isDateMoreRecentThan(
|
||||||
|
new Date(issue.updated_at),
|
||||||
|
new Date(markedStaleOn),
|
||||||
|
15
|
||||||
|
);
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`$$type has been updated since it was marked stale: ${LoggerService.cyan(
|
`$$type has been updated since it was marked stale: ${LoggerService.cyan(
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {isDateMoreRecentThan} from './is-date-more-recent-than';
|
import {isDateEqualTo, isDateMoreRecentThan} from './is-date-more-recent-than';
|
||||||
|
|
||||||
describe('isDateMoreRecentThan()', (): void => {
|
describe('isDateMoreRecentThan()', (): void => {
|
||||||
let date: Date;
|
let date: Date;
|
||||||
|
@ -48,4 +48,68 @@ describe('isDateMoreRecentThan()', (): void => {
|
||||||
expect(result).toStrictEqual(true);
|
expect(result).toStrictEqual(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('date equality', (): void => {
|
||||||
|
it('should correctly compare a before date outside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T14:00:00');
|
||||||
|
expect(isDateEqualTo(aDate, otherDate, 60)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare a before date inside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T13:00:42');
|
||||||
|
expect(isDateEqualTo(aDate, otherDate, 60)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare an after date outside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T12:00:00');
|
||||||
|
expect(isDateEqualTo(aDate, otherDate, 60)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare an after date inside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T12:59:42');
|
||||||
|
expect(isDateEqualTo(aDate, otherDate, 60)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare an exactly equal date', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T13:00:00');
|
||||||
|
expect(isDateEqualTo(aDate, otherDate, 60)).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('date comparison with tolerances', (): void => {
|
||||||
|
it('should correctly compare a before date outside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T14:00:00');
|
||||||
|
expect(isDateMoreRecentThan(aDate, otherDate)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare a before date inside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T13:00:42');
|
||||||
|
expect(isDateMoreRecentThan(aDate, otherDate, 60)).toBe(false); // considered equal here
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare an after date outside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T12:00:00');
|
||||||
|
expect(isDateMoreRecentThan(aDate, otherDate, 60)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare an after date inside tolerance', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T12:59:42');
|
||||||
|
expect(isDateMoreRecentThan(aDate, otherDate, 60)).toBe(false); // considered equal here
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly compare an exactly equal date', (): void => {
|
||||||
|
const aDate = new Date('2022-09-09T13:00:00');
|
||||||
|
const otherDate = new Date('2022-09-09T13:00:00');
|
||||||
|
expect(isDateMoreRecentThan(aDate, otherDate, 60)).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,31 @@
|
||||||
|
/// returns false if the dates are equal within the `equalityToleranceInSeconds` number of seconds
|
||||||
|
/// otherwise returns true if `comparedDate` is after `date`
|
||||||
|
|
||||||
export function isDateMoreRecentThan(
|
export function isDateMoreRecentThan(
|
||||||
date: Readonly<Date>,
|
date: Readonly<Date>,
|
||||||
comparedDate: Readonly<Date>
|
comparedDate: Readonly<Date>,
|
||||||
|
equalityToleranceInSeconds = 0
|
||||||
): boolean {
|
): boolean {
|
||||||
|
if (equalityToleranceInSeconds > 0) {
|
||||||
|
const areDatesEqual = isDateEqualTo(
|
||||||
|
date,
|
||||||
|
comparedDate,
|
||||||
|
equalityToleranceInSeconds
|
||||||
|
);
|
||||||
|
|
||||||
|
return !areDatesEqual && date > comparedDate;
|
||||||
|
}
|
||||||
|
|
||||||
return date > comparedDate;
|
return date > comparedDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isDateEqualTo(
|
||||||
|
date: Date,
|
||||||
|
otherDate: Date,
|
||||||
|
toleranceInSeconds: number
|
||||||
|
): boolean {
|
||||||
|
const timestamp = date.getTime();
|
||||||
|
const otherTimestamp = otherDate.getTime();
|
||||||
|
const deltaInSeconds = Math.abs(timestamp - otherTimestamp) / 1000;
|
||||||
|
return deltaInSeconds <= toleranceInSeconds;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue