Remove lineNumber from lint exceptions
This commit is contained in:
parent
fb00464033
commit
36d8ef9678
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2018-2020 Signal Messenger, LLC
|
// Copyright 2018-2021 Signal Messenger, LLC
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
|
@ -13,30 +13,6 @@ import { ENCODING, loadJSON, sortExceptions } from './util';
|
||||||
|
|
||||||
const ALL_REASONS = REASONS.join('|');
|
const ALL_REASONS = REASONS.join('|');
|
||||||
|
|
||||||
function getExceptionKey(
|
|
||||||
exception: Pick<ExceptionType, 'rule' | 'path' | 'lineNumber'>
|
|
||||||
): string {
|
|
||||||
return `${exception.rule}-${exception.path}-${exception.lineNumber}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createLookup(
|
|
||||||
list: ReadonlyArray<ExceptionType>
|
|
||||||
): { [key: string]: ExceptionType } {
|
|
||||||
const lookup = Object.create(null);
|
|
||||||
|
|
||||||
list.forEach((exception: ExceptionType) => {
|
|
||||||
const key = getExceptionKey(exception);
|
|
||||||
|
|
||||||
if (lookup[key]) {
|
|
||||||
throw new Error(`Duplicate exception found for key ${key}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
lookup[key] = exception;
|
|
||||||
});
|
|
||||||
|
|
||||||
return lookup;
|
|
||||||
}
|
|
||||||
|
|
||||||
const rulesPath = join(__dirname, 'rules.json');
|
const rulesPath = join(__dirname, 'rules.json');
|
||||||
const exceptionsPath = join(__dirname, 'exceptions.json');
|
const exceptionsPath = join(__dirname, 'exceptions.json');
|
||||||
const basePath = join(__dirname, '../../..');
|
const basePath = join(__dirname, '../../..');
|
||||||
|
@ -324,7 +300,7 @@ async function main(): Promise<void> {
|
||||||
setupRules(rules);
|
setupRules(rules);
|
||||||
|
|
||||||
const exceptions: Array<ExceptionType> = loadJSON(exceptionsPath);
|
const exceptions: Array<ExceptionType> = loadJSON(exceptionsPath);
|
||||||
const exceptionsLookup = createLookup(exceptions);
|
let unusedExceptions = exceptions;
|
||||||
|
|
||||||
const results: Array<ExceptionType> = [];
|
const results: Array<ExceptionType> = [];
|
||||||
let scannedCount = 0;
|
let scannedCount = 0;
|
||||||
|
@ -351,7 +327,7 @@ async function main(): Promise<void> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lines.forEach((line: string, lineIndex: number) => {
|
lines.forEach((line: string) => {
|
||||||
if (!rule.regex.test(line)) {
|
if (!rule.regex.test(line)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -361,30 +337,29 @@ async function main(): Promise<void> {
|
||||||
rule.regex = new RegExp(rule.expression, 'g');
|
rule.regex = new RegExp(rule.expression, 'g');
|
||||||
}
|
}
|
||||||
|
|
||||||
const lineNumber = lineIndex + 1;
|
const matchedException = unusedExceptions.find(
|
||||||
|
exception =>
|
||||||
|
exception.rule === rule.name &&
|
||||||
|
exception.path === relativePath &&
|
||||||
|
(line.length < 300
|
||||||
|
? exception.line === line
|
||||||
|
: exception.line === undefined)
|
||||||
|
);
|
||||||
|
|
||||||
const exceptionKey = getExceptionKey({
|
if (matchedException) {
|
||||||
rule: rule.name,
|
unusedExceptions = unusedExceptions.filter(
|
||||||
path: relativePath,
|
exception => exception !== matchedException
|
||||||
lineNumber,
|
);
|
||||||
});
|
} else {
|
||||||
|
results.push({
|
||||||
const exception = exceptionsLookup[exceptionKey];
|
rule: rule.name,
|
||||||
if (exception && (!exception.line || exception.line === line)) {
|
path: relativePath,
|
||||||
delete exceptionsLookup[exceptionKey];
|
line: line.length < 300 ? line : undefined,
|
||||||
|
reasonCategory: ALL_REASONS,
|
||||||
return;
|
updated: now.toJSON(),
|
||||||
|
reasonDetail: '<optional>',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
results.push({
|
|
||||||
rule: rule.name,
|
|
||||||
path: relativePath,
|
|
||||||
line: line.length < 300 ? line : undefined,
|
|
||||||
lineNumber,
|
|
||||||
reasonCategory: ALL_REASONS,
|
|
||||||
updated: now.toJSON(),
|
|
||||||
reasonDetail: '<optional>',
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -392,8 +367,6 @@ async function main(): Promise<void> {
|
||||||
{ concurrency: 100 }
|
{ concurrency: 100 }
|
||||||
);
|
);
|
||||||
|
|
||||||
const unusedExceptions = Object.values(exceptionsLookup);
|
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
`${scannedCount} files scanned.`,
|
`${scannedCount} files scanned.`,
|
||||||
`${results.length} questionable lines,`,
|
`${results.length} questionable lines,`,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2018-2020 Signal Messenger, LLC
|
// Copyright 2018-2021 Signal Messenger, LLC
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
// Tool requirements:
|
// Tool requirements:
|
||||||
|
@ -59,7 +59,6 @@ export type ExceptionType = {
|
||||||
rule: string;
|
rule: string;
|
||||||
path: string;
|
path: string;
|
||||||
line?: string;
|
line?: string;
|
||||||
lineNumber: number;
|
|
||||||
reasonCategory: string;
|
reasonCategory: string;
|
||||||
updated: string;
|
updated: string;
|
||||||
reasonDetail: string;
|
reasonDetail: string;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2018-2020 Signal Messenger, LLC
|
// Copyright 2018-2021 Signal Messenger, LLC
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
|
|
||||||
import { readFileSync } from 'fs';
|
import { readFileSync } from 'fs';
|
||||||
|
|
||||||
import { orderBy } from 'lodash';
|
import { omit, orderBy } from 'lodash';
|
||||||
|
|
||||||
import { ExceptionType } from './types';
|
import { ExceptionType } from './types';
|
||||||
|
|
||||||
|
@ -25,5 +25,19 @@ export function loadJSON<T>(target: string): T {
|
||||||
export function sortExceptions(
|
export function sortExceptions(
|
||||||
exceptions: Array<ExceptionType>
|
exceptions: Array<ExceptionType>
|
||||||
): Array<ExceptionType> {
|
): Array<ExceptionType> {
|
||||||
return orderBy(exceptions, ['path', 'lineNumber', 'rule']);
|
return orderBy(exceptions, [
|
||||||
|
'path',
|
||||||
|
'rule',
|
||||||
|
'reasonCategory',
|
||||||
|
'updated',
|
||||||
|
'reasonDetail',
|
||||||
|
]).map(removeLegacyAttributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is here in case any open changesets still touch `lineNumber`. We should remove
|
||||||
|
// this after 2021-06-01 to be conservative.
|
||||||
|
function removeLegacyAttributes(
|
||||||
|
exception: Readonly<ExceptionType>
|
||||||
|
): ExceptionType {
|
||||||
|
return omit(exception, ['lineNumber']);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue