~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/testament.py

- refactor handling of short option names

Show diffs side-by-side

added added

removed removed

Lines of Context:
69
69
# TODO: Perhaps these should just be different formats in which inventories/
70
70
# revisions can be serialized.
71
71
 
72
 
from copy import copy
73
72
from cStringIO import StringIO
74
73
import string
75
74
from sha import sha
82
81
    Testaments can be 
83
82
 
84
83
      - produced from a revision
85
 
      - written to a stream
 
84
      - writen to a stream
86
85
      - loaded from a stream
87
86
      - compared to a revision
88
87
    """
89
88
 
90
89
    @classmethod
91
 
    def from_revision(cls, repository, revision_id):
 
90
    def from_revision(cls, branch, revision_id):
92
91
        """Produce a new testament from a historical revision"""
93
 
        rev = repository.get_revision(revision_id)
94
 
        inventory = repository.get_inventory(revision_id)
95
 
        return cls(rev, inventory)
96
 
 
97
 
    def __init__(self, rev, inventory):
98
 
        """Create a new testament for rev using inventory."""
99
 
        self.revision_id = str(rev.revision_id)
100
 
        self.committer = rev.committer
101
 
        self.timezone = rev.timezone or 0
102
 
        self.timestamp = rev.timestamp
103
 
        self.message = rev.message
104
 
        self.parent_ids = rev.parent_ids[:]
105
 
        self.inventory = inventory
106
 
        self.revprops = copy(rev.properties)
107
 
        assert not contains_whitespace(self.revision_id)
108
 
        assert not contains_linebreaks(self.committer)
 
92
        t = cls()
 
93
        rev = branch.get_revision(revision_id)
 
94
        t.revision_id = str(revision_id)
 
95
        t.committer = rev.committer
 
96
        t.timezone = rev.timezone or 0
 
97
        t.timestamp = rev.timestamp
 
98
        t.message = rev.message
 
99
        t.parent_ids = rev.parent_ids[:]
 
100
        t.inventory = branch.get_inventory(revision_id)
 
101
        assert not contains_whitespace(t.revision_id)
 
102
        assert not contains_linebreaks(t.committer)
 
103
        return t
109
104
 
110
105
    def as_text_lines(self):
111
106
        """Yield text form as a sequence of lines.
114
109
        hashed in that encoding.
115
110
        """
116
111
        r = []
117
 
        a = r.append
 
112
        def a(s):
 
113
            r.append(s)
118
114
        a('bazaar-ng testament version 1\n')
119
115
        a('revision-id: %s\n' % self.revision_id)
120
116
        a('committer: %s\n' % self.committer)
131
127
        a('inventory:\n')
132
128
        for path, ie in self.inventory.iter_entries():
133
129
            a(self._entry_to_line(path, ie))
134
 
        r.extend(self._revprops_to_lines())
135
130
        if __debug__:
136
131
            for l in r:
137
 
                assert isinstance(l, basestring), \
 
132
                assert isinstance(l, str), \
138
133
                    '%r of type %s is not a plain string' % (l, type(l))
139
 
        return [line.encode('utf-8') for line in r]
 
134
        return r
140
135
 
141
136
    def _escape_path(self, path):
142
137
        assert not contains_linebreaks(path)
170
165
                'sha1: %s\n'
171
166
                % (self.revision_id, s.hexdigest()))
172
167
 
173
 
    def _revprops_to_lines(self):
174
 
        """Pack up revision properties."""
175
 
        if not self.revprops:
176
 
            return []
177
 
        r = ['properties:\n']
178
 
        for name, value in sorted(self.revprops.items()):
179
 
            assert isinstance(name, str)
180
 
            assert not contains_whitespace(name)
181
 
            r.append('  %s:\n' % name)
182
 
            for line in value.splitlines():
183
 
                if not isinstance(line, str):
184
 
                    line = line.encode('utf-8')
185
 
                r.append('    %s\n' % line)
186
 
        return r