Cómo comentar un número de línea específico en un PR en github

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.

enter image description here

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.

Lo que he intentado hasta ahora

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

  • crear una matriz de nuevos numbers de línea que comiencen desde NEW_STARTING_LINE_NUMBER hasta NEW_STARTING_LINE_NUMBER+NEW_TOTAL_LINES por cada file
  • reste newStart de cada número y newStart en otra matriz relativeLineNumbers
  • recorre el set y para cada línea eliminada ( type==='del' ) incrementa el número relativeLineNumbers correspondiente.
  • para otro trozo (línea que tiene @@ ), 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

Imagen difusa

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