如何使用 github3.py 仅拉取修改的提交/拉取请求?



>我正在编写一个 ETL 作业,其中我保留了数据仓库中GitHub存储库中的提交、拉取请求和文件的更新列表。 我目前正在存储etags并将其传递给各种迭代器,但我认为我不知道如何正确执行此操作。

我也很难理解object.refresh(conditional=True)到底在做什么。 如果我循环访问存储库上的所有提交,然后对每个提交调用commit.refresh(conditional=True),我是否会收到要处理的 304 异常,以便我知道不要将该提交包含在数据仓库中,因为它没有更改? 拉取请求也是如此。 当我调用repository.refresh(conditional=True)时,它似乎忽略了存储库中的新提交。

如果我将etag传递给repo.iter_commits,它是否只返回修改后的提交,或者如果有任何更改,它会返回存储库的所有提交?

这是我目前使用的基本工作流程:

from github3 import login
gh = login(token='access_token')
repos = (repo.refresh(conditional=True) for repo in gh.iter_repos(etag='previous_etag'))
commit_iters = (commit_iter for repo in repos for commit_iter in repo.iter_commits(etag='prev_etag'))
for commit_iter in commit_iters:
for commit in commit_iter:
commit.refresh(conditional=True)
# pull various attributes, write to file, etc...

我将每个迭代器包装在一个包装类中,该包装类处理检索以前的etags、在迭代后存储etags以及检查速率限制。

我的首要目标是拉取自上次请求以来发生更改的任何新提交/拉取请求。 我假设此时我想从数据库中删除现有条目并使用新条目进行更新。

使用github3.pyAPI 实现此目的的正确和最有效的方法是什么?

编辑: 我再次检查了文档,有一个since参数可以解决我的提交问题。 所以我只需要知道如何正确使用 etag 来提取更新的拉取请求数据。

因此 ETag 的工作方式如下:

  1. 您发出请求并使用资源并存储 etag

  2. 您使用 ETag 值发出请求

    • 如果资源发生更改,则必须再次使用整个资源

    • 如果没有变化,您将收到204 No Content响应

ETag 不允许您从原来的位置恢复,并且没有好方法可以使用 API 从中断的地方恢复。

老实说,我认为您可能想做的是:

  1. 使用存储库上的所有当前提交
  2. 注册仅订阅push事件的 Webhook
  3. 处理其余的提交,因为人们将它们推送到 GitHub。

相关内容

  • 没有找到相关文章

最新更新