Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to get the latest tag of a given repo using github API v3

Tags:

I am relatively new to the github api and I am struggling to get the latest tag of a given repo.

Q: Why I need that ?

A: As a QA I am responsible for testing and releasing to LIVE and our team owns around 40 artefacts(repos in github). I want to build a tool which lists the projects which have commits after that latest tag. So that I can manage releases more efficiently.

Coming to the point.

According to Github api to get all tags of a give repo is

GET /repos/:owner/:repo/tags 

But this gives the full list of tags the repo has.

Is there an easy way to find the latest tag without iterating through the all available tags from the above api call?

If I have iterate through each tag in order to find the latest tag (based on timestamp of each tag)thats clearly going to be not the efficient way of doing this as the time goes the number of tags will increase and since I want to repeat the same process for at least more than 10 repos.

Any help will be highly appreciated.

Many thanks in advance

like image 238
Varun Kumar Rao Ponugoti Avatar asked Mar 17 '15 21:03

Varun Kumar Rao Ponugoti


People also ask

How do I get the latest tag from GitHub API?

GitHub doesn't have an API to retrieve the latest tag, as it has for retrieving the latest release. That might be because tags could be arbitrary strings, not necessarily semvers, but it's not really an excuse, since tags have timestamps, and GitHub does sort tags lexicographically when returning them via its Tags API.

How do I see latest releases in GitHub?

On GitHub.com, navigate to the main page of the repository. To the right of the list of files, click Releases.


2 Answers

GitHub doesn't have an API to retrieve the latest tag, as it has for retrieving the latest release. That might be because tags could be arbitrary strings, not necessarily semvers, but it's not really an excuse, since tags have timestamps, and GitHub does sort tags lexicographically when returning them via its Tags API.

Anyway, to get the latest tag, you need to call that API, then sort the tags according to semver rules. Since these rules are non-trivial (see point 11 at that link), it's better to use the semver library (ported for the browser).

const gitHubPath = 'dandv/local-iso-dt';  // example repo const url = 'https://api.github.com/repos/' + gitHubPath + '/tags';  $.get(url).done(data => {   const versions = data.sort((v1, v2) => 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>
like image 170
Dan Dascalescu Avatar answered Nov 26 '22 07:11

Dan Dascalescu


You could consider, as an alternative to the GitHub API, a simple script mentioned in "Is there a simple way to “git describe” a remote repository?" (source, by svnpenn):

#!/usr/bin/awk -f BEGIN {   if (ARGC != 2) {     print "git-describe-remote.awk https://github.com/stedolan/jq"     exit   }   FS = "[ /^]+"   while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {     if (!sha)       sha = substr($0, 1, 7)     tag = $3   }   while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)     if ($3 ~ "commits")       com = $2   printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha } 

That does extract the tag (and more), without having to clone the repo.

Note: as commented below by Joels Elf, make sure /usr/bin/awk refers to gawk, not mawk.

like image 25
VonC Avatar answered Nov 26 '22 08:11

VonC