%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
#!/usr/bin/env node // Usage: // git diff upstream/main...HEAD -G"pr-url:" -- "*.md" | \ // ./tools/lint-pr-url.mjs <expected-pr-url> import process from 'node:process'; import readline from 'node:readline'; const [, , expectedPrUrl] = process.argv; const fileDelimiter = /^\+\+\+ b\/(.+\.md)$/; const changeDelimiter = /^@@ -\d+,\d+ \+(\d+),\d+ @@/; const prUrlDefinition = /^\+\s+pr-url: (.+)$/; const validatePrUrl = (url) => url == null || url === expectedPrUrl; let currentFile; let currentLine; const diff = readline.createInterface({ input: process.stdin }); for await (const line of diff) { if (fileDelimiter.test(line)) { currentFile = line.match(fileDelimiter)[1]; console.log(`Parsing changes in ${currentFile}.`); } else if (changeDelimiter.test(line)) { currentLine = Number(line.match(changeDelimiter)[1]); } else if (!validatePrUrl(line.match(prUrlDefinition)?.[1])) { console.warn( `::warning file=${currentFile},line=${currentLine++},col=${line.length}` + '::pr-url doesn\'t match the URL of the current PR.' ); } else if (line[0] !== '-') { // Increment line counter if line is not being deleted. currentLine++; } }