#!/usr/bin/env ruby # frozen_string_literal: true # rubocop:disable Style/TopLevelMethodDefinition 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{(?