2017-07-06 5 views
1

Ich möchte einen Pre-Commit Hook für devtools::document einrichten und das Commit fehlschlagen, wenn devtools::document ändert nichts. Ich überprüfte die devtools::document Quelle und es gibt invisible() zurück, so dass es nicht möglich ist, einen Beendigungscode bedingt zurückzugeben.Pre-Commit-Hook für Devtools :: Dokument

Gibt es clevere Möglichkeiten, das Commit zu stoppen, wenn devtools::document funktioniert?

+1

'devtools :: Dokument()' schreibt eine Nachricht an STDOUT (in der Regel der Konsole), wenn es eine Datei ändert: 'Schreiben getScore.Rd' . Vielleicht, wenn Sie das erkennen können, könnten Sie damit arbeiten. – JAD

+0

Interessant, für mich druckt es auch die Aktualisierung und das Laden von Nachrichten (in rot), aber sie werden nicht von 'capture.output' zurückgegeben. – JAD

+0

Hast du dieses Skript schon getestet? Ich habe das Gefühl, dass das nicht funktionieren wird. 'capture.output' hat zwei Arten von Ausgaben zu fangen und mit' message' greifen Sie nur die zwei Standardnachrichten (update und loading). Die Nachricht 'Datei.Rd schreiben 'ist eigentlich keine Nachricht, sondern eine Ausgabe. ** Du fängst diese also jetzt nicht an. ** Du solltest den Typ in 'type =" output "' ändern und dann nach 'length (lines)> 0' testen. – JAD

Antwort

1

Mit der Funktion capture.output können wir die Nachrichten fangen devtools::documents sendet, wenn es eine Datei ändert:

Writing getScore.Rd 

Also, wenn wir laufen:

results <- capture.output(devtools::document()) 

Wenn ein Dokument aktualisiert wird (für dieses Beispiel, Ich entfernte eine meiner .Rd-Dateien, die Ergebnisse sehen wie folgt aus:

Wenn nichts geschrieben wird, results leer ist:

> results 
character(0) 

Es ist leicht, von hier gehen Ich denke :)

Das OP, erstellt @BobJansen das folgende Skript, das das obige Verfahren läuft und gibt ein status = 0, wenn keine Dateien wurden bearbeitet und ein status = 100 falls vorhanden, wo:

#!/usr/bin/Rscript 

source("packrat/init.R") 

lines <- capture.output(devtools::document(), type = 'output') 
if (length(lines) > 0) { 
    print(lines) 
    q(save = 'no', status = 100) 
} else { 
    q(save = 'no', status = 0) 
} 
+0

Habe meine Frage aufgeräumt –