homebrew-cask/developer/bin/find-appcast

92 lines
2.3 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
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 do |appcast|
# Collapse groups of two or more forward slashes into one, except when preceded by a colon
appcast.gsub(%r{(?<!:)/{2,}}, "/")
end
return if 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
App = Pathname(ARGV[0]).freeze
find_sparkle(App)
find_electron_builder(App)