]> scripts.mit.edu Git - wizard.git/blobdiff - wizard/command/prepare_pristine.py
prepare-pristine: stage deleted files too, and update upgrade docs.
[wizard.git] / wizard / command / prepare_pristine.py
index 3f16e2f40d142fa01b9a0e00e9f9e33e74b89620..d4c92331868688ef2700f168fc2a2d98902c10fb 100644 (file)
@@ -1,39 +1,43 @@
 import urllib
 import shutil
 import os
+import os.path
 
 from wizard import app, command, shell
 
 def main(argv, baton):
     options, args = parse_args(argv, baton)
-    sh = shell.Shell() 
     check_directory(options)
     if not os.path.exists(args[0]):
         appname, _, version = args[0].partition("-")
-        application = app.applications()[appname]
+        application = app.getApplication(appname)
         url = application.download(version)
         base = os.path.basename(url)
         with open(base, "w") as outfile:
             infile = urllib.urlopen(url)
             shutil.copyfileobj(infile, outfile)
-        sh.call("tar", "xf", base)
+        shell.call("tar", "xf", base)
         os.unlink(base)
     else:
         base = args[0]
-        sh.call("tar", "xf", base)
+        shell.call("tar", "xf", base)
     # extract the files, but be smart: if only one directory is output,
     # move the contents of that directory here
     items = [f for f in os.listdir(os.getcwd()) if f[0] != "."]
     if len(items) == 1 and os.path.isdir(items[0]):
         os.rename(items[0], "_wizard_source")
-        sh.call("cp", "-R", "_wizard_source/.", ".")
+        shell.call("cp", "-R", "_wizard_source/.", ".")
         shutil.rmtree("_wizard_source")
         # populate empty directories with blank files
         for dirpath, dirnames, filenames in os.walk(os.getcwd()):
             if "/.git" in dirpath: continue
             if not filenames and not dirnames:
                 open(os.path.join(dirpath, ".preserve-dir"), "w").write("")
-        sh.call("git", "add", ".")
+        # stage all changes
+        shell.call("git", "add", ".")
+        for f in shell.call("git", "ls-files", "-d", "-z")[0].split("\0"):
+            if f != "":
+                shell.call("git", "rm", "--", f)
 
 def parse_args(argv, baton):
     usage = """usage: %prog prepare-pristine APP-VERSION
@@ -57,21 +61,19 @@ local diffs: you can override this safety mechanism with --force.
     return options, args
 
 def check_directory(options):
-    sh = shell.Shell()
-    files = sh.eval("git", "ls-files", "-o")
+    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, refusing to remove (override with --force)")
     try:
-        sh.call("git", "rev-parse", "HEAD")
+        shell.call("git", "rev-parse", "HEAD")
         _, _, ref = open(".git/HEAD").read().rstrip().partition(' ')
         if not options.force:
             if ref != "refs/heads/pristine" and os.path.exists(os.path.join(".git", ref)):
                 raise Exception("Not on pristine branch (override with --force)")
-            try:
-                sh.call("git", "status")
+            if shell.eval("git", "ls-files", "-m").strip() != "":
                 raise Exception("Working copy is dirty (override with --force)")
-            except shell.CallError:
-                pass
         for f in os.listdir(os.getcwd()):
             if f == ".git": continue
             try: