当使用Watchman的watch-make时,我想访问已更改文件的名称

时间:2017-10-23 04:12:38

标签: python watchman

我正在使用watchman-make编写一个watchman命令,当我试图准确访问目录中已更改的内容时,我感到很茫然。我想运行我的upload.py脚本,在脚本中我想访问/ var / spool / cups-pdf / ANONYMOUS中新创建文件的文件名。 到目前为止我有

$ watchman-make -p '/var/spool/cups-pdf/ANONYMOUS' -—run 'python /home/pi/upload.py'

我想在python upload.py中添加另一个参数,这样我就可以对新创建的文件有一个确切的文件路径,以便我可以将新文件发送到upload.py中的数据库,

我一直在看守望者的文档,我能想到的最接近的东西是触发对象。请帮忙!

2 个答案:

答案 0 :(得分:0)

watchman-make旨在与将执行自己的后续查询的工具一起使用,以便在下一步中发现他们想要执行的操作。例如,运行make工具会导致各个代表商品stat更新。

这意味着,如果您想与守望者一起使用,upload.py脚本需要知道如何为自己执行此操作。

您有几种选择,具体取决于您希望事情的复杂程度:

使用pywatchman发出即席查询

如果您希望能够随时运行upload.py并让它找到正确的东西(就像make那样),那么您可以让它直接询问守望者。您可以让upload.py使用pywatchman(python watchman客户端)来执行此操作。如果守望者pywatchman脚本认为您有一个正常工作的python安装,则会安装configure。您还可以pip install pywatchman。一旦您有了PYTHONPATH

import pywatchman

client = pywatchman.client()
client.query('watch-project', os.getcwd())
result = client.query('query', os.getcwd(), {
   "since": "n:pi_upload",
   "fields": ["name"]})
print(result["files"])

此代码段使用自生成器命名游标来发现自上次使用同一命名游标发出查询以来更改的文件列表。 Watchman会为您记住关联的 clock 值,因此您不需要通过状态跟踪使脚本复杂化。我们使用名称pi_upload作为游标;该名称在可能使用命名游标的守望者客户端中必须是唯一的,因此在您的工具之后命名它是一个好主意,以避免潜在的冲突。

这可能是提取所需信息的最直接方式,而无需您对上传脚本进行更具侵略性的更改。

使用pywatchman启动长时间运行的订阅

此方法会转换您的upload.py脚本,以便它知道如何直接订阅守望者,因此您只需直接运行watchman-make而不是upload.py,而不是watchman-wait继续运行并执行上传。这是一个更具侵略性,有点太多的代码尝试粘贴在这里。如果您对此方法感兴趣,那么我建议您将watchman-wait后面的代码作为起点。你可以在这里找到它:

https://github.com/facebook/watchman/blob/master/python/bin/watchman-wait

您可能想要修改的关键部分是这一行:

https://github.com/facebook/watchman/blob/master/python/bin/watchman-wait#L169

是收到文件列表的地方。

为什么不触发?

您可以使用触发器,但我们会引导人们远离触发器,因为它们很难管理。触发器将在后台运行,并将其输出发送到watchman日志文件。很难判断它是在运行还是停止运行。

界面更靠近unix模型,允许您在stdin上提供文件列表。

说到unix,watchman-wait怎么办?

我们还有一个命令可以在更改时发出已更改文件的列表。您可以在upload.py中流式传输{{1}}的输出。这将使它与订阅方法有一些相似之处,但不直接使用pywatchman客户端。

答案 1 :(得分:0)

使用watchman-wait的解决方案:

假设项目布局如下:

/posts/_SUBDIR_WITH_POST_NAME_/index.md
/Scripts/convert.sh

还有这样的shell脚本:

#!/bin/bash
# File: convert.sh

SrcDirPath=$(cd "$(dirname "$0")/../"; pwd)
cd "$SrcDirPath"

echo "Converting: $SrcDirPath/$1"

然后我们可以像这样启动watchman-wait

watchman-wait . --max-events 0 -p 'posts/**/*.md' | while read line; do ./Scripts/convert.sh $line; done

当我们更改文件/posts/_SUBDIR_WITH_POST_NAME_/index.md时,输出将如下所示:

...
Converting: /Users/.../Angular/dartweb_quickstart/posts/swift-on-android-building-toolchain/index.md
Converting: /Users/.../Angular/dartweb_quickstart/posts/swift-on-android-building-toolchain/index.md
...