Example #1
0
 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
Example #2
0
    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