160 lines
6.4 KiB
Python
160 lines
6.4 KiB
Python
#!/usr/bin/env python2.7
|
|
|
|
import os
|
|
import sys
|
|
import time
|
|
import shutil
|
|
import ConfigParser
|
|
|
|
currentStorageDir = 'giraffe_storage'
|
|
maxDirectoryAge = 86400
|
|
privateTargetDir = os.path.expanduser('/mnt/chuckleshare/buildbot/')
|
|
steamContentBuilderDir = os.path.expanduser('~/steam_uploader')
|
|
|
|
cfg = ConfigParser.SafeConfigParser()
|
|
cfg.read(os.path.expanduser("~/passwords.cfg"))
|
|
steamAccount = cfg.get("steam", "account")
|
|
steamPassword = cfg.get("steam", "password")
|
|
|
|
def copyAndReplace(source, dest, replacements):
|
|
sourcefile = open(source)
|
|
destfile = open(dest, 'w')
|
|
|
|
for line in sourcefile:
|
|
for src, target in replacements.items():
|
|
line = line.replace(src, target)
|
|
destfile.write(line)
|
|
sourcefile.close()
|
|
destfile.close()
|
|
|
|
def touch(file):
|
|
open(file, 'w').write("")
|
|
|
|
def copyTreeExisting(src, dst, symlinks=False, ignore=None):
|
|
if not os.path.exists(dst):
|
|
os.makedirs(dst)
|
|
for item in os.listdir(src):
|
|
s = os.path.join(src, item)
|
|
d = os.path.join(dst, item)
|
|
if os.path.isdir(s):
|
|
copyTreeExisting(s, d, symlinks, ignore)
|
|
else:
|
|
shutil.copy2(s, d)
|
|
|
|
def recursiveChmod(targetDir, level):
|
|
for root, dirs, files in os.walk(targetDir):
|
|
for entry in dirs:
|
|
os.chmod(os.path.join(root, entry), level | 0o111)
|
|
for entry in files:
|
|
os.chmod(os.path.join(root, entry), level)
|
|
os.chmod(root, level | 0o111)
|
|
|
|
def basename(dir):
|
|
bn = os.path.basename(dir)
|
|
if bn == '':
|
|
return os.path.basename(os.path.dirname(dir))
|
|
else:
|
|
return bn
|
|
|
|
def rmtree(dir):
|
|
if os.path.isdir(dir):
|
|
shutil.rmtree(dir)
|
|
elif os.path.exists(dir):
|
|
sys.exit("Directory %s expected, file found instead, aborting" % dir)
|
|
|
|
def uploadNewPrivateRevision(revisionDir, revision):
|
|
print("Uploading new private revision...")
|
|
targetDir = os.path.join(privateTargetDir, revision)
|
|
|
|
rmtree(targetDir)
|
|
os.mkdir(targetDir)
|
|
|
|
pcdir = os.path.join(targetDir, "pc")
|
|
os.mkdir(pcdir)
|
|
|
|
shutil.copytree(os.path.join(revisionDir, "data/assets"), os.path.join(pcdir, "assets"))
|
|
shutil.copytree(os.path.join(revisionDir, "data/tiled"), os.path.join(pcdir, "tiled"))
|
|
shutil.copytree(os.path.join(revisionDir, "linux32_binaries"), os.path.join(pcdir, "linux32"))
|
|
shutil.copytree(os.path.join(revisionDir, "linux64_binaries"), os.path.join(pcdir, "linux64"))
|
|
shutil.copytree(os.path.join(revisionDir, "osx_binaries"), os.path.join(pcdir, "osx"))
|
|
shutil.copytree(os.path.join(revisionDir, "win32_binaries"), os.path.join(pcdir, "win32"))
|
|
shutil.copytree(os.path.join(revisionDir, "win64_binaries"), os.path.join(pcdir, "win64"))
|
|
|
|
xboxdir = os.path.join(targetDir, "xboxone")
|
|
os.mkdir(xboxdir)
|
|
shutil.copytree(os.path.join(revisionDir, "data/assets"), os.path.join(xboxdir, "assets"))
|
|
copyTreeExisting(os.path.join(revisionDir, "xboxone_binaries"), xboxdir)
|
|
|
|
recursiveChmod(targetDir, 0o644)
|
|
|
|
print("Finished uploading private revision!")
|
|
|
|
def uploadNewSteamRevision(revisionDir, isStable, setLive, revision):
|
|
print("Uploading new steam revision...")
|
|
|
|
if setLive != '':
|
|
print("This will set the content live to the steam branch '%s'" % steamLiveBranch)
|
|
|
|
print("Removing old steam content structure...")
|
|
steamContentDir = os.path.join(steamContentBuilderDir, "content")
|
|
rmtree(steamContentDir)
|
|
|
|
print("Building new steam content structure...")
|
|
os.mkdir(steamContentDir)
|
|
shutil.copytree(os.path.join(revisionDir, "data/assets"), os.path.join(steamContentDir, "assets"))
|
|
shutil.copytree(os.path.join(revisionDir, "data/tiled"), os.path.join(steamContentDir, "tiled"))
|
|
shutil.copytree(os.path.join(revisionDir, "linux32_binaries"), os.path.join(steamContentDir, "linux32"))
|
|
shutil.copytree(os.path.join(revisionDir, "linux64_binaries"), os.path.join(steamContentDir, "linux64"))
|
|
shutil.copytree(os.path.join(revisionDir, "osx_binaries"), os.path.join(steamContentDir, "osx"))
|
|
shutil.copytree(os.path.join(revisionDir, "win32_binaries"), os.path.join(steamContentDir, "win32"))
|
|
shutil.copytree(os.path.join(revisionDir, "win64_binaries"), os.path.join(steamContentDir, "win64"))
|
|
|
|
os.mkdir(os.path.join(steamContentDir, currentStorageDir))
|
|
os.mkdir(os.path.join(steamContentDir, currentStorageDir, "mods"))
|
|
touch(os.path.join(steamContentDir, currentStorageDir, "mods", "mods_go_here"))
|
|
|
|
if isStable:
|
|
scriptsDir = os.path.join(steamContentBuilderDir, "scripts")
|
|
copyAndReplace(os.path.join(scriptsDir, "app_build_stable.vdf.template"), os.path.join(scriptsDir, "app_build_stable.vdf"),
|
|
{'{REVISION}' : revision, '{SETLIVE}' : setLive})
|
|
|
|
print("Uploading content to Steam STABLE build, Steam uploader output follows...")
|
|
|
|
os.chdir(os.path.join(steamContentBuilderDir, "builder"))
|
|
if os.system("./steamcmd.sh +login %s '%s' +run_app_build ../scripts/app_build_stable.vdf +quit 2>&1" % (steamAccount, steamPassword)) != 0:
|
|
sys.exit("Something went wrong with the steam upload, aborting!")
|
|
|
|
else:
|
|
scriptsDir = os.path.join(steamContentBuilderDir, "scripts")
|
|
copyAndReplace(os.path.join(scriptsDir, "app_build_unstable.vdf.template"), os.path.join(scriptsDir, "app_build_unstable.vdf"),
|
|
{'{REVISION}' : revision, '{SETLIVE}' : setLive})
|
|
|
|
print("Uploading content to Steam UNSTABLE build, Steam uploader output follows...")
|
|
|
|
os.chdir(os.path.join(steamContentBuilderDir, "builder"))
|
|
if os.system("./steamcmd.sh +login %s '%s' +run_app_build ../scripts/app_build_unstable.vdf +quit 2>&1" % (steamAccount, steamPassword)) != 0:
|
|
sys.exit("Something went wrong with the steam upload, aborting!")
|
|
|
|
print("Finished uploading build to steam!")
|
|
|
|
directory = sys.argv[0]
|
|
revision = sys.argv[1]
|
|
steamTarget = sys.argv[2] if len(sys.argv) >= 2 else "none"
|
|
steamLiveBranch = sys.argv[3] if len(sys.argv) >= 3 else ""
|
|
|
|
# Change stdout to be unbuffered for buildbot logging
|
|
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
|
|
|
|
print("Uploading new starbound revision %s..." % revision)
|
|
outputDirs = set(os.listdir(revisionDir))
|
|
|
|
requiredDirs = set(['linux32_binaries', 'linux64_binaries', 'osx_binaries', 'win32_binaries', 'win64_binaries', 'xboxone_binaries', 'data'])
|
|
if not outputDirs.issuperset(requiredDirs):
|
|
sys.exit("Refusing to upload %s due to missing directories: %s" % (revision, requiredDirs.difference(outputDirs)))
|
|
|
|
uploadNewPrivateRevision(revisionDir, basename(revisionDir))
|
|
|
|
if steamTarget == 'stable':
|
|
uploadNewSteamRevision(revisionDir, True, setLive, basename(revisionDir))
|
|
elif steamTarget == 'unstable':
|
|
uploadNewSteamRevision(revisionDir, False, setLive, basename(revisionDir))
|