]> scripts.mit.edu Git - wizard.git/commitdiff
Automate upgrade preparation.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Fri, 11 Apr 2014 01:01:16 +0000 (18:01 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Fri, 11 Apr 2014 01:01:16 +0000 (18:01 -0700)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
wizard/command/prepare_upgrade.py [new file with mode: 0644]

diff --git a/wizard/command/prepare_upgrade.py b/wizard/command/prepare_upgrade.py
new file mode 100644 (file)
index 0000000..44813da
--- /dev/null
@@ -0,0 +1,81 @@
+from wizard import command, deploy, shell, app, util
+
+import sys
+import os
+
+def main(argv, baton):
+    options, args = parse_args(argv, baton)
+
+    if not os.path.exists(".git"):
+        raise Exception("Not in root directory of Git repository")
+    files = shell.eval("git", "ls-files", "-o")
+    if files:
+        raise Exception("Unversioned files exist, aborting (please cleanup directory first)")
+
+    rav = args[0].split('-')
+    av = app.ApplicationVersion.make(rav[0], rav[1])
+
+    try:
+        shell.call("git", "rev-parse", av.pristine_tag)
+        raise Error("Pristine tag already exists")
+    except shell.CallError:
+        pass
+    try:
+        shell.call("git", "rev-parse", av.wizard_tag)
+        raise Error("Wizard tag already exists")
+    except shell.CallError:
+        pass
+
+    shell.call("git", "checkout", "pristine")
+    shell.call("wizard", "prepare-pristine", av.pristine_tag)
+    shell.call("git", "commit", "-s", "-m", "%s %s" % (av.application.fullname, av.version))
+    shell.call("git", "tag", av.pristine_tag)
+    shell.call("git", "checkout", "master", stdout=sys.stdout, stderr=sys.stderr)
+    try:
+        shell.call("git", "merge", "pristine", "--no-commit", stdout=sys.stdout, stderr=sys.stderr)
+    except shell.CallError:
+        # XXX refactor this pattern
+        while 1:
+            print "Dropping in shell: resolve conflicts and then exit"
+            shell.interactive()
+            if shell.eval("git", "ls-files", "--unmerged").strip():
+                print
+                print "WARNING: There are still unmerged files."
+                out = raw_input("Continue editing? [y/N]: ")
+                if out == "y" or out == "Y":
+                    continue
+                else:
+                    print "Aborting."
+                    sys.exit(1)
+            break
+    shell.call("git", "commit", "-s", "-m", "%s %s-scripts" % (av.application.fullname, av.version))
+    if options.test_dir:
+        with util.ChangeDirectory(options.test_dir):
+            shell.call("./%s-install-test.sh" % av.application.name, addenv={'WIZARD_NO_COMMIT': '1'}, stdout=sys.stdout, stderr=sys.stderr)
+            with util.ChangeDirectory("testdir_%s_install_head" % av.application.name):
+                shell.call("wizard", "prepare-config")
+                if shell.eval("git", "ls-files", "--modified").strip():
+                    print
+                    print "ERROR: There were configuration changes, bailing"
+                    print "Don't forget to make the %s tag when you're done" % av.wizard_tag
+                    print "Check %s for more details" % os.getcwd()
+                    sys.exit(1)
+    shell.call("git", "tag", av.wizard_tag)
+
+def parse_args(argv, baton):
+    usage = """usage: %prog prepare-upgrade APP-VERSION
+
+Interactively walks through the process of preparing an upgrade."""
+    parser = command.WizardOptionParser(usage)
+    parser.add_option("--test-dir", dest="test_dir", metavar="DIR",
+            default=None, help="This folder contains test scripts for this update.")
+    options, args = parser.parse_all(argv)
+    if len(args) > 1:
+        parser.error("too many arguments")
+    elif len(args) == 0:
+        parser.error("please provide APP-VERSION")
+    return options, args
+
+class Error(command.Error):
+    """Base exception for all exceptions raised by upgrade"""
+    pass