2013-01-01 12 views
11

Sto cercando di creare uno script di pre-commit in SVN e voglio eseguire PHP_CodeSniffer sulle linee modificate solo (a differenza dell'intero file). Finora ho questo script:Utilizzare PHP_CodeSniffer solo per le righe modificate

#!/bin/sh 

REPOS="$1" 
TXN="$2" 

# Make sure that the log message contains some text. 
SVNLOOK=/usr/bin/svnlook 
$SVNLOOK log -t "$TXN" "$REPOS" | \ 
    grep "[a-zA-Z0-9]" > /dev/null || exit 1 

# Check for code validation before commiting the script using PHP_CodeSniffer 
/tmp/pear/download/PHP_CodeSniffer-1.4.3/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN" >&2 || exit 1 

# All checks passed, so allow the commit. 
exit 0 
+0

Forse dovresti delineare un po 'quale sia il problema con quello che hai provato finora. +1 Per costruire questo e chiedendo comunque;) – hakre

+2

phpcs prende il file, lo analizza in AST ed esegue analisi su di esso. Quindi, nella fase di verifica, non è disponibile un numero di righe originale. Non dubito che sia possibile – zerkms

+1

Come @zerkms ha detto, deve essere analizzato l'intero file, ma potrebbe essere possibile verificare se una qualsiasi delle linee modificate è nell'insieme di righe contenenti errori cs. –

risposta

0

Concettualmente non ha senso.

phpcs deve conoscere il contesto del foro per poter analizzare correttamente.

La scansione delle sole righe modificate rimuove il contesto.

+0

PHPCS funziona solo con il contesto del file corrente. Sono a conoscenza solo di 1 sniff, che ha bisogno di più intell, ma utilizza una tecnica bit-avanzata per farlo. https://github.com/Symplify/CodingStandard#possible-unused-public-method –

0

Ecco come si fa in Arcanist strumento di Phabricator:

  1. viene eseguito il codice php sniffer su ogni file modificato e raccoglie tutti gli errori
  2. ostacoli per quegli errori di numero di riga, dove solo numeri di riga che sono stati modificati in questo commit sono consentiti

Questo ovviamente non coprirà alcuni casi specifici, quando la modifica in LineA ha causato un errore in LineB.

0

Si potrebbe cercare di accelerare la scansione o impedire l'introduzione di nuovi problemi nel codice che ha già un numero enorme di problemi. (http://xyproblem.info/)

Se si sta cercando di accelerare la scansione, allora temo che sia un no-go. Come ha detto Max Horvath, non ha senso. È necessario l'intero file per fornire un contesto sufficiente per valutare una nuova riga (un semplice esempio: aggiungo una nuova riga che fa riferimento a una variabile definita in una riga che non ho modificato. Non è possibile stabilire se si tratta di un riferimento valido senza scansione del file per trovare riferimenti ad esso).

Se si sta tentando di identificare nuovi problemi, l'unico modo corretto per farlo è eseguire 2 scansioni e confrontare i risultati con e senza le nuove modifiche.

Questo non sarà necessariamente raddoppiare il tempo di elaborazione se è possibile eseguire entrambe le scansioni a risultati paralleli o della cache, ma non sta andando essere più veloce, che è un peccato perché il caso d'uso ovvia per tecnologia come questo è per molto grande File.

Capire se due messaggi di errore sono uguali è un po 'più complicato di quello che appare per la prima volta, poiché i numeri di riga cambieranno. Dovresti diffare i due file originali e capire tutti gli offset di linea per ottenere un risultato corretto.

Probabilmente sarebbe sufficiente sfocare i numeri di riga prima di diffare i risultati e lasciare che lo sviluppatore capisca. Se dovessi dire "Questo cambiamento ha introdotto uno di questi 4 errori, ma non so quale" lo sviluppatore lo capirà facilmente.

0

Sono consapevole che l'argomento non è aggiornato. Costruisco la mia soluzione per raggiungere questo obiettivo (scansione solo recentemente modificata). E 'prematuro, ma funziona

https://github.com/ayeo/sniffer

Problemi correlati