88 lines
2.3 KiB
Ruby
Executable File
88 lines
2.3 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
require 'open3'
|
|
require 'pathname'
|
|
require 'yaml'
|
|
|
|
require 'net/http'
|
|
require 'uri'
|
|
|
|
def verify_appcast(appcast_type, *urls)
|
|
print "Looking for #{appcast_type} appcast… "
|
|
|
|
urls.each do |url|
|
|
next unless url_exist?(url)
|
|
|
|
puts 'Found!'
|
|
puts " #{url}"
|
|
return true
|
|
end
|
|
|
|
puts 'Not found.'
|
|
false
|
|
end
|
|
|
|
def url_exist?(url)
|
|
return false unless url
|
|
|
|
system('curl', '--silent', '--location', '--fail', url, out: File::NULL)
|
|
end
|
|
|
|
def find_sparkle(app)
|
|
plist = app.join('Contents/Info.plist')
|
|
url = Open3.capture3('defaults', 'read', plist.to_path, 'SUFeedURL').first.strip
|
|
|
|
verify_appcast('Sparkle', url)
|
|
end
|
|
|
|
def find_electron_builder(app)
|
|
appcast_file = app.join('Contents/Resources/app-update.yml')
|
|
|
|
unless appcast_file.exist?
|
|
verify_appcast('electron-builder', false)
|
|
return false
|
|
end
|
|
|
|
data = YAML.load_file(appcast_file)
|
|
bucket = data['bucket']
|
|
channel = data['channel']
|
|
endpoint = data['endpoint']
|
|
name = data['name']
|
|
owner = data['owner']
|
|
path = data['path']
|
|
region = data['region']
|
|
repo = data['repo']
|
|
url = data['url']
|
|
|
|
possible_appcasts = [
|
|
"#{url}/latest-mac.yml",
|
|
"#{url}/updates/latest/mac/latest-mac.yml",
|
|
"https://github.com/#{owner}/#{repo}/releases.atom",
|
|
"https://#{bucket}.s3.amazon-aws.yml/#{channel}/latest-mac.yml",
|
|
"https://#{bucket}.s3.amazonaws.com/latest-mac.yml",
|
|
"https://#{bucket}.s3.amazonaws.com/#{path}/latest-mac.yml",
|
|
"https://s3-#{region}.amazonaws.com/#{bucket}/#{path}/latest-mac.yml",
|
|
"https://s3.amazonaws.com/#{bucket}/#{path}/latest-mac.yml",
|
|
"https://#{name}.#{region}.digitaloceanspaces.com/latest-mac.yml",
|
|
"https://#{name}.#{region}.digitaloceanspaces.com/#{path}/latest-mac.yml",
|
|
"#{endpoint}/#{bucket}/#{path}/latest-mac.yml",
|
|
].map { |appcast| appcast.gsub(%r{(?<!:)/{2,}}, '/') } # Collapse groups of two or more forward slahses into one, except when preceded by a colon
|
|
|
|
unless verify_appcast('electron-builder', *possible_appcasts)
|
|
warn <<~MESSAGE
|
|
|
|
An "app-update.yml" file was found, but we could not parse it.
|
|
Please report this on https://github.com/Homebrew/homebrew-cask/
|
|
Provide this info:
|
|
|
|
MESSAGE
|
|
|
|
puts appcast_file.read
|
|
end
|
|
end
|
|
|
|
App = Pathname(ARGV[0])
|
|
|
|
find_sparkle(App)
|
|
find_electron_builder(App)
|