ghcurl 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -10
  3. data/bin/ghcurl +108 -71
  4. data/lib/ghcurl.rb +6 -4
  5. metadata +5 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0069ec92dd2a2638c346d29aec05b591f52556ccee9906c28a3382506d5d5bd6'
4
- data.tar.gz: db516685965cfeadfb7e7db426ee8b328e5f6267af1158bbdc21c23e2aeddce7
3
+ metadata.gz: efa8ec89c9537aeb042258adb82a8b4c5b5906fee9f75d1ac348bb59d98095a7
4
+ data.tar.gz: a95f9e3385e1bb9766c1b807520ae191f768801e83fffe29a7231a10f4926cf8
5
5
  SHA512:
6
- metadata.gz: 71a3fd97dc832a34b358f87a1be6b925e07647e83506545d13384229a42a24f34a6ab4c6c362a3b482b914e5bbff620fa8a0f3aa545dc771db371ad7eb366c7a
7
- data.tar.gz: 3b407e1b7b4ebf046621567d9a1aba7d60cbd55754de54b4e85b7c9af583a57054cd7b50868761249ae385f9aded3eae9d5ca0cc8913245e03b14eaa50bc2f09
6
+ metadata.gz: f1839ed2a13c403b71a7ea01773f7ec9b4b7b13b3a7f2aade2fa567703e46fb3b8b2b05395f17fa690924d93a8c570195b57d733768883f07b6f44aab58c5fb3
7
+ data.tar.gz: b37c28392213b7b0a73343b8fa61399d510edc3ff8fc51758e95e79c10bf30f7188851d3e5df53411b3275bee72980f5f6acf66aa69a3b4a8e57f5c3c6f8bd6b
data/README.md CHANGED
@@ -4,21 +4,47 @@
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/ghcurl.svg)](https://rubygems.org/gems/ghcurl)
6
6
 
7
+
8
+ Download files and install from Github releases.
9
+
7
10
  ```bash
8
11
  gem install ghcurl
9
12
  ```
10
13
 
14
+ </div>
15
+
16
+ `ghcurl` can recognize your OS and arch, give you the proper option to download. You can search by regular expression, specify a version, and install it to a path or according to the environment variable `GHCURL_BIN_PATH` or just `/usr/local/bin`. It will automatically extract a tar/zip file to make the installation process better.
17
+
18
+ Note it doesn't work on Windows.
19
+
11
20
  <br>
12
21
 
13
- Download files and install from Github releases.
22
+ ## Usage
14
23
 
15
- It's quite easy to use `ghcurl`, because it can recognize your OS and arch, always give you the best option to download by default. What's more, You can search by regular expression, specify a version, and install it to a path or according to the environment variable `GHCURL_BIN_PATH` or just `/usr/local/bin`. The best of it is to automatically extract a tar/zip file to make the installation process smooth in a terminal.
24
+ ```bash
25
+ $ ghcurl [user/]repo [regexp] [options]
26
+ ```
16
27
 
17
- It may be difficult to use it on Windows, welcome contributions!
28
+ **-o**
18
29
 
19
- </div>
30
+ This is optional, download will default to `~/.cache/ghcurl`
31
+ 1. `-o path` Download into path
32
+ 2. `-o path/name` Download as path/name
20
33
 
21
- ## Usage
34
+ **-v**
35
+ 1. `-v 1.0.0` Download tag version 1.0.0
36
+ 2. `-v3.1.4` This is also OK to download tag version 3.1.4
37
+
38
+ **-i**
39
+ 1. `-i` Install to `/usr/local/bin` or `GHCURL_BIN_PATH`
40
+ 2. `-i path` Install to path`
41
+
42
+ **-r**
43
+ 1. `-r name` Install the binary as name
44
+
45
+ <br>
46
+
47
+ ## Example
22
48
 
23
49
  Things can be easier. We consider these as popular binaries: https://github.com/ibraheemdev/modern-unix
24
50
 
@@ -28,11 +54,11 @@ Notice: `-i` means to install.
28
54
  # It knows that's sharkdp/fd
29
55
  ghcurl fd -i
30
56
 
57
+ # It's cli/cli !
58
+ ghcurl gh -i
59
+
31
60
  # Much easier to install rbspy!
32
61
  ghcurl rbspy -i
33
-
34
- # On Linux, it's very handy
35
- ghcurl cli -i
36
62
  ```
37
63
 
38
64
  Download latest deb/rpm package and install, notice the argument `deb` / `rpm` are just regular expressions.
@@ -43,6 +69,12 @@ ghcurl cli/cli rpm -i
43
69
 
44
70
  Normal download
45
71
  ```bash
72
+ # The easiest way to download
73
+ ghcurl gh
74
+
75
+ # Download to /tmp
76
+ ghcurl gh -o /tmp
77
+
46
78
  # Download latest rbspy-x86_64-unknown-linux-gnu.tar.gz to ~/.cache/ghcurl
47
79
  ghcurl rbspy/rbspy 'x86_64.*linux'
48
80
 
@@ -53,10 +85,13 @@ ghcurl rbspy/rbspy 'x86_64.*linux' -v0.11.1
53
85
  Download a binary and install it to anywhere
54
86
  ```bash
55
87
  # Install to /usr/local/bin
56
- ghcurl BetaPictoris/timeleft timeleft -i
88
+ ghcurl starship linux-gnu -i
57
89
 
58
90
  # Install to ~/tmp/bin
59
- ghcurl BetaPictoris/timeleft timeleft -i ~/tmp/bin
91
+ ghcurl BetaPictoris/timeleft -i ~/tmp/bin
92
+
93
+ # Download as /tmp/github-cli and install
94
+ ghcurl gh -o /tmp/github-cli -i
60
95
 
61
96
  # Install and rename it to, here, 'gd' in /usr/local/bin
62
97
  ghcurl dlvhdr/gh-dash linux-amd64 -i -r 'gd'
data/bin/ghcurl CHANGED
@@ -3,7 +3,7 @@
3
3
  # File : ghcurl.rb
4
4
  # Authors : ccmywish <ccmywish@qq.com>
5
5
  # Created on : <2022-04-12>
6
- # Last modified : <2022-04-15>
6
+ # Last modified : <2022-04-26>
7
7
  #
8
8
  # ghcurl:
9
9
  #
@@ -12,8 +12,6 @@
12
12
  # ------------------------------------------------------
13
13
 
14
14
  require 'ghcurl'
15
- require 'nokogiri'
16
- require 'open-uri'
17
15
  require 'highline'
18
16
  require 'cliswitch'
19
17
  require 'fileutils'
@@ -37,10 +35,25 @@ module Ghcurl
37
35
  end
38
36
 
39
37
 
40
- def curl(url, name)
41
- cmd = "curl -L #{url} --create-dirs -o #{WAREHOUSE}/#{name}"
38
+ #
39
+ # @return absolute download path
40
+ #
41
+ def curl(url, name, to)
42
+ if to == nil
43
+ to = WAREHOUSE + '/' + name
44
+ elsif test 'd', to
45
+ to = to.chomp('/') + '/' + name
46
+ elsif to.include?('/')
47
+ # noop
48
+ else
49
+ # just a rename in WAREHOUSE
50
+ to = WAREHOUSE + '/' + name
51
+ end
52
+
53
+ cmd = "curl -L #{url} --create-dirs -o #{to}"
42
54
  system cmd
43
- log "Downloaded to #{WAREHOUSE}/#{name}"
55
+ log "Downloaded to #{to}"
56
+ return to
44
57
  end
45
58
 
46
59
 
@@ -113,8 +126,11 @@ module Ghcurl
113
126
  end
114
127
 
115
128
 
116
- def download(repo, regexp, version: nil)
129
+ def download(repo, regexp, version: nil, download_to: nil)
130
+
131
+ require 'octokit'
117
132
 
133
+ # adjust repo name : user/repo
118
134
  if repo =~ /^https:\/\/github.com/
119
135
  require 'uri'
120
136
  uri = URI(repo)
@@ -132,27 +148,32 @@ module Ghcurl
132
148
  end
133
149
 
134
150
  log "checking..."
135
- unless version
136
- doc = Nokogiri::HTML5 URI.open("https://github.com/#{repo}/releases/latest")
137
- else
138
- doc = Nokogiri::HTML5 URI.open("https://github.com/#{repo}/releases/tag/v#{version}")
151
+ begin
152
+ unless version
153
+ doc = Octokit::Client.new.latest_release(repo)
154
+ else
155
+ doc = Octokit::Client.new.release_for_tag(repo, 'v' + version)
156
+ end
157
+ rescue Octokit::NotFound
158
+ puts "ghcurl: Not found #{repo} v#{version} !"
159
+ rescue Error => e
160
+ puts e
161
+ exit 0
139
162
  end
140
163
 
141
-
142
- links = doc.css("li>a[href^='/#{repo}/releases/download']")
164
+ links = doc.to_hash[:assets]
143
165
  if links.empty?
144
- puts doc.css('li a').map(&:to_s)
145
166
  log <<~EOE
146
- The search result is empty, check the args:
167
+ The search result is empty, check the args!
147
168
  repo: #{repo}
148
169
  version: #{version ? version:'nil'}
149
-
170
+
171
+ Maybe there's no assets in this release
150
172
  EOE
151
- puts
173
+ exit 0
152
174
  end
153
175
 
154
-
155
- links = links.map { _1['href'] }
176
+ links = links.map { _1[:browser_download_url] }
156
177
 
157
178
 
158
179
  if regexp
@@ -184,55 +205,58 @@ module Ghcurl
184
205
  end
185
206
  end
186
207
 
187
- url = "https://github.com" + links[0].split('/')[0..-2].join('/') + '/' + link
208
+ url = links[0].split('/')[0..-2].join('/') + '/' + link
188
209
 
189
210
  log "Downloading #{url}"
190
211
 
191
- download_name = link.split('/').last
212
+ dl_name = link.split('/').last
192
213
 
193
- curl(url, download_name)
194
- return download_name
214
+ return curl(url, dl_name, download_to)
195
215
  end
196
216
 
197
217
 
198
-
199
- def install(dl_name, rename_as: nil, install_to: nil)
200
-
201
- if install_to.nil?
202
- install_to = BIN_PATH
203
- end
204
-
205
- target = "#{WAREHOUSE}/#{dl_name}"
218
+ #
219
+ # This function is a little confusing
220
+ #
221
+ # target: The absolute path to a downloaded file
222
+ # name : The software name
223
+ #
224
+ def install(target, rename_as: nil, install_to: nil)
206
225
 
207
226
  if target.end_with?('.deb')
208
- log "Install deb package for you"
227
+ log "Install the deb package"
209
228
  system "sudo dpkg -i #{target}"
210
229
  return
211
230
  end
212
231
 
213
232
  if target.end_with?('.rpm')
214
- log "Install rpm package for you"
233
+ log "Install the rpm package"
215
234
  system "sudo rpm -i #{target}"
216
235
  return
217
236
  end
218
237
 
219
238
 
239
+ if install_to.nil?
240
+ install_to = BIN_PATH
241
+ end
242
+
243
+
220
244
  #
221
- # The zipped file
245
+ # Handle zip situation
222
246
  #
223
-
224
247
  zip_flag = false
225
- # unzipped to dir
226
- unzip_dir = ""
227
- # unzipped files
228
- files = ""
229
- # our desired software name
230
- name = ""
231
-
248
+
232
249
  if target.match?(/\.zip$/) or target.match?(/\.tar\.(\w){1,3}/)
233
250
 
234
251
  zip_flag = true
235
252
 
253
+ # unzipped to dir
254
+ unzip_dir = ""
255
+ # unzipped files
256
+ files = ""
257
+ # the target unzipped file name (this includes the path prefix)
258
+ unzip_name = ""
259
+
236
260
  # unzip
237
261
  if target.match? /\.zip$/
238
262
  log "Unzip zip file"
@@ -249,7 +273,9 @@ module Ghcurl
249
273
  end
250
274
 
251
275
 
252
-
276
+ #
277
+ # @return [Array] file names in the dir
278
+ #
253
279
  def _iterate_dir(dir)
254
280
  result = []
255
281
  chd = Dir.children(dir)
@@ -266,28 +292,29 @@ module Ghcurl
266
292
  end
267
293
 
268
294
 
269
-
270
295
  Dir.chdir unzip_dir do
271
296
  files = _iterate_dir('.')
272
297
  end
273
298
 
274
299
 
275
300
  if files.size > 1
276
- name = HL.choose do |menu|
301
+ unzip_name = HL.choose do |menu|
277
302
  menu.index_color = :rgb_77bbff
278
303
  menu.prompt = "Which one do you want to install? "
279
304
  menu.choices( *files )
280
305
  end
281
306
  else
282
- name = files[0]
307
+ unzip_name = files[0]
283
308
  end
284
309
 
285
310
  end # end of zipped file handle
286
311
 
287
312
 
288
- if !zip_flag
289
- # downloaded name in WAREHOUSE
290
- name = dl_name
313
+ # Get software real name
314
+ if zip_flag
315
+ name = unzip_name.split('/').last
316
+ else
317
+ name = target.split('/').last
291
318
  end
292
319
 
293
320
 
@@ -302,29 +329,33 @@ module Ghcurl
302
329
  end
303
330
  end
304
331
 
305
-
332
+
306
333
  if zip_flag
307
- # add unzip_dir prefix
308
- name = unzip_dir.delete_prefix(WAREHOUSE + '/') + '/' + name
334
+ # Now:
335
+ # target is /home/xx/xx.zip
336
+ # unzip_dir is /home/xx/xx
337
+ # unzip_file is abc/cde/file (new target)
338
+ target = unzip_dir + '/' + unzip_name
309
339
  end
310
340
 
311
- if rename_as
312
- log "Renamed as '#{rename_as}'"
313
- end
341
+ log "Renamed as '#{rename_as}'" if rename_as
314
342
 
315
343
 
316
344
  case RUBY_PLATFORM
317
345
  when /ucrt/i, /mingw/i
318
- install_on_windows(name, install_to, rename_as)
346
+ install_on_windows(target, name, install_to, rename_as)
319
347
  else
320
- install_on_nix(name, install_to, rename_as)
348
+ install_on_nix(target, name, install_to, rename_as)
321
349
  end
322
350
  end
323
351
 
324
352
 
325
- def install_on_nix(name, install_to, rename_as)
326
- install_to = install_to.chomp('/')
327
- target = WAREHOUSE + '/' + name
353
+ #
354
+ # @param target [String] the absulute path of to be installed software
355
+ # @param name [String] the name of the software
356
+ #
357
+ def install_on_nix(target, name, install_to, rename_as)
358
+ install_to = install_to.chomp('/')
328
359
 
329
360
  if test 'd', install_to
330
361
  log "Ready to install #{name}"
@@ -346,7 +377,7 @@ module Ghcurl
346
377
  end
347
378
 
348
379
 
349
- def install_on_windows
380
+ def install_on_windows(target, name, install_to, rename_as)
350
381
  log "Sorry, not implemented yet on Windows! Can you help?"
351
382
  end
352
383
 
@@ -395,14 +426,15 @@ module Ghcurl
395
426
  Default install to env 'GHCURL_BIN_PATH' or /usr/local/bin
396
427
 
397
428
  usage:
398
- ghcurl [user]/repo [regexp] => Search latest version with regexp to download
399
- ghcurl repo [re] -v tag => Download a specific tag version
400
- ghcurl repo [deb/rpm] => Download and install deb/rpm package
401
- ghcurl repo [re] -i [path] => Download and install to path
402
- ghcurl repo [re] -i -r name => Download and install as 'name'
403
- ghcurl -l => List downloaded files
404
- ghcurl -d [name] => Delete a downloaded file or all
405
- ghcurl -h => Print this help
429
+ ghcurl [user]/repo [regexp] => Search latest version with regexp to download
430
+ ghcurl repo [re] -v tag => Download a specific tag version
431
+ ghcurl repo [re] -o [path] => Download into path or rename
432
+ ghcurl repo [re] -i [path] => Download and install to path
433
+ ghcurl repo [re] -o [path] -i => Download into path and install
434
+ ghcurl repo [re] -i -r name => Download and install as 'name'
435
+ ghcurl -l => List downloaded files
436
+ ghcurl -d [name] => Delete a downloaded file or all
437
+ ghcurl -h => Print this help
406
438
 
407
439
  example:
408
440
  ghcurl bat => Search sharkdp/bat the latest
@@ -424,6 +456,7 @@ extend Ghcurl
424
456
 
425
457
  class Ghcurl::CLI < CliSwitch
426
458
  option name: 'install', short: '-i', arg_required: 'optional'
459
+ option name: 'output', short: '-o', long: '--output', arg_required: 'required'
427
460
  option name: 'rename', short: '-r', arg_required: 'required'
428
461
  option name: 'version', short: '-v', arg_required: 'required'
429
462
  option name: 'help', short: '-h', long: '--help', arg_required: 'noarg'
@@ -442,6 +475,7 @@ end
442
475
  repo_or_name, regexp = args[0], args[1]
443
476
  version = nil
444
477
  need_install = false
478
+ download_to = nil
445
479
  install_to = nil
446
480
  rename_as = nil
447
481
 
@@ -458,6 +492,8 @@ opts.each do
458
492
  exit
459
493
  when 'version'
460
494
  version = _1.next_arg
495
+ when 'output'
496
+ download_to = _1.next_arg
461
497
  when 'install'
462
498
  need_install = true
463
499
  install_to = _1.next_arg
@@ -470,13 +506,14 @@ end
470
506
  # p repo_or_name
471
507
  # p regexp
472
508
  # p need_install
509
+ # p download_to
473
510
  # p install_to
474
511
  # p rename_as
475
512
 
476
513
  begin
477
- dl_name = download(repo_or_name, regexp, version: version)
514
+ ware = download(repo_or_name, regexp, version: version, download_to: download_to)
478
515
  if need_install
479
- install(dl_name, rename_as: rename_as, install_to: install_to)
516
+ install(ware, rename_as: rename_as, install_to: install_to)
480
517
  end
481
518
  rescue Interrupt
482
519
  end
data/lib/ghcurl.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # File : ghcurl.rb
3
3
  # Authors : ccmywish <ccmywish@qq.com>
4
4
  # Created on : <2022-04-12>
5
- # Last modified : <2022-04-15>
5
+ # Last modified : <2022-04-26>
6
6
  #
7
7
  # ghcurl:
8
8
  #
@@ -12,7 +12,7 @@
12
12
 
13
13
  module Ghcurl
14
14
 
15
- VERSION = "0.6.0"
15
+ VERSION = "0.7.0"
16
16
 
17
17
  end
18
18
 
@@ -24,6 +24,7 @@ end
24
24
  Ghcurl::DEFAULT_WARES = {
25
25
 
26
26
  cli: 'cli/cli',
27
+ gh: 'cli/cli',
27
28
 
28
29
  fd: 'sharkdp/fd',
29
30
  bat: 'sharkdp/bat',
@@ -61,6 +62,7 @@ Ghcurl::DEFAULT_WARES = {
61
62
  xh: 'ducaale/xh',
62
63
  zoxide: 'ajeetdsouza/zoxide',
63
64
 
64
- scc: 'boyter/scc',
65
- rbspy: 'rbspy/rbspy'
65
+ scc: 'boyter/scc',
66
+ rbspy: 'rbspy/rbspy',
67
+ starship: 'starship/starship'
66
68
  }
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghcurl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ccmywish
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-14 00:00:00.000000000 Z
11
+ date: 2022-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: nokogiri
14
+ name: octokit
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: '4.22'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: '4.22'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: highline
29
29
  requirement: !ruby/object:Gem::Requirement