~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: mbp at sourcefrog
  • Date: 2005-04-13 04:07:00 UTC
  • Revision ID: mbp@sourcefrog.net-20050413040700-cd67a1265f4e8af9
- control files always in utf-8-unix format
- command line arguments interpreted as locale encoding

Show diffs side-by-side

added added

removed removed

Lines of Context:
152
152
 
153
153
 
154
154
    def controlfile(self, file_or_path, mode='r'):
155
 
        """Open a control file for this branch"""
156
 
        return file(self.controlfilename(file_or_path), mode)
 
155
        """Open a control file for this branch.
 
156
 
 
157
        There are two classes of file in the control directory: text
 
158
        and binary.  binary files are untranslated byte streams.  Text
 
159
        control files are stored with Unix newlines and in UTF-8, even
 
160
        if the platform or locale defaults are different.
 
161
        """
 
162
 
 
163
        fn = self.controlfilename(file_or_path)
 
164
 
 
165
        if mode == 'rb' or mode == 'wb':
 
166
            return file(fn, mode)
 
167
        elif mode == 'r' or mode == 'w':
 
168
            # open in binary mode anyhow so there's no newline translation
 
169
            import codecs
 
170
            return codecs.open(fn, mode + 'b', 'utf-8')
 
171
        else:
 
172
            raise BzrError("invalid controlfile mode %r" % mode)
 
173
 
157
174
 
158
175
 
159
176
    def _make_control(self):
161
178
        self.controlfile('README', 'w').write(
162
179
            "This is a Bazaar-NG control directory.\n"
163
180
            "Do not change any files in this directory.")
164
 
        self.controlfile('branch-format', 'wb').write(BZR_BRANCH_FORMAT)
 
181
        self.controlfile('branch-format', 'w').write(BZR_BRANCH_FORMAT)
165
182
        for d in ('text-store', 'inventory-store', 'revision-store'):
166
183
            os.mkdir(self.controlfilename(d))
167
184
        for f in ('revision-history', 'merged-patches',
182
199
        # This ignores newlines so that we can open branches created
183
200
        # on Windows from Linux and so on.  I think it might be better
184
201
        # to always make all internal files in unix format.
185
 
        fmt = self.controlfile('branch-format', 'rb').read()
 
202
        fmt = self.controlfile('branch-format', 'r').read()
186
203
        fmt.replace('\r\n', '')
187
204
        if fmt != BZR_BRANCH_FORMAT:
188
205
            bailout('sorry, branch format %r not supported' % fmt,
193
210
    def read_working_inventory(self):
194
211
        """Read the working inventory."""
195
212
        before = time.time()
196
 
        inv = Inventory.read_xml(self.controlfile('inventory', 'r'))
 
213
        # ElementTree does its own conversion from UTF-8, so open in
 
214
        # binary.
 
215
        inv = Inventory.read_xml(self.controlfile('inventory', 'rb'))
197
216
        mutter("loaded inventory of %d items in %f"
198
217
               % (len(inv), time.time() - before))
199
218
        return inv
208
227
        ## TODO: factor out to atomicfile?  is rename safe on windows?
209
228
        ## TODO: Maybe some kind of clean/dirty marker on inventory?
210
229
        tmpfname = self.controlfilename('inventory.tmp')
211
 
        tmpf = file(tmpfname, 'w')
 
230
        tmpf = file(tmpfname, 'wb')
212
231
        inv.write_xml(tmpf)
213
232
        tmpf.close()
214
233
        inv_fname = self.controlfilename('inventory')
612
631
        >>> ScratchBranch().revision_history()
613
632
        []
614
633
        """
615
 
        return [chomp(l) for l in self.controlfile('revision-history').readlines()]
 
634
        return [chomp(l) for l in self.controlfile('revision-history', 'r').readlines()]
616
635
 
617
636
 
618
637
    def revno(self):