relsr 0.0.2
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 +7 -0
- data/bin/relsr +5 -0
- data/lib/relsr.rb +2 -0
- data/lib/relsr/initializer.rb +75 -0
- data/lib/relsr/release_manager.rb +92 -0
- data/lib/relsr/version.rb +3 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ca4948573df960dcef8b8bef529bed14b9461e70
|
4
|
+
data.tar.gz: de593211017d930fff99ed08051bb06c8e749af5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e198224981df581dd25f39b5b86e16cbd6c630b47024c775e4d47413055f1610e279aaae10ae39fa894156a0d40614873f10202b21a6af0e3712cfe16bb3fc77
|
7
|
+
data.tar.gz: 1631f806a13edea365894e89756e3b8fa429162e84ec4f6949f35ea58927f0a4dbc2f19c5340dcc0acd21b8a1afcfd824ba62a290b2b5c27ae3f20c14c72e57c
|
data/bin/relsr
ADDED
data/lib/relsr.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
module Relsr
|
5
|
+
class Initializer
|
6
|
+
|
7
|
+
YAML_FILE = 'relsr.yml'
|
8
|
+
|
9
|
+
def self.init
|
10
|
+
parse_options
|
11
|
+
parse_yaml
|
12
|
+
process
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def self.parse_options
|
18
|
+
@options = {}
|
19
|
+
OptionParser.new do |opts|
|
20
|
+
opts.banner = "Usage: relsr [options]"
|
21
|
+
|
22
|
+
opts.on("-r", "--release", "Create a release branch and open a pull request") do |v|
|
23
|
+
@options[:branch] = true
|
24
|
+
@options[:pull_request] = true
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on("-b", "--branch", "Create a release branch only") do |v|
|
28
|
+
@options[:branch] = true
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-d", "--dry-run", "Dry run") do |v|
|
32
|
+
@options[:dry_run] = true
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("-i", "--init", "Create relst.yml for project") do |v|
|
36
|
+
create_default_yaml
|
37
|
+
exit 0
|
38
|
+
end
|
39
|
+
end.parse!
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.parse_yaml
|
43
|
+
unless File.exists?(YAML_FILE)
|
44
|
+
puts 'Could not file relsr.yml file.'
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
begin
|
48
|
+
config = YAML.load_file(YAML_FILE)
|
49
|
+
raise 'repo: has not been set' if config['repo'].nil?
|
50
|
+
raise 'label: has not been set' if config['label'].nil?
|
51
|
+
@repo = config['repo']
|
52
|
+
@label = config['label']
|
53
|
+
rescue StandardError => error
|
54
|
+
puts 'invalid relsr.yml file'
|
55
|
+
puts error.message
|
56
|
+
exit 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.process
|
61
|
+
manager = Relsr::ReleaseManager.new(@repo, @label, @options[:dry_run])
|
62
|
+
manager.create_release if @options[:branch]
|
63
|
+
manager.create_pull_request if @options[:pull_request]
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.create_default_yaml
|
67
|
+
content = {
|
68
|
+
'repo' => 'username/repo_name',
|
69
|
+
'label' => 'acceptance-done'
|
70
|
+
}
|
71
|
+
File.open(YAML_FILE, 'w') {|f| f.write content.to_yaml }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'octokit'
|
2
|
+
|
3
|
+
module Relsr
|
4
|
+
class ReleaseManager
|
5
|
+
|
6
|
+
def initialize(repo_name, label, dry_run = false)
|
7
|
+
@repo_name = repo_name
|
8
|
+
@label = label
|
9
|
+
@release_branch_name = Time.now.strftime('release/%Y%m%d-%H%M%S')
|
10
|
+
@dry_run = dry_run
|
11
|
+
Octokit.auto_paginate = true
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_release
|
15
|
+
create_release_branch
|
16
|
+
merge_work_branches
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_pull_request
|
20
|
+
puts "Creating Pull Request"
|
21
|
+
return if @dry_run
|
22
|
+
client.create_pull_request(
|
23
|
+
@repo_name,
|
24
|
+
'master',
|
25
|
+
@release_branch_name,
|
26
|
+
@release_branch_name,
|
27
|
+
pr_body
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def create_release_branch
|
34
|
+
puts "Creating release branch '#{@release_branch_name}' on '#{@repo_name}'"
|
35
|
+
return if @dry_run
|
36
|
+
client.create_ref(@repo_name, "heads/#{@release_branch_name}", master.object.sha)
|
37
|
+
end
|
38
|
+
|
39
|
+
def merge_work_branches
|
40
|
+
branches_to_merge.each do |work_branch|
|
41
|
+
puts "Merging '#{work_branch}' into release"
|
42
|
+
next if @dry_run
|
43
|
+
client.merge(
|
44
|
+
@repo_name,
|
45
|
+
@release_branch_name,
|
46
|
+
work_branch,
|
47
|
+
commit_message: "Merging #{work_branch} into release"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def client
|
53
|
+
@client ||= Octokit::Client.new(netrc: true)
|
54
|
+
end
|
55
|
+
|
56
|
+
def repo
|
57
|
+
@repo ||= client.repo(@repo_name)
|
58
|
+
end
|
59
|
+
|
60
|
+
def branch_names
|
61
|
+
@branch_names ||= client.branches(@repo_name).collect { |b| b.name }
|
62
|
+
end
|
63
|
+
|
64
|
+
def branches_to_merge
|
65
|
+
branches_to_merge = []
|
66
|
+
|
67
|
+
issues.each do |issue|
|
68
|
+
branch_names.each do |branch|
|
69
|
+
if branch.include? "##{issue.number}"
|
70
|
+
branches_to_merge << branch
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
branches_to_merge
|
75
|
+
end
|
76
|
+
|
77
|
+
def master
|
78
|
+
@master ||= client.refs(@repo_name, 'heads/master')
|
79
|
+
end
|
80
|
+
|
81
|
+
def issues
|
82
|
+
@issues ||= client.list_issues(@repo_name, labels: @label)
|
83
|
+
end
|
84
|
+
|
85
|
+
def pr_body
|
86
|
+
issues.collect do |issue|
|
87
|
+
"Connects ##{issue.number} - #{issue.title}"
|
88
|
+
end.join("\n")
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: relsr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Cleary
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-07-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: octokit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: netrc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.11'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.11'
|
41
|
+
description:
|
42
|
+
email:
|
43
|
+
- john@createk.io
|
44
|
+
executables:
|
45
|
+
- relsr
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- bin/relsr
|
50
|
+
- lib/relsr.rb
|
51
|
+
- lib/relsr/initializer.rb
|
52
|
+
- lib/relsr/release_manager.rb
|
53
|
+
- lib/relsr/version.rb
|
54
|
+
homepage: https://github.com/jcleary/relsr
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '2.0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.5.1
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Command-line release managment tool for GitHub projects.
|
78
|
+
test_files: []
|