summaryrefslogtreecommitdiff
path: root/migrations/run-all
diff options
context:
space:
mode:
Diffstat (limited to 'migrations/run-all')
-rwxr-xr-xmigrations/run-all72
1 files changed, 72 insertions, 0 deletions
diff --git a/migrations/run-all b/migrations/run-all
new file mode 100755
index 00000000..8df00074
--- /dev/null
+++ b/migrations/run-all
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+# Copyright (C) 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''Run a set of migration scripts.
+
+This script does exactly what `PYTHONPATH=. run-parts --exit-on-error` would
+do. I avoided using 'run-parts' purely because the implementation in Fedora 22
+doesn't have an '--exit-on-error' option. The Busybox and Debian
+implementations do have that option.
+
+Please fix run-parts in https://git.fedorahosted.org/cgit/crontabs.git/tree/
+so we can simplify this script :-)
+
+'''
+
+
+import os
+import subprocess
+import sys
+
+
+if len(sys.argv) == 2:
+ migration_dir = sys.argv[1]
+elif len(sys.argv) == 1:
+ migration_dir = os.path.dirname(__file__)
+else:
+ sys.stderr.write("Usage: %s [MIGRATION_DIR]\n" % sys.argv[0])
+ sys.exit(1)
+
+
+def is_executable(fpath):
+ return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+
+env = os.environ
+if 'PYTHONPATH' in env:
+ env['PYTHONPATH'] = env['PYTHONPATH'] + ':' + migration_dir
+else:
+ env['PYTHONPATH'] = migration_dir
+
+try:
+ migrations_found = 0
+ for fname in sorted(os.listdir(migration_dir)):
+ migration_fpath = os.path.join(migration_dir, fname)
+ if is_executable(migration_fpath):
+ if not os.path.samefile(migration_fpath, __file__):
+ migrations_found += 1
+ sys.stdout.write(migration_fpath + ":\n")
+ subprocess.check_call(
+ migration_fpath, env=env)
+
+ if migrations_found == 0:
+ sys.stderr.write("No migration files found in '%s'\n" % migration_dir)
+ sys.exit(1)
+ else:
+ sys.exit(0)
+
+except (subprocess.CalledProcessError, RuntimeError) as e:
+ sys.stderr.write(str(e) + '\n')
+ sys.exit(1)