Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,71 @@ func releasecmd(opt Options) error {
return nil
}

func increleasecmd(opt Options) error {
cmdopt := opt.IncRelease
user := nvls(cmdopt.User, EnvUser)
repo := nvls(cmdopt.Repo, EnvRepo)
token := nvls(cmdopt.Token, EnvToken)

vprintln("incremental release...")

release, _ := LatestRelease(user, repo, token)
release = IncrementReleaseVersion(release)

tag := nvls(cmdopt.Tag, release.TagName)
name := nvls(cmdopt.Name, tag)
desc := nvls(cmdopt.Desc, tag)
target := nvls(cmdopt.Target)
draft := cmdopt.Draft
prerelease := cmdopt.Prerelease

if err := ValidateCredentials(user, repo, token, tag); err != nil {
return err
}

params := ReleaseCreate{
TagName: release.TagName,
TargetCommitish: target,
Name: name,
Body: desc,
Draft: draft,
Prerelease: prerelease,
}

/* encode params as json */
payload, err := json.Marshal(params)
if err != nil {
return fmt.Errorf("can't encode release creation params, %v", err)
}
reader := bytes.NewReader(payload)

URL := nvls(EnvApiEndpoint, github.DefaultBaseURL) + fmt.Sprintf("/repos/%s/%s/releases", user, repo)
resp, err := github.DoAuthRequest("POST", URL, "application/json", token, nil, reader)
if err != nil {
return fmt.Errorf("while submitting %v, %v", string(payload), err)
}
defer resp.Body.Close()

vprintln("RESPONSE:", resp)
if resp.StatusCode != http.StatusCreated {
if resp.StatusCode == 422 {
return fmt.Errorf("github returned %v (this is probably because the release already exists)",
resp.Status)
}
return fmt.Errorf("github returned %v", resp.Status)
}

if VERBOSITY != 0 {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("error while reading response, %v", err)
}
vprintln("BODY:", string(body))
}

return nil
}

func editcmd(opt Options) error {
cmdopt := opt.Edit
user := nvls(cmdopt.User, EnvUser)
Expand Down
24 changes: 18 additions & 6 deletions github-release.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,17 @@ type Options struct {
Draft bool `goptions:"--draft, description='The release is a draft'"`
Prerelease bool `goptions:"-p, --pre-release, description='The release is a pre-release'"`
} `goptions:"release"`
IncRelease struct {
Token string `goptions:"-s, --security-token, description='Github token (required if $GITHUB_TOKEN not set)'"`
User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"`
Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"`
Tag string `goptions:"-t, --tag, description='Git tag to create a release from'"`
Name string `goptions:"-n, --name, description='Name of the release (defaults to tag)'"`
Desc string `goptions:"-d, --description, description='Release description, use - for reading a description from stdin (defaults to tag)'"`
Target string `goptions:"-c, --target, description='Commit SHA or branch to create release of (defaults to the repository default branch)'"`
Draft bool `goptions:"--draft, description='The release is a draft'"`
Prerelease bool `goptions:"-p, --pre-release, description='The release is a pre-release'"`
} `goptions:"increlease"`
Edit struct {
Token string `goptions:"-s, --security-token, description='Github token (required if $GITHUB_TOKEN not set)'"`
User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"`
Expand Down Expand Up @@ -74,12 +85,13 @@ type Options struct {
type Command func(Options) error

var commands = map[goptions.Verbs]Command{
"download": downloadcmd,
"upload": uploadcmd,
"release": releasecmd,
"edit": editcmd,
"delete": deletecmd,
"info": infocmd,
"download": downloadcmd,
"upload": uploadcmd,
"release": releasecmd,
"increlease": increleasecmd,
"edit": editcmd,
"delete": deletecmd,
"info": infocmd,
}

var (
Expand Down
16 changes: 16 additions & 0 deletions releases.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"fmt"
"strconv"
"strings"
"time"

Expand Down Expand Up @@ -126,6 +127,21 @@ func ReleaseOfTag(user, repo, tag, token string) (*Release, error) {
return nil, fmt.Errorf("could not find the release corresponding to tag %s", tag)
}

func IncrementReleaseVersion(release *Release) *Release {
// Handle nil release gracefully
version := 0
if release != nil {
version, _ = strconv.Atoi(release.TagName[1:])
version++
} else {
release = &Release{}
}

release.TagName = fmt.Sprintf("v%d", version)

return release
}

/* find the release-id of the specified tag */
func IdOfTag(user, repo, tag, token string) (int, error) {
release, err := ReleaseOfTag(user, repo, tag, token)
Expand Down