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

后端 未结 4 723
南笙
南笙 2021-02-02 11:10

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:

相关标签:
4条回答
  • 2021-02-02 11:37

    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>

    0 讨论(0)
  • 2021-02-02 11:41

    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.

    0 讨论(0)
  • 2021-02-02 11:52

    Using GraphQL API v4, you can get the last tag by alphabetical or commit date. For instance by commit date (eg the tag that point to the most recent commit) :

    {
      repository(owner: "bertrandmartel", name: "caipy-dashboard") {
        refs(refPrefix: "refs/tags/", first: 1, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
          edges {
            node {
              name
              target {
                oid
                ... on Tag {
                  message
                  commitUrl
                  tagger {
                    name
                    email
                    date
                  }
                }
              }
            }
          }
        }
      }
    }
    

    test it in the explorer

    Note that if the tag is a lightweight tag, there will be no taggeror message field. You can also use field: ALPHABETICAL for the last tag in alphabetical order.

    If you want to get the last tag that was created (which could be different from the tag that point to the most recent commit, or the last tag in alphabetical order), it's only possible for annotated tag since their creation date is stored and will be available in the tagger field.

    To get the last created tag, you would get all the tags and filter the most recent date in data.repository.refs.edges.node.target.tagger.date field in the response of the following request :

    {
      repository(owner: "google", name: "gson") {
        refs(refPrefix: "refs/tags/", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
          edges {
            node {
              name
              target {
                oid
                ... on Tag {
                  commitUrl
                  tagger {
                    date
                  }
                }
              }
            }
          }
        }
      }
    }
    

    test it in the explorer

    0 讨论(0)
  • 2021-02-02 11:53

    You can get the latest release at https://api.github.com/repos/$org/$repo/releases/latest

    If you want just the tag name, you can try something like this:

    curl https://api.github.com/repos/$org/$repo/releases/latest -s | jq .name -r
    
    0 讨论(0)
提交回复
热议问题