New Sparkle appcast generator stores the version string in the item rather than as an attribute of the entities.
126 lines
4.4 KiB
Ruby
Executable file
126 lines
4.4 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
require 'tempfile'
|
|
require 'open-uri'
|
|
require 'shellwords'
|
|
require 'nokogiri'
|
|
require 'time'
|
|
|
|
feed = ARGV[0] || 'mercury'
|
|
|
|
site_dir = "#{Dir.home}/Source/Repos/kode54-net/cog"
|
|
|
|
appcast = open("#{site_dir}/#{feed}_builds/#{feed}.xml")
|
|
|
|
appcastdoc = Nokogiri::XML(appcast)
|
|
|
|
appcast.close
|
|
|
|
sparkle = appcastdoc.namespaces['xmlns:sparkle']
|
|
|
|
channel = appcastdoc.xpath('//channel')
|
|
|
|
sortedchannels = channel.search('./item').sort_by{ |i| Time.parse(i.at('pubDate').text) }.reverse
|
|
|
|
#Get the latest revision from the appcast
|
|
appcast_enclosure = sortedchannels[0].search('./enclosure').first
|
|
appcast_revision = sortedchannels[0].xpath('.//sparkle:version').text
|
|
appcast_url = appcast_enclosure.attribute('url');
|
|
if !appcast_revision
|
|
appcast_revision = appcast_enclosure.attribute_with_ns('version', sparkle).to_s
|
|
end
|
|
appcast_revision_split = appcast_revision.split( /-/ )
|
|
appcast_revision_code = appcast_revision_split[1]
|
|
appcast_revision_split = appcast_revision_code.split( /g/ )
|
|
appcast_revision_code = appcast_revision_split[1]
|
|
|
|
#Remove modified files that may cause conflicts.
|
|
#%x[hg revert --all]
|
|
|
|
#Update to the latest revision
|
|
#%x[hg pull -u]
|
|
|
|
# %[xcodebuild -workspace Cog.xcodeproj/project.xcworkspace -scheme Cog archive 2>&1].each_line do |line|
|
|
# if line.match(/\*\* BUILD FAILD \*\*/)
|
|
# exit
|
|
# end
|
|
# end
|
|
|
|
# archivedir = "~/Library/Developer/Xcode/Archives"
|
|
# latest_archive = %x[find #{archivedir} -type d -name 'Cog *.xcarchive' -print0 | xargs -0 stat -f "%m %N" -t "%Y" | sort -r | head -n1 | sed -E 's/^[0-9]+ //'].rstrip
|
|
# app_path = "#{latest_archive}/Products#{ENV['HOME']}/Applications"
|
|
script_path = File.expand_path(File.dirname(__FILE__))
|
|
app_path = "#{Dir.home}/Desktop/Cog"
|
|
|
|
plist = open("#{app_path}/Cog.app/Contents/Info.plist")
|
|
plistdoc = Nokogiri::XML(plist)
|
|
plist.close
|
|
|
|
version_element = plistdoc.xpath('//key[.="CFBundleVersion"]/following-sibling::string[1]')
|
|
|
|
latest_revision = version_element.inner_text
|
|
|
|
#latest_revision = %x[/usr/local/bin/hg log -r . --template '{latesttag}-{latesttagdistance}-{node|short}']
|
|
revision_split = latest_revision.split( /-/ )
|
|
revision_number = revision_split[0]
|
|
revision_code = revision_split[1]
|
|
revision_split = revision_code.split( /g/ )
|
|
revision_code = revision_split[1]
|
|
|
|
if 1 #appcast_revision < latest_revision
|
|
#Get the changelog
|
|
changelog = %x[/usr/bin/git log #{appcast_revision_code}..#{revision_code} --pretty=format:'<li> <a href="https://github.com/losnoco/Cog/commit/%H">view commit</a> • %s</li> ' --reverse]
|
|
|
|
description = changelog
|
|
|
|
filename = "Cog-#{revision_code}.zip"
|
|
filenamedesc = "Cog-#{revision_code}.html"
|
|
deltamask = "Cog#{revision_number}-"
|
|
temp_path = "/tmp";
|
|
%x[rm -rf '#{temp_path}/Cog.app' '#{temp_path}/Cog.zip']
|
|
|
|
#Copy the replacement build
|
|
%x[cp -R '#{app_path}/Cog.app' '#{temp_path}/Cog.app']
|
|
|
|
#Zip the app!
|
|
%x[rm -f '#{temp_path}/#{feed}.zip']
|
|
%x[ditto -c -k --sequesterRsrc --keepParent --zlibCompressionLevel 9 '#{temp_path}/Cog.app' '#{temp_path}/#{feed}.zip']
|
|
|
|
#Send the new build to the storage path
|
|
%x[cp '#{temp_path}/#{feed}.zip' '#{site_dir}/#{feed}_builds/#{filename}']
|
|
%x[rm '#{temp_path}/#{feed}.zip']
|
|
|
|
#Generate the description document
|
|
descriptiondoc = Tempfile.new('#{feed}.html')
|
|
descriptiondoc.write(description)
|
|
descriptiondoc.close()
|
|
|
|
#Send it to the storage path
|
|
%x[cp '#{descriptiondoc.path}' '#{site_dir}/#{feed}_builds/#{filenamedesc}']
|
|
%x[rm '#{descriptiondoc.path}']
|
|
|
|
#Update appcast
|
|
%x[generate_appcast '#{site_dir}/#{feed}_builds']
|
|
|
|
#List out the deltas
|
|
deltas = Dir.entries("#{site_dir}/#{feed}_builds").select { |f| f =~ /\A#{Regexp.escape(deltamask)}.+\.delta\z/ }.map { |f| File.join("#{site_dir}/#{feed}_builds", f) }
|
|
|
|
#Upload them to S3
|
|
%x[s3cmd put -P -m application/octet-stream #{deltas.shelljoin} '#{site_dir}/#{feed}_builds/#{filename}' s3://cogcdn.cog.losno.co]
|
|
|
|
#Upload the changelog that Sparkle will display
|
|
%x[s3cmd put -P -m text/html '#{site_dir}/#{feed}_builds/#{filenamedesc}' s3://cogcdn.cog.losno.co]
|
|
|
|
#Clean up
|
|
%x[rm -rf '#{temp_path}/Cog.app']
|
|
|
|
#Upload to S3
|
|
%x[s3cmd put -P -m application/xml '#{site_dir}/#{feed}_builds/#{feed}.xml' s3://cogcdn.cog.losno.co]
|
|
|
|
# invalidate cache of feed manifest
|
|
%x[aws cloudfront create-invalidation --distribution-id E2O8QDAIFS424Q --paths "/#{feed}.xml"]
|
|
|
|
#Send web hook to update site
|
|
update_uri = %x[security find-generic-password -w -a #{ENV['LOGNAME']} -s cogupdateurl]
|
|
%x[curl -X POST #{update_uri}]
|
|
end
|