You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
git-filter-repo/t/t9391/splice_repos.py

74 lines
2.2 KiB
Python

#!/usr/bin/env python
import re
import sys
import git_filter_repo as fr
class InterleaveRepositories:
def __init__(self, repo1, repo2, output_dir):
self.repo1 = repo1
self.repo2 = repo2
self.output_dir = output_dir
self.commit_map = {}
self.last_commit = None
def skip_reset(self, reset):
reset.skip()
def hold_commit(self, commit):
commit.skip(new_id = commit.id)
letter = re.match('Commit (.)', commit.message).group(1)
self.commit_map[letter] = commit
def weave_commit(self, commit):
letter = re.match('Commit (.)', commit.message).group(1)
prev_letter = chr(ord(letter)-1)
# Splice in any extra commits needed
if prev_letter in self.commit_map:
new_commit = self.commit_map[prev_letter]
new_commit.from_commit = self.last_commit
new_commit.dump(self.out._output)
commit.from_commit = new_commit.id
# Dump our commit now
commit.dump(self.out._output)
# Make sure that commits that depended on new_commit.id will now depend
# on commit.id
if prev_letter in self.commit_map:
self.last_commit = commit.id
fr.record_id_rename(new_commit.id, commit.id)
def run(self):
blob = fr.Blob('public gpg key contents')
tag = fr.Tag('gpg-pubkey', blob.id,
'Ima Tagger', 'ima@tagg.er', '1136199845 +0300',
'Very important explanation and stuff')
args = fr.FilteringOptions.parse_args(['--target', self.output_dir])
out = fr.RepoFilter(args)
out.importer_only()
self.out = out
i1args = fr.FilteringOptions.parse_args(['--source', self.repo1])
i1 = fr.RepoFilter(i1args,
reset_callback = lambda r: self.skip_reset(r),
commit_callback = lambda c: self.hold_commit(c))
i1.set_output(out)
i1.run()
i2args = fr.FilteringOptions.parse_args(['--source', self.repo2])
i2 = fr.RepoFilter(i2args,
commit_callback = lambda c: self.weave_commit(c))
i2.set_output(out)
i2.run()
blob.dump(out._output)
tag.dump(out._output)
out.finish()
splicer = InterleaveRepositories(sys.argv[1], sys.argv[2], sys.argv[3])
splicer.run()