2017-07-06 145 views
1

我想建立一個pre-commit鉤devtools::document並要失敗提交如果devtools::document改變任何東西。我檢查了devtools::document源,並返回invisible()所以這是不可能有條件地返回的退出代碼。預提交鉤devtools ::文件

有什麼巧妙的方法來阻止發生時devtools::document確實工作的承諾?

+1

'devtools ::文件()'寫一條消息到標準輸出(通常是控制檯),每當它改變一個文件:'寫作getScore.Rd' 。也許如果你能發現,你可以用它來工作。 – JAD

+0

有趣,對我來說也打印更新和裝載消息(紅色),但它們不是由'capture.output'返回。 – JAD

+0

您是否測試過該腳本?我有一種感覺,那是行不通的。 'capture.output'有兩種類型的輸出,用'message'你只抓取兩個默認的消息(更新和加載)。消息'writing file.Rd'實際上不是消息,而是輸出。 **所以你現在不抓住這些權利。**你應該改變類型'TYPE =「輸出」',然後測試'長度(線)> 0'。 – JAD

回答

1

使用功能capture.output我們能趕上devtools::documents發送消息時,它改變了一個文件:

Writing getScore.Rd 

所以,當我們運行:

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

當文檔(在這個例子中更新,我刪除了一個.Rd文件,結果如下:

> results 
[1] "Writing getScore.Rd" 

如果什麼也沒寫,results是空的:

> results 
character(0) 

這是很容易從這裏我覺得:)

的OP下去,@BobJansen創建運行上面的方法,並返回一個下面的腳本status = 0如果沒有文件編輯和status = 100如有其中:

#!/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

做出整理了我的問題 –