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.
- checksums.yaml +4 -4
- data/README.md +45 -10
- data/bin/ghcurl +116 -73
- data/lib/ghcurl.rb +9 -4
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2238b90c3f61619eb9f28f29ed7f8c877ef524936e394511e95fd9fd239142e
|
4
|
+
data.tar.gz: '0821dc3f69cc443c42d18200c8c92a60415d8bac045de7ac4388e814e08ecca5'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5c5f13aa7f4a10e5a06daf7bcf3f580ef4f2d05ba0d62bf7ddbcc433f6f840f3fe9027557ee24cb5bcf25a0b9eb2ce2ed3afe6cc412cd5efd1454246cb3a346
|
7
|
+
data.tar.gz: cb845d8d93fdcbc324a2fa3fa3f037049c7e95852c77746ff00207c34839eda761c6e3b84d5723c0052c6d7ec1392b265c3da092b0ba8f70b89135c0bb5d4022
|
data/README.md
CHANGED
@@ -4,21 +4,47 @@
|
|
4
4
|
|
5
5
|
[](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
|
-
|
22
|
+
## Usage
|
14
23
|
|
15
|
-
|
24
|
+
```bash
|
25
|
+
$ ghcurl [user/]repo [regexp] [options]
|
26
|
+
```
|
16
27
|
|
17
|
-
|
28
|
+
**-o**
|
18
29
|
|
19
|
-
|
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
|
-
|
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
|
88
|
+
ghcurl starship linux-gnu -i
|
57
89
|
|
58
90
|
# Install to ~/tmp/bin
|
59
|
-
ghcurl BetaPictoris/timeleft
|
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-
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
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
|
-
|
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 =
|
213
|
+
url = links[0].split('/')[0..-2].join('/') + '/' + link
|
188
214
|
|
189
215
|
log "Downloading #{url}"
|
190
216
|
|
191
|
-
|
217
|
+
dl_name = link.split('/').last
|
192
218
|
|
193
|
-
curl(url,
|
194
|
-
return download_name
|
219
|
+
return curl(url, dl_name, download_to)
|
195
220
|
end
|
196
221
|
|
197
222
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
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
|
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
|
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
|
-
#
|
250
|
+
# Handle zip situation
|
222
251
|
#
|
223
|
-
|
224
252
|
zip_flag = false
|
225
|
-
|
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
|
-
|
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
|
-
|
312
|
+
unzip_name = files[0]
|
283
313
|
end
|
284
314
|
|
285
315
|
end # end of zipped file handle
|
286
316
|
|
287
317
|
|
288
|
-
|
289
|
-
|
290
|
-
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
|
-
#
|
308
|
-
|
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
|
-
|
326
|
-
|
327
|
-
|
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]
|
399
|
-
ghcurl repo [re] -v tag
|
400
|
-
ghcurl repo [
|
401
|
-
ghcurl repo [re] -i [path]
|
402
|
-
ghcurl repo [re] -
|
403
|
-
ghcurl -
|
404
|
-
ghcurl -
|
405
|
-
ghcurl -
|
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
|
-
|
520
|
+
ware = download(repo_or_name, regexp, version: version, download_to: download_to)
|
478
521
|
if need_install
|
479
|
-
install(
|
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-
|
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.
|
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:
|
65
|
-
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.
|
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-
|
11
|
+
date: 2022-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: octokit
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
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: '
|
26
|
+
version: '4.22'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: highline
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|