Estoy tratando de escribir un pequeño script que pueda hacer comentarios sobre github PR usando salida eslint.
El problema es que eslint me da los numbers de línea absolutos para cada error. Pero el API de Github quiere el número de línea relativo a la diferencia.
De los documentos API de github: https://developer.github.com/v3/pulls/comments/#create-a-comment
Para comentar una línea específica en un file, primero deberá determinar la position en el file diff. GitHub ofrece un tipo de aplicación / vnd.github.v3.diff que puede usar en una request anterior para ver la diferencia de request de extracción. La diferencia debe interpretarse para traducir de la línea en el file a una position en la diferencia. El valor de position es el número de líneas hacia abajo desde el primer encabezado de hunk "@@" en el file que desea comentar.
La línea justo debajo de la línea "@@" es la position 1, la siguiente línea es la position 2, y así sucesivamente. La position en la diferencia del file continúa aumentando a través de líneas de espacios en blanco y trozos adicionales hasta que se alcanza un nuevo file.
Entonces, si quiero agregar un comentario sobre la nueva línea número 5 en la image de arriba, entonces necesitaría pasar 12 a la API
Mi pregunta es cómo puedo mapear fácilmente entre los nuevos numbers de línea que el eslint dará en sus posts de error con los numbers de línea relativos requeridos por la API de github.
Estoy usando parse-diff para convertir el diff provisto por la API github en un object json
[{ "chunks": [{ "content": "@@ -,OLD_TOTAL_LINES +NEW_STARTING_LINE_NUMBER,NEW_TOTAL_LINES @@", "changes": [ { "type": STRING("normal"|"add"|"del"), "normal": BOOLEAN, "add": BOOLEAN, "del": BOOLEAN, "ln1": OLD_LINE_NUMBER, "ln2": NEW_LINE_NUMBER, "content": STRING, "oldStart": NUMBER, "oldLines": NUMBER, "newStart": NUMBER, "newLines": NUMBER } }] }]
Estoy pensando en el siguiente algorithm
NEW_STARTING_LINE_NUMBER
hasta NEW_STARTING_LINE_NUMBER+NEW_TOTAL_LINES
por cada file newStart
de cada número y newStart
en otra matriz relativeLineNumbers
type==='del'
) incrementa el número relativeLineNumbers
correspondiente. @@
), disminuya el relativeLineNumbers
restante. relativeLineNumbers
He encontrado una solución. No lo puse aquí porque involucra simples loops y nada especial. Pero de todos modos respondiendo ahora para ayudar a otros.
He abierto una request de extracción para crear una situación similar a la que se muestra en la pregunta https://github.com/harryi3t/5134/pull/7/files
Usando la API de Github uno puede get los datos de diferencia. He escrito un pequeño contenedor JS para él https://github.com/harryi3t/github-adapter/blob/master/src/Adapter.js#L223
diff --git a/test.js b/test.js index 2aa9a08..066fc99 100644 --- a/test.js +++ b/test.js @@ -2,14 +2,7 @@ var hello = require('./hello.js'); -var names = [ - 'harry', - 'barry', - 'garry', - 'harry', - 'barry', - 'marry', -]; +var names = ['harry', 'barry', 'garry', 'harry', 'barry', 'marry']; var names2 = [ 'harry', @@ -23,9 +16,7 @@ var names2 = [ // after this line new chunk will be created var names3 = [ 'harry', - 'barry', - 'garry', 'harry', 'barry', - 'marry', + 'marry', 'garry', ];
Ahora pasa estos datos al module de diff-parse
y realiza el cálculo.
var parsedFiles = parseDiff(data); // diff output parsedFiles.forEach( function (file) { var relativeLine = 0; file.chunks.forEach( function (chunk, index) { if (index !== 0) // relative line number should increment for each chunk relativeLine++; // except the first one (see rel-line 16 in the image) chunk.changes.forEach( function (change) { relativeLine++; console.log( change.type, change.ln1 ? change.ln1 : '-', change.ln2 ? change.ln2 : '-', change.ln ? change.ln : '-', relativeLine ); } ); } ); } );
Esto imprimiría
type (ln1) old line (ln2) new line (ln) added/deleted line relative line normal 2 2 - 1 normal 3 3 - 2 normal 4 4 - 3 del - - 5 4 del - - 6 5 del - - 7 6 del - - 8 7 del - - 9 8 del - - 10 9 del - - 11 10 del - - 12 11 add - - 5 12 normal 13 6 - 13 normal 14 7 - 14 normal 15 8 - 15 normal 23 16 - 17 normal 24 17 - 18 normal 25 18 - 19 del - - 26 20 del - - 27 21 normal 28 19 - 22 normal 29 20 - 23 del - - 30 24 add - - 21 25 normal 31 22 - 26
Ahora puede usar el número de línea relativo para publicar un comentario usando github api.
Para mi propósito, solo necesitaba los numbers de línea relativos para las líneas recién agregadas, pero usando la tabla de arriba también se puede get para las líneas eliminadas.
Aquí está el enlace para el proyecto de linting en el que utilicé esto. https://github.com/harryi3t/lint-github-pr