diff --git a/features/release.feature b/features/release.feature index 360ab693a..fbbe35d03 100644 --- a/features/release.feature +++ b/features/release.feature @@ -250,26 +250,25 @@ Feature: hub release Scenario: Show specific release Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - name: 'will_paginate 1.2.0', - draft: true, - prerelease: false, - tarball_url: "https://github.com/mislav/will_paginate/archive/v1.2.0.tar.gz", - zipball_url: "https://github.com/mislav/will_paginate/archive/v1.2.0.zip", - assets: [ - { browser_download_url: "https://github.com/mislav/will_paginate/releases/download/v1.2.0/example.zip", - }, - ], - body: < 'KITTENS EVERYWHERE', @@ -584,12 +580,11 @@ MARKDOWN And I am on the "feature" branch with upstream "doge/feature" Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', - tag_name: 'v1.2.0', - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', + tag_name: 'v1.2.0', + } } patch('/repos/mislav/will_paginate/releases/123') { json({}) @@ -601,12 +596,11 @@ MARKDOWN Scenario: Edit existing release no title Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - name: 'will_paginate 1.2.0', - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + tag_name: 'v1.2.0', + name: 'will_paginate 1.2.0', + } } """ And a file named "message.txt" with: @@ -623,21 +617,20 @@ MARKDOWN Given the GitHub API server: """ deleted = false - get('/repos/mislav/will_paginate/releases') { - json [ - { url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', - upload_url: 'https://uploads.github.com/uploads/assets{?name,label}', - tag_name: 'v1.2.0', - name: 'will_paginate 1.2.0', - draft: true, - prerelease: false, - assets: [ - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/456', - name: 'hello-1.2.0.tar.gz', - }, - ], - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', + upload_url: 'https://uploads.github.com/uploads/assets{?name,label}', + tag_name: 'v1.2.0', + name: 'will_paginate 1.2.0', + draft: true, + prerelease: false, + assets: [ + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/456', + name: 'hello-1.2.0.tar.gz', + }, + ], + } } delete('/repos/mislav/will_paginate/assets/456') { deleted = true @@ -669,16 +662,15 @@ MARKDOWN Scenario: Download a release asset Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - assets: [ - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-1.2.0.tar.gz', - }, - ], - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + tag_name: 'v1.2.0', + assets: [ + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-1.2.0.tar.gz', + }, + ], + } } get('/repos/mislav/will_paginate/assets/9876') { halt 401 unless request.env['HTTP_AUTHORIZATION'] == 'token OTOKEN' @@ -707,22 +699,21 @@ MARKDOWN Scenario: Download release assets that match pattern Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - assets: [ - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.0.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9877', - name: 'hello-amd64-1.2.0.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9878', - name: 'hello-x86-1.2.0.tar.gz', - }, - ], - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + tag_name: 'v1.2.0', + assets: [ + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.0.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9877', + name: 'hello-amd64-1.2.0.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9878', + name: 'hello-x86-1.2.0.tar.gz', + }, + ], + } } get('/repos/mislav/will_paginate/assets/9876') { "TARBALL" } get('/repos/mislav/will_paginate/assets/9877') { "TARBALL" } @@ -738,22 +729,21 @@ MARKDOWN Scenario: Glob pattern allows exact match Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - assets: [ - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.0.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9877', - name: 'hello-amd64-1.2.0.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9878', - name: 'hello-x86-1.2.0.tar.gz', - }, - ], - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + tag_name: 'v1.2.0', + assets: [ + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.0.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9877', + name: 'hello-amd64-1.2.0.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9878', + name: 'hello-x86-1.2.0.tar.gz', + }, + ], + } } get('/repos/mislav/will_paginate/assets/9876') { "ASSET_TARBALL" } """ @@ -772,22 +762,21 @@ MARKDOWN Scenario: Advanced glob pattern Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - assets: [ - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.0.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.1.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.2.tar.gz', - }, - ], - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + tag_name: 'v1.2.0', + assets: [ + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.0.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.1.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.2.tar.gz', + }, + ], + } } get('/repos/mislav/will_paginate/assets/9876') { "ASSET_TARBALL" } """ @@ -801,22 +790,21 @@ MARKDOWN Scenario: No matches for download pattern Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { tag_name: 'v1.2.0', - assets: [ - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.0.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.1.tar.gz', - }, - { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', - name: 'hello-amd32-1.2.2.tar.gz', - }, - ], - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + tag_name: 'v1.2.0', + assets: [ + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.0.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.1.tar.gz', + }, + { url: 'https://api.github.com/repos/mislav/will_paginate/assets/9876', + name: 'hello-amd32-1.2.2.tar.gz', + }, + ], + } } """ When I run `hub release download v1.2.0 --include amd32` @@ -837,12 +825,11 @@ MARKDOWN Scenario: Delete a release Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - json [ - { url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', - tag_name: 'v1.2.0', - }, - ] + get('/repos/mislav/will_paginate/releases/tags/v1.2.0') { + json { + url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', + tag_name: 'v1.2.0', + } } delete('/repos/mislav/will_paginate/releases/123') { @@ -855,18 +842,14 @@ MARKDOWN Scenario: Release not found Given the GitHub API server: """ - get('/repos/mislav/will_paginate/releases') { - assert :per_page => "100" + get('/repos/mislav/will_paginate/releases/tags/v2.0') { + // TODO!!! json [ { url: 'https://api.github.com/repos/mislav/will_paginate/releases/123', tag_name: 'v1.2.0', }, ] } - - delete('/repos/mislav/will_paginate/releases/123') { - status 204 - } """ When I run `hub release delete v2.0` Then the exit status should be 1 diff --git a/github/client.go b/github/client.go index c31d8987f..2178b78b8 100644 --- a/github/client.go +++ b/github/client.go @@ -362,17 +362,25 @@ func (client *Client) FetchReleases(project *Project, limit int, filter func(*Re } func (client *Client) FetchRelease(project *Project, tagName string) (*Release, error) { - releases, err := client.FetchReleases(project, 100, func(release *Release) bool { - return release.TagName == tagName - }) - + api, err := client.simpleAPI() if err != nil { return nil, err } - if len(releases) < 1 { - return nil, fmt.Errorf("Unable to find release with tag name `%s'", tagName) + + path := fmt.Sprintf("repos/%s/%s/releases/tags/%s", project.Owner, project.Name, tagName) + var res *simpleResponse + + res, err = api.Get(path) + if err = checkStatus(200, "fetching release", res, err); err != nil { + return nil, err } - return &releases[0], nil + + var release *Release + if err = res.Unmarshal(&release); err != nil { + return nil, err + } + + return release, nil } func (client *Client) CreateRelease(project *Project, releaseParams *Release) (release *Release, err error) {