homebrew-cask/developer/bin/find-appcast

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)