nexus_cli 0.9.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/nexus_cli/nexus_oss_remote.rb +91 -1
- data/lib/nexus_cli/nexus_pro_remote.rb +4 -3
- data/lib/nexus_cli/tasks.rb +5 -1
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
@@ -5,7 +5,10 @@ require 'json'
|
|
5
5
|
require 'jsonpath'
|
6
6
|
|
7
7
|
module NexusCli
|
8
|
+
# @author Kyle Allan <kallan@riotgames.com>
|
8
9
|
class OSSRemote
|
10
|
+
# @param [Hash] overrides
|
11
|
+
# @param [Boolean] ssl_verify
|
9
12
|
def initialize(overrides, ssl_verify=true)
|
10
13
|
@configuration = Configuration::parse(overrides)
|
11
14
|
@ssl_verify = ssl_verify
|
@@ -15,6 +18,10 @@ module NexusCli
|
|
15
18
|
return @configuration if @configuration
|
16
19
|
end
|
17
20
|
|
21
|
+
# Returns an HTTPClient instance with settings to connect
|
22
|
+
# to a Nexus server.
|
23
|
+
#
|
24
|
+
# @return [HTTPClient]
|
18
25
|
def nexus
|
19
26
|
client = HTTPClient.new
|
20
27
|
client.send_timeout = 600
|
@@ -26,10 +33,20 @@ module NexusCli
|
|
26
33
|
return client
|
27
34
|
end
|
28
35
|
|
36
|
+
# Joins a given url to the current url stored in the configuraiton
|
37
|
+
# and returns the combined String.
|
38
|
+
#
|
39
|
+
# @param [String] url
|
40
|
+
#
|
41
|
+
# @return [String]
|
29
42
|
def nexus_url(url)
|
30
43
|
File.join(configuration['url'], url)
|
31
44
|
end
|
32
45
|
|
46
|
+
# Gets that current status of the Nexus server. On a non-error
|
47
|
+
# status code, returns a Hash of values from the server.
|
48
|
+
#
|
49
|
+
# @return [Hash]
|
33
50
|
def status
|
34
51
|
response = nexus.get(nexus_url("service/local/status"))
|
35
52
|
case response.status
|
@@ -52,17 +69,26 @@ module NexusCli
|
|
52
69
|
end
|
53
70
|
end
|
54
71
|
|
72
|
+
# Determines whether or not the Nexus server being
|
73
|
+
# connected to is running Nexus Pro.
|
55
74
|
def running_nexus_pro?
|
56
75
|
status['edition_long'] == "Professional"
|
57
76
|
end
|
58
77
|
|
78
|
+
# Retrieves a file from the Nexus server using the given [String] artifact
|
79
|
+
# identifier. Optionally provide a destination [String].
|
80
|
+
#
|
81
|
+
# @param [String] artifact
|
82
|
+
# @param [String] destination
|
83
|
+
#
|
84
|
+
# @return [File]
|
59
85
|
def pull_artifact(artifact, destination=nil)
|
60
86
|
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
61
87
|
version = Nokogiri::XML(get_artifact_info(artifact)).xpath("//version").first.content() if version.casecmp("latest")
|
62
88
|
destination = File.join(File.expand_path(destination || "."), "#{artifact_id}-#{version}.#{extension}")
|
63
89
|
response = nexus.get(nexus_url("service/local/artifact/maven/redirect"), :query => {:g => group_id, :a => artifact_id, :v => version, :e => extension, :r => configuration['repository']})
|
64
90
|
case response.status
|
65
|
-
when 301
|
91
|
+
when 301, 307
|
66
92
|
# Follow redirect and stream in chunks.
|
67
93
|
artifact_file = File.open(destination, "wb") do |io|
|
68
94
|
nexus.get(response.content.gsub(/If you are not automatically redirected use this url: /, "")) do |chunk|
|
@@ -77,6 +103,14 @@ module NexusCli
|
|
77
103
|
File.expand_path(destination)
|
78
104
|
end
|
79
105
|
|
106
|
+
|
107
|
+
# Pushes the given [file] to the Nexus server
|
108
|
+
# under the given [artifact] identifier.
|
109
|
+
#
|
110
|
+
# @param artifact [String] the Maven identifier
|
111
|
+
# @param file [type] the path to the file
|
112
|
+
#
|
113
|
+
# @return [Boolean] returns true when successful
|
80
114
|
def push_artifact(artifact, file)
|
81
115
|
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
82
116
|
response = nexus.post(nexus_url("service/local/artifact/maven/content"), {:hasPom => false, :g => group_id, :a => artifact_id, :v => version, :e => extension, :p => extension, :r => configuration['repository'], :file => File.open(file)})
|
@@ -122,6 +156,12 @@ module NexusCli
|
|
122
156
|
end
|
123
157
|
end
|
124
158
|
|
159
|
+
|
160
|
+
# Searches for an artifact using the given identifier.
|
161
|
+
#
|
162
|
+
# @param artifact [String] the Maven identifier
|
163
|
+
#
|
164
|
+
# @return [Array<String>] a formatted Array of results
|
125
165
|
def search_for_artifacts(artifact)
|
126
166
|
group_id, artifact_id = artifact.split(":")
|
127
167
|
response = nexus.get(nexus_url("service/local/data_index"), :query => {:g => group_id, :a => artifact_id})
|
@@ -134,6 +174,10 @@ module NexusCli
|
|
134
174
|
end
|
135
175
|
end
|
136
176
|
|
177
|
+
|
178
|
+
# Retrieves the global settings of the Nexus server
|
179
|
+
#
|
180
|
+
# @return [File] a File with the global settings.
|
137
181
|
def get_global_settings
|
138
182
|
json = get_global_settings_json
|
139
183
|
pretty_json = JSON.pretty_generate(JSON.parse(json))
|
@@ -188,6 +232,14 @@ module NexusCli
|
|
188
232
|
end
|
189
233
|
end
|
190
234
|
|
235
|
+
|
236
|
+
# Creates a repository that the Nexus uses to hold artifacts.
|
237
|
+
#
|
238
|
+
# @param name [String] the name of the repository to create
|
239
|
+
# @param proxy [Boolean] true if this is a proxy repository
|
240
|
+
# @param url [String] the url for the proxy repository to point to
|
241
|
+
#
|
242
|
+
# @return [Boolean] returns true on success
|
191
243
|
def create_repository(name, proxy, url)
|
192
244
|
json = if proxy
|
193
245
|
create_proxy_repository_json(name, url)
|
@@ -285,6 +337,12 @@ module NexusCli
|
|
285
337
|
end
|
286
338
|
end
|
287
339
|
|
340
|
+
|
341
|
+
# Changes the password of a user
|
342
|
+
#
|
343
|
+
# @param params [Hash] a hash given to update the users password
|
344
|
+
#
|
345
|
+
# @return [type] [description]
|
288
346
|
def change_password(params)
|
289
347
|
response = nexus.post(nexus_url("service/local/users_changepw"), :body => create_change_password_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
290
348
|
case response.status
|
@@ -403,10 +461,26 @@ module NexusCli
|
|
403
461
|
|
404
462
|
private
|
405
463
|
|
464
|
+
|
465
|
+
# Transforms a given [String] into a sanitized version by
|
466
|
+
# replacing spaces with underscores and downcasing.
|
467
|
+
#
|
468
|
+
# @param unsanitized_string [String] the String to sanitize
|
469
|
+
#
|
470
|
+
# @return [String] the sanitized String
|
406
471
|
def sanitize_for_id(unsanitized_string)
|
407
472
|
unsanitized_string.gsub(" ", "_").downcase
|
408
473
|
end
|
409
474
|
|
475
|
+
|
476
|
+
# Transfers an artifact from one repository
|
477
|
+
# to another. Sometimes called a `promotion`
|
478
|
+
#
|
479
|
+
# @param artifact [String] a Maven identifier
|
480
|
+
# @param from_repository [String] the name of the from repository
|
481
|
+
# @param to_repository [String] the name of the to repository
|
482
|
+
#
|
483
|
+
# @return [Boolean] returns true when successful
|
410
484
|
def do_transfer_artifact(artifact, from_repository, to_repository)
|
411
485
|
Dir.mktmpdir do |temp_dir|
|
412
486
|
configuration["repository"] = sanitize_for_id(from_repository)
|
@@ -416,6 +490,15 @@ module NexusCli
|
|
416
490
|
end
|
417
491
|
end
|
418
492
|
|
493
|
+
|
494
|
+
# Formats the given XML into an [Array<String>] so it
|
495
|
+
# can be displayed nicely.
|
496
|
+
#
|
497
|
+
# @param doc [Nokogiri::XML] the xml search results
|
498
|
+
# @param group_id [String] the group id
|
499
|
+
# @param artifact_id [String] the artifact id
|
500
|
+
#
|
501
|
+
# @return [type] [description]
|
419
502
|
def format_search_results(doc, group_id, artifact_id)
|
420
503
|
versions = doc.xpath("//version").inject([]) {|array,node| array << "#{node.content()}"}
|
421
504
|
indent_size = versions.max{|a,b| a.length <=> b.length}.size+4
|
@@ -426,6 +509,13 @@ module NexusCli
|
|
426
509
|
end
|
427
510
|
end
|
428
511
|
|
512
|
+
|
513
|
+
# Parses a given artifact string into its
|
514
|
+
# four, distinct, Maven pieces.
|
515
|
+
#
|
516
|
+
# @param artifact [String] the Maven identifier
|
517
|
+
#
|
518
|
+
# @return [Array<String>] an Array with four elements
|
429
519
|
def parse_artifact_string(artifact)
|
430
520
|
split_artifact = artifact.split(":")
|
431
521
|
if(split_artifact.size < 4)
|
@@ -105,7 +105,7 @@ module NexusCli
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def artifact_publish(repository_id, params)
|
108
|
-
response = nexus.put(nexus_url("service/local/smartproxy/pub-sub/#{repository_id}"), :body => create_pub_sub_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
108
|
+
response = nexus.put(nexus_url("service/local/smartproxy/pub-sub/#{sanitize_for_id(repository_id)}"), :body => create_pub_sub_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
109
109
|
case response.status
|
110
110
|
when 200
|
111
111
|
return true
|
@@ -114,11 +114,12 @@ module NexusCli
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
-
def enable_artifact_subscribe(repository_id)
|
117
|
+
def enable_artifact_subscribe(repository_id, preemptive_fetch)
|
118
118
|
raise NotProxyRepositoryException.new(repository_id) unless Nokogiri::XML(get_repository_info(repository_id)).xpath("/repository/data/repoType").first.content == "proxy"
|
119
119
|
|
120
120
|
params = {:repositoryId => repository_id}
|
121
121
|
params[:subscribe] = true
|
122
|
+
params[:preemptiveFetch] = preemptive_fetch
|
122
123
|
artifact_subscribe(repository_id, params)
|
123
124
|
end
|
124
125
|
|
@@ -131,7 +132,7 @@ module NexusCli
|
|
131
132
|
end
|
132
133
|
|
133
134
|
def artifact_subscribe(repository_id, params)
|
134
|
-
response = nexus.put(nexus_url("service/local/smartproxy/pub-sub/#{repository_id}"), :body => create_pub_sub_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
135
|
+
response = nexus.put(nexus_url("service/local/smartproxy/pub-sub/#{sanitize_for_id(repository_id)}"), :body => create_pub_sub_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
135
136
|
case response.status
|
136
137
|
when 200
|
137
138
|
return true
|
data/lib/nexus_cli/tasks.rb
CHANGED
@@ -282,10 +282,14 @@ module NexusCli
|
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
285
|
+
method_option :preemptive_fetch,
|
286
|
+
:type => :boolean,
|
287
|
+
:default => false,
|
288
|
+
:desc => "Subscribing repositories that preemtively fetch will grab artifacts as updates are received."
|
285
289
|
desc "enable_artifact_subscribe repository_id", "Sets a repository to subscribe to updates about artifacts."
|
286
290
|
def enable_artifact_subscribe(repository_id)
|
287
291
|
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
288
|
-
if nexus_remote.enable_artifact_subscribe(repository_id)
|
292
|
+
if nexus_remote.enable_artifact_subscribe(repository_id, options[:preemptive_fetch])
|
289
293
|
say "The repository #{repository_id} is now subscribed for artifact updates.", :blue
|
290
294
|
end
|
291
295
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexus_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -253,7 +253,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
253
253
|
version: '0'
|
254
254
|
segments:
|
255
255
|
- 0
|
256
|
-
hash:
|
256
|
+
hash: -2249648047035309885
|
257
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
258
258
|
none: false
|
259
259
|
requirements:
|
@@ -262,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
262
262
|
version: '0'
|
263
263
|
segments:
|
264
264
|
- 0
|
265
|
-
hash:
|
265
|
+
hash: -2249648047035309885
|
266
266
|
requirements: []
|
267
267
|
rubyforge_project:
|
268
268
|
rubygems_version: 1.8.21
|