-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstall.rb
135 lines (111 loc) · 3.7 KB
/
install.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
require 'json'
require 'net/http'
require 'uri'
require 'fileutils'
require 'zip'
require 'optparse'
require 'colorize'
# Função para ler o arquivo fonts.json
def load_fonts_json(file_path)
file = File.read(file_path)
JSON.parse(file)
end
# Função para seguir redirecionamentos
def follow_redirects(uri, limit = 10)
raise 'Demasiados redirecionamentos' if limit == 0
response = Net::HTTP.get_response(uri)
case response
when Net::HTTPSuccess then
uri
when Net::HTTPRedirection then
new_uri = URI(response['location'])
follow_redirects(new_uri, limit - 1)
else
raise "Erro ao acessar #{uri}: #{response.code} #{response.message}"
end
end
# Função para baixar e descompactar os arquivos zip
def download_and_extract(url, install_dir)
uri = URI(url)
filename = File.join(install_dir, File.basename(uri.path))
# Seguir redirecionamentos, se houver
uri = follow_redirects(uri)
puts "Baixando de: #{url} > Salvando como: #{filename}"
# Baixar o arquivo
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
request = Net::HTTP::Get.new(uri)
http.request(request) do |response|
File.open(filename, 'wb') do |file|
response.read_body do |chunk|
file.write(chunk) unless chunk.nil? || chunk.empty?
end
end
end
end
# Verificar se o arquivo foi baixado corretamente
if File.size?(filename).nil? || File.size?(filename) == 0
puts "Erro: O arquivo #{filename} foi baixado com tamanho zero."
return
end
# Descompactar o arquivo zip
Zip::File.open(filename) do |zip_file|
zip_file.each do |entry|
entry.extract(File.join(install_dir, entry.name)) { true }
end
end
# Remover o arquivo zip após extração
File.delete(filename)
end
# Função para processar a escolha das fontes
def process_font_selection(selection, fonts)
# Separar intervalos e números individuais
selected_fonts = []
selection.split(',').each do |part|
if part.include?('-')
range = part.split('-').map(&:to_i)
selected_fonts.concat((range[0]..range[1]).to_a)
else
selected_fonts << part.to_i
end
end
selected_fonts.uniq
# Mostrar fontes selecionadas
selected_fonts.map { |num| fonts.keys[num - 1] }
end
# Parsing de argumentos da linha de comando para a versão
options = { version: '3.2.1' }
OptionParser.new do |opts|
opts.banner = "Uso: ruby install.rb [opções]"
opts.on("-v", "--version VERSION", "Especificar versão das fontes (default: v3.2.1)") do |v|
options[:version] = "v#{v}"
end
end.parse!
# Carregar o JSON de fontes do arquivo fonts.json
fonts_json = load_fonts_json('fonts.json')
# Substituir VERSION no JSON pelas opções ou padrão
fonts_json["fonts"].each do |font_name, url|
fonts_json["fonts"][font_name] = url.gsub('VERSION', options[:version])
end
# Exibir o menu de fontes
puts "Selecione as fontes que deseja instalar (ex: 1-5,7,10-12):"
puts "0. TODAS AS FONTES".yellow
fonts_json["fonts"].keys.each_with_index do |font, index|
puts "#{index + 1}. #{font}"
end
# Capturar a seleção do usuário (usando $stdin.gets para evitar confusão com redirecionamento)
puts "Digite sua escolha:"
selection = $stdin.gets.chomp
selected_fonts = process_font_selection(selection, fonts_json["fonts"])
# Definir o diretório de instalação
install_dir = File.join(Dir.home, ".fonts")
FileUtils.mkdir_p(install_dir) unless Dir.exist?(install_dir)
# Instalar fontes selecionadas
selected_fonts.each do |font_name|
url = fonts_json["fonts"][font_name]
puts "Baixando e instalando #{font_name} > URL: #{url}"
download_and_extract(url, install_dir)
end
# Atualizar o cache de fontes
puts "Atualizando o cache de fontes..."
system("fc-cache -f")
puts "Instalação concluída!"