Switch to side-by-side view

--- a/scripts/migrate_project_database.py
+++ b/scripts/migrate_project_database.py
@@ -12,17 +12,25 @@
 MONGO_HOME=os.environ.get('MONGO_HOME', '/usr')
 MONGO_DUMP=os.path.join(MONGO_HOME, 'bin/mongodump')
 MONGO_RESTORE=os.path.join(MONGO_HOME, 'bin/mongorestore')
+SHARD_LENGTH=1
 
 def main():
     if len(sys.argv) > 1:
         shortnames = sys.argv[1:]
     else:
         shortnames = [ p.shortname for p in M.Project.query.find(dict(is_root=True)) ]
+    databases = set(M.session.main_doc_session.db.connection.database_names())
     for pname in shortnames:
-        migrate_project_database(pname)
+        # This needs to be a .find() instead of a .get() because of the
+        # __init__ projects, which have the same shortname but exist in
+        # multiple neighborhoods.
+        for project in M.Project.query.find(dict(shortname=pname)):
+            migrate_project_database(project, pname, databases)
 
-def migrate_project_database(pname):
-    c.project = project = M.Project.query.get(shortname=pname)
+def migrate_project_database(project, pname, databases):
+    c.project = project
+    target_uri = M.Project.default_database_uri(pname)
+    target_db = target_uri.rsplit('/')[-1]
     if project is None:
         log.fatal('Project %s not found', pname)
         print 'Project %s not found' % pname
@@ -36,18 +44,24 @@
     host = '%s:%s' % (conn.host, conn.port)
     dirname = os.tempnam()
     try:
-        log.info('Backing up %s to %s', pname, dirname)
-        assert 0 == os.system('%s --host %s --db %s -o %s' % (
-                MONGO_DUMP, host, project.database, dirname))
-        assert 0 == os.system('%s --host %s --db project-data %s/%s ' % (
-                MONGO_RESTORE, host, dirname, project.database))
+        if c.project.database not in databases:
+            skip=True
+            log.warning('No db for %s, so not migrating data', pname)
+        else:
+            skip=False
+            log.info('Backing up %s to %s', pname, dirname)
+            assert 0 == os.system('%s --host %s --db %s -o %s' % (
+                    MONGO_DUMP, host, project.database, dirname))
+            assert 0 == os.system('%s --host %s --db %s %s/%s ' % (
+                    MONGO_RESTORE, host, target_db, dirname, project.database))
         database = project.database
         for p in M.Project.query.find(dict(database=database)):
             p.database = ''
-            p.database_uri = 'ming://%s/project-data' % host
+            p.database_uri = M.Project.default_database_uri(pname)
         project.ensure_project_indexes()
         session(project).flush()
-        conn.drop_database(database)
+        if not skip:
+            conn.drop_database(database)
     finally:
         if os.path.exists(dirname):
             shutil.rmtree(dirname)