使用GitHub GraphQL API v4查询单个存储库中的所有提交

时间:2019-03-29 14:07:23

标签: github graphql github-api

我正在尝试通过GitHub的GraphQL API v4查询对GitHub上指定存储库的所有提交。

我只想提取它们的提交日期,以估计贡献给该存储库的总时间(类似于git-hours

这是我的初始查询:(注意:您可以尝试在Explorer中运行它)

{
  repository(owner: "facebook", name: "react") {
    object(expression: "master") {
      ... on Commit {
        history {
          nodes {
            committedDate
          }
        }
      }
    }
  }
}

不幸的是,由于API的resource limitations,它仅返回最近的100次提交:

  

节点限制

     

要通过架构验证,所有GraphQL API v4调用都必须满足以下标准:

     
      
  • 客户端必须在任何连接上提供第一个或最后一个参数。
  •   
  • first和last的值必须在1-100之间。
  •   
  • 单个呼叫最多只能请求500,000个节点。
  •   

因此,由于我没有提供firstlast参数,因此该API假定我正在查询history(first: 100)。而且我无法在单个连接中查询100个以上的节点。

但是,总节点数要高得多(500,000),我应该能够以100为一组查询提交,直到我拥有所有提交为止。

我可以使用以下查询查询最近的200次提交:

{
  repository(owner: "facebook", name: "react") {
    object(expression: "master") {
      ... on Commit {
        total: history {
          totalCount
        }
        first100: history(first: 100) {
          edges {
            cursor
            node {
              committedDate
            }
          }
        }
        second100: history(after: "700f17be6752a13a8ead86458e343d2d637ee3ee 99") {
          edges {
            cursor
            node {
              committedDate
            }
          }
        }
      }
    }
  }
}

但是,我必须手动输入在第二个连接中传递的游标String:second100: history(after: "cursor-string") {}

在查询存储库中所有committedDate个提交之前,如何递归运行此连接?

1 个答案:

答案 0 :(得分:0)

尽管可以通过某种方式递归查询存储库上的所有提交,但我找不到可行的解决方案。

这是我的解决方法

我的需要是

  

我只想提取它们的提交日期,以估算贡献给该存储库的总时间(大约为git-hours)

由于我无法查询完整的提交历史记录,因此我不得不假设最近100次提交的贡献时间与任何100次提交的贡献时间相同。

从GitHub GraphQL API查询数据

  • 提交历史记录的src
  • 最近100次提交中的totalCount
committedDate

今天运行,查询返回:

{
  repository(owner: "facebook", name: "react") {
    object(expression: "master") {
      ... on Commit {
        history {
          totalCount
          nodes {
            committedDate
          }
        }
      }
    }
  }
}

估计总贡献时间

我使用与git-hours's README上解释的算法相似的算法,估算了最近100次提交所花费的时间。

然后我将其缩放到{ "data": { "repository": { "object": { "history": { "totalCount": 10807, "nodes": [ { "committedDate": "2019-04-04T01:15:33Z" }, { "committedDate": "2019-04-03T22:07:09Z" }, { "committedDate": "2019-04-03T20:21:27Z" }, // 97 other committed dates ] } } } } }

totalCount

我估计截至今天为止,Twitter的Bootstrap上有13152小时,其中const timeContributedTotal = timeContributedLatest100 * totalCount / 100; 估计7个月前为9959小时。听起来还不错。

至于React,我总共有15097小时(或629天)。

这个估算值很粗略,但与我所能达到的要求差不多。如果发现任何可能的改进,请随时发表评论或回答。