X-Git-Url: https://scripts.mit.edu/gitweb/wizard.git/blobdiff_plain/05d452073bdb008549a4a69ef47660a7e37115b7..0d054f889445688ace24d38b7c09ccde64f39247:/wizard/command/prepare_pristine.py diff --git a/wizard/command/prepare_pristine.py b/wizard/command/prepare_pristine.py index d6ba256..ad66072 100644 --- a/wizard/command/prepare_pristine.py +++ b/wizard/command/prepare_pristine.py @@ -1,38 +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) + shell.call("tar", "xf", base) + os.unlink(base) else: base = args[0] + shell.call("tar", "xf", base) # extract the files, but be smart: if only one directory is output, # move the contents of that directory here - sh.call("tar", "xf", base) - os.unlink(base) 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", "-f", ".") + 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 @@ -56,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") - _, _, ref = open(".git/HEAD").read().partition(' ') + 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: