+ if not os.path.isfile("AdminSettings.php"):
+ sh.call("git", "checkout", "-q", "mediawiki-" + str(version), "--", "AdminSettings.php")
+ try:
+ result = sh.eval("php", "maintenance/update.php", "--quick", log=True)
+ except shell.CallError as e:
+ raise app.UpgradeFailure("Update script returned non-zero exit code\nSTDOUT: %s\nSTDERR: %s" % (e.stdout, e.stderr))
+ results = result.rstrip().split()
+ if not results or not results[-1] == "Done.":
+ raise app.UpgradeFailure(result)
+ def backup(self, deployment, options):
+ sh = shell.Shell()
+ # XXX: duplicate code, refactor, also, race condition
+ backupdir = os.path.join(".scripts", "backups")
+ backup = str(deployment.version) + "-" + datetime.date.today().isoformat()
+ outdir = os.path.join(backupdir, backup)
+ if not os.path.exists(backupdir):
+ os.mkdir(backupdir)
+ if os.path.exists(outdir):
+ util.safe_unlink(outdir)
+ os.mkdir(outdir)
+ outfile = os.path.join(outdir, "db.sql")
+ try:
+ sh.call("mysqldump", "--compress", "-r", outfile, *get_mysql_args(deployment))
+ sh.call("gzip", "--best", outfile)
+ except shell.CallError as e:
+ shutil.rmtree(outdir)
+ raise app.BackupFailure(e.stderr)
+ return backup
+ def restore(self, deployment, backup, options):
+ sh = shell.Shell()
+ backup_dir = os.path.join(".scripts", "backups", backup)
+ if not os.path.exists(backup_dir):
+ raise app.RestoreFailure("Backup %s doesn't exist", backup)
+ sql = open(os.path.join(backup_dir, "db.sql"), 'w+')
+ sh.call("gunzip", "-c", os.path.join(backup_dir, "db.sql.gz"), stdout=sql)
+ sql.seek(0)
+ sh.call("mysql", *get_mysql_args(deployment), stdin=sql)
+ sql.close()