~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

Rearrange log opening helper function and fix a couple of bugs

Show diffs side-by-side

added added

removed removed

Lines of Context:
239
239
    """
240
240
    global _bzr_log_filename
241
241
 
242
 
    def create_log_file(filename):
243
 
        """Create the .bzr.log file.
 
242
    def _open_or_create_log_file(filename):
 
243
        """Open existing log file, or create with ownership and permissions
244
244
 
245
245
        It inherits the ownership and permissions (masked by umask) from
246
246
        the containing directory to cope better with being run under sudo
247
247
        with $HOME still set to the user's homedir.
248
248
        """
249
 
        buffering = 0 # unbuffered
250
249
        flags = os.O_WRONLY | os.O_APPEND | osutils.O_TEXT
251
250
        while True:
252
251
            try:
253
252
                fd = os.open(filename, flags)
254
 
                logfile = os.fdopen(fd, 'at', buffering)
255
 
                return logfile
 
253
                break
256
254
            except OSError, e:
257
255
                if e.errno != errno.ENOENT:
258
256
                    raise
259
257
            try:
260
 
                flags = flags | os.O_CREAT | os.O_EXCL
261
 
                permissions = 0666
262
 
                fd = os.open(filename, flags, permissions)
263
 
                logfile = os.fdopen(fd, 'at', buffering)
 
258
                fd = os.open(filename, flags | os.O_CREAT | os.O_EXCL, 0666)
264
259
            except OSError, e:
265
260
                if e.errno != errno.EEXIST:
266
261
                    raise
267
262
            else:
268
263
                osutils.copy_ownership_from_path(filename)
269
 
                return logfile
 
264
                break
 
265
        return os.fdopen(fd, 'at', 0) # unbuffered
270
266
 
271
267
 
272
268
    _bzr_log_filename = _get_bzr_log_filename()
273
269
    _rollover_trace_maybe(_bzr_log_filename)
274
270
    try:
275
 
        bzr_log_file = create_log_file(_bzr_log_filename)
 
271
        bzr_log_file = _open_or_create_log_file(_bzr_log_filename)
276
272
        bzr_log_file.write('\n')
277
273
        if bzr_log_file.tell() <= 2:
278
274
            bzr_log_file.write("this is a debug log for diagnosing/reporting problems in bzr\n")
281
277
 
282
278
        return bzr_log_file
283
279
 
284
 
    except IOError, e:
 
280
    except EnvironmentError, e:
285
281
        # If we are failing to open the log, then most likely logging has not
286
282
        # been set up yet. So we just write to stderr rather than using
287
283
        # 'warning()'. If we using warning(), users get the unhelpful 'no