/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 bzrlib/testament.py

  • Committer: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

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):