7 import wizard.deploy as wd
8 import wizard.shell as sh
11 def massmigrate(argv, global_options, logger = None):
12 usage = """usage: %prog massmigrate [ARGS] APPLICATION
14 Mass migrates an application to the new repository format.
15 Essentially equivalent to running '%prog migrate' on all
16 autoinstalls for a particular application found by parallel-find,
17 but with advanced reporting.
19 NOTE: --verbose implies --no-parallelize, as it results in
20 output going to stdout/stderr."""
21 parser = WizardOptionParser(usage)
22 parser.add_option("--no-parallelize", dest="no_parallelize", action="store_true",
23 default=False, help="Turn off parallelization")
24 parser.add_option("--dry-run", dest="dry_run", action="store_true",
25 default=False, help="Print commands that would be run. Implies --no-parallelize")
26 options, args, logger = parser.parse_all(argv, logger)
28 parser.error("too many arguments")
30 parser.error("must specify application to migrate")
31 if options.verbose or options.dry_run:
32 options.no_parallelize = True
35 if options.verbose: base_args.append("--verbose")
36 if options.dry_run: base_args.append("--dry-run")
38 for line in wd.getInstallLines(global_options):
40 deploy = wd.Deployment.parse(line)
41 except wd.DeploymentParseError, wd.NoSuchApplication:
43 name = deploy.getApplication().name
44 if name != app: continue
45 deploys.append(deploy)
46 # parallelization code would go here
48 for deploy in deploys:
49 sub_argv = base_args + [deploy.location]
50 logger.info("$ wizard migrate " + " ".join(sub_argv))
52 migrate.migrate(sub_argv, global_options, logger)
53 except UserException as e:
54 name = e.__class__.__name__
55 if name not in errors: errors[name] = []
56 errors[name].append(deploy)
57 logger.error("ERROR [%s] in %s" % (name, d.location))
58 for name, deploys in errors.items():
59 logger.warning("ERROR [%s] from %d installs" % (name, len(deploys)))