diff --git a/Scripts/launchd_nightly.plist b/Scripts/launchd_nightly.plist new file mode 100644 index 000000000..4343be307 --- /dev/null +++ b/Scripts/launchd_nightly.plist @@ -0,0 +1,24 @@ + + + + + Label + org.cogx.cog.nightly + ProgramArguments + + /Users/vspader/Projects/Cog.Nightly/Scripts/build_nightly.rb + + UserName + vspader + WorkingDirectory + /Users/vspader/Projects/Cog.Nightly + StartCalendarInterval + + Hour + 3 + Minute + 0 + + + + diff --git a/Scripts/update_feed.rb b/Scripts/update_feed.rb new file mode 100644 index 000000000..37924aac0 --- /dev/null +++ b/Scripts/update_feed.rb @@ -0,0 +1,103 @@ +#!/usr/bin/env ruby + +require 'tempfile' +require 'open-uri' +require 'rexml/document' +include REXML + +feed = ARGV[0] || 'mercury' + +appcast = open("http://kode54.net/cog/#{feed}.xml") + +appcastdoc = Document.new(appcast) + +#Get the latest revision from the appcast +appcast_revision = appcastdoc.elements['//channel/item/enclosure/sparkle:version'].text.to_s() || 0 +appcast_revision_split = appcast_revision.split( /-/ ) +appcast_revision_code = appcast_revision_split[2] + +#Remove modified files that may cause conflicts. +#%x[hg revert --all] + +#Update to the latest revision +#%x[hg pull -u] +latest_revision = %x[/usr/local/bin/hg log -r . --template '{latesttag}-{latesttagdistance}-{node|short}'] +revision_split = latest_revision.split( /-/ ) +revision_code = revision_split[2] + +if appcast_revision < latest_revision + #Get the changelog + changelog = %x[hg log --template '{desc}\n' -r #{revision_code}:children(#{appcast_revision_code})] + + description = '' + ignore_next = false + changelog.each_line do |line| + if (ignore_next) + ignore_next = false + next + end + if Regexp.new('^-+$').match(line) + ignore_next = true + next + elsif Regexp.new('^\s*$').match(line) + next + end + description += line + end + + #Remove the previous build directories + %x[find . -type d -name build -print0 | xargs -0 rm -r ] + + #Build Cog! + %x[xcodebuild -alltargets -configuration Release 2>&1].each_line do |line| + if line.match(/\*\* BUILD FAILED \*\*/) + exit + end + end + + filename = "Cog-#{revision_code}.tbz" + + #Zip the app! + %x[rm -f build/Release/#{feed}.tar.bz2] + %x[tar -C build/Release -cjf build/Release/#{feed}.tar.bz2 Cog.app] + + filesize = File.size("build/Release/#{feed}.tar.bz2") + + #Send the new build to the server + %x[scp build/Release/#{feed}.tar.bz2 ec2-user@kode54.net:/usr/share/nginx/html/cog/#{feed}_builds/#{filename}] + + #Add new entry to appcast + new_item = Element.new('item') + + new_item.add_element('title') + new_item.elements['title'].text = "Cog {latest_revision}" + + new_item.add_element('description') + new_item.elements['description'].text = description + + new_item.add_element('pubDate') + new_item.elements['pubDate'].text = Time.now().strftime("%a, %d %b %Y %H:%M:%S %Z") #RFC 822 + + new_item.add_element('sparkle:minimumSystemVersion') + new_item.elements['sparkle:minimumSystemVersion'].text = '10.7.0' + + new_item.add_element('enclosure') + new_item.elements['enclosure'].add_attribute('url', "http://kode54.net/cog/#{feed}_builds/#{filename}") + new_item.elements['enclosure'].add_attribute('length', filesize) + new_item.elements['enclosure'].add_attribute('type', 'application/octet-stream') + new_item.elements['enclosure'].add_attribute('sparkle:version', "{latest_revision}") + + appcastdoc.insert_before('//channel/item', new_item) + + #Limit number of entries to 5 + appcastdoc.delete_element('//channel/item[position()>5]') + + new_xml = Tempfile.new('appcast.xml') + appcastdoc.write(new_xml) + new_xml.close() + appcast.close() + + #Send the updated appcast to the server + %x[scp #{new_xml.path} ec2-user@kode54.net:/usr/share/nginx/html/cog/#{feed}.xml] + +end