GitHub API (v3): упорядочить теги по дате создания
Я столкнулся с проблемой / вопросом при использовании GitHub 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 не решит удалить/оптимизировать это :))
- вы можете использовать его для фильтрации тегов в монорепозитории (который, скорее всего, помечает компоненты выпуска тегов с префиксными тегами)