# Fudge committer and author ids that git fast-import considers invalid # Copyright 2020 Codethink Ltd import re import sys from mercurial import templatefilters def build_filter(args): return Filter(args) class Filter: # What git considers valid (see parse_ident() in fast-import.c) _valid_id_re = re.compile(rb'^[^<>]* <[^<>]+>$') # Special characters we may need to replace _id_special_re = re.compile(rb'[<>]') def __init__(self, args): pass def commit_message_filter(self, commit_data): for key in ['author', 'committer']: try: user_id = commit_data[key] except KeyError: continue if self._valid_id_re.match(user_id): continue name = templatefilters.person(user_id) email = templatefilters.email(user_id) # Replace any special characters left in the name and email name = self._id_special_re.sub(b'?', name) email = self._id_special_re.sub(b'?', email) commit_data[key] = b'%s <%s>' % (name, email) sys.stderr.write( 'Replaced %s id "%s" with "%s"\n' % (key, user_id.decode('utf-8', errors='replace'), commit_data[key].decode('utf-8', errors='replace')))