~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

[merge] config file and other things from robert

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
import types
30
30
 
31
31
import bzrlib
 
32
from bzrlib.config import config_dir, _get_user_id
32
33
from bzrlib.errors import BzrError
33
34
from bzrlib.trace import mutter
34
35
 
131
132
        return
132
133
    bfn = fn + '~'
133
134
 
 
135
    if has_symlinks() and os.path.islink(fn):
 
136
        target = os.readlink(fn)
 
137
        os.symlink(target, bfn)
 
138
        return
134
139
    inf = file(fn, 'rb')
135
140
    try:
136
141
        content = inf.read()
259
264
            'sha1': s.hexdigest()}
260
265
 
261
266
 
262
 
def config_dir():
263
 
    """Return per-user configuration directory.
264
 
 
265
 
    By default this is ~/.bzr.conf/
266
 
    
267
 
    TODO: Global option --config-dir to override this.
268
 
    """
269
 
    return os.path.join(os.path.expanduser("~"), ".bzr.conf")
270
 
 
271
 
 
272
 
def _auto_user_id():
273
 
    """Calculate automatic user identification.
274
 
 
275
 
    Returns (realname, email).
276
 
 
277
 
    Only used when none is set in the environment or the id file.
278
 
 
279
 
    This previously used the FQDN as the default domain, but that can
280
 
    be very slow on machines where DNS is broken.  So now we simply
281
 
    use the hostname.
282
 
    """
283
 
    import socket
284
 
 
285
 
    # XXX: Any good way to get real user name on win32?
286
 
 
287
 
    try:
288
 
        import pwd
289
 
        uid = os.getuid()
290
 
        w = pwd.getpwuid(uid)
291
 
        gecos = w.pw_gecos.decode(bzrlib.user_encoding)
292
 
        username = w.pw_name.decode(bzrlib.user_encoding)
293
 
        comma = gecos.find(',')
294
 
        if comma == -1:
295
 
            realname = gecos
296
 
        else:
297
 
            realname = gecos[:comma]
298
 
        if not realname:
299
 
            realname = username
300
 
 
301
 
    except ImportError:
302
 
        import getpass
303
 
        realname = username = getpass.getuser().decode(bzrlib.user_encoding)
304
 
 
305
 
    return realname, (username + '@' + socket.gethostname())
306
 
 
307
 
 
308
 
def _get_user_id(branch):
309
 
    """Return the full user id from a file or environment variable.
310
 
 
311
 
    e.g. "John Hacker <jhacker@foo.org>"
312
 
 
313
 
    branch
314
 
        A branch to use for a per-branch configuration, or None.
315
 
 
316
 
    The following are searched in order:
317
 
 
318
 
    1. $BZREMAIL
319
 
    2. .bzr/email for this branch.
320
 
    3. ~/.bzr.conf/email
321
 
    4. $EMAIL
322
 
    """
323
 
    v = os.environ.get('BZREMAIL')
324
 
    if v:
325
 
        return v.decode(bzrlib.user_encoding)
326
 
 
327
 
    if branch:
328
 
        try:
329
 
            return (branch.controlfile("email", "r") 
330
 
                    .read()
331
 
                    .decode(bzrlib.user_encoding)
332
 
                    .rstrip("\r\n"))
333
 
        except IOError, e:
334
 
            if e.errno != errno.ENOENT:
335
 
                raise
336
 
        except BzrError, e:
337
 
            pass
338
 
    
339
 
    try:
340
 
        return (open(os.path.join(config_dir(), "email"))
341
 
                .read()
342
 
                .decode(bzrlib.user_encoding)
343
 
                .rstrip("\r\n"))
344
 
    except IOError, e:
345
 
        if e.errno != errno.ENOENT:
346
 
            raise e
347
 
 
348
 
    v = os.environ.get('EMAIL')
349
 
    if v:
350
 
        return v.decode(bzrlib.user_encoding)
351
 
    else:    
352
 
        return None
353
 
 
354
 
 
355
 
def username(branch):
356
 
    """Return email-style username.
357
 
 
358
 
    Something similar to 'Martin Pool <mbp@sourcefrog.net>'
359
 
 
360
 
    TODO: Check it's reasonably well-formed.
361
 
    """
362
 
    v = _get_user_id(branch)
363
 
    if v:
364
 
        return v
365
 
    
366
 
    name, email = _auto_user_id()
367
 
    if name:
368
 
        return '%s <%s>' % (name, email)
369
 
    else:
370
 
        return email
371
 
 
372
 
 
373
 
def user_email(branch):
374
 
    """Return just the email component of a username."""
375
 
    e = _get_user_id(branch)
376
 
    if e:
377
 
        m = re.search(r'[\w+.-]+@[\w+.-]+', e)
378
 
        if not m:
379
 
            raise BzrError("%r doesn't seem to contain "
380
 
                           "a reasonable email address" % e)
381
 
        return m.group(0)
382
 
 
383
 
    return _auto_user_id()[1]
384
 
 
385
 
 
386
267
def compare_files(a, b):
387
268
    """Returns true if equal in contents"""
388
269
    BUFSIZE = 4096
511
392
        return os.path.join(p1, p2)
512
393
    
513
394
 
514
 
def _read_config_value(name):
515
 
    """Read a config value from the file ~/.bzr.conf/<name>
516
 
    Return None if the file does not exist"""
517
 
    try:
518
 
        f = file(os.path.join(config_dir(), name), "r")
519
 
        return f.read().decode(bzrlib.user_encoding).rstrip("\r\n")
520
 
    except IOError, e:
521
 
        if e.errno == errno.ENOENT:
522
 
            return None
523
 
        raise
524
 
 
525
 
 
526
395
def split_lines(s):
527
396
    """Split s into lines, but without removing the newline characters."""
528
397
    return StringIO(s).readlines()