-
Notifications
You must be signed in to change notification settings - Fork 0
/
rls.go
85 lines (70 loc) · 2.15 KB
/
rls.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package main
import (
"context"
"fmt"
"github.com/google/go-github/github"
"github.com/pkg/errors"
"io"
"time"
)
// RLS is git-release object
type RLS struct {
GitHub GitHub
outStream io.Writer
}
// CreateRelease is handler of create github release
func (r *RLS) CreateRelease(ctx context.Context, req *github.RepositoryRelease, recreate bool) (*github.RepositoryRelease, error) {
// When draft release creation is requested,
// create it without any check (it can).
if *req.Draft {
fmt.Fprintln(r.outStream, "==> Create a draft release")
return r.GitHub.CreateRelease(ctx, req)
}
// Check release exists.
// If release is not found, then create a new release.
release, err := r.GitHub.GetRelease(ctx, *req.TagName)
if err != nil {
if err != RelaseNotFound {
return nil, errors.Wrap(err, "failed to get release")
}
if recreate {
fmt.Fprintf(r.outStream,
"WARNING: '-recreate' is specified but release (%s) not found",
*req.TagName)
}
fmt.Fprintln(r.outStream, "==> Create a new release")
return r.GitHub.CreateRelease(ctx, req)
}
// recreate is not true. Then use that existing release.
if !recreate {
fmt.Fprintf(r.outStream, "WARNING: found release (%s). Use existing one.\n",
*req.TagName)
return release, nil
}
// When recreate is requested, delete existing release and create a
// new release.
fmt.Fprintln(r.outStream, "==> Recreate a release")
if err := r.DeleteRelease(ctx, *release.ID, *req.TagName); err != nil {
return nil, err
}
return r.GitHub.CreateRelease(ctx, req)
}
// DeleteRelease is handler of delete github release
func (r *RLS) DeleteRelease(ctx context.Context, ID int, tag string) error {
err := r.GitHub.DeleteRelease(ctx, ID)
if err != nil {
return err
}
err = r.GitHub.DeleteTag(ctx, tag)
if err != nil {
return err
}
// This is because sometimes the process of creating a release on GitHub
// is faster than deleting a tag.
time.Sleep(5 * time.Second)
return nil
}
// GetCommits pass the same function from github.go
func (r *RLS) GetCommits(ctx context.Context, opts *github.CommitsListOptions) ([]*github.RepositoryCommit, error) {
return r.GitHub.GetCommits(ctx, opts)
}