166 lines
4.4 KiB
Ruby
Executable File
166 lines
4.4 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
class Builder
|
|
|
|
def initialize
|
|
@env = Environment.new()
|
|
@worker = CompositeWorker.new([Logger.new(), Executer.new()])
|
|
end
|
|
|
|
def makeRelease
|
|
createWorkingDirectories
|
|
downloadSource
|
|
copySource
|
|
buildModules
|
|
createPackage "ocmock-2.1.1.dmg", "OCMock 2.1.1"
|
|
openPackageDir
|
|
end
|
|
|
|
def justBuild
|
|
createWorkingDirectories
|
|
downloadSource
|
|
buildModules
|
|
openPackageDir
|
|
end
|
|
|
|
def createWorkingDirectories
|
|
@worker.run("mkdir -p #{@env.sourcedir}")
|
|
@worker.run("mkdir -p #{@env.productdir}")
|
|
@worker.run("mkdir -p #{@env.packagedir}")
|
|
end
|
|
|
|
def downloadSource
|
|
@worker.run("git archive master | tar -x -v -C #{@env.sourcedir}")
|
|
end
|
|
|
|
def copySource
|
|
@worker.run("cp -R #{@env.sourcedir}/Source #{@env.productdir}")
|
|
end
|
|
|
|
def buildModules
|
|
@worker.chdir("#{@env.sourcedir}/Source")
|
|
@worker.run("xcodebuild -project OCMock.xcodeproj -target OCMock")
|
|
osxproductdir = "#{@env.productdir}/OSX"
|
|
@worker.run("mkdir -p #{osxproductdir}")
|
|
@worker.run("cp -R build/Release/OCMock.framework #{osxproductdir}")
|
|
@worker.run("xcodebuild -project OCMock.xcodeproj -target OCMockLib -sdk iphoneos6.1")
|
|
@worker.run("xcodebuild -project OCMock.xcodeproj -target OCMockLib -sdk iphonesimulator6.1")
|
|
@worker.run("lipo -create -output build/Release/libOCMock.a build/Release-*/libOCMock.a")
|
|
iosproductdir = "#{@env.productdir}/iOS"
|
|
@worker.run("mkdir -p #{iosproductdir}")
|
|
@worker.run("cp -R build/Release/libOCMock.a #{iosproductdir}")
|
|
@worker.run("cp -R build/Release-iphoneos/OCMock #{iosproductdir}")
|
|
end
|
|
|
|
def createPackage(packagename, volumename)
|
|
@worker.chdir(@env.packagedir)
|
|
@worker.run("hdiutil create -size 4m temp.dmg -layout NONE")
|
|
disk_id = nil
|
|
@worker.run("hdid -nomount temp.dmg") { |hdid| disk_id = hdid.readline.split[0] }
|
|
@worker.run("newfs_hfs -v '#{volumename}' #{disk_id}")
|
|
@worker.run("hdiutil eject #{disk_id}")
|
|
@worker.run("hdid temp.dmg") { |hdid| disk_id = hdid.readline.split[0] }
|
|
@worker.run("cp -R #{@env.productdir}/* '/Volumes/#{volumename}'")
|
|
@worker.run("hdiutil eject #{disk_id}")
|
|
@worker.run("hdiutil convert -format UDZO temp.dmg -o #{@env.packagedir}/#{packagename} -imagekey zlib-level=9")
|
|
@worker.run("hdiutil internet-enable -yes #{@env.packagedir}/#{packagename}")
|
|
@worker.run("rm temp.dmg")
|
|
end
|
|
|
|
def openPackageDir
|
|
@worker.run("open #{@env.packagedir}")
|
|
end
|
|
|
|
def upload(packagename, dest)
|
|
@worker.run("scp #{@env.packagedir}/#{packagename} #{dest}")
|
|
end
|
|
|
|
def cleanup
|
|
@worker.run("chmod -R u+w #{@env.tmpdir}")
|
|
@worker.run("rm -rf #{@env.tmpdir}");
|
|
end
|
|
|
|
end
|
|
|
|
|
|
## Environment
|
|
## use attributes to configure manager for your environment
|
|
|
|
class Environment
|
|
def initialize()
|
|
@tmpdir = "/tmp/ocmock.#{Process.pid}"
|
|
@sourcedir = tmpdir + "/Source"
|
|
@productdir = tmpdir + "/Products"
|
|
@packagedir = tmpdir
|
|
end
|
|
|
|
attr_accessor :tmpdir, :sourcedir, :productdir, :packagedir
|
|
end
|
|
|
|
|
|
## Logger (Worker)
|
|
## prints commands
|
|
|
|
class Logger
|
|
def chdir(dir)
|
|
puts "## chdir #{dir}"
|
|
end
|
|
|
|
def run(cmd)
|
|
puts "## #{cmd}"
|
|
end
|
|
end
|
|
|
|
|
|
## Executer (Worker)
|
|
## actually runs commands
|
|
|
|
class Executer
|
|
def chdir(dir)
|
|
Dir.chdir(dir)
|
|
end
|
|
|
|
def run(cmd, &block)
|
|
if block == nil
|
|
system(cmd)
|
|
else
|
|
IO.popen(cmd, &block)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
## Composite Worker (Worker)
|
|
## sends commands to multiple workers
|
|
|
|
class CompositeWorker
|
|
def initialize(workers)
|
|
@workers = workers
|
|
end
|
|
|
|
def chdir(dir)
|
|
@workers.each { |w| w.chdir(dir) }
|
|
end
|
|
|
|
def run(cmd)
|
|
@workers.each { |w| w.run(cmd) }
|
|
end
|
|
|
|
def run(cmd, &block)
|
|
@workers.each { |w| w.run(cmd, &block) }
|
|
end
|
|
end
|
|
|
|
|
|
if /Tools$/.match(Dir.pwd)
|
|
Dir.chdir("..")
|
|
end
|
|
|
|
if ARGV[0] == '-r'
|
|
Builder.new.makeRelease
|
|
else
|
|
Builder.new.justBuild
|
|
end
|
|
|
|
|