git-pulls 0.1.0 → 0.2.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.
Files changed (2) hide show
  1. data/lib/git-pulls.rb +76 -3
  2. metadata +18 -4
data/lib/git-pulls.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'json'
3
3
  require 'httparty'
4
+ require 'launchy'
4
5
  require 'pp'
5
6
 
6
7
  class GitPulls
@@ -19,7 +20,14 @@ class GitPulls
19
20
 
20
21
  def run
21
22
  if @command && self.respond_to?(@command)
23
+ # If the cache file doesn't exist, make sure we run update
24
+ # before any other command. git-pulls will otherwise crash
25
+ # with an exception.
26
+ update unless File.exists?(PULLS_CACHE_FILE) || @command == 'update'
27
+
22
28
  self.send @command
29
+ elsif %w(-h --help).include?(@command)
30
+ usage
23
31
  else
24
32
  help
25
33
  end
@@ -30,6 +38,17 @@ class GitPulls
30
38
  def help
31
39
  puts "No command: #{@command}"
32
40
  puts "Try: update, list, show, merge, browse"
41
+ puts "or call with '--help' for usage information"
42
+ end
43
+
44
+ def usage
45
+ puts <<-USAGE
46
+ Usage: git pulls update
47
+ or: git pulls list [--reverse]
48
+ or: git pulls show <number> [--full]
49
+ or: git pulls browse <number>
50
+ or: git pulls merge <number>
51
+ USAGE
33
52
  end
34
53
 
35
54
  def merge
@@ -86,7 +105,7 @@ class GitPulls
86
105
  def browse
87
106
  num = @args.shift
88
107
  if p = pull_num(num)
89
- `open #{p['html_url']}`
108
+ Launchy.open(p['html_url'])
90
109
  else
91
110
  puts "No such number"
92
111
  end
@@ -97,6 +116,7 @@ class GitPulls
97
116
  puts "Open Pull Requests for #{@user}/#{@repo}"
98
117
  pulls = get_pull_info
99
118
  pulls.reverse! if option == '--reverse'
119
+ count = 0
100
120
  pulls.each do |pull|
101
121
  line = []
102
122
  line << l(pull['number'], 4)
@@ -107,8 +127,12 @@ class GitPulls
107
127
  sha = pull['head']['sha']
108
128
  if not_merged?(sha)
109
129
  puts line.join ' '
130
+ count += 1
110
131
  end
111
132
  end
133
+ if count == 0
134
+ puts ' -- no open pull requests --'
135
+ end
112
136
  end
113
137
 
114
138
  def update
@@ -117,10 +141,15 @@ class GitPulls
117
141
  fetch_stale_forks
118
142
  list
119
143
  end
144
+
145
+ def protocol(is_private)
146
+ is_private ? "ssh://git@" : "git://"
147
+ end
120
148
 
121
149
  def fetch_stale_forks
122
150
  puts "Checking for forks in need of fetching"
123
151
  pulls = get_pull_info
152
+ is_private = get_repo_visibility
124
153
  repos = {}
125
154
  pulls.each do |pull|
126
155
  o = pull['head']['repository']['owner']
@@ -133,7 +162,16 @@ class GitPulls
133
162
  end
134
163
  repos.each do |repo, bool|
135
164
  puts " fetching #{repo}"
136
- git("fetch git://github.com/#{repo}.git refs/heads/*:refs/pr/#{repo}/*")
165
+ git("fetch #{protocol(is_private)}#{github_url}/#{repo}.git +refs/heads/*:refs/pr/#{repo}/*")
166
+ end
167
+ end
168
+
169
+ def github_url
170
+ host = git("config --get-all github.host")
171
+ if host.size > 0
172
+ host
173
+ else
174
+ 'github.com'
137
175
  end
138
176
  end
139
177
 
@@ -162,15 +200,50 @@ class GitPulls
162
200
  info.to_s.gsub("\n", ' ')
163
201
  end
164
202
 
203
+
204
+ # PRIVATE REPOSITORIES ACCESS
205
+
206
+ def github_username
207
+ git("config --get-all github.user")
208
+ end
209
+
210
+ def github_token
211
+ git("config --get-all github.token")
212
+ end
213
+
165
214
  # API/DATA HELPER FUNCTIONS #
215
+
216
+ def github_credentials_provided?
217
+ if github_token.empty? && github_username.empty?
218
+ return false
219
+ end
220
+ true
221
+ end
222
+
223
+ def authentication_options
224
+ if github_credentials_provided?
225
+ options = {:basic_auth => {:username => "#{github_username}/token:#{github_token}"}}
226
+ end
227
+ options || {}
228
+ end
166
229
 
167
230
  def get_pull_info
168
231
  get_data(PULLS_CACHE_FILE)['pulls']
169
232
  end
170
233
 
234
+ def get_repo_visibility
235
+ # This would fail if the repository was private and user did not provide github token
236
+ if github_credentials_provided?
237
+ repo_path = "/repos/show/#{repo_info[0]}/#{repo_info[1]}"
238
+ repo_response = HTTParty.get("https://#{github_url}/api/v2/json" << repo_path, authentication_options)
239
+ repo_response['repository']['private'] if repo_response['repository']
240
+ end
241
+ end
242
+
171
243
  def cache_pull_info
172
244
  path = "/pulls/#{@user}/#{@repo}/open"
173
- response = HTTParty.get('https://github.com/api/v2/json' << path)
245
+ puts "https://#{github_url}/api/v2/json"
246
+ response = HTTParty.get("https://#{github_url}/api/v2/json" << path, authentication_options)
174
247
  save_data(response, PULLS_CACHE_FILE)
175
248
  end
176
249
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-pulls
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 2
8
9
  - 1
9
- - 0
10
- version: 0.1.0
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Scott Chacon
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-07 00:00:00 -08:00
18
+ date: 2011-02-03 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -46,6 +46,20 @@ dependencies:
46
46
  version: "0"
47
47
  type: :runtime
48
48
  version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: launchy
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
49
63
  description: " git-pulls facilitates github pull requests.\n"
50
64
  email: schacon@gmail.com
51
65
  executables: