ghcurl 0.4.0 → 0.5.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 +0 -18
  3. data/bin/ghcurl +197 -60
  4. data/lib/ghcurl.rb +65 -0
  5. metadata +31 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93c6f4a7b36d196072151ee1b8b62785072dac59291080436ff9d387e387e966
4
- data.tar.gz: 6f441d27a1d0daa7ba05ed44dec04f436286eac3a5b2d2621d76c340eb442b2b
3
+ metadata.gz: 9b4840d95efdb75df9837f357689f9a4e1de17d22149d95a0843d26925923341
4
+ data.tar.gz: 13f087583da4f41ff0e94be251e74fe565981e8c01e73867a1be0e25ab88065f
5
5
  SHA512:
6
- metadata.gz: 66263a60ee4ada61f3901bad75ec026994ccffa9839962c18aa48c6e25212bc74d16e1aa402a2c4b6e50f638d2f6efd453c048ef231bed0f9cc85cb5029402c2
7
- data.tar.gz: 60544aa30cbc50533763400c9e4296ff4017912585fd0d8adad24bdbf65d88f89557c358de012f768ca2a2b7467d409d692bc17256b6da4ffafb705383f97a83
6
+ metadata.gz: be2b7c9bd8de0b137d8bdd07d49bdb9a30a3906e8034e87ac850047809ba2ec6dc24909b82feed5a53550532001222c0ae999e7441af27322c9ea34d18930289
7
+ data.tar.gz: 19d2d408baa93e56c2ce1145b7e2319283f9a18053f0cadf1fe46c9d4139356a7802794c534d5a4b6362189884e0089b2b0248781d800896e550cec1ea2e10a7
data/README.md CHANGED
@@ -47,21 +47,3 @@ ghcurl dlvhdr/gh-dash linux-amd64 -i ~/tmp/bin/gd
47
47
  ```
48
48
 
49
49
  <br>
50
-
51
- ## How does it works?
52
-
53
- For future contributers and myself, I'll tell you how to maintain this.
54
-
55
- In `ghcurl` previous to `0.3.1`, I write this code piece:
56
- ```ruby
57
- unless version
58
- # Notice: releases/tag/vx.x.x/download not works!!!
59
- # This is a link relocation
60
- url = "https://github.com/#{repo}/releases/latest/download/#{ware}"
61
- else
62
- # The real download link
63
- url = "https://github.com/#{repo}/releases/download/v#{version}/#{ware}"
64
- end
65
- ```
66
-
67
- As you can see, it considers the Github router when you try to install a **latest** one, which are very unreliable, and you should specify a precise name for the thing you want to download. So from `0.4.0` I changed this via a slow but useful method: check the HTML file in the release page, and search the string user request which is not necessarily accurate, to find the download link directly.
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-13>
6
+ # Last modified : <2022-04-14>
7
7
  #
8
8
  # ghcurl:
9
9
  #
@@ -11,15 +11,18 @@
11
11
  #
12
12
  # ------------------------------------------------------
13
13
 
14
+ require 'ghcurl'
14
15
  require 'nokogiri'
15
16
  require 'open-uri'
17
+ require 'highline'
18
+ require 'cliswitch'
16
19
 
17
20
  module Ghcurl
18
21
 
19
- VERSION = "0.4.0"
20
22
  WAREHOUSE = File.expand_path("~/.cache/ghcurl")
21
- BIN_PATH = "/usr/local/bin"
22
-
23
+ BIN_PATH = ENV['GHCURL_BIN_PATH'] || "/usr/local/bin"
24
+ HL = HighLine.new
25
+
23
26
  class Error < StandardError; end
24
27
 
25
28
 
@@ -44,13 +47,90 @@ module Ghcurl
44
47
  end
45
48
 
46
49
 
47
- def download(repo, ware, version: nil)
50
+ def get_filters
51
+
52
+ arches = [
53
+ ['amd64', 'x86_64', 'x64'],
54
+ ['386', 'i686'],
55
+ ['arm64', 'aarch64'],
56
+ ['armv6', 'arm'],
57
+ ]
58
+
59
+ oses = [
60
+ ['linux'],
61
+ ['mac', 'apple'],
62
+ ['windows']
63
+ ]
64
+
65
+ fs = RUBY_PLATFORM.split('-')
66
+ os = ""
67
+ arch = ""
68
+ fs.each do |f|
69
+ case f
70
+ when 'linux' then os = 'linux'
71
+ when 'mac','macOS' then os = 'mac'
72
+ when 'ucrt', 'mingw', 'windows' then os = 'windows'
73
+ when 'x86_64' then arch = 'x86_64'
74
+ when 'x86' then arch = 'x86'
75
+ when 'amd64' then arch = 'amd64'
76
+ when 'arm64' then arch = 'arm64'
77
+ when 'armv6' then arch = 'armv6'
78
+ end
79
+ end
80
+
81
+ approval, refuse = [], []
82
+ # [os, arch].each { approval << _1 unless _1.nil? }
83
+
84
+ if os
85
+ i = oses.each_with_index do |type, index|
86
+ break index if type.include? os
87
+ end
88
+ if !i.nil?
89
+ tmp = oses.dup
90
+ tmp.delete_at(i)
91
+ refuse.concat tmp.flatten
92
+ end
93
+ end
94
+
95
+
96
+ if arch
97
+ i = arches.each_with_index do |type, index|
98
+ break index if type.include? arch
99
+ end
100
+ if !i.nil?
101
+ tmp = arches.dup
102
+ tmp.delete_at(i)
103
+ refuse.concat tmp.flatten
104
+ end
105
+ end
106
+
107
+ # Debug
108
+ # puts "=> Approval and refuse"
109
+ # p [os, arch]
110
+ # p refuse
111
+
112
+ # Now we only refuse others
113
+ return refuse
114
+
115
+ end
116
+
117
+
118
+ def download(repo, regexp, version: nil)
48
119
 
49
120
  if repo =~ /^https:\/\/github.com/
50
121
  require 'uri'
51
122
  uri = URI(repo)
52
123
  # index 1, take 2
53
124
  repo = uri.path.split('/')[1,2].join('/')
125
+ elsif !repo.include?('/')
126
+ got_repo = DEFAULT_WARES[repo.to_sym]
127
+ if not got_repo
128
+ user = HL.ask "Who developed the awesome '#{repo}' ? "
129
+ repo = user + '/' + repo
130
+ else
131
+ repo = got_repo
132
+ log "Use the popular repo #{repo}"
133
+ end
54
134
  end
55
135
 
56
136
  log "checking..."
@@ -68,16 +148,45 @@ module Ghcurl
68
148
  The search result is empty, check the args:
69
149
  repo: #{repo}
70
150
  version: #{version ? version:'nil'}
71
- regexp: #{ware}
151
+
72
152
  EOE
73
153
  puts
74
154
  end
75
-
76
- link = links.each do
77
- break _1['href'] if _1['href'] =~ /#{ware}/
155
+
156
+
157
+ links = links.map { _1['href'] }
158
+
159
+
160
+ if regexp
161
+ filtered = links.select do
162
+ _1 =~ /#{regexp}/
163
+ end
164
+ else
165
+ refuse = get_filters()
166
+ filtered = links.select do |l|
167
+ refuse.all? do |f|
168
+ l !~ /#{f}/
169
+ end
170
+ end
171
+ end
172
+
173
+
174
+ if filtered.size == 1
175
+ link = filtered[0].split('/').last
176
+ else
177
+ if filtered.size == 0
178
+ links_for_user = links.map { _1.split('/').last }
179
+ else
180
+ links_for_user = filtered.map { _1.split('/').last }
181
+ end
182
+ link = HL.choose do |menu|
183
+ menu.index_color = :rgb_77bbff
184
+ menu.prompt = "Which one do you want to download? "
185
+ menu.choices( *links_for_user )
186
+ end
78
187
  end
79
188
 
80
- url = "https://github.com" + link
189
+ url = "https://github.com" + links[0].split('/')[0..-2].join('/') + '/' + link
81
190
 
82
191
  log "Downloading #{url}"
83
192
 
@@ -87,12 +196,29 @@ module Ghcurl
87
196
 
88
197
  end
89
198
 
199
+
90
200
  def install(ware, place: BIN_PATH)
201
+
202
+ ware_name = ''
203
+ if ware.include?('/')
204
+ ware_name = ware.split('/').last
205
+ else
206
+ ware_name = ware
207
+ end
208
+
209
+ if (! $downloaded.include?(ware_name)) and (!$downloaded.end_with?('.deb')) and (!$downloaded.end_with?('.rpm'))
210
+ log "Do you want to rename or install it to a different path?"
211
+ re = HL.ask "Input path or name, or just enter to say no."
212
+ if !re.empty?
213
+ place = re
214
+ end
215
+ end
216
+
91
217
  case RUBY_PLATFORM
92
218
  when /ucrt/i, /mingw/i
93
- install_on_windows(ware, place)
219
+ install_on_windows($downloaded, place)
94
220
  else
95
- install_on_nix(ware, place)
221
+ install_on_nix($downloaded, place)
96
222
  end
97
223
  log "Install finish!"
98
224
  end
@@ -136,6 +262,7 @@ module Ghcurl
136
262
 
137
263
 
138
264
  def install_on_windows
265
+ log "Sorry, not implemented yet!"
139
266
  end
140
267
 
141
268
 
@@ -152,21 +279,23 @@ module Ghcurl
152
279
 
153
280
  def help
154
281
  puts <<~EOC
155
- ghcurl (v#{VERSION}): Download files (and install) from Github releases
282
+ ghcurl (v#{VERSION}): Download files and install from Github releases
283
+
284
+ Default install to env 'GHCURL_BIN_PATH' or /usr/local/bin
156
285
 
157
286
  usage:
158
- ghcurl repo_url regexp => Search in repo_url the latest to download
159
- ghcurl user/repo regexp => Search in user/repo the latest to download
160
- ghcurl url re -v tag => Download a specific tag version
161
- ghcurl url re deb/rpm => Download and install deb/rpm package
162
- ghcurl url re -i [path] => Download and install to /usr/local/bin
163
- ghcurl url re -i name => Download and install as 'name'
164
- ghcurl -l => List downloaded files
165
- ghcurl -h => Print this help
287
+ ghcurl [user]/repo [regexp] => Search latest version with regexp to download
288
+ ghcurl repo [re] -v tag => Download a specific tag version
289
+ ghcurl repo [deb/rpm] => Download and install deb/rpm package
290
+ ghcurl repo [re] -i [path] => Download and install to path
291
+ ghcurl repo [re] -i name => Download and install as 'name'
292
+ ghcurl -l => List downloaded files
293
+ ghcurl -h => Print this help
166
294
 
167
295
  example:
296
+ ghcurl bat => Search sharkdp/bat the latest
297
+ ghcurl cli deb -i => Search cli/cli /deb/
168
298
  ghcurl rbspy/rbspy 'x86_64.*linux' -v0.11.1
169
- ghcurl cli/cli deb -i
170
299
 
171
300
  EOC
172
301
  end
@@ -180,53 +309,61 @@ end
180
309
  ####################
181
310
  extend Ghcurl
182
311
 
183
- # e.g. ccmywish/binary
184
- gh_repo, ware = ARGV.shift(2)
185
- case gh_repo
186
- when '-l' then list_wares ; exit
187
- when '-h', '--help' then help ; exit
188
- when nil then help ; exit
189
- end
190
-
191
- if ware.nil?
192
- log "ghcurl: Download what?"
193
- log " use: ghcurl repo file"
194
- exit
195
- end
196
-
312
+ CO = CliSwitch::Option
313
+ op_config = [] << CO.new(name: 'install', short: '-i', arg_required: 'optional') <<
314
+ CO.new(name: 'version', short: '-v', arg_required: 'required') <<
315
+ CO.new(name: 'help', short: '-h', long: '--help', arg_required: 'noarg') <<
316
+ CO.new(name: 'list', short: '-l', arg_required: 'noarg')
197
317
 
198
- arg = ARGV.shift
318
+ cli = CliSwitch.new(op_config)
319
+ args, opts = cli.parse(ARGV)
199
320
 
200
- next_op = true
321
+ if args.empty? and opts.empty?
322
+ help
323
+ exit
324
+ end
201
325
 
202
- case arg
203
- when '-v'
204
- download gh_repo, ware, version: ARGV.shift
205
- when /-v\d.*/
206
- v = arg.split('-v')[1]
207
- download gh_repo, ware, version: v
326
+ if args.size >= 2
327
+ repo_or_name, regexp = args[0], args[1]
208
328
  else
209
- download gh_repo, ware
210
- next_op = false
329
+ repo_or_name, regexp = args[0], nil
211
330
  end
212
331
 
213
332
 
214
- if next_op
215
- next_op = ARGV.shift
216
- else
217
- next_op = arg
333
+ version = nil
334
+ need_install = false
335
+ install_to = nil
336
+
337
+ opts.each do
338
+ case _1.name
339
+ when 'help'
340
+ help
341
+ exit
342
+ when 'list'
343
+ list_wares
344
+ exit
345
+ when 'version'
346
+ version = _1.next_arg
347
+ when 'install'
348
+ need_install = true
349
+ install_to = _1.next_arg
350
+ end
218
351
  end
219
352
 
220
-
221
- case next_op
222
- when '-i'
223
- place = ARGV.shift
224
- if place.nil?
225
- install($downloaded)
353
+ # Debug
354
+ # p repo_or_name
355
+ # p regexp
356
+ # p need_install
357
+ # p install_to
358
+
359
+ begin
360
+ download(repo_or_name, regexp, version: version)
361
+ if need_install
362
+ if install_to
363
+ install(repo_or_name, place: install_to)
226
364
  else
227
- install($downloaded, place: place)
365
+ install(repo_or_name)
228
366
  end
229
- when /-i.*/
230
- place = next_op.split('-i')[1]
231
- install($downloaded, place: place)
367
+ end
368
+ rescue Interrupt
232
369
  end
data/lib/ghcurl.rb ADDED
@@ -0,0 +1,65 @@
1
+ # ------------------------------------------------------
2
+ # File : ghcurl.rb
3
+ # Authors : ccmywish <ccmywish@qq.com>
4
+ # Created on : <2022-04-12>
5
+ # Last modified : <2022-04-14>
6
+ #
7
+ # ghcurl:
8
+ #
9
+ # This is the lib file.
10
+ #
11
+ # ------------------------------------------------------
12
+
13
+ module Ghcurl
14
+
15
+ VERSION = "0.5.0"
16
+
17
+ end
18
+
19
+ #
20
+ # We consider from this:
21
+ #
22
+ # https://github.com/ibraheemdev/modern-unix
23
+ #
24
+ Ghcurl::DEFAULT_WARES = {
25
+
26
+ cli: 'cli/cli',
27
+
28
+ fd: 'sharkdp/fd',
29
+ bat: 'sharkdp/bat',
30
+ hyperfine: 'sharkdp/hyperfine',
31
+ hexyl: 'sharkdp/hexyl',
32
+
33
+ exa: 'ogham/exa',
34
+ dog: 'ogham/dog',
35
+
36
+ lsd: 'Peltoche/lsd',
37
+ delta: 'dandavison/delta',
38
+ dust: 'bootandy/dust',
39
+ duf: 'muesli/duf',
40
+ broot: 'Canop/broot',
41
+
42
+ ripgrep: 'BurntSushi/ripgrep',
43
+ rg: 'BurntSushi/ripgrep',
44
+ ag: 'ggreer/the_silver_searcher',
45
+
46
+ fzf: 'junegunn/fzf',
47
+ fzy: 'jhawthorn/fzy',
48
+
49
+ mcfly: 'cantino/mcfly',
50
+ choose: 'theryangeary/choose',
51
+ jq: 'stedolan/jq',
52
+ sd: 'chmln/sd',
53
+ cheat: 'cheat/cheat',
54
+ bottom: 'ClementTsang/bottom',
55
+ glances: 'nicolargo/glances',
56
+ gtop: 'aksakalli/gtop',
57
+ gping: 'orf/gping',
58
+ procs: 'dalance/procs',
59
+ httpie: 'httpie/httpie',
60
+ curlie: 'rs/curlie',
61
+ xh: 'ducaale/xh',
62
+ zoxide: 'ajeetdsouza/zoxide',
63
+
64
+ scc: 'boyter/scc'
65
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghcurl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.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-12 00:00:00.000000000 Z
11
+ date: 2022-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: highline
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cliswitch
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.2'
27
55
  description: Download files (and install) from Github releases.
28
56
  email:
29
57
  - ccmywish@qq.com
@@ -37,6 +65,7 @@ files:
37
65
  - README.md
38
66
  - Rakefile
39
67
  - bin/ghcurl
68
+ - lib/ghcurl.rb
40
69
  homepage: https://github.com/ccmywish/ghcurl
41
70
  licenses:
42
71
  - MIT