-import optparse
import sys
import distutils.version
import os
import shutil
import logging.handlers
-import errno
import tempfile
import itertools
from wizard import app, command, deploy, scripts, shell, util
kib_buffer = 1024 * 30 # 30 MiB we will always leave available
+errno_blacklisted = 64
def main(argv, baton):
options, args = parse_args(argv, baton)
try: # global try-finally for cleaning up /dev/shm if it's being used
if options.continue_:
temp_wc_dir = os.getcwd()
+ wc = deploy.WorkingCopy(".")
user_commit, next_commit = open(".git/WIZARD_PARENTS", "r").read().split()
repo = open(".git/WIZARD_REPO", "r").read()
version = open(".git/WIZARD_UPGRADE_VERSION", "r").read()
if not options.log_file and os.path.exists(".git/WIZARD_LOG_FILE"):
options.log_file = open(".git/WIZARD_LOG_FILE", "r").read()
# reload logging
- command.addFileLogger(options.log_file, options.debug)
+ command.setup_file_logger(options.log_file, options.debug)
logging.info("Continuing upgrade...")
util.chdir(sh.eval("git", "config", "remote.origin.url"))
- d = deploy.Deployment(".")
+ d = deploy.ProductionCopy(".")
try:
sh.call("git", "status")
raise LocalChangesError()
except shell.CallError:
pass
else:
- d = deploy.Deployment(".")
+ d = deploy.ProductionCopy(".")
if os.path.exists(".scripts/blacklisted"):
reason = open(".scripts/blacklisted").read()
- print "-1 " + reason
- raise BlacklistedError(reason)
+ # ignore blank blacklisted files
+ if reason:
+ print reason
+ raise BlacklistedError(reason)
+ else:
+ logging.warning("Application was blacklisted, but no reason was found");
d.verify()
d.verifyTag(options.srv_path)
d.verifyGit(options.srv_path)
use_shm = os.path.exists("/dev/shm")
temp_dir, temp_wc_dir = perform_tmp_clone(sh, use_shm)
with util.ChangeDirectory(temp_wc_dir):
+ wc = deploy.WorkingCopy(".")
sh.call("git", "remote", "add", "scripts", repo)
sh.call("git", "fetch", "-q", "scripts")
user_commit, next_commit = calculate_parents(sh, version)
open(".git/WIZARD_SIZE", "w").write(str(scripts.get_disk_usage()))
if options.log_file:
open(".git/WIZARD_LOG_FILE", "w").write(options.log_file)
- perform_merge(sh, repo, d, version, use_shm, kib_limit and kib_limit - kib_usage or None)
+ perform_merge(sh, repo, d, wc, version, use_shm, kib_limit and kib_limit - kib_usage or None)
# variables: version, user_commit, next_commit, temp_wc_dir
with util.ChangeDirectory(temp_wc_dir):
try:
sh.call("git", "reset", "-q", "--hard", final_commit)
# This is a quick sanity check to make sure we didn't completely
# mess up the merge
- d.verifyVersion()
+ wc.invalidateCache()
+ wc.verifyVersion()
# Till now, all of our operations were in a tmp sandbox.
if options.dry_run:
logging.info("Dry run, bailing. See results at %s" % temp_wc_dir)
sh.call("git", "clone", "-q", "--shared", ".", temp_wc_dir)
return temp_dir, temp_wc_dir
-def perform_merge(sh, repo, d, version, use_shm, kib_avail):
+def perform_merge(sh, repo, d, wc, version, use_shm, kib_avail):
# Note: avail_quota == None means unlimited
# naive merge algorithm:
# sh.call("git", "merge", "-m", message, "scripts/master")
def make_virtual_commit(tag, parents = []):
"""WARNING: Changes state of Git repository"""
sh.call("git", "checkout", "-q", tag, "--")
- d.parametrize(".")
- for file in d.application.parametrized_files:
+ wc.parametrize(d)
+ for file in wc.application.parametrized_files:
try:
sh.call("git", "add", "--", file)
except shell.CallError:
sh.call("git", "reset", "--hard")
return virtual_commit
user_tree = sh.eval("git", "rev-parse", "HEAD^{tree}")
- base_virtual_commit = make_virtual_commit(d.app_version.scripts_tag)
+ base_virtual_commit = make_virtual_commit(wc.app_version.scripts_tag)
next_virtual_commit = make_virtual_commit(version, [base_virtual_commit])
user_virtual_commit = sh.eval("git", "commit-tree", user_tree,
"-p", base_virtual_commit, input="", log=True)
sh.call("git", "checkout", user_virtual_commit, "--")
- d.application.prepareMerge(os.getcwd())
+ wc.prepareMerge()
sh.call("git", "commit", "--amend", "-a", "-m", "amendment")
try:
sh.call("git", "merge", next_virtual_commit)
# Run the application's specific merge resolution algorithms
# and see if we can salvage it
curdir = os.getcwd()
- if d.application.resolveConflicts(curdir):
+ if wc.resolveConflicts():
logging.info("Resolved conflicts with application specific knowledge")
sh.call("git", "commit", "-a", "-m", "merge")
return
class BlacklistedError(Error):
#: Reason why the autoinstall was blacklisted
reason = None
+ exitcode = errno_blacklisted
def __init__(self, reason):
self.reason = reason
def __str__(self):