Partial work on a svn-all-fast-export based Git migrator.
authorAnders Kaseorg <andersk@mit.edu>
Thu, 25 Dec 2008 23:40:40 +0000 (18:40 -0500)
committerAnders Kaseorg <andersk@mit.edu>
Thu, 25 Dec 2008 23:40:40 +0000 (18:40 -0500)
svn path=/trunk/scripts/git-migration/; revision=1901

git-migrate-fast.sh [new file with mode: 0755]
rules.mako [new file with mode: 0644]

diff --git a/git-migrate-fast.sh b/git-migrate-fast.sh
new file mode 100755 (executable)
index 0000000..8b70fa4
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -e
+
+mako-render rules.mako > rules
+
+rm git -rf
+mkdir git
+cd git
+
+sed -n 's/^create repository // p' ../rules | while read repo; do
+    mkdir -p "$repo" && GIT_DIR="$repo" git init --bare
+done
+
+echo run > ../run.gdb
+gdb -batch -x ../run.gdb --args svn-all-fast-export ../rules /home/anders/xvm/svn
+
+sed -n 's/^create repository // p' ../rules | while read repo; do
+    ! [ -e "$repo/refs/heads/tags" ] || \
+       cp -a "$repo/refs/heads/tags/." "$repo/refs/tags" && \
+       rm -rf "$repo/refs/heads/tags"
+done
diff --git a/rules.mako b/rules.mako
new file mode 100644 (file)
index 0000000..6d7ca1c
--- /dev/null
@@ -0,0 +1,96 @@
+<%
+    packages = [line.strip() for line in open('package-list')]
+    packages.append('packages/xvm-console-devconfig')
+    repos = packages
+    packages = [package[len('packages/'):] for package in packages]
+
+    merges = []
+    for line in open('merges'):
+        line = line.strip()
+        if line == '' or line[0] == '#':
+            continue
+
+        merges.append(line.split())
+
+    merge_map = {}
+    merge_count = {}
+    merge_n = {}
+    for merge in merges:
+        repos.remove('packages/%s' % merge[0])
+        merge_map[merge[0]] = merge[1]
+        if int(merge[2]) == 0:
+            merge_count[merge[1]] = merge_count.get(merge[1], 0) + 1
+        else:
+            merge_n[merge[0]] = int(merge[2])
+
+    def get_repo(package):
+        if package in merge_map:
+            return get_repo(merge_map[package])
+        return 'packages/%s.git' % package
+
+    def get_branch(package):
+        if package in merge_map:
+            if package in merge_n or merge_count[merge_map[package]] > 1:
+                return package
+            return get_branch(merge_map[package])
+        return 'master'
+
+    def get_tag_prefix(package):
+        if package in merge_map:
+            return '%s/' % package
+        return ''
+%>
+
+% for repo in repos:
+create repository ${repo}.git
+end repository
+
+% endfor
+
+% for package in packages:
+match /trunk/packages/${package}/${package}/
+  repository ${get_repo(package)}
+  branch ${get_branch(package)}
+end match
+
+match /package_tags/${package}/([^/~]+)/${package}/
+  repository ${get_repo(package)}
+  branch tags/${get_tag_prefix(package)}\1
+end match
+
+match /trunk/packages/${package}/
+  repository ${get_repo(package)}
+  branch ${get_branch(package)}
+end match
+
+match /package_tags/${package}/([^/~]+)/
+  repository ${get_repo(package)}
+  branch tags/${get_tag_prefix(package)}\1
+end match
+
+match /package_tags/${package}/([^/~]+)~([^/~]+)/
+  repository ${get_repo(package)}
+  branch tags/${get_tag_prefix(package)}\1_\2
+end match
+
+% endfor
+
+match /trunk/packages/(xen-common|xen-3.1)/
+end match
+
+match /package_tags/(xen-common|xen-3.1)/
+end match
+
+match /trunk/packages/tmp/
+  repository ${get_repo('sipb-xen-database')}
+  branch ${get_branch('sipb-xen-database')}
+end match
+
+match /trunk/(dhcp|dns|scripts|vnc|web|vmctl)/
+end match
+
+match /trunk/(COPYING|xvm-host-setup-notes)
+end match
+
+match /branches/wsgi/
+end match