github-release-party 0.3.1 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/github-release-party.rb +92 -47
- data/lib/github-release-party/tasks/heroku.rb +14 -7
- data/lib/github-release-party/version.rb +2 -4
- metadata +8 -24
- metadata.gz.sig +0 -0
- data/lib/http.rb +0 -143
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b275fe65a8b6ac130be289ac5f7b1af6f53f48c4ebbafb784cbb14386659c24
|
4
|
+
data.tar.gz: cd19b786aff568234d157f5eae7e81902a97272ccd0976deb4a89fa9dbdde7bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bebba1d515b12e752576732795caee7d364bacfc8df7528db2e808109ca5c9cef08de9f8d224b5640c598aa5196e14b17648e8607690ba9ce3cc7add9cf9c56d
|
7
|
+
data.tar.gz: 24eb66e7bdd380085a67655356d6db00ab8ffcf3b4eb8119a3c3922b6f76d2f4cd3ab4a5f5efdd59b4ea26e73c274377cae393dbd2e893bf384b6c99c7ddc142
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/github-release-party.rb
CHANGED
@@ -1,65 +1,46 @@
|
|
1
|
-
require_relative "http"
|
2
1
|
require_relative "github-release-party/version"
|
2
|
+
require "net/http"
|
3
|
+
require "json"
|
3
4
|
|
4
|
-
class GithubReleaseParty
|
5
|
-
|
6
|
-
|
7
|
-
HEADERS = {
|
8
|
-
"User-Agent" => "github-release-party/#{GithubReleaseParty::VERSION}",
|
9
|
-
}
|
10
|
-
|
11
|
-
def initialize
|
12
|
-
return unless self.class.env_ok
|
13
|
-
@releases = []
|
5
|
+
class GithubReleaseParty
|
6
|
+
def self.releases
|
7
|
+
releases = []
|
14
8
|
page = 1
|
15
9
|
while true
|
16
|
-
r =
|
17
|
-
|
10
|
+
r = GitHub.get("/repos/#{repo}/releases?page=#{page}")
|
11
|
+
if !r.success?
|
12
|
+
puts "Error occurred when fetching releases:"
|
13
|
+
puts error(r)
|
14
|
+
abort
|
15
|
+
end
|
18
16
|
break if r.json.length == 0
|
19
|
-
|
20
|
-
@releases = @releases + r.json
|
17
|
+
releases = releases + r.json
|
21
18
|
page += 1
|
22
19
|
end
|
23
|
-
|
24
|
-
|
25
|
-
def update_or_create(tag_name, name, message)
|
26
|
-
release = @releases.find { |rel| rel["tag_name"] == tag_name }
|
27
|
-
if release
|
28
|
-
self.class.update(release["id"], name, message)
|
29
|
-
else
|
30
|
-
self.class.create(tag_name, name, message)
|
31
|
-
end
|
20
|
+
return releases
|
32
21
|
end
|
33
22
|
|
34
23
|
def self.update(id, name, message)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
name: name,
|
40
|
-
body: message
|
41
|
-
}.to_json
|
42
|
-
})
|
24
|
+
r = GitHub.patch("/repos/#{repo}/releases/#{id}", {
|
25
|
+
name: name,
|
26
|
+
body: message,
|
27
|
+
}.to_json)
|
43
28
|
if r.success?
|
44
29
|
puts "GitHub release #{name} updated!"
|
45
30
|
else
|
46
|
-
puts "Failed to update GitHub release #{
|
31
|
+
puts "Failed to update GitHub release #{name}!"
|
47
32
|
puts error(r)
|
48
33
|
end
|
49
34
|
end
|
50
35
|
|
51
36
|
def self.create(tag_name, name, message)
|
52
|
-
return unless env_ok
|
53
|
-
|
54
37
|
body = {
|
55
38
|
tag_name: tag_name,
|
56
39
|
name: name,
|
57
|
-
body: message
|
40
|
+
body: message,
|
58
41
|
}
|
59
42
|
|
60
|
-
r = post("/repos/#{repo}/releases",
|
61
|
-
body: body.to_json
|
62
|
-
})
|
43
|
+
r = GitHub.post("/repos/#{repo}/releases", body.to_json)
|
63
44
|
if r.success?
|
64
45
|
puts "GitHub release #{tag_name} created!"
|
65
46
|
else
|
@@ -67,7 +48,7 @@ class GithubReleaseParty < HTTP
|
|
67
48
|
puts
|
68
49
|
puts "Body sent: #{body.to_json}"
|
69
50
|
puts
|
70
|
-
puts "Failed to create GitHub release!"
|
51
|
+
puts "Failed to create a GitHub release!"
|
71
52
|
puts "Create it manually here: https://github.com/#{repo}/releases/new?tag=#{tag_name}"
|
72
53
|
puts "Tag version: #{tag_name}"
|
73
54
|
puts "Release title: #{tag_name}"
|
@@ -76,16 +57,13 @@ class GithubReleaseParty < HTTP
|
|
76
57
|
end
|
77
58
|
end
|
78
59
|
|
79
|
-
def self.
|
60
|
+
def self.check_env!
|
80
61
|
if !ENV["GITHUB_RELEASE_TOKEN"]
|
81
|
-
|
82
|
-
return false
|
62
|
+
abort "Configure GITHUB_RELEASE_TOKEN to create GitHub releases. See https://github.com/stefansundin/github-release-party#setup"
|
83
63
|
end
|
84
64
|
if !repo
|
85
|
-
|
86
|
-
return false
|
65
|
+
abort "Can't find the GitHub repository. Please use the remote 'origin'."
|
87
66
|
end
|
88
|
-
return true
|
89
67
|
end
|
90
68
|
|
91
69
|
def self.repo
|
@@ -95,6 +73,73 @@ class GithubReleaseParty < HTTP
|
|
95
73
|
private
|
96
74
|
|
97
75
|
def self.error(r)
|
98
|
-
"#{r.
|
76
|
+
"#{r.request_uri}: #{r.code}: #{r.body}\nHeaders: #{r.headers.to_json}"
|
77
|
+
end
|
78
|
+
|
79
|
+
class GitHub
|
80
|
+
def self.get(*args)
|
81
|
+
request(:request_get, *args)
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.post(*args)
|
85
|
+
request(:request_post, *args)
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.patch(*args)
|
89
|
+
request(:patch, *args)
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def self.request(method, request_uri, body=nil)
|
95
|
+
opts = {
|
96
|
+
use_ssl: true,
|
97
|
+
open_timeout: 10,
|
98
|
+
read_timeout: 10,
|
99
|
+
}
|
100
|
+
Net::HTTP.start("api.github.com", 443, opts) do |http|
|
101
|
+
headers = {
|
102
|
+
"Authorization" => "token #{ENV["GITHUB_RELEASE_TOKEN"]}",
|
103
|
+
"User-Agent" => "github-release-party/#{GithubReleaseParty::VERSION}",
|
104
|
+
}
|
105
|
+
if method == :request_post or method == :patch
|
106
|
+
response = http.send(method, request_uri, body, headers)
|
107
|
+
else
|
108
|
+
response = http.send(method, request_uri, headers)
|
109
|
+
end
|
110
|
+
return HTTPResponse.new(response, request_uri)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class HTTPResponse
|
116
|
+
def initialize(response, request_uri)
|
117
|
+
@response = response
|
118
|
+
@request_uri = request_uri
|
119
|
+
end
|
120
|
+
|
121
|
+
def request_uri
|
122
|
+
@request_uri
|
123
|
+
end
|
124
|
+
|
125
|
+
def body
|
126
|
+
@response.body
|
127
|
+
end
|
128
|
+
|
129
|
+
def json
|
130
|
+
@json ||= JSON.parse(@response.body)
|
131
|
+
end
|
132
|
+
|
133
|
+
def headers
|
134
|
+
@response.to_hash
|
135
|
+
end
|
136
|
+
|
137
|
+
def code
|
138
|
+
@response.code.to_i
|
139
|
+
end
|
140
|
+
|
141
|
+
def success?
|
142
|
+
@response.is_a?(Net::HTTPSuccess)
|
143
|
+
end
|
99
144
|
end
|
100
145
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "open3"
|
2
|
+
require "shellwords"
|
2
3
|
require "github-release-party"
|
3
4
|
|
4
5
|
def heroku_push(args=[])
|
@@ -27,7 +28,7 @@ def github_tag(hash, ver)
|
|
27
28
|
last_tag = `git rev-list --max-parents=0 HEAD`.strip[0..6]
|
28
29
|
first_deploy = true
|
29
30
|
end
|
30
|
-
commits = `git log #{last_tag}..#{hash} --first-parent --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
|
31
|
+
commits = `git log #{last_tag}..#{hash} --reverse --first-parent --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
|
31
32
|
message = "Deploy #{hash[0..6]}\n\nDiff: https://github.com/#{repo}/compare/#{last_tag}...#{tag_name}\n#{commits}"
|
32
33
|
|
33
34
|
if first_deploy
|
@@ -53,7 +54,7 @@ end
|
|
53
54
|
|
54
55
|
desc "Deploy a new version to Heroku"
|
55
56
|
task :deploy do
|
56
|
-
|
57
|
+
GithubReleaseParty.check_env!
|
57
58
|
ver = heroku_push() or abort("Deploy failed.")
|
58
59
|
hash = `git rev-parse HEAD`.strip
|
59
60
|
github_tag(hash, ver)
|
@@ -62,7 +63,7 @@ end
|
|
62
63
|
namespace :deploy do
|
63
64
|
desc "Deploy a new version to Heroku using --force"
|
64
65
|
task :force do
|
65
|
-
|
66
|
+
GithubReleaseParty.check_env!
|
66
67
|
ver = heroku_push(%w[--force]) or abort("Deploy failed.")
|
67
68
|
hash = `git rev-parse HEAD`.strip
|
68
69
|
github_tag(hash, ver)
|
@@ -70,7 +71,7 @@ namespace :deploy do
|
|
70
71
|
|
71
72
|
desc "Tag last release"
|
72
73
|
task :tag do
|
73
|
-
|
74
|
+
GithubReleaseParty.check_env!
|
74
75
|
|
75
76
|
# get heroku version number
|
76
77
|
begin
|
@@ -86,7 +87,8 @@ namespace :deploy do
|
|
86
87
|
|
87
88
|
desc "Rebuild all the release tags"
|
88
89
|
task :retag do
|
89
|
-
|
90
|
+
GithubReleaseParty.check_env!
|
91
|
+
releases = GithubReleaseParty.releases
|
90
92
|
repo = GithubReleaseParty.repo
|
91
93
|
|
92
94
|
tags = `git tag -l heroku/v* --sort=version:refname`.split("\n")
|
@@ -102,7 +104,7 @@ namespace :deploy do
|
|
102
104
|
|
103
105
|
hash = `git rev-list --max-count=1 #{tag_name}`.strip
|
104
106
|
date = `git show --pretty="format:%ai" -s --no-color #{tag_name} | tail -1`.strip
|
105
|
-
commits = `git log #{last_tag}..#{tag_name} --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
|
107
|
+
commits = `git log #{last_tag}..#{tag_name} --reverse --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
|
106
108
|
message = "Deploy #{hash[0..6]}\n\nDiff: https://github.com/#{repo}/compare/#{last_tag}...#{tag_name}\n#{commits}"
|
107
109
|
|
108
110
|
if i == 0
|
@@ -115,7 +117,12 @@ namespace :deploy do
|
|
115
117
|
abort if not success
|
116
118
|
|
117
119
|
# update or create GitHub release
|
118
|
-
|
120
|
+
release = releases.find { |rel| rel["tag_name"] == tag_name }
|
121
|
+
if release
|
122
|
+
GithubReleaseParty.update(release["id"], ver, message)
|
123
|
+
else
|
124
|
+
GithubReleaseParty.create(tag_name, ver, message)
|
125
|
+
end
|
119
126
|
end
|
120
127
|
|
121
128
|
puts
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: github-release-party
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Sundin
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain:
|
11
11
|
- |
|
@@ -31,36 +31,22 @@ cert_chain:
|
|
31
31
|
E04BZKo2WzOTzSDymo97Yu4YFgyc98umMyeaCvPk4YmdNzqSanAXpY2bnsyu0CF5
|
32
32
|
Td0=
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date:
|
34
|
+
date: 2021-04-09 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
38
|
requirement: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '12'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - "
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '12'
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: addressable
|
52
|
-
requirement: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '2'
|
57
|
-
type: :runtime
|
58
|
-
prerelease: false
|
59
|
-
version_requirements: !ruby/object:Gem::Requirement
|
60
|
-
requirements:
|
61
|
-
- - "~>"
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '2'
|
64
50
|
description: I use this gem to automatically create GitHub releases when I deploy
|
65
51
|
to Heroku. See the GitHub page for usage.
|
66
52
|
email:
|
@@ -72,12 +58,11 @@ files:
|
|
72
58
|
- lib/github-release-party.rb
|
73
59
|
- lib/github-release-party/tasks/heroku.rb
|
74
60
|
- lib/github-release-party/version.rb
|
75
|
-
- lib/http.rb
|
76
61
|
homepage: https://github.com/stefansundin/github-release-party
|
77
62
|
licenses:
|
78
63
|
- GPL-3.0
|
79
64
|
metadata: {}
|
80
|
-
post_install_message:
|
65
|
+
post_install_message:
|
81
66
|
rdoc_options: []
|
82
67
|
require_paths:
|
83
68
|
- lib
|
@@ -92,9 +77,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
77
|
- !ruby/object:Gem::Version
|
93
78
|
version: 1.3.6
|
94
79
|
requirements: []
|
95
|
-
|
96
|
-
|
97
|
-
signing_key:
|
80
|
+
rubygems_version: 3.2.3
|
81
|
+
signing_key:
|
98
82
|
specification_version: 4
|
99
83
|
summary: Easily create GitHub releases.
|
100
84
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/http.rb
DELETED
@@ -1,143 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "net/http"
|
4
|
-
require "addressable/uri"
|
5
|
-
require "json"
|
6
|
-
|
7
|
-
class HTTP
|
8
|
-
def self.request(method, url, options={body: nil, headers: nil, query: nil})
|
9
|
-
relative_url = (url[0] == "/")
|
10
|
-
|
11
|
-
if defined?(self::BASE_URL) and relative_url
|
12
|
-
url = self::BASE_URL+url
|
13
|
-
end
|
14
|
-
|
15
|
-
if defined?(self::PARAMS) and relative_url
|
16
|
-
if url["?"]
|
17
|
-
url += "&"+self::PARAMS
|
18
|
-
else
|
19
|
-
url += "?"+self::PARAMS
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
if options[:query]
|
24
|
-
params = options[:query].map { |k,v| "#{k}=#{v}" }.join("&")
|
25
|
-
if url["?"]
|
26
|
-
url += "&"+params
|
27
|
-
else
|
28
|
-
url += "?"+params
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
uri = Addressable::URI.parse(url).normalize
|
33
|
-
opts = {
|
34
|
-
use_ssl: uri.scheme == "https",
|
35
|
-
open_timeout: 10,
|
36
|
-
read_timeout: 10,
|
37
|
-
}
|
38
|
-
Net::HTTP.start(uri.host, uri.port, opts) do |http|
|
39
|
-
headers = {}
|
40
|
-
headers.merge!(self::HEADERS) if defined?(self::HEADERS) and relative_url
|
41
|
-
headers.merge!(options[:headers]) if options[:headers]
|
42
|
-
if method == :request_post or method == :patch
|
43
|
-
response = http.send(method, uri.request_uri, options[:body], headers)
|
44
|
-
else
|
45
|
-
response = http.send(method, uri.request_uri, headers)
|
46
|
-
end
|
47
|
-
return HTTPResponse.new(response, uri.to_s)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.get(*args)
|
52
|
-
request(:request_get, *args)
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.post(*args)
|
56
|
-
request(:request_post, *args)
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.patch(*args)
|
60
|
-
request(:patch, *args)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
class HTTPResponse
|
65
|
-
def initialize(response, url)
|
66
|
-
@response = response
|
67
|
-
@url = url
|
68
|
-
end
|
69
|
-
|
70
|
-
def raw
|
71
|
-
@response
|
72
|
-
end
|
73
|
-
|
74
|
-
def url
|
75
|
-
@url
|
76
|
-
end
|
77
|
-
|
78
|
-
def body
|
79
|
-
@response.body
|
80
|
-
end
|
81
|
-
|
82
|
-
def json
|
83
|
-
@json ||= JSON.parse(@response.body)
|
84
|
-
end
|
85
|
-
|
86
|
-
def parsed_response
|
87
|
-
json
|
88
|
-
end
|
89
|
-
|
90
|
-
def headers
|
91
|
-
@response.header
|
92
|
-
end
|
93
|
-
|
94
|
-
def code
|
95
|
-
@response.code.to_i
|
96
|
-
end
|
97
|
-
|
98
|
-
def success?
|
99
|
-
@response.is_a?(Net::HTTPSuccess)
|
100
|
-
end
|
101
|
-
|
102
|
-
def redirect?
|
103
|
-
@response.is_a?(Net::HTTPRedirection)
|
104
|
-
end
|
105
|
-
|
106
|
-
def redirect_url
|
107
|
-
raise("not a redirect") if !redirect?
|
108
|
-
url = @response.header["location"]
|
109
|
-
if url[0] == "/"
|
110
|
-
# relative redirect
|
111
|
-
uri = Addressable::URI.parse(@url)
|
112
|
-
url = uri.scheme + "://" + uri.host + url
|
113
|
-
elsif /^https?:\/\/./ !~ url
|
114
|
-
raise("bad redirect: #{url}")
|
115
|
-
end
|
116
|
-
Addressable::URI.parse(url).normalize.to_s # Some redirects do not url encode properly, such as http://amzn.to/2aDg49F
|
117
|
-
end
|
118
|
-
|
119
|
-
def redirect_same_origin?
|
120
|
-
return false if !redirect?
|
121
|
-
uri = Addressable::URI.parse(@url).normalize
|
122
|
-
new_uri = Addressable::URI.parse(redirect_url).normalize
|
123
|
-
uri.origin == new_uri.origin
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
class HTTPError < StandardError
|
128
|
-
def initialize(obj)
|
129
|
-
@obj = obj
|
130
|
-
end
|
131
|
-
|
132
|
-
def request
|
133
|
-
@obj
|
134
|
-
end
|
135
|
-
|
136
|
-
def data
|
137
|
-
@obj.json
|
138
|
-
end
|
139
|
-
|
140
|
-
def message
|
141
|
-
"#{@obj.code}: #{@obj.body}"
|
142
|
-
end
|
143
|
-
end
|