From: Evan Broder Date: Thu, 25 Dec 2008 04:33:27 +0000 (-0500) Subject: Here's a version that's more likely to work. X-Git-Url: http://xvm.mit.edu/gitweb/invirt/scripts/git-migration.git/commitdiff_plain/f042480e435cbf19bac8bb6ae0d4a16ba57e517f Here's a version that's more likely to work. svn path=/trunk/scripts/git-migration/; revision=1893 --- diff --git a/git-migrate b/git-migrate index 458d903..f03884f 100755 --- a/git-migrate +++ b/git-migrate @@ -5,6 +5,29 @@ import sys import subprocess import shutil +def tagBase(pkg): + p = subprocess.Popen(['git', 'tag', + '-l', + 'base'], + cwd='%s.git' % pkg, + stdout=subprocess.PIPE) + p.wait() + if p.stdout.read().strip() != '': + return + + p = subprocess.Popen(['git', 'rev-list', + '--reverse', + 'master'], + cwd='%s.git' % pkg, + stdout=subprocess.PIPE) + p.wait() + base = p.stdout.read().split()[0] + + subprocess.check_call(['git', 'tag', + 'base', + base], + cwd='%s.git' % pkg) + def clonePackage(base, pkg): if not os.path.isdir('%s.git' % pkg): if os.path.isdir(pkg): @@ -34,16 +57,67 @@ def clonePackage(base, pkg): if len(p.stdout.read()) == 0: subprocess.check_call(['git', 'reset', '--soft', 'HEAD^'], cwd='%s.git' % pkg) + + tagBase(pkg) def cloneAllPackages(base): for pkg in open('package-list'): clonePackage(base, pkg.strip()) def mergeHistory(old_pkg, new_pkg, n): + n = int(n) + subprocess.check_call(['git', 'push', '../%s.git' % new_pkg, 'master:refs/heads/%s' % old_pkg], cwd='%s.git' % old_pkg) + + # Find the merge commit + if n == 0: + p = subprocess.Popen(['git', 'rev-parse', + 'base'], + cwd='%s.git' % new_pkg, + stdout=subprocess.PIPE) + else: + p = subprocess.Popen(['git', 'rev-list', + '--reverse', + '--boundary', + '--skip=%s' % (n - 1), + 'base..master'], + cwd='%s.git' % new_pkg, + stdout=subprocess.PIPE) + p.wait() + new_rev = p.stdout.read().split()[0].strip('-') + + # Find any other parents of the merge commit + p = subprocess.Popen(['git', 'log', + '-1', + '--pretty=format:%P', + new_rev], + cwd='%s.git' % new_pkg, + stdout=subprocess.PIPE) + p.wait() + parents = p.stdout.read().split() + + # Find the additional parent we're adding + p = subprocess.Popen(['git', 'rev-parse', + old_pkg], + cwd='%s.git' % new_pkg, + stdout=subprocess.PIPE) + p.wait() + parents.append(p.stdout.read().strip()) + + # Write out the grafts file + f = open('%s.git/info/grafts' % new_pkg, 'a') + print >>f, '%s %s' % (new_rev, ' '.join(parents)) + f.close() + + # Run filter-branch + subprocess.call(['git', 'filter-branch', + '--tag-name-filter', 'cat', + '--', + '--all'], + cwd='%s.git' % new_pkg) def mergeHistories(): merges = []