909a604a2881725e75b173769aa4dcf442d44b1d
[invirt/scripts/git-migration.git] / git-migrate
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import subprocess
6 import shutil
7
8 def clonePackage(base, pkg):
9     if not os.path.isdir('%s.git' % pkg):
10         if os.path.isdir(pkg):
11             shutil.rmtree(pkg)
12         # Use --no-follow-parent because we're going to handle that with
13         # grafts.
14         subprocess.check_call(['git', 'svn', 'clone',
15                                '--no-follow-parent',
16                                '-Aauthors',
17                                '-q',
18                                '--no-metadata',
19                                '%s/packages/%s' % (base, pkg)],
20                               stdout=subprocess.PIPE)
21         
22         # Then make the repository bare, because git-svn can't do this
23         shutil.move('%s/.git' % pkg, '%s.git' % pkg)
24         shutil.rmtree(pkg)
25         subprocess.check_call(['git', 'config', 'core.bare', 'true'],
26                               cwd='%s.git' % pkg)
27         
28     # Some of these repos have a rev where everything was deleted
29     # as a result of the move. We don't want that rev to exist.
30     p = subprocess.Popen(['git', 'ls-files'],
31                          cwd='%s.git' % pkg,
32                          stdout=subprocess.PIPE)
33     p.wait()
34     if len(p.stdout.read()) == 0:
35         subprocess.check_call(['git', 'reset', '--soft', 'HEAD^'],
36                               cwd='%s.git' % pkg)
37
38 def cloneAllPackages(base):
39     for pkg in open('package-list'):
40         clonePackage(base, pkg.strip())
41
42 def mergeHistory(old_pkg, new_pkg, n):
43     cwd = os.getcwd()
44     subprocess.check_call(['git', 'push',
45                            'file:///%s/%s.git' % (cwd, new_pkg),
46                            'master:refs/heads/%s' % old_pkg],
47                           cwd='%s.git' % old_pkg)
48
49 def mergeHistories():
50     merges = []
51     for line in open('merges'):
52         line = line.strip()
53         if line == '' or line[0] == '#':
54             continue
55         
56         merges.append(line.split())
57     
58     for merge in merges:
59         mergeHistory(*merge)
60
61 if __name__ == '__main__':
62     try:
63         base = sys.argv[1]
64     except:
65         base = 'svn://invirt.mit.edu/trunk'
66     
67     cloneAllPackages(base)
68     mergeHistories()