~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/testament.py

  • Committer: Haw Loeung (hloeung)
  • Date: 2012-07-24 12:53:36 UTC
  • mfrom: (6541 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6542.
  • Revision ID: haw.loeung@canonical.com-20120724125336-r3wzxm02lyec7jm6
[hloeung] Merged with upstream resolving conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
59
59
* the testament uses unix line-endings (\n)
60
60
"""
61
61
 
 
62
from __future__ import absolute_import
 
63
 
62
64
# XXX: At the moment, clients trust that the graph described in a weave
63
65
# is accurate, but that's not covered by the testament.  Perhaps the best
64
66
# fix is when verifying a revision to make sure that every file mentioned
74
76
from bzrlib.osutils import (
75
77
    contains_whitespace,
76
78
    contains_linebreaks,
77
 
    sha,
 
79
    sha_strings,
78
80
    )
 
81
from bzrlib.tree import Tree
79
82
 
80
83
 
81
84
class Testament(object):
91
94
 
92
95
    long_header = 'bazaar-ng testament version 1\n'
93
96
    short_header = 'bazaar-ng testament short form 1\n'
 
97
    include_root = False
94
98
 
95
99
    @classmethod
96
100
    def from_revision(cls, repository, revision_id):
97
 
        """Produce a new testament from a historical revision"""
 
101
        """Produce a new testament from a historical revision."""
98
102
        rev = repository.get_revision(revision_id)
99
 
        inventory = repository.get_inventory(revision_id)
100
 
        return cls(rev, inventory)
101
 
 
102
 
    def __init__(self, rev, inventory):
103
 
        """Create a new testament for rev using inventory."""
 
103
        tree = repository.revision_tree(revision_id)
 
104
        return cls(rev, tree)
 
105
 
 
106
    @classmethod
 
107
    def from_revision_tree(cls, tree):
 
108
        """Produce a new testament from a revision tree."""
 
109
        rev = tree._repository.get_revision(tree.get_revision_id())
 
110
        return cls(rev, tree)
 
111
 
 
112
    def __init__(self, rev, tree):
 
113
        """Create a new testament for rev using tree."""
104
114
        self.revision_id = rev.revision_id
105
115
        self.committer = rev.committer
106
116
        self.timezone = rev.timezone or 0
107
117
        self.timestamp = rev.timestamp
108
118
        self.message = rev.message
109
119
        self.parent_ids = rev.parent_ids[:]
110
 
        self.inventory = inventory
 
120
        if not isinstance(tree, Tree):
 
121
            raise TypeError("As of bzr 2.4 Testament.__init__() takes a "
 
122
                "Revision and a Tree.")
 
123
        self.tree = tree
111
124
        self.revprops = copy(rev.properties)
112
125
        if contains_whitespace(self.revision_id):
113
126
            raise ValueError(self.revision_id)
143
156
        return [line.encode('utf-8') for line in r]
144
157
 
145
158
    def _get_entries(self):
146
 
        entries = self.inventory.iter_entries()
147
 
        entries.next()
148
 
        return entries
 
159
        return ((path, ie) for (path, versioned, kind, file_id, ie) in
 
160
                self.tree.list_files(include_root=self.include_root))
149
161
 
150
162
    def _escape_path(self, path):
151
163
        if contains_linebreaks(path):
199
211
        return r
200
212
 
201
213
    def as_sha1(self):
202
 
        s = sha()
203
 
        map(s.update, self.as_text_lines())
204
 
        return s.hexdigest()
 
214
        return sha_strings(self.as_text_lines())
205
215
 
206
216
 
207
217
class StrictTestament(Testament):
209
219
 
210
220
    long_header = 'bazaar-ng testament version 2.1\n'
211
221
    short_header = 'bazaar-ng testament short form 2.1\n'
 
222
    include_root = False
212
223
    def _entry_to_line(self, path, ie):
213
224
        l = Testament._entry_to_line(self, path, ie)[:-1]
214
225
        l += ' ' + ie.revision
224
235
 
225
236
    long_header = 'bazaar testament version 3 strict\n'
226
237
    short_header = 'bazaar testament short form 3 strict\n'
227
 
    def _get_entries(self):
228
 
        return self.inventory.iter_entries()
 
238
    include_root = True
229
239
 
230
240
    def _escape_path(self, path):
231
241
        if contains_linebreaks(path):