2017-07-06 107 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

做出整理了我的问题 –