ghcurl 0.6.0 → 0.8.0

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 (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -10
  3. data/bin/ghcurl +116 -73
  4. data/lib/ghcurl.rb +9 -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: a2238b90c3f61619eb9f28f29ed7f8c877ef524936e394511e95fd9fd239142e
4
+ data.tar.gz: '0821dc3f69cc443c42d18200c8c92a60415d8bac045de7ac4388e814e08ecca5'
5
5
  SHA512:
6
- metadata.gz: 71a3fd97dc832a34b358f87a1be6b925e07647e83506545d13384229a42a24f34a6ab4c6c362a3b482b914e5bbff620fa8a0f3aa545dc771db371ad7eb366c7a
7
- data.tar.gz: 3b407e1b7b4ebf046621567d9a1aba7d60cbd55754de54b4e85b7c9af583a57054cd7b50868761249ae385f9aded3eae9d5ca0cc8913245e03b14eaa50bc2f09
6
+ metadata.gz: e5c5f13aa7f4a10e5a06daf7bcf3f580ef4f2d05ba0d62bf7ddbcc433f6f840f3fe9027557ee24cb5bcf25a0b9eb2ce2ed3afe6cc412cd5efd1454246cb3a346
7
+ data.tar.gz: cb845d8d93fdcbc324a2fa3fa3f037049c7e95852c77746ff00207c34839eda761c6e3b84d5723c0052c6d7ec1392b265c3da092b0ba8f70b89135c0bb5d4022
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-29>
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,29 @@ module Ghcurl
37
35
  end
38
36
 
39
37
 
40
- def curl(url, name)
41
- cmd = "curl -L #{url} --create-dirs -o #{WAREHOUSE}/#{name}"
42
- system cmd
43
- log "Downloaded to #{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}"
54
+ status = system cmd
55
+ if status == false || status.nil?
56
+ log "Download error!"
57
+ exit
58
+ end
59
+ log "Downloaded to #{to}"
60
+ return to
44
61
  end
45
62
 
46
63
 
@@ -113,8 +130,11 @@ module Ghcurl
113
130
  end
114
131
 
115
132
 
116
- def download(repo, regexp, version: nil)
133
+ def download(repo, regexp, version: nil, download_to: nil)
117
134
 
135
+ require 'octokit'
136
+
137
+ # adjust repo name : user/repo
118
138
  if repo =~ /^https:\/\/github.com/
119
139
  require 'uri'
120
140
  uri = URI(repo)
@@ -132,27 +152,33 @@ module Ghcurl
132
152
  end
133
153
 
134
154
  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}")
155
+ begin
156
+ unless version
157
+ doc = Octokit::Client.new.latest_release(repo)
158
+ else
159
+ doc = Octokit::Client.new.release_for_tag(repo, 'v' + version)
160
+ end
161
+ rescue Octokit::NotFound
162
+ log "Not found #{repo} v#{version} !"
163
+ exit
164
+ rescue StandardError => e
165
+ log e
166
+ exit
139
167
  end
140
168
 
141
-
142
- links = doc.css("li>a[href^='/#{repo}/releases/download']")
169
+ links = doc.to_hash[:assets]
143
170
  if links.empty?
144
- puts doc.css('li a').map(&:to_s)
145
171
  log <<~EOE
146
- The search result is empty, check the args:
172
+ The search result is empty, check the args!
147
173
  repo: #{repo}
148
174
  version: #{version ? version:'nil'}
149
-
175
+
176
+ Maybe there's no assets in this release
150
177
  EOE
151
- puts
178
+ exit 0
152
179
  end
153
180
 
154
-
155
- links = links.map { _1['href'] }
181
+ links = links.map { _1[:browser_download_url] }
156
182
 
157
183
 
158
184
  if regexp
@@ -184,55 +210,58 @@ module Ghcurl
184
210
  end
185
211
  end
186
212
 
187
- url = "https://github.com" + links[0].split('/')[0..-2].join('/') + '/' + link
213
+ url = links[0].split('/')[0..-2].join('/') + '/' + link
188
214
 
189
215
  log "Downloading #{url}"
190
216
 
191
- download_name = link.split('/').last
217
+ dl_name = link.split('/').last
192
218
 
193
- curl(url, download_name)
194
- return download_name
219
+ return curl(url, dl_name, download_to)
195
220
  end
196
221
 
197
222
 
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}"
223
+ #
224
+ # This function is a little confusing
225
+ #
226
+ # target: The absolute path to a downloaded file
227
+ # name : The software name
228
+ #
229
+ def install(target, rename_as: nil, install_to: nil)
206
230
 
207
231
  if target.end_with?('.deb')
208
- log "Install deb package for you"
232
+ log "Install the deb package"
209
233
  system "sudo dpkg -i #{target}"
210
234
  return
211
235
  end
212
236
 
213
237
  if target.end_with?('.rpm')
214
- log "Install rpm package for you"
238
+ log "Install the rpm package"
215
239
  system "sudo rpm -i #{target}"
216
240
  return
217
241
  end
218
242
 
219
243
 
244
+ if install_to.nil?
245
+ install_to = BIN_PATH
246
+ end
247
+
248
+
220
249
  #
221
- # The zipped file
250
+ # Handle zip situation
222
251
  #
223
-
224
252
  zip_flag = false
225
- # unzipped to dir
226
- unzip_dir = ""
227
- # unzipped files
228
- files = ""
229
- # our desired software name
230
- name = ""
231
-
253
+
232
254
  if target.match?(/\.zip$/) or target.match?(/\.tar\.(\w){1,3}/)
233
255
 
234
256
  zip_flag = true
235
257
 
258
+ # unzipped to dir
259
+ unzip_dir = ""
260
+ # unzipped files
261
+ files = ""
262
+ # the target unzipped file name (this includes the path prefix)
263
+ unzip_name = ""
264
+
236
265
  # unzip
237
266
  if target.match? /\.zip$/
238
267
  log "Unzip zip file"
@@ -249,7 +278,9 @@ module Ghcurl
249
278
  end
250
279
 
251
280
 
252
-
281
+ #
282
+ # @return [Array] file names in the dir
283
+ #
253
284
  def _iterate_dir(dir)
254
285
  result = []
255
286
  chd = Dir.children(dir)
@@ -266,28 +297,29 @@ module Ghcurl
266
297
  end
267
298
 
268
299
 
269
-
270
300
  Dir.chdir unzip_dir do
271
301
  files = _iterate_dir('.')
272
302
  end
273
303
 
274
304
 
275
305
  if files.size > 1
276
- name = HL.choose do |menu|
306
+ unzip_name = HL.choose do |menu|
277
307
  menu.index_color = :rgb_77bbff
278
308
  menu.prompt = "Which one do you want to install? "
279
309
  menu.choices( *files )
280
310
  end
281
311
  else
282
- name = files[0]
312
+ unzip_name = files[0]
283
313
  end
284
314
 
285
315
  end # end of zipped file handle
286
316
 
287
317
 
288
- if !zip_flag
289
- # downloaded name in WAREHOUSE
290
- name = dl_name
318
+ # Get software real name
319
+ if zip_flag
320
+ name = unzip_name.split('/').last
321
+ else
322
+ name = target.split('/').last
291
323
  end
292
324
 
293
325
 
@@ -302,29 +334,33 @@ module Ghcurl
302
334
  end
303
335
  end
304
336
 
305
-
337
+
306
338
  if zip_flag
307
- # add unzip_dir prefix
308
- name = unzip_dir.delete_prefix(WAREHOUSE + '/') + '/' + name
339
+ # Now:
340
+ # target is /home/xx/xx.zip
341
+ # unzip_dir is /home/xx/xx
342
+ # unzip_file is abc/cde/file (new target)
343
+ target = unzip_dir + '/' + unzip_name
309
344
  end
310
345
 
311
- if rename_as
312
- log "Renamed as '#{rename_as}'"
313
- end
346
+ log "Renamed as '#{rename_as}'" if rename_as
314
347
 
315
348
 
316
349
  case RUBY_PLATFORM
317
350
  when /ucrt/i, /mingw/i
318
- install_on_windows(name, install_to, rename_as)
351
+ install_on_windows(target, name, install_to, rename_as)
319
352
  else
320
- install_on_nix(name, install_to, rename_as)
353
+ install_on_nix(target, name, install_to, rename_as)
321
354
  end
322
355
  end
323
356
 
324
357
 
325
- def install_on_nix(name, install_to, rename_as)
326
- install_to = install_to.chomp('/')
327
- target = WAREHOUSE + '/' + name
358
+ #
359
+ # @param target [String] the absulute path of to be installed software
360
+ # @param name [String] the name of the software
361
+ #
362
+ def install_on_nix(target, name, install_to, rename_as)
363
+ install_to = install_to.chomp('/')
328
364
 
329
365
  if test 'd', install_to
330
366
  log "Ready to install #{name}"
@@ -346,7 +382,7 @@ module Ghcurl
346
382
  end
347
383
 
348
384
 
349
- def install_on_windows
385
+ def install_on_windows(target, name, install_to, rename_as)
350
386
  log "Sorry, not implemented yet on Windows! Can you help?"
351
387
  end
352
388
 
@@ -355,6 +391,7 @@ module Ghcurl
355
391
  # For -l option
356
392
  #
357
393
  def list_wares
394
+ FileUtils.mkdir_p(WAREHOUSE)
358
395
  puts blue("ghcurl: #{WAREHOUSE}")
359
396
  Dir.children(WAREHOUSE).each_with_index do |dict,i|
360
397
  puts "#{blue(i+1)}. #{bold(green(dict))}"
@@ -369,7 +406,7 @@ module Ghcurl
369
406
  begin
370
407
 
371
408
  if name.nil?
372
- re = HL.ask "Do you want to delete all downloaded files?"
409
+ re = HL.ask "Do you want to delete all downloaded files?[Enter to yes or n]"
373
410
  case re.downcase
374
411
  when '','y','ye','yes','true'
375
412
  FileUtils.rm_rf WAREHOUSE
@@ -395,14 +432,15 @@ module Ghcurl
395
432
  Default install to env 'GHCURL_BIN_PATH' or /usr/local/bin
396
433
 
397
434
  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
435
+ ghcurl [user]/repo [regexp] => Search latest version with regexp to download
436
+ ghcurl repo [re] -v tag => Download a specific tag version
437
+ ghcurl repo [re] -o [path] => Download into path or rename
438
+ ghcurl repo [re] -i [path] => Download and install to path
439
+ ghcurl repo [re] -o [path] -i => Download into path and install
440
+ ghcurl repo [re] -i -r name => Download and install as 'name'
441
+ ghcurl -l => List downloaded files
442
+ ghcurl -d [name] => Delete a downloaded file or all
443
+ ghcurl -h => Print this help
406
444
 
407
445
  example:
408
446
  ghcurl bat => Search sharkdp/bat the latest
@@ -424,6 +462,7 @@ extend Ghcurl
424
462
 
425
463
  class Ghcurl::CLI < CliSwitch
426
464
  option name: 'install', short: '-i', arg_required: 'optional'
465
+ option name: 'output', short: '-o', long: '--output', arg_required: 'required'
427
466
  option name: 'rename', short: '-r', arg_required: 'required'
428
467
  option name: 'version', short: '-v', arg_required: 'required'
429
468
  option name: 'help', short: '-h', long: '--help', arg_required: 'noarg'
@@ -442,6 +481,7 @@ end
442
481
  repo_or_name, regexp = args[0], args[1]
443
482
  version = nil
444
483
  need_install = false
484
+ download_to = nil
445
485
  install_to = nil
446
486
  rename_as = nil
447
487
 
@@ -458,6 +498,8 @@ opts.each do
458
498
  exit
459
499
  when 'version'
460
500
  version = _1.next_arg
501
+ when 'output'
502
+ download_to = _1.next_arg
461
503
  when 'install'
462
504
  need_install = true
463
505
  install_to = _1.next_arg
@@ -470,13 +512,14 @@ end
470
512
  # p repo_or_name
471
513
  # p regexp
472
514
  # p need_install
515
+ # p download_to
473
516
  # p install_to
474
517
  # p rename_as
475
518
 
476
519
  begin
477
- dl_name = download(repo_or_name, regexp, version: version)
520
+ ware = download(repo_or_name, regexp, version: version, download_to: download_to)
478
521
  if need_install
479
- install(dl_name, rename_as: rename_as, install_to: install_to)
522
+ install(ware, rename_as: rename_as, install_to: install_to)
480
523
  end
481
524
  rescue Interrupt
482
525
  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-29>
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.8.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,10 @@ 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',
68
+
69
+ glow: 'charmbracelet/glow'
70
+
66
71
  }
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.8.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-29 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