knife-github 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/chef/knife/github_base.rb +54 -119
- data/lib/chef/knife/github_baselist.rb +0 -3
- data/lib/chef/knife/github_compare.rb +2 -3
- data/lib/{chef/knife/github_config.rb → knife-github/config.rb} +0 -0
- data/lib/knife-github/connection.rb +74 -0
- data/lib/knife-github/repo.rb +162 -0
- data/lib/knife-github/version.rb +1 -1
- metadata +5 -3
@@ -17,7 +17,6 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
# require 'chef/knife'
|
20
|
-
require "knife-github/version"
|
21
20
|
|
22
21
|
class Chef
|
23
22
|
class Knife
|
@@ -29,7 +28,10 @@ class Chef
|
|
29
28
|
deps do
|
30
29
|
require 'chef/mixin/shell_out'
|
31
30
|
require 'mixlib/versioning'
|
32
|
-
require '
|
31
|
+
require 'knife-github/repo'
|
32
|
+
require 'knife-github/config'
|
33
|
+
require 'knife-github/version'
|
34
|
+
require 'knife-github/connection'
|
33
35
|
end
|
34
36
|
|
35
37
|
option :github_url,
|
@@ -38,7 +40,7 @@ class Chef
|
|
38
40
|
|
39
41
|
option :github_organizations,
|
40
42
|
:long => "--github_org ORG:ORG",
|
41
|
-
:description => "Lookup
|
43
|
+
:description => "Lookup repositories in this colon-separated list of organizations",
|
42
44
|
:proc => lambda { |o| o.split(":") }
|
43
45
|
|
44
46
|
option :github_link,
|
@@ -148,144 +150,77 @@ class Chef
|
|
148
150
|
# Parse every org and merge all into one hash
|
149
151
|
repos = {}
|
150
152
|
orgs.each do |org|
|
151
|
-
|
153
|
+
get_org_data(org).each { |repo|
|
154
|
+
name = repo['name']
|
155
|
+
repos["#{name}"] = repo.to_hash
|
156
|
+
}
|
152
157
|
end
|
153
158
|
repos
|
154
159
|
end
|
155
160
|
|
156
|
-
def
|
157
|
-
dns_name
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
161
|
+
def get_org_data(org)
|
162
|
+
dns_name = get_dns_name(@github_url)
|
163
|
+
file = ENV['HOME'] + "/.chef/.#{dns_name}_#{org.downcase}.cache"
|
164
|
+
|
165
|
+
cache_repo_data = get_cache_data(file)
|
166
|
+
github_repo_data = get_github_repo_data(org)
|
167
|
+
|
168
|
+
github_repoList = Github::RepoList.new
|
169
|
+
|
170
|
+
github_repo_data.each do |repo|
|
171
|
+
github_repoList.push(repo)
|
172
|
+
cache_repo = cache_repo_data.find { |k| k['name'] == repo.name }
|
173
|
+
if cache_repo
|
174
|
+
# found cache repo, update tags if latest_update is not equal
|
175
|
+
if repo.updated_at == cache_repo['updated_at']
|
176
|
+
github_repoList.last.tags_all = cache_repo['tags_all']
|
177
|
+
github_repoList.last.tags_last = cache_repo['tags_last']
|
178
|
+
else
|
179
|
+
github_repoList.last.update_tags!
|
180
|
+
end
|
181
|
+
else
|
182
|
+
# cannot find cache repo data, updating tags
|
183
|
+
github_repoList.last.update_tags!
|
171
184
|
end
|
172
|
-
else
|
173
|
-
create_cache_file(file_cache + ".cache", org)
|
174
|
-
create_cache_json(file_cache + ".json", org)
|
175
185
|
end
|
176
|
-
|
177
|
-
|
178
|
-
JSON.parse(File.read(file_cache + ".cache"))
|
186
|
+
write_cache_data(file, github_repoList)
|
187
|
+
get_cache_data(file)
|
179
188
|
end
|
180
|
-
|
181
|
-
def
|
182
|
-
|
183
|
-
url = @github_url + "/api/" + @github_api_version + "/orgs/" + org
|
184
|
-
params = {'response' => 'json'}
|
185
|
-
result = send_request(url, params)
|
186
|
-
File.open(file, 'w') { |f| f.write(JSON.pretty_generate(result)) }
|
189
|
+
|
190
|
+
def connection
|
191
|
+
@connection ||= GithubClient::Connection.new()
|
187
192
|
end
|
188
193
|
|
189
|
-
def
|
190
|
-
|
191
|
-
result = get_repos_github(org)
|
192
|
-
File.open(file, 'w') { |f| f.write(JSON.pretty_generate(result)) }
|
194
|
+
def write_cache_data(file, json)
|
195
|
+
File.open(file, 'w') { |f| f.write(json.to_pretty_json) }
|
193
196
|
end
|
194
|
-
|
195
|
-
def
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
197
|
+
|
198
|
+
def get_cache_data(file)
|
199
|
+
if File.exists?(file)
|
200
|
+
return JSON.parse(File.read(file))
|
201
|
+
else
|
202
|
+
return JSON.parse("{}")
|
203
|
+
end
|
200
204
|
end
|
201
|
-
|
202
|
-
def
|
203
|
-
# Get all repo's from cache file
|
204
|
-
|
205
|
-
# Get all repo's for the org from github
|
205
|
+
|
206
|
+
def get_github_repo_data(org)
|
206
207
|
arr = []
|
207
208
|
page = 1
|
208
|
-
url = @github_url + "/api/" + @github_api_version + "/orgs/" + org + "/repos"
|
209
|
+
url = @github_url + "/api/" + @github_api_version + "/orgs/" + org + "/repos"
|
209
210
|
while true
|
210
211
|
params = {'response' => 'json', 'page' => page }
|
211
|
-
result =
|
212
|
+
result = connection.send_get_request(url, params)
|
212
213
|
break if result.nil? || result.count < 1
|
213
|
-
result.each { |key| arr << key }
|
214
|
+
result.each { |key| arr << Github::Repo.new(key) }
|
214
215
|
page = page + 1
|
215
216
|
end
|
216
|
-
|
217
|
-
# if key['tags_url']
|
218
|
-
# tags = get_tags(key)
|
219
|
-
# key['tags'] = tags unless tags.nil? || tags.empty?
|
220
|
-
# key['latest_tag'] = get_latest_tag(tags)
|
221
|
-
# arr << key
|
222
|
-
# else
|
223
|
-
# arr << key
|
224
|
-
# end
|
225
|
-
#}
|
226
|
-
arr
|
217
|
+
return arr
|
227
218
|
end
|
228
|
-
|
229
|
-
def get_tags(repo)
|
230
|
-
params = {'response' => 'json'}
|
231
|
-
send_request(repo['tags_url'], params)
|
232
|
-
end
|
233
|
-
|
234
|
-
def get_latest_tag(tags)
|
235
|
-
return "" if tags.nil? || tags.empty?
|
236
|
-
tags_arr =[]
|
237
|
-
tags.each do |tag|
|
238
|
-
tags_arr.push(Mixlib::Versioning.parse(tag['name'])) if tag['name'] =~ /^(\d*)\.(\d*)\.(\d*)$/
|
239
|
-
end
|
240
|
-
return "" if tags_arr.nil? || tags_arr.empty?
|
241
|
-
return tags_arr.sort.last.to_s
|
242
|
-
end
|
243
|
-
|
219
|
+
|
244
220
|
def get_dns_name(url)
|
245
221
|
url = url.downcase.gsub("http://","") if url.downcase.start_with?("http://")
|
246
222
|
url = url.downcase.gsub("https://","") if url.downcase.start_with?("https://")
|
247
|
-
url
|
248
|
-
end
|
249
|
-
|
250
|
-
def send_request(url, params = {})
|
251
|
-
unless params.empty?
|
252
|
-
params_arr = []
|
253
|
-
params.sort.each { |elem|
|
254
|
-
params_arr << elem[0].to_s + '=' + CGI.escape(elem[1].to_s).gsub('+', '%20').gsub(' ','%20')
|
255
|
-
}
|
256
|
-
data = params_arr.join('&')
|
257
|
-
url = "#{url}?#{data}"
|
258
|
-
end
|
259
|
-
|
260
|
-
if @github_ssl_verify_mode == "verify_none"
|
261
|
-
config[:ssl_verify_mode] = :verify_none
|
262
|
-
elsif @github_ssl_verify_mode == "verify_peer"
|
263
|
-
config[:ssl_verify_mode] = :verify_peer
|
264
|
-
end
|
265
|
-
|
266
|
-
Chef::Log.debug("URL: " + url.to_s)
|
267
|
-
|
268
|
-
uri = URI.parse(url)
|
269
|
-
req_body = Net::HTTP::Get.new(uri.request_uri)
|
270
|
-
request = Chef::REST::RESTRequest.new("GET", uri, req_body, headers={})
|
271
|
-
|
272
|
-
response = request.call
|
273
|
-
|
274
|
-
unless response.is_a?(Net::HTTPOK) then
|
275
|
-
puts "Error #{response.code}: #{response.message}"
|
276
|
-
puts JSON.pretty_generate(JSON.parse(response.body))
|
277
|
-
puts "URL: #{url}"
|
278
|
-
exit 1
|
279
|
-
end
|
280
|
-
|
281
|
-
begin
|
282
|
-
json = JSON.parse(response.body)
|
283
|
-
rescue
|
284
|
-
ui.warn "The result on the RESTRequest is not in json format"
|
285
|
-
ui.warn "Output: " + response.body
|
286
|
-
exit 1
|
287
|
-
end
|
288
|
-
return json
|
223
|
+
url.downcase
|
289
224
|
end
|
290
225
|
|
291
226
|
def get_clone(url, cookbook)
|
@@ -53,7 +53,7 @@ class Chef
|
|
53
53
|
|
54
54
|
#Get the github link
|
55
55
|
git_link = get_repo_clone_link
|
56
|
-
|
56
|
+
|
57
57
|
# Filter all repo information based on the tags that we can find
|
58
58
|
if config[:fields] || config[:fieldlist]
|
59
59
|
all_repos = get_all_repos
|
@@ -68,7 +68,7 @@ class Chef
|
|
68
68
|
else
|
69
69
|
cookbooks.each { |k,v|
|
70
70
|
get_all_repos[k].nil? || get_all_repos[k][git_link].nil? ? gh_url = ui.color("Cannot find cookbook!", :red) : gh_url = get_all_repos[k][git_link]
|
71
|
-
get_all_repos[k].nil? || get_all_repos[k]['
|
71
|
+
get_all_repos[k].nil? || get_all_repos[k]['tags_last'].nil? || get_all_repos[k]['tags_last'].empty? ? gh_tag = ui.color("No tags!", :red) : gh_tag = get_all_repos[k]['tags_last']
|
72
72
|
all_repos[k] = { 'name' => k, 'latest_cb_tag' => v['versions'][0]['version'], 'git_url' => gh_url, 'latest_gh_tag' => gh_tag }
|
73
73
|
}
|
74
74
|
end
|
@@ -92,7 +92,6 @@ class Chef
|
|
92
92
|
end
|
93
93
|
|
94
94
|
end
|
95
|
-
|
96
95
|
end
|
97
96
|
end
|
98
97
|
end
|
File without changes
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'uri'
|
3
|
+
require 'cgi'
|
4
|
+
require 'openssl'
|
5
|
+
require 'net/http'
|
6
|
+
|
7
|
+
module GithubClient
|
8
|
+
class Connection
|
9
|
+
def send_get_request(url, params = {})
|
10
|
+
unless params.empty?
|
11
|
+
params_arr = []
|
12
|
+
params.sort.each { |elem|
|
13
|
+
params_arr << elem[0].to_s + '=' + CGI.escape(elem[1].to_s).gsub('+', '%20').gsub(' ','%20')
|
14
|
+
}
|
15
|
+
data = params_arr.join('&')
|
16
|
+
url = "#{url}?#{data}"
|
17
|
+
end
|
18
|
+
|
19
|
+
#if @github_ssl_verify_mode == "verify_none"
|
20
|
+
# config[:ssl_verify_mode] = :verify_none
|
21
|
+
#elsif @github_ssl_verify_mode == "verify_peer"
|
22
|
+
# config[:ssl_verify_mode] = :verify_peer
|
23
|
+
#end
|
24
|
+
|
25
|
+
Chef::Log.debug("URL: " + url.to_s)
|
26
|
+
|
27
|
+
uri = URI.parse(url)
|
28
|
+
http = http_client_builder.new(uri.host, uri.port)
|
29
|
+
|
30
|
+
if uri.scheme == "https"
|
31
|
+
http.use_ssl = true
|
32
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
33
|
+
end
|
34
|
+
|
35
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
36
|
+
response = http.request(request)
|
37
|
+
|
38
|
+
unless response.is_a?(Net::HTTPOK) then
|
39
|
+
puts "Error #{response.code}: #{response.message}"
|
40
|
+
puts JSON.pretty_generate(JSON.parse(response.body))
|
41
|
+
puts "URL: #{url}"
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
|
45
|
+
begin
|
46
|
+
json = JSON.parse(response.body)
|
47
|
+
rescue
|
48
|
+
ui.warn "The result on the RESTRequest is not in json format"
|
49
|
+
ui.warn "Output: " + response.body
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
return json
|
53
|
+
end
|
54
|
+
|
55
|
+
def http_client_builder
|
56
|
+
http_proxy = proxy_uri
|
57
|
+
if http_proxy.nil?
|
58
|
+
Net::HTTP
|
59
|
+
else
|
60
|
+
Chef::Log.debug("Using #{http_proxy.host}:#{http_proxy.port} for proxy")
|
61
|
+
user = http_proxy.user if http_proxy.user
|
62
|
+
pass = http_proxy.password if http_proxy.password
|
63
|
+
Net::HTTP.Proxy(http_proxy.host, http_proxy.port, user, pass)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def proxy_uri
|
68
|
+
return nil if @api_proxy.nil?
|
69
|
+
result = URI.parse(@api_proxy)
|
70
|
+
return result unless result.host.nil? || result.host.empty?
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'mixlib/versioning'
|
2
|
+
require 'knife-github/connection'
|
3
|
+
|
4
|
+
module Github
|
5
|
+
class Repo
|
6
|
+
|
7
|
+
def initialize(repo)
|
8
|
+
# Instance variables
|
9
|
+
@id = repo['id']
|
10
|
+
@name = repo['name']
|
11
|
+
@description = repo['description']
|
12
|
+
@full_name = repo['full_name']
|
13
|
+
@private = repo['private']
|
14
|
+
@homapage = repo['homepage']
|
15
|
+
@created_at = repo['created_at']
|
16
|
+
@updated_at = repo['updated_at']
|
17
|
+
@pushed_at = repo['pushed_at']
|
18
|
+
@html_url = repo['html_url']
|
19
|
+
@ssh_url = repo['ssh_url']
|
20
|
+
@git_url = repo['git_url']
|
21
|
+
@svn_url = repo['svn_url']
|
22
|
+
@clone_url = repo['clone_url']
|
23
|
+
@tags_url = repo['tags_url']
|
24
|
+
@tags_all = repo['tags_all']
|
25
|
+
@tags_last = repo['tags_last']
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_reader :name, :id, :updated_at
|
29
|
+
attr_writer :tags_all, :tags_last
|
30
|
+
|
31
|
+
def last_tag?
|
32
|
+
get_last_tag(@tags_all)
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
@name
|
37
|
+
end
|
38
|
+
|
39
|
+
def update_tags!
|
40
|
+
if @tags_url
|
41
|
+
@tags_all = get_tags(@tags_url)
|
42
|
+
@tags_last = get_last_tag(@tags_all)
|
43
|
+
end
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_hash
|
48
|
+
{
|
49
|
+
'id' => @id,
|
50
|
+
'name' => @name,
|
51
|
+
'description' => @description,
|
52
|
+
'full_name' => @full_name,
|
53
|
+
'private' => @private,
|
54
|
+
'homepage' => @homepage,
|
55
|
+
'created_at' => @created_at,
|
56
|
+
'updated_at' => @updated_at,
|
57
|
+
'pushed_at' => @pushed_at,
|
58
|
+
'html_url' => @html_url,
|
59
|
+
'ssh_url' => @ssh_url,
|
60
|
+
'git_url' => @git_url,
|
61
|
+
'svn_url' => @svn_url,
|
62
|
+
'clone_url' => @clone_url,
|
63
|
+
'tags_url' => @tags_url,
|
64
|
+
'tags_all' => @tags_all,
|
65
|
+
'tags_last' => @tags_last
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_repo_data(orgs)
|
70
|
+
orgs.each do |org|
|
71
|
+
get_org_data(org)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def get_tags(url)
|
78
|
+
tags = []
|
79
|
+
result = connection.send_get_request(url)
|
80
|
+
result.each { |tag| tags.push(tag['name']) if tag['name'] =~ /^(\d*)\.(\d*)\.(\d*)$/ }
|
81
|
+
tags || nil
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_last_tag(tags)
|
85
|
+
return nil if tags.nil? || tags.empty?
|
86
|
+
base, last = "0.0.0", nil
|
87
|
+
tags.each do |tag|
|
88
|
+
if Mixlib::Versioning.parse(tag) >= Mixlib::Versioning.parse(base)
|
89
|
+
last = tag
|
90
|
+
base = last
|
91
|
+
end
|
92
|
+
end
|
93
|
+
last
|
94
|
+
end
|
95
|
+
|
96
|
+
def connection
|
97
|
+
@connection ||= GithubClient::Connection.new()
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class RepoList
|
102
|
+
def initialize
|
103
|
+
# Instance variables
|
104
|
+
@repos = Array.new
|
105
|
+
end
|
106
|
+
|
107
|
+
def push(aRepo)
|
108
|
+
pos = self.find_index(aRepo.name)
|
109
|
+
if pos
|
110
|
+
@repos[pos] = aRepo
|
111
|
+
else
|
112
|
+
@repos.push(aRepo)
|
113
|
+
end
|
114
|
+
self
|
115
|
+
end
|
116
|
+
|
117
|
+
def shift
|
118
|
+
@repos.shift
|
119
|
+
end
|
120
|
+
|
121
|
+
def pop
|
122
|
+
@repos.pop
|
123
|
+
end
|
124
|
+
|
125
|
+
def count
|
126
|
+
@repos.count
|
127
|
+
end
|
128
|
+
|
129
|
+
def delete(key)
|
130
|
+
@repos.delete(self.find(key))
|
131
|
+
self
|
132
|
+
end
|
133
|
+
|
134
|
+
def last
|
135
|
+
@repos.last
|
136
|
+
end
|
137
|
+
|
138
|
+
def find(key)
|
139
|
+
@repos.find { |aRepo| aRepo.name == key }
|
140
|
+
end
|
141
|
+
|
142
|
+
def find_index(key)
|
143
|
+
@repos.find_index { |aRepo| aRepo.name == key }
|
144
|
+
end
|
145
|
+
|
146
|
+
def [](key)
|
147
|
+
return @repos[key] if key.kind_of?(Integer)
|
148
|
+
return @repos.find { |aRepo| aRepo.name == key }
|
149
|
+
nil
|
150
|
+
end
|
151
|
+
|
152
|
+
def to_pretty_json
|
153
|
+
json = []
|
154
|
+
@repos.each do |repo|
|
155
|
+
json << repo.to_hash
|
156
|
+
end
|
157
|
+
JSON.pretty_generate(json)
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
data/lib/knife-github/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-github
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-11-
|
13
|
+
date: 2013-11-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: mixlib-versioning
|
@@ -91,13 +91,15 @@ files:
|
|
91
91
|
- lib/chef/knife/github_cleanup.rb
|
92
92
|
- lib/chef/knife/github_clone.rb
|
93
93
|
- lib/chef/knife/github_compare.rb
|
94
|
-
- lib/chef/knife/github_config.rb
|
95
94
|
- lib/chef/knife/github_create.rb
|
96
95
|
- lib/chef/knife/github_deploy.rb
|
97
96
|
- lib/chef/knife/github_diff.rb
|
98
97
|
- lib/chef/knife/github_list.rb
|
99
98
|
- lib/chef/knife/github_pin.rb
|
100
99
|
- lib/chef/knife/github_search.rb
|
100
|
+
- lib/knife-github/config.rb
|
101
|
+
- lib/knife-github/connection.rb
|
102
|
+
- lib/knife-github/repo.rb
|
101
103
|
- lib/knife-github/version.rb
|
102
104
|
homepage: https://github.com/schubergphilis/knife-github
|
103
105
|
licenses:
|