GitHub API(v3):按创建日期排序标签

时间:2013-10-18 14:31:36

标签: api github github-api

我在使用GitHub API时遇到了问题/疑问。

我需要一个在单个标签之后创建的所有标签的列表。唯一的方法是按日期比较标签。但是,API的结果不按日期排序:

API的结果(rails repository示例):

API results

网络界面的结果:

Webinterface results

我所期望的是按日期排序的列表。但是,正如您在图片中看到的那样:API正在返回v4.0.0rc1& v4.0.0rc2在v4.0.0发布之前,而4.0.0是在发布候选版本之后发布的。在服务器端甚至没有订购的创建/提交日期。

版本API也不是解决方案。此API仅返回由Github创建的版本,而不是由标记创建的版本。

有没有办法按日期订购标签?

提前致谢!

3 个答案:

答案 0 :(得分:10)

Repositories API当前按照“git tag”命令返回的顺序返回标记,这意味着它们按字母顺序排序。

在Git中按时间顺序排序标记的问题是有两种类型的标记,轻量级和注释,而对于轻量级类型,Git不存储创建日期。

版本/标签UI当前按照标签指向的提交日期按时间顺序对标签进行排序。这再次不是标签本身的创建日期,但它确实按时间顺序建立了事物。

在API中添加此替代排序选项位于我们的功能请求列表中。

答案 1 :(得分:4)

使用GraphQL API v4,我们现在可以在field: TAG_COMMIT_DATE内使用orderBy按提交日期过滤代码。以下将按提交日期执行递增的标记:

{
  repository(owner: "rails", name: "rails") {
    refs(refPrefix: "refs/tags/", last: 100, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) {
      edges {
        node {
          name
          target {
            oid
            ... on Tag {
              message
              commitUrl
              tagger {
                name
                email
                date
              }
            }
          }
        }
      }
    }
  }
}

Test it in the explorer

此处,tagger内的target字段只会填写带注释的标签&对于轻量级标签,它将为空。

由于date中的tagger属性提供了标记的创建日期(仅适用于带注释的标记),因此可以轻松地在客户端按创建日期进行过滤(无需逐个检索所有标签

请注意,此时orderBy.field的可用选项为TAG_COMMIT_DATE& ALPHABETICAL(否TAG_CREATION_DATE

答案 2 :(得分:3)

作为解决方法,有一个节点模块, 它基本上获取每个标记的提交细节: github-api-tags-full

> npm install github-api-tags-full github moment

var GitHubApi  = require('github'),
moment     = require('moment'),
githubTags = require('github-api-tags-full');

var github = new GitHubApi({
  version: '3.0.0'
});

githubTags({ user: 'golang', repo: 'go' }, github)
.then(function(tags) {
  var tagsSorted = tags.sort(byAuthorDateAsc).reverse(); // descending
  console.log(tagsSorted); // prints the array of tags sorted by their creation date
});

var byAuthorDateAsc = function(tagA, tagB) {
  return githubCompareDates(
    tagA.commit.author.date,
    tagB.commit.author.date
  );
};
var githubCompareDates = function(dateStrA, dateStrB) {
  return moment(dateStrA).diff(dateStrB);
};

最诚挚的问候

编辑:使用新的Github GraphQL API现在有更简单的方法吗?