/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 roundtrip.py

Remove segment parameters for http smart transports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
"""Roundtripping support."""
18
 
 
 
17
"""Roundtripping support.
 
18
 
 
19
Bazaar stores more data than Git, which means that in order to preserve
 
20
a commit when it is pushed from Bazaar into Git we have to stash
 
21
that extra metadata somewhere.
 
22
 
 
23
There are two kinds of metadata relevant here:
 
24
 * per-file metadata (stored by revision+path)
 
25
  - usually stored per tree
 
26
 * per-revision metadata (stored by git commit id)
 
27
 
 
28
Bazaar revisions have the following information that is not
 
29
present in Git commits:
 
30
 * revision ids
 
31
 * revision properties
 
32
 * ghost parents
 
33
 
 
34
Tree content:
 
35
 * empty directories
 
36
 * path file ids
 
37
 * path last changed revisions [1]
 
38
 
 
39
 [1] path last changed revision information can usually
 
40
     be induced from the existing history, unless
 
41
     ghost revisions are involved.
 
42
 
 
43
This extra metadata is stored in so-called "supplements":
 
44
  * CommitSupplement
 
45
  * TreeSupplement
 
46
"""
 
47
 
 
48
from bzrlib import osutils
19
49
 
20
50
from cStringIO import StringIO
21
51
 
22
52
 
23
 
class BzrGitRevisionMetadata(object):
24
 
    """Metadata for a Bazaar revision roundtripped into Git.
 
53
class CommitSupplement(object):
 
54
    """Supplement for a Bazaar revision roundtripped into Git.
25
55
 
26
56
    :ivar revision_id: Revision id, as string
27
57
    :ivar properties: Revision properties, as dictionary
33
63
 
34
64
    explicit_parent_ids = None
35
65
 
36
 
    verifiers = {}
37
 
 
38
66
    def __init__(self):
39
67
        self.properties = {}
 
68
        self.verifiers = {}
40
69
 
41
70
    def __nonzero__(self):
42
 
        return bool(self.revision_id or self.properties)
 
71
        return bool(self.revision_id or self.properties or self.explicit_parent_ids)
 
72
 
 
73
 
 
74
class TreeSupplement(object):
 
75
    """Supplement for a Bazaar tree roundtripped into Git.
 
76
 
 
77
    This provides file ids (if they are different from the mapping default)
 
78
    and can provide text revisions.
 
79
    """
 
80
 
43
81
 
44
82
 
45
83
def parse_roundtripping_metadata(text):
46
84
    """Parse Bazaar roundtripping metadata."""
47
 
    ret = BzrGitRevisionMetadata()
 
85
    ret = CommitSupplement()
48
86
    f = StringIO(text)
49
87
    for l in f.readlines():
50
88
        (key, value) = l.split(":", 1)
55
93
        elif key == "testament3-sha1":
56
94
            ret.verifiers["testament3-sha1"] = value.strip()
57
95
        elif key.startswith("property-"):
58
 
            ret.properties[key[len("property-"):]] = value[1:].rstrip("\n")
 
96
            name = key[len("property-"):]
 
97
            if not name in ret.properties:
 
98
                ret.properties[name] = value[1:].rstrip("\n")
 
99
            else:
 
100
                ret.properties[name] += "\n" + value[1:].rstrip("\n")
59
101
        else:
60
102
            raise ValueError
61
103
    return ret
64
106
def generate_roundtripping_metadata(metadata, encoding):
65
107
    """Serialize the roundtripping metadata.
66
108
 
67
 
    :param metadata: A `BzrGitRevisionMetadata` instance
 
109
    :param metadata: A `CommitSupplement` instance
68
110
    :return: String with revision metadata
69
111
    """
70
112
    lines = []
73
115
    if metadata.explicit_parent_ids:
74
116
        lines.append("parent-ids: %s\n" % " ".join(metadata.explicit_parent_ids))
75
117
    for key in sorted(metadata.properties.keys()):
76
 
        lines.append("property-%s: %s\n" % (key.encode(encoding), metadata.properties[key].encode(encoding)))
 
118
        for l in metadata.properties[key].split("\n"):
 
119
            lines.append("property-%s: %s\n" % (key.encode(encoding), osutils.safe_utf8(l)))
77
120
    if "testament3-sha1" in metadata.verifiers:
78
121
        lines.append("testament3-sha1: %s\n" %
79
122
                     metadata.verifiers["testament3-sha1"])
92
135
    return split[0], parse_roundtripping_metadata(split[1])
93
136
 
94
137
 
95
 
def inject_bzr_metadata(message, metadata, encoding):
96
 
    if not metadata:
 
138
def inject_bzr_metadata(message, commit_supplement, encoding):
 
139
    if not commit_supplement:
97
140
        return message
98
 
    rt_data = generate_roundtripping_metadata(metadata, encoding)
 
141
    rt_data = generate_roundtripping_metadata(commit_supplement, encoding)
99
142
    if not rt_data:
100
143
        return message
101
144
    assert type(rt_data) == str
103
146
 
104
147
 
105
148
def serialize_fileid_map(file_ids):
106
 
    """Serialize a file id map."""
 
149
    """Serialize a fileid map.
 
150
 
 
151
    :param file_ids: Path -> fileid map
 
152
    :return: Serialized fileid map, as sequence of chunks
 
153
    """
107
154
    lines = []
108
155
    for path in sorted(file_ids.keys()):
109
156
        lines.append("%s\0%s\n" % (path, file_ids[path]))
111
158
 
112
159
 
113
160
def deserialize_fileid_map(filetext):
114
 
    """Deserialize a file id map."""
 
161
    """Deserialize a file id map.
 
162
 
 
163
    :param file: File
 
164
    :return: Fileid map (path -> fileid)
 
165
    """
115
166
    ret = {}
116
167
    f = StringIO(filetext)
117
168
    lines = f.readlines()