GitHub API v4 - 从特定存储库获取贡献者

时间:2018-04-14 09:27:34

标签: graphql github-api github-graphql

我尝试使用GitHub API v4(GraphQL)构建查询以获取贡献者的数量。

目前我有一些像

这样的东西
query ($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    ref(qualifiedName: "master") {
      target {
        ... on Commit {
          history(first: 100) {
            nodes {
              author {
                name
              }
            }
            pageInfo {
              hasNextPage
              endCursor
            }
          }
        }
      }
    }
  }
}

我将浏览所有提交并获取作者的名称(当时我试图获取贡献者的提交数量),但对于具有大量提交的存储库,这需要很多时候。

回到我的问题,这是一种只获取存储库中贡献者数量的方法吗?

2 个答案:

答案 0 :(得分:1)

据我所知,这只能通过REST API(v3)实现,每页只请求一个项目,并提取响应头中的总页数。

答案 1 :(得分:0)

使用此graphql查询,您可以获得: -总发行数量 -分支机构总数 -总提交数

query{
  repository(owner:"kasadawa", name:"vmware-task") {

    Releases:refs(first: 0, refPrefix: "refs/tags/") {
      totalCount
    }
    Branches:refs(first: 0, refPrefix: "refs/heads/") {
      totalCount

    }

    object(expression:"master") {

      ... on Commit {

        history {
          totalCount
        }
      }
    }
  }
}

但是,如果您想获得贡献者,则应该使用REST API来实现,因为目前没有简单的方法可以使用GRAPHQL API来实现它。

这是REST API的解决方案。


const options = {
    url: 'https://api.github.com/repos/vmware/contributors' ,
    'json': true ,
    headers: { 
        'User-Agent':'request',
         'Authorization': 'token API_KEY_GENERATED_FROM_GITHUB'
        }
    };


var lastPageNum = 0 ; // global variable 

request.getAsync(options).then((res) =>{

        this.checkHeaders(res.headers.status) // just check the header status 

        // check if there are more pages 
        if(!!res.headers.link){

            const [ , lastURL] = res.headers.link.split(','); // getting the last page link from the header 
            lastPageNum = +lastURL.match(/page=(\d+)/)[1]; // get the number from the url string
            options.url = licenseUrl + lastPageNum; 
            return request.getAsync(options) // make Request with the last page, in order to get the last page results, they could be less than 30
        }else{
            // if its single page just resolve on to the chain 

            return Promise.resolve(res.body.length);
        }

    })
    .then((lastPageRes)=>{

        return (lastPageNum !== 0 
            ? ( (lastPageNum-1)*30 + lastPageRes.body.length ) 
            : lastPageRes)

        })
    .catch() // handle errors 


签出更新:https://github.community/t5/GitHub-API-Development-and/Get-contributor-count-with-the-graphql-api/td-p/18593