Как я могу получить последнюю "стабильную" версию репо из Github API?

Метод тегов Github возвращает список всех тегов, помещенных в репозиторий, с последним тегом, указанным вверху. Вот пример вызова: https://api.github.com/repos/ff0000/rosy/tags который создает следующий объект json.

[{
    name: "rbp-folder-rename",
    zipball_url: "https://api.github.com/repos/ff0000/rosy/zipball/rbp-folder-rename",
    tarball_url: "https://api.github.com/repos/ff0000/rosy/tarball/rbp-folder-rename",
    commit: {
        sha: "09ebda2678d932a005fc86ab78f6c04eebdcd50d",
        url: "https://api.github.com/repos/ff0000/rosy/commits/09ebda2678d932a005fc86ab78f6c04eebdcd50d"
    }
},
{
    name: "2.0.10",
    zipball_url: "https://api.github.com/repos/ff0000/rosy/zipball/2.0.10",
    tarball_url: "https://api.github.com/repos/ff0000/rosy/tarball/2.0.10",
    commit: {
        sha: "fe284c7d461107d9d08d2d4dcb676759f9485fc1",
        url: "https://api.github.com/repos/ff0000/rosy/commits/fe284c7d461107d9d08d2d4dcb676759f9485fc1"
    }
},

// ....

{
    name: "2.1.5",
    zipball_url: "https://api.github.com/repos/ff0000/rosy/zipball/2.1.5",
    tarball_url: "https://api.github.com/repos/ff0000/rosy/tarball/2.1.5",
    commit: {
        sha: "db92baa49657b3c3d27b1475c415c19525cb2118",
        url: "https://api.github.com/repos/ff0000/rosy/commits/db92baa49657b3c3d27b1475c415c19525cb2118"
    }
}]

Вопросы

  1. Этот список, кажется, имеет самый последний тег в верхней части, за которым следует история предыдущих тегов, перечисленных в обратном хронологическом порядке. Зачем? Кажется странным, что первый результат упорядочен не так, как остальные, может, я неправильно это читаю?
  2. Есть ли способ программно получить последнюю версию, примененную к master только ветка? Я хотел бы программно получить последнюю стабильную версию репо.

Любая помощь / понимание будут оценены.

2 ответа

Решение

Вы можете просто заменить тег на имя ветви:

https://api.github.com/repos/ff0000/rosy/zipball/master

См. Более общую форму этого запроса (для данной ветви) в " Есть ли какой-либо способ программно получить zipball из частного репозитория github?".

Но это предполагает, что последняя стабильная версия репо находится в master (это может быть последняя "разработка", которая может быть не очень стабильной после того, как она компилируется и проходит базовый модульный тест): каждый проект может иметь свое собственное соглашение.

Для чего это стоит, https://api.github.com/repos/ff0000/rosy/branches будет перечислять ветви для того же репо.

Чтобы получить номер последней версии:

https://api.github.com/repos/user/repo/releases/latest

Например, для этого репо (https://github.com/pyIDM/PyIDM) вы можете использовать следующий URL:

https://api.github.com/repos/pyidm/pyidm/releases/latest

вы получите файл json с tag_name= последняя версия

Этот список, кажется, имеет самый последний тег в верхней части, за которым следует история предыдущих тегов, перечисленных в обратном хронологическом порядке.

Вы не должны зависеть от порядка, в котором API GitHub возвращает тег, потому что нет временных отметок, и участники репо могли использовать несовместимые имена тегов, например v1.9.0 а также 2.5.14, В этом конкретном примере, v1.9.0 появится первым - посмотрите репо.

Вам следует поработать с сопровождающими, чтобы использовать согласованные теги ( пример), и в любом случае отсортировать вывод GitHub в соответствии с правилами semver. Поскольку эти правила нетривиальны (см. Пункт 11 по этой ссылке), лучше использовать библиотеку semver ( перенесена для браузера).

var gitHubPath = 'ff0000/rosy';  // your example repo
var url = 'https://api.github.com/repos/' + gitHubPath + '/tags';

$.get(url).done(function (data) {
  var versions = data.sort(function (v1, v2) {
    return semver.compare(v2.name, v1.name)
  });
  $('#result').html(versions[0].name);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/hippich/bower-semver/master/semver.min.js"></script>
<p>Latest tag: <span id="result"></span></p>

Получение последней "стабильной" версии

GitHub релизы имеют prerelease флаг, который может быть истинным или ложным. Если вы определите "стабильный" как prerelease: false, то вы можете получить релизы, фильтр для prerelease: false и сортировать.

var gitHubPath = 'idorecall/selection-menu';  // your example repo doesn't have releases
var url = 'https://api.github.com/repos/' + gitHubPath + '/releases';

$.get(url).done(function (data) {
  var releases = data.filter(function (release) {
    return !release.prerelease;
  })
  releases = releases.sort(function (v1, v2) {
    return Date.parse(v2.published_at) - Date.parse(v1.published_at);
  });
  console.log(releases[0]);
  $('#result').html(releases[0].name);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Latest release name: <span id="result"></span></p>

Другие вопросы по тегам