7 from wizard import app, command, git, prompt, shell, util
8 from wizard.install import installopt, interactive
10 def main(argv, baton):
11 old_options, args = parse_args(argv, baton)
14 dir = os.path.abspath(args[1])
15 web_stub_path = old_options.web_stub_path
17 if not old_options.retry and not old_options.help and os.path.exists(dir) and os.listdir(dir):
18 raise DirectoryExistsError
20 appname, _, version = appstr.partition('-')
21 application = app.getApplication(appname)
23 if application.needs_web_stub and web_stub_path is None:
24 raise NeedsWebStubError
27 schema = application.install_schema
28 schema.commit(application, dir, web_stub_path)
30 opthandler = installopt.Controller(dir, schema)
31 parser = command.WizardOptionParser("""usage: %%prog install %s DIR [ -- SETUPARGS ]
33 Autoinstalls the application %s in the directory DIR.""" % (appname, appname))
34 configure_parser(parser, baton)
35 opthandler.push(parser)
39 input = prompt.make(old_options.prompt, old_options.non_interactive)
40 ihandler = interactive.Controller(dir, schema, input)
41 options, _ = parser.parse_all(args[2:] + command.make_base_args(old_options))
42 if old_options.non_interactive:
43 opthandler.handle(options)
47 if not os.path.exists(dir) or not os.listdir(dir):
48 input.infobox("Copying files (this may take a while)...")
49 shell.call("git", "clone", "-q", "--shared", application.repository(old_options.srv_path), dir)
51 logging.info("Skipped clone")
52 with util.ChangeDirectory(dir):
53 if not old_options.retry and version and version != "head-scripts": # for ease in testing
54 shell.call("git", "reset", "-q", "--hard", appstr)
55 input.infobox("Installing...")
56 v = distutils.version.LooseVersion(version)
57 if application.needs_web_stub:
58 application.install(v, options, web_stub_path)
60 application.install(v, options)
61 if not old_options.no_commit:
62 git.commit_configure()
63 if not hasattr(options, "web_inferred"):
64 open(os.path.join(dir, ".scripts/url"), "w").write("http://%s%s" % (options.web_host, options.web_path)) # XXX: no support for https yet!
65 input.infobox("Congratulations, your new install is now accessible at:\n\nhttp://%s%s" % (options.web_host, options.web_path), width=80)
67 def configure_parser(parser, baton):
68 parser.add_option("--prompt", dest="prompt", action="store_true",
69 default=False, help="Force to use non-ncurses interactive interface")
70 parser.add_option("--non-interactive", dest="non_interactive", action="store_true",
71 default=False, help="Force program to be non-interactive and use SETUPARGS. Use --help with APP to find argument names.")
72 parser.add_option("--no-commit", dest="no_commit", action="store_true",
73 default=command.boolish(os.getenv("WIZARD_NO_COMMIT")), help="Do not generate an 'installation commit' after configuring the application. Envvar is WIZARD_NO_COMMIT")
74 parser.add_option("--retry", dest="retry", action="store_true",
75 default=False, help="Do not complain if directory already exists and reinstall application.")
76 baton.push(parser, "srv_path")
78 def parse_args(argv, baton):
79 usage = """usage: %prog install APP DIR [ -- SETUPARGS ]
81 Autoinstalls the application APP in the directory DIR.
82 This command will interactively ask for information to
83 complete the autoinstall.
85 You can also use --help with APP and DIR to find out what
86 are required SETUPARGS if you want to run this non-interactively
87 (the distribution of required and optional arguments may change
88 depending on what directory you are installing to.)"""
89 parser = command.WizardOptionParser(usage, store_help=True)
90 configure_parser(parser, baton)
91 parser.add_option("--web-stub-path", dest="web_stub_path",
92 default=None, help="Used on certain installations for indicating"
93 "where to place stub files for a web path.")
94 options, args = parser.parse_all(argv)
100 args.append(os.getcwd())
103 parser.error("not enough arguments")
106 class DirectoryExistsError(wizard.Error):
108 return "Directory already exists and is not empty"
110 class NeedsWebStubError(wizard.Error):
112 return "You need to specify a web stub directory for this application"