X-Git-Url: http://xvm.mit.edu/gitweb/invirt/scripts/git-migration.git/blobdiff_plain/f042480e435cbf19bac8bb6ae0d4a16ba57e517f..55d9f8723b2aa4d856e9d1fcf3a9d31c75dd27c7:/git-migrate diff --git a/git-migrate b/git-migrate index f03884f..52204b2 100755 --- a/git-migrate +++ b/git-migrate @@ -1,5 +1,6 @@ #!/usr/bin/python +import glob import os import sys import subprocess @@ -28,18 +29,27 @@ def tagBase(pkg): base], cwd='%s.git' % pkg) -def clonePackage(base, pkg): +def clonePackage(base, repo_path): + pkg = os.path.basename(repo_path) + if not os.path.isdir('%s.git' % pkg): if os.path.isdir(pkg): shutil.rmtree(pkg) + + args = [] + args.append('-Ttrunk/%s' % repo_path) + if repo_path.startswith('packages/'): + args.append('-tpackage_tags/%s' % pkg) + args.append(base) + args.append(pkg) + # Use --no-follow-parent because we're going to handle that with # grafts. subprocess.check_call(['git', 'svn', 'clone', '--no-follow-parent', '-Aauthors', '-q', - '--no-metadata', - '%s/packages/%s' % (base, pkg)], + '--no-metadata'] + args, stdout=subprocess.PIPE) # Then make the repository bare, because git-svn can't do this @@ -58,6 +68,20 @@ def clonePackage(base, pkg): subprocess.check_call(['git', 'reset', '--soft', 'HEAD^'], cwd='%s.git' % pkg) + # Early in the project's history, there were a bunch of double + # directory trees - i.e. the source was actually in + # trunk/packages/$package/$package. Correct for that + cwd = os.getcwd() + os.environ['PACKAGE'] = pkg + p = subprocess.check_call(['git', 'filter-branch', + '--commit-filter', '%s "$@"' % os.path.join(cwd, 'filter-subdirs'), + '--tag-name-filter', 'cat', + '--', + '--all'], + cwd='%s.git' % pkg) + + shutil.rmtree('%s.git/refs/original' % pkg, True) + tagBase(pkg) def cloneAllPackages(base): @@ -118,6 +142,12 @@ def mergeHistory(old_pkg, new_pkg, n): '--', '--all'], cwd='%s.git' % new_pkg) + + subprocess.call(['git', 'branch', + '-D', + old_pkg], + cwd='%s.git' % new_pkg) + shutil.rmtree('%s.git/refs/original' % new_pkg, True) def mergeHistories(): merges = [] @@ -130,12 +160,24 @@ def mergeHistories(): for merge in merges: mergeHistory(*merge) + + for merge in merges: + shutil.rmtree('%s.git' % merge[0]) + +def cleanupRepos(): + for pkg in glob.glob('*.git'): + subprocess.check_call(['git', 'tag', '-d', 'base'], + cwd='%s' % pkg) + + subprocess.check_call(['git', 'gc'], + cwd='%s' % pkg) if __name__ == '__main__': try: base = sys.argv[1] except: - base = 'svn://invirt.mit.edu/trunk' + base = 'svn://invirt.mit.edu' cloneAllPackages(base) mergeHistories() + cleanupRepos()