GitHub API (v3): упорядочить теги по дате создания

Я столкнулся с проблемой / вопросом при использовании GitHub API.

Мне нужен список всех тегов, созданных после одного тега. Единственный способ сделать это - сравнить теги по дате. Однако результаты API не упорядочены по дате:

Результат от API (пример хранилища рельсов):

Результаты API

Результаты из веб-интерфейса:

Результаты веб-интерфейса

Что я ожидал, так это список, упорядоченный по дате. Однако, как вы можете видеть на рисунках: API возвращает v4.0.0rc1 & v4.0.0rc2 до выпуска v4.0.0, а 4.0.0 выпускается после релиза-кандидата. Нет даже даты создания / фиксации для заказа на стороне сервера.

API релизов также не является решением. Этот API-интерфейс возвращает только выпуски, созданные Github, а не выпуски, созданные с помощью тегов.

Есть ли способ заказать теги по дате?

Заранее спасибо!

Ruben

4 ответа

Решение

API репозиториев в настоящее время возвращает теги в том порядке, в котором они будут возвращены командой "git tag", что означает, что они отсортированы по алфавиту.

Проблема с сортировкой тегов в Git в хронологическом порядке заключается в том, что существует два типа тегов (легкие и аннотированные), а для облегченного типа Git не хранит дату создания.

Интерфейс Releases/Tags в настоящее время сортирует теги в хронологическом порядке по дате фиксации, на которую указывает тег. Это опять-таки не дата создания самого тега, но он устанавливает хронологический порядок вещей.

Добавление этой альтернативной опции сортировки в API находится в нашем списке запросов функций.

В 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
              }
            }
          }
        }
      }
    }
  }
}

Проверьте это в проводнике

Здесь tagger поле внутри target будет заполнено только для аннотированных тегов и будет пустым для легких тегов.

Как date недвижимость в tagger дает дату создания тега (только для аннотированного тега), можно легко фильтровать по дате создания на стороне клиента (без необходимости извлекать все теги 1 на 1)

Обратите внимание, что доступны варианты для orderBy.field в это время TAG_COMMIT_DATE & ALPHABETICAL (нет TAG_CREATION_DATE)

В качестве обходного пути для этого есть модуль узла, который в основном извлекает детали фиксации каждого тега: https://github.com/strarsis/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?

Вы можете использовать Git References API.

Это также может вернуть все теги, соответствующие определенному префиксу.

В вашем случае вы, вероятно, хотите что-то вроде:

      https://api.github.com/repos/rails/rails/git/matching-refs/tags/v

Или в случае монорепозитория:

      https://api.github.com/repos/grafana/loki/git/matching-refs/tags/helm-loki-

Недостатки :

  • sorting : результаты сортируются в порядке возрастания semver , и вы получите сначала самые старые.
  • вы не получаете много информации о каждом теге, и вам, возможно, придется анализировать версии из имени/пути ссылки

вверх

  • вы получаете все совпадающие ссылки/теги (т.е. без нумерации страниц, пока GitHub не решит удалить/оптимизировать это :))
  • вы можете использовать его для фильтрации тегов в монорепозитории (который, скорее всего, помечает компоненты выпуска тегов с префиксными тегами)
Другие вопросы по тегам