github_issues_cli 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3672afbc8205c0742de2b4d9d34b01c02a291a0
4
+ data.tar.gz: 2974bcf3df15e6fed060b3a80e5144ce17de9b94
5
+ SHA512:
6
+ metadata.gz: 226d54775ed24548111425e7add4cea6cfe51c4fcf5b5870f7d14a6e7b130346bfa1cbf0258eadd25d180e2f424a0df47e217de1c1016f1bfe33035d609b3d74
7
+ data.tar.gz: dbc7736f5bbbd548eb836aa052fd06ca2cfb3c6d8bb72d8d9f7101d448bc9e7bb107d19132032f87d6f8d06df8c5e1f0711464c860c5d9c7c97cc7330f3077d9
data/bin/gi ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
+ require 'github_issues_cli'
5
+
6
+ GithubIssuesCli::CommandManager.run
@@ -0,0 +1,17 @@
1
+ module GithubIssuesCli
2
+ require 'clamp'
3
+ require 'git'
4
+ require 'term/ansicolor'
5
+ require 'github_api'
6
+ require 'io/console'
7
+ require 'json'
8
+ require 'github_issues_cli/command'
9
+ require 'github_issues_cli/command/list'
10
+ require 'github_issues_cli/command/checkout'
11
+ require 'github_issues_cli/command/browse'
12
+ require 'github_issues_cli/command/show'
13
+ require 'github_issues_cli/command/open'
14
+ require 'github_issues_cli/command/push'
15
+ require 'github_issues_cli/command/pull_request'
16
+ require 'github_issues_cli/command_manager'
17
+ end
@@ -0,0 +1,105 @@
1
+ module GithubIssuesCli
2
+ class Command < Clamp::Command
3
+
4
+ include Term::ANSIColor
5
+
6
+ attr_accessor :git_repo, :username
7
+
8
+ def initialize(invocation_path, context = {}, parent_attribute_values = {})
9
+ super
10
+ authenticate
11
+ end
12
+
13
+ def authenticate
14
+ config_dirname = ENV['HOME'] + '/.github-issues/'
15
+ Dir.mkdir config_dirname unless Dir.exists? config_dirname
16
+
17
+ config_path = config_dirname + 'token'
18
+ if File.exists? config_path
19
+ config = JSON.parse File.new(config_path, 'r').gets
20
+ @username, token = config.values_at 'username', 'token'
21
+ else
22
+ print 'Please provide GitHub token: '
23
+ token = $stdin.gets.chomp
24
+ @username = Github::Users.new.get(:oauth_token => token).login
25
+ config = {:username => @username, :token => token}
26
+ File.new(config_path, 'w').puts config.to_json
27
+ end
28
+
29
+ Github.configure do |c|
30
+ c.oauth_token = token
31
+ end
32
+ end
33
+
34
+ # @return [Git::Base]
35
+ def get_git_repo
36
+ unless @git_repo
37
+ dir = Dir.getwd + '/'
38
+ until Dir.exists? dir + '.git' do
39
+ if dir == '/'
40
+ raise StandardError, 'Git not found'
41
+ end
42
+ dir = File.dirname(dir)
43
+ end
44
+ @git_repo = Git.open dir
45
+ end
46
+ @git_repo
47
+ end
48
+
49
+ def get_issue_number
50
+ if get_git_repo.current_branch.match(/issue-([0-9]+)/).nil?
51
+ raise 'Is not branch issue. Issue branches match `issue-XXX` pattern'
52
+ end
53
+ $1
54
+ end
55
+
56
+ def get_github_repo
57
+ url = get_git_repo.remote(:upstream).url
58
+ if url.nil?
59
+ raise 'No `upstream` remote found, please configure it first'
60
+ end
61
+ unless url.start_with?('git@github.com:', 'https://github.com/')
62
+ raise 'Remote upstream points to non-github url: ' + url
63
+ end
64
+ if url.match(/github.com[:\/]([^\/]+)\/([^\/]+)\.git$/).nil?
65
+ raise 'Can\'t extract `user/repo` data from upstream remote'
66
+ end
67
+ {:user => $1, :name => $2}
68
+ end
69
+
70
+ def get_source issue_number
71
+ github_repo = get_github_repo
72
+ pull_requests_client = Github::PullRequests.new
73
+ pull_request = pull_requests_client.get :user => github_repo[:user], :repo => github_repo[:name], :number => issue_number rescue return nil
74
+ user = pull_request.head.repo.owner.login
75
+ url = pull_request.head.repo.ssh_url
76
+ ref = pull_request.head.ref
77
+ remote_name = 'gi-' + user
78
+ repo = get_git_repo
79
+ remote = repo.remote remote_name
80
+ if remote.url.nil?
81
+ print 'Setting up remote `' + remote_name + '`...'
82
+ remote = repo.add_remote remote_name, url
83
+ puts ' Done'
84
+ end
85
+ if remote.url != url
86
+ raise '`' + remote_name + '` remote\'s url differs from expected: `' + remote.url + ' != ' + url + '`'
87
+ end
88
+ remote.fetch
89
+ remote.name + '/' + ref
90
+ end
91
+
92
+ def run(arguments)
93
+ begin
94
+ super
95
+ rescue Exception => e
96
+ print on_red ' '
97
+ print bold ' Error: '
98
+ puts e.message
99
+ exit 1
100
+ end
101
+ end
102
+
103
+
104
+ end
105
+ end
@@ -0,0 +1,10 @@
1
+ module GithubIssuesCli
2
+ class Command::Browse < Command
3
+
4
+ def execute
5
+ github_repo = get_github_repo
6
+ url = 'https://github.com/' + github_repo[:user] + '/' + github_repo[:name] + '/issues/' + get_issue_number
7
+ system('open ' + url)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ module GithubIssuesCli
2
+ class Command::Checkout < Command
3
+
4
+ parameter "issue-number", "number of issue to be worked on", :attribute_name => :issue_number
5
+
6
+ def execute
7
+ branch_name = 'issue-' + issue_number
8
+ repo = get_git_repo
9
+ source = nil
10
+ if repo.lib.branches_all.map(&:first).include? branch_name
11
+ repo.checkout branch_name
12
+ else
13
+ source = get_source issue_number
14
+ if source.nil?
15
+ repo.remote('upstream').fetch
16
+ source = 'upstream/master'
17
+ end
18
+ repo.lib.checkout source, :new_branch => branch_name
19
+ end
20
+ print on_green ' '
21
+ print ' Checked out #' + issue_number
22
+ print ' (' + source.split('/').first.sub(/^gi-/, '') + ')' if source
23
+ puts
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ module GithubIssuesCli
2
+ class Command::List < Command
3
+
4
+ option "--mine", :flag, "show only mine issues"
5
+
6
+ def execute
7
+ github_repo = get_github_repo
8
+ issues_client = Github::Issues.new
9
+ request = {:user => github_repo[:user], :repo => github_repo[:name]}
10
+ request.store(:assignee, @username) if mine?
11
+ issues = issues_client.list request
12
+
13
+ issues.each do |issue|
14
+ if not issue.assignee.nil? and issue.assignee.login == @username
15
+ print on_yellow ' '
16
+ else
17
+ print ' '
18
+ end
19
+ print bold ' ' + ('#' + issue.number.to_s).rjust(6)
20
+ print ' ' + issue.title
21
+ puts
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module GithubIssuesCli
2
+ class Command::Open < Command
3
+
4
+ parameter "summary", "summary of the paramter", :attribute_name => :summary
5
+
6
+ def execute
7
+ github_repo = get_github_repo
8
+ issue = Github::Issues.new.create :user => github_repo[:user], :repo => github_repo[:name], :title => summary
9
+ issue_number = issue[:number].to_s
10
+
11
+ get_github_repo
12
+ git_repo = get_git_repo
13
+ git_repo.remote('upstream').fetch
14
+ git_repo.lib.checkout 'upstream/master', :new_branch => 'issue-' + issue_number
15
+ print on_green ' '
16
+ print ' Checked out '
17
+ puts bold '#' + issue_number
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module GithubIssuesCli
2
+ class Command::Pull_request < Command
3
+
4
+ def execute
5
+ github_repo = get_github_repo
6
+ issue_number = get_issue_number
7
+ source = @username + ':issue-' + issue_number
8
+ begin
9
+ Github::PullRequests.new.create :user => github_repo[:user], :repo => github_repo[:name], :head => source, :base => github_repo[:user] + ':master', :issue => issue_number
10
+ rescue
11
+ unless get_source(issue_number).nil?
12
+ raise 'Pull-request for issue #' + issue_number + ' already exists'
13
+ end
14
+ raise 'Internal error: Cannot create pull-request'
15
+ end
16
+ print 'Pull request for issue '
17
+ print bold '#' + issue_number
18
+ puts ' created'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module GithubIssuesCli
2
+ class Command::Push < Command
3
+
4
+ def execute
5
+ issue_number = get_issue_number
6
+ source = get_source issue_number
7
+ if source.nil?
8
+ source = 'origin/issue-' + issue_number
9
+ end
10
+ print 'Pushing code to '
11
+ puts bold source
12
+ remote, branch = source.split('/')
13
+ get_git_repo.push(remote, branch)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ module GithubIssuesCli
2
+ class Command::Show < Command
3
+
4
+ def execute
5
+ issue_number = get_issue_number
6
+ issues_client = Github::Issues.new
7
+ issue = issues_client.get :number => issue_number
8
+ comments = issues_client.comments.all :issue_id => issue_number
9
+
10
+ puts
11
+ print bold issue_number + ': ' + issue[:title] + ' '
12
+ if issue[:state] == :open
13
+ print white on_green [:state]
14
+ else
15
+ print white on_red issue[:state]
16
+ end
17
+ puts
18
+ if issue[:body]
19
+ puts issue[:body]
20
+ puts
21
+ end
22
+ puts
23
+
24
+ comments.each do |c|
25
+ print yellow '@' + c.user.login
26
+ puts ':'
27
+ puts c[:body]
28
+ puts
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ module GithubIssuesCli
2
+ class CommandManager < Clamp::Command
3
+
4
+ subcommand 'list', 'Lists issues', Command::List
5
+ subcommand 'checkout', 'Checkouts specifc issue', Command::Checkout
6
+ subcommand 'show', 'Show current issue details', Command::Show
7
+ subcommand 'browse', 'Navigate to issue HTML url', Command::Browse
8
+ subcommand 'open', 'Open new issue', Command::Open
9
+ subcommand 'push', 'Push current state to repo', Command::Push
10
+ subcommand 'pull-request', 'Creates pull-request out of current issue', Command::Pull_request
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github_issues_cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: ruby
6
+ authors:
7
+ - Tomasz Durka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: clamp
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: git
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: github_api
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: term-ansicolor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.0
69
+ description:
70
+ email: tomasz@durka.pl
71
+ executables:
72
+ - gi
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/github_issues_cli/command/browse.rb
77
+ - lib/github_issues_cli/command/checkout.rb
78
+ - lib/github_issues_cli/command/list.rb
79
+ - lib/github_issues_cli/command/open.rb
80
+ - lib/github_issues_cli/command/pull_request.rb
81
+ - lib/github_issues_cli/command/push.rb
82
+ - lib/github_issues_cli/command/show.rb
83
+ - lib/github_issues_cli/command.rb
84
+ - lib/github_issues_cli/command_manager.rb
85
+ - lib/github_issues_cli.rb
86
+ - bin/gi
87
+ homepage: https://github.com/tomaszdurka/github_issues_cli.git
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.1.9
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Command line tool for managing issues, pull-requests on GitHub platform
111
+ test_files: []