github-release-party 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c3aeb5150e8e1d0815c605df468dbaa8b5689b7
4
+ data.tar.gz: 2b77512c89c8d240a3936e9b87c36d4f4474e0ea
5
+ SHA512:
6
+ metadata.gz: 91cea9e652666ee62b3cfea2a8f6d90e5350b45e8270a01df68eacc7a53ecbb57fe0fc2bd743051982640b71e04e56583b3fb4abe65e6414fed7c835091ddc0e
7
+ data.tar.gz: caff089ab5e75a73d7a1d508fa0fb71ed34887561256e59b3703589fd9f6591b651d252abd9ac63d55421ef3c9cf0e2852597bf6a1ce7fe681e5ee8a170c49f4
@@ -0,0 +1,88 @@
1
+ require "github-release-party"
2
+
3
+ desc "Deploy new version to Heroku"
4
+ task :deploy do
5
+ return unless GithubReleaseParty.env_ok
6
+ success = system "git push heroku HEAD:master"
7
+ if not success
8
+ abort "Deploy failed."
9
+ end
10
+ Rake.application.invoke_task("deploy:tag")
11
+ end
12
+
13
+ namespace :deploy do
14
+ desc "Forcibly deploy new version to Heroku"
15
+ task :force do
16
+ return unless GithubReleaseParty.env_ok
17
+ success = system "git push heroku HEAD:master --force"
18
+ if not success
19
+ abort "Deploy failed."
20
+ end
21
+ Rake.application.invoke_task("deploy:tag")
22
+ end
23
+
24
+ desc "Tag latest release"
25
+ task :tag do
26
+ return unless GithubReleaseParty.env_ok
27
+
28
+ # get heroku version number
29
+ ver = `heroku releases`.split("\n")[1].split(" ")[0]
30
+ hash = `git rev-parse HEAD`.strip
31
+ tag_name = "heroku/#{ver}"
32
+
33
+ # build tag message
34
+ repo = GithubReleaseParty.repo
35
+ last_tag = `git describe --tags --abbrev=0 --match 'heroku/v*'`.strip
36
+ commits = `git log #{last_tag}..#{hash} --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
37
+ message = "Deploy #{hash[0..6]}\n\nDiff: https://github.com/#{repo}/compare/#{last_tag}...#{tag_name}\n#{commits}"
38
+
39
+ # tag and push new tag
40
+ puts "Tagging #{tag_name}."
41
+ success = system "git tag -a -m \"#{message.gsub('"','\\"')}\" #{tag_name} #{hash}"
42
+ abort if not success
43
+ success = system "git push origin #{tag_name}"
44
+ abort if not success
45
+
46
+ # create GitHub release
47
+ puts
48
+ puts "Waiting 3 seconds to let GitHub process the new tag."
49
+ sleep 3
50
+ GithubReleaseParty.create(tag_name, ver, message)
51
+ end
52
+ end
53
+
54
+ desc "Rebuild all the release tags"
55
+ task :retag do
56
+ github = GithubReleaseParty.new
57
+ repo = GithubReleaseParty.repo
58
+
59
+ tags = `git tag -l heroku/v* --sort=version:refname`.split("\n")
60
+ puts "Found #{tags.count} tags."
61
+ tags.each_with_index do |tag_name, i|
62
+ ver = tag_name[/v(\d+)/]
63
+ last_tag = if i == 0
64
+ `git rev-list --max-parents=0 HEAD`.strip
65
+ else
66
+ tags[i-1]
67
+ end
68
+
69
+ hash = `git rev-list --max-count=1 #{tag_name}`.strip
70
+ date = `git show --pretty="format:%ai" -s --no-color #{tag_name} | tail -1`.strip
71
+ commits = `git log #{last_tag}..#{tag_name} --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
72
+ message = "Deploy #{hash[0..6]}\n\nDiff: https://github.com/#{repo}/compare/#{last_tag}...#{tag_name}\n#{commits}"
73
+
74
+ if i == 0
75
+ message += "\n"+`git show #{last_tag} -s --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
76
+ end
77
+
78
+ success = system "GIT_COMMITTER_DATE='#{date}' git tag -f -a -m \"#{message.gsub('"','\\"')}\" #{tag_name} #{tag_name}^{}"
79
+ abort if not success
80
+ success = system "git push -f origin #{tag_name}"
81
+ abort if not success
82
+
83
+ # update or create GitHub release
84
+ github.update_or_create(tag_name, ver, message)
85
+ end
86
+
87
+ puts "Done"
88
+ end
@@ -0,0 +1,3 @@
1
+ class GithubReleaseParty
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,109 @@
1
+ # This is a GitHub party, and everyone's invited!
2
+
3
+ require "httparty"
4
+
5
+ class GithubReleaseParty
6
+ include HTTParty
7
+ base_uri "https://api.github.com"
8
+
9
+ def initialize
10
+ return unless self.class.env_ok
11
+ @releases = []
12
+ page = 1
13
+ while true
14
+ r = self.class.get "/repos/#{self.class.repo}/releases?page=#{page}", self.class.options
15
+ raise self.class.error(r) if not r.success?
16
+ break if r.parsed_response.count == 0
17
+
18
+ @releases = @releases + r.parsed_response
19
+ page += 1
20
+ end
21
+ end
22
+
23
+ def update_or_create(tag_name, name, message)
24
+ release = @releases.find { |rel| rel["tag_name"] == tag_name }
25
+ if release
26
+ self.class.update(release["id"], name, message)
27
+ else
28
+ self.class.create(tag_name, name, message)
29
+ end
30
+ end
31
+
32
+ def self.update(id, name, message)
33
+ return unless env_ok
34
+
35
+ r = patch "/repos/#{repo}/releases/#{id}", options.merge({
36
+ body: {
37
+ name: name,
38
+ body: message
39
+ }.to_json
40
+ })
41
+ if r.success?
42
+ puts "GitHub release #{name} updated!"
43
+ else
44
+ puts "Failed to update GitHub release #{tag_name}!"
45
+ puts error(r)
46
+ end
47
+ end
48
+
49
+ def self.create(tag_name, name, message)
50
+ return unless env_ok
51
+
52
+ body = {
53
+ tag_name: tag_name,
54
+ name: name,
55
+ body: message
56
+ }
57
+
58
+ r = post "/repos/#{repo}/releases", options.merge({
59
+ body: body.to_json
60
+ })
61
+ if r.success?
62
+ puts "GitHub release #{tag_name} created!"
63
+ else
64
+ puts error(r)
65
+ puts
66
+ puts "Body sent: #{body.to_json}"
67
+ puts
68
+ puts "Failed to create GitHub release!"
69
+ puts "Create it manually here: https://github.com/#{repo}/releases/new"
70
+ puts "Tag version: #{tag_name}"
71
+ puts "Release title: #{tag_name}"
72
+ puts "Message:"
73
+ puts message
74
+ end
75
+ end
76
+
77
+ def self.env_ok
78
+ if not ENV["GITHUB_RELEASE_TOKEN"]
79
+ puts "Configure GITHUB_RELEASE_TOKEN to create GitHub releases. See https://github.com/stefansundin/github-release-party#setup"
80
+ return false
81
+ end
82
+ if not repo
83
+ puts "Can't find the GitHub repo. Please use the remote 'origin'."
84
+ return false
85
+ end
86
+ return true
87
+ end
88
+
89
+ def self.repo
90
+ `git remote -v`.scan(/^origin\t.*github.com[:\/](.+)\.git /).uniq.flatten.first
91
+ end
92
+
93
+ private
94
+
95
+ def self.options
96
+ {
97
+ query: {
98
+ access_token: ENV["GITHUB_RELEASE_TOKEN"]
99
+ },
100
+ headers: {
101
+ "User-Agent" => "github-release-party/#{GithubReleaseParty::VERSION}"
102
+ }
103
+ }
104
+ end
105
+
106
+ def self.error(r)
107
+ "#{r.request.path.to_s}: #{r.code} #{r.message}: #{r.body}. #{r.headers.to_h.to_json}"
108
+ end
109
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github-release-party
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stefan Sundin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.13'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 10.4.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 10.4.2
41
+ description: I use this gem to automatically create GitHub releases when I deploy
42
+ to Heroku. See the GitHub page for usage.
43
+ email:
44
+ - stefan@stefansundin.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - lib/github-release-party.rb
50
+ - lib/github-release-party/tasks/heroku.rb
51
+ - lib/github-release-party/version.rb
52
+ homepage: https://github.com/stefansundin/github-release-party
53
+ licenses: []
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.6
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.2.2
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: Easily create GitHub releases.
75
+ test_files: []