/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to mapping.py

(lifeless) When writing temporary files for external diff do not set the file utime if we don't know when the in-tree file was last modified. (Martin [gz])

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
"""Converters, etc for going between Bazaar and Git ids."""
18
 
 
19
 
from bzrlib import errors, foreign
20
 
from bzrlib.inventory import ROOT_ID
21
 
from bzrlib.foreign import (
22
 
        ForeignVcs, 
23
 
        VcsMappingRegistry, 
24
 
        ForeignRevision,
25
 
        )
26
 
 
27
 
 
28
 
def escape_file_id(file_id):
29
 
    return file_id.replace('_', '__').replace(' ', '_s')
30
 
 
31
 
 
32
 
def unescape_file_id(file_id):
33
 
    return file_id.replace("_s", " ").replace("__", "_")
34
 
 
35
 
 
36
 
class BzrGitMapping(foreign.VcsMapping):
37
 
    """Class that maps between Git and Bazaar semantics."""
38
 
    experimental = False
39
 
 
40
 
    def __eq__(self, other):
41
 
        return type(self) == type(other) and self.revid_prefix == other.revid_prefix
42
 
 
43
 
    @classmethod
44
 
    def revision_id_foreign_to_bzr(cls, git_rev_id):
45
 
        """Convert a git revision id handle to a Bazaar revision id."""
46
 
        return "%s:%s" % (cls.revid_prefix, git_rev_id)
47
 
 
48
 
    @classmethod
49
 
    def revision_id_bzr_to_foreign(cls, bzr_rev_id):
50
 
        """Convert a Bazaar revision id to a git revision id handle."""
51
 
        if not bzr_rev_id.startswith("%s:" % cls.revid_prefix):
52
 
            raise errors.InvalidRevisionId(bzr_rev_id, cls)
53
 
        return bzr_rev_id[len(cls.revid_prefix)+1:], cls()
54
 
 
55
 
    @classmethod
56
 
    def show_foreign_revid(cls, foreign_revid):
57
 
        return { "git commit": foreign_revid }
58
 
 
59
 
    def generate_file_id(self, path):
60
 
        if path == "":
61
 
            return ROOT_ID
62
 
        return escape_file_id(path.encode('utf-8'))
63
 
 
64
 
    def import_commit(self, commit):
65
 
        """Convert a git commit to a bzr revision.
66
 
 
67
 
        :return: a `bzrlib.revision.Revision` object.
68
 
        """
69
 
        if commit is None:
70
 
            raise AssertionError("Commit object can't be None")
71
 
        rev = ForeignRevision(commit.id, self, self.revision_id_foreign_to_bzr(commit.id))
72
 
        rev.parent_ids = tuple([self.revision_id_foreign_to_bzr(p) for p in commit.parents])
73
 
        rev.message = commit.message.decode("utf-8", "replace")
74
 
        rev.committer = str(commit.committer).decode("utf-8", "replace")
75
 
        if commit.committer != commit.author:
76
 
            rev.properties['author'] = str(commit.author).decode("utf-8", "replace")
77
 
        rev.timestamp = commit.commit_time
78
 
        rev.timezone = 0
79
 
        return rev
80
 
 
81
 
 
82
 
class BzrGitMappingv1(BzrGitMapping):
83
 
    revid_prefix = 'git-v1'
84
 
    experimental = False
85
 
 
86
 
 
87
 
class BzrGitMappingExperimental(BzrGitMappingv1):
88
 
    revid_prefix = 'git-experimental'
89
 
    experimental = True
90
 
 
91
 
 
92
 
class GitMappingRegistry(VcsMappingRegistry):
93
 
 
94
 
    def revision_id_bzr_to_foreign(self, bzr_revid):
95
 
        if not bzr_revid.startswith("git-"):
96
 
            raise errors.InvalidRevisionId(bzr_revid, None)
97
 
        (mapping_version, git_sha) = bzr_revid.split(":", 1)
98
 
        mapping = self.get(mapping_version)
99
 
        return mapping.revision_id_bzr_to_foreign(bzr_revid)
100
 
 
101
 
    parse_revision_id = revision_id_bzr_to_foreign
102
 
 
103
 
 
104
 
mapping_registry = GitMappingRegistry()
105
 
mapping_registry.register_lazy('git-v1', "bzrlib.plugins.git.mapping",
106
 
                                   "BzrGitMappingv1")
107
 
mapping_registry.register_lazy('git-experimental', "bzrlib.plugins.git.mapping",
108
 
                                   "BzrGitMappingExperimental")
109
 
 
110
 
 
111
 
class ForeignGit(ForeignVcs):
112
 
    """Foreign Git."""
113
 
 
114
 
    def __init__(self):
115
 
        super(ForeignGit, self).__init__(mapping_registry)
116
 
 
117
 
 
118
 
default_mapping = BzrGitMappingv1()
119
 
foreign_git = ForeignGit()