~jameinel/bzr/lru_locking

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-04-24 16:54:50 UTC
  • mfrom: (5183.1.2 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100424165450-2jfbk8ta0hhznynx
(vila) Only chown() the .bzr.log when creating it (Parth Malwankar)

Show diffs side-by-side

added added

removed removed

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