def commit(self, message): self._validate_unicode_text(message, 'commit message') c = Commit() c.parents = [ self.repository.lookup_bzr_revision_id(revid)[0] for revid in self.parents ] c.tree = commit_tree(self.store, self._iterblobs()) encoding = self._revprops.pop(u'git-explicit-encoding', 'utf-8') c.encoding = encoding.encode('ascii') c.committer = fix_person_identifier(self._committer.encode(encoding)) try: author = self._revprops.pop('author') except KeyError: try: authors = self._revprops.pop('authors').splitlines() except KeyError: author = self._committer else: if len(authors) > 1: raise Exception("Unable to convert multiple authors") elif len(authors) == 0: author = self._committer else: author = authors[0] c.author = fix_person_identifier(author.encode(encoding)) bugstext = self._revprops.pop('bugs', None) if bugstext is not None: message += "\n" for url, status in bugtracker.decode_bug_urls(bugstext): if status == bugtracker.FIXED: message += "Fixes: %s\n" % url elif status == bugtracker.RELATED: message += "Bug: %s\n" % url else: raise bugtracker.InvalidBugStatus(status) if self._revprops: raise NotImplementedError(self._revprops) c.commit_time = int(self._timestamp) c.author_time = int(self._timestamp) c.commit_timezone = self._timezone c.author_timezone = self._timezone c.message = message.encode(encoding) if (self._config_stack.get('create_signatures') == _mod_config.SIGN_ALWAYS): strategy = gpg.GPGStrategy(self._config_stack) c.gpgsig = strategy.sign(c.as_raw_string(), gpg.MODE_DETACH) self.store.add_object(c) self.repository.commit_write_group() self._new_revision_id = self._mapping.revision_id_foreign_to_bzr(c.id) return self._new_revision_id
def export_commit(self, rev, tree_sha, parent_lookup, lossy, verifiers): """Turn a Bazaar revision in to a Git commit :param tree_sha: Tree sha for the commit :param parent_lookup: Function for looking up the GIT sha equiv of a bzr revision :param lossy: Whether to store roundtripping information. :param verifiers: Verifiers info :return dulwich.objects.Commit represent the revision: """ from dulwich.objects import Commit, Tag commit = Commit() commit.tree = tree_sha if not lossy: metadata = CommitSupplement() metadata.verifiers = verifiers else: metadata = None parents = [] for p in rev.parent_ids: try: git_p = parent_lookup(p) except KeyError: git_p = None if metadata is not None: metadata.explicit_parent_ids = rev.parent_ids if git_p is not None: if len(git_p) != 40: raise AssertionError("unexpected length for %r" % git_p) parents.append(git_p) commit.parents = parents try: encoding = rev.properties[u'git-explicit-encoding'] except KeyError: encoding = rev.properties.get(u'git-implicit-encoding', 'utf-8') try: commit.encoding = rev.properties[u'git-explicit-encoding'].encode( 'ascii') except KeyError: pass commit.committer = fix_person_identifier(rev.committer.encode( encoding)) commit.author = fix_person_identifier( rev.get_apparent_authors()[0].encode(encoding)) # TODO(jelmer): Don't use this hack. long = getattr(__builtins__, 'long', int) commit.commit_time = long(rev.timestamp) if u'author-timestamp' in rev.properties: commit.author_time = long(rev.properties[u'author-timestamp']) else: commit.author_time = commit.commit_time commit._commit_timezone_neg_utc = ( u"commit-timezone-neg-utc" in rev.properties) commit.commit_timezone = rev.timezone commit._author_timezone_neg_utc = ( u"author-timezone-neg-utc" in rev.properties) if u'author-timezone' in rev.properties: commit.author_timezone = int(rev.properties[u'author-timezone']) else: commit.author_timezone = commit.commit_timezone if u'git-gpg-signature' in rev.properties: commit.gpgsig = rev.properties[u'git-gpg-signature'].encode( 'utf-8', 'surrogateescape') commit.message = self._encode_commit_message(rev, rev.message, encoding) if not isinstance(commit.message, bytes): raise TypeError(commit.message) if metadata is not None: try: mapping_registry.parse_revision_id(rev.revision_id) except errors.InvalidRevisionId: metadata.revision_id = rev.revision_id mapping_properties = set( [u'author', u'author-timezone', u'author-timezone-neg-utc', u'commit-timezone-neg-utc', u'git-implicit-encoding', u'git-gpg-signature', u'git-explicit-encoding', u'author-timestamp', u'file-modes']) for k, v in rev.properties.items(): if k not in mapping_properties: metadata.properties[k] = v if not lossy and metadata: if self.roundtripping: commit.message = inject_bzr_metadata(commit.message, metadata, encoding) else: raise NoPushSupport( None, None, self, revision_id=rev.revision_id) if not isinstance(commit.message, bytes): raise TypeError(commit.message) i = 0 propname = u'git-mergetag-0' while propname in rev.properties: commit.mergetag.append(Tag.from_string(rev.properties[propname])) i += 1 propname = u'git-mergetag-%d' % i if u'git-extra' in rev.properties: commit.extra.extend( [l.split(b' ', 1) for l in rev.properties[u'git-extra'].splitlines()]) return commit