92 lines
2.3 KiB
Ruby
Executable File
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)
|