]> scripts.mit.edu Git - wizard.git/blobdiff - wizard/command/upgrade.py
More documentation improvements.
[wizard.git] / wizard / command / upgrade.py
index f26309905de4140a4a2d1a883ef9c8defc080054..0d90a562f1f977bb566ac8f975f27abd9658086f 100644 (file)
@@ -1,16 +1,15 @@
-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)
@@ -27,27 +26,32 @@ def main(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)
@@ -76,6 +80,7 @@ def main(argv, baton):
                 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)
@@ -87,7 +92,7 @@ def main(argv, baton):
                 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:
@@ -108,7 +113,8 @@ def main(argv, baton):
             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)
@@ -199,7 +205,7 @@ def perform_tmp_clone(sh, use_shm):
     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")
@@ -207,8 +213,8 @@ def perform_merge(sh, repo, d, version, use_shm, kib_avail):
     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:
@@ -220,12 +226,12 @@ def perform_merge(sh, repo, d, version, use_shm, kib_avail):
         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)
@@ -235,7 +241,7 @@ def perform_merge(sh, repo, d, version, use_shm, kib_avail):
         # 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
@@ -321,6 +327,7 @@ this actually works)."""
 class BlacklistedError(Error):
     #: Reason why the autoinstall was blacklisted
     reason = None
+    exitcode = errno_blacklisted
     def __init__(self, reason):
         self.reason = reason
     def __str__(self):