~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Robert Collins
  • Date: 2005-10-11 07:00:25 UTC
  • mto: This revision was merged to the branch mainline in revision 1443.
  • Revision ID: robertc@robertcollins.net-20051011070025-bac6b53cb6186dfd
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.

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
 
32
from bzrlib.config import config_dir, _get_user_id
33
33
from bzrlib.errors import BzrError
34
34
from bzrlib.trace import mutter
35
35
 
260
260
            'sha1': s.hexdigest()}
261
261
 
262
262
 
263
 
def _auto_user_id():
264
 
    """Calculate automatic user identification.
265
 
 
266
 
    Returns (realname, email).
267
 
 
268
 
    Only used when none is set in the environment or the id file.
269
 
 
270
 
    This previously used the FQDN as the default domain, but that can
271
 
    be very slow on machines where DNS is broken.  So now we simply
272
 
    use the hostname.
273
 
    """
274
 
    import socket
275
 
 
276
 
    # XXX: Any good way to get real user name on win32?
277
 
 
278
 
    try:
279
 
        import pwd
280
 
        uid = os.getuid()
281
 
        w = pwd.getpwuid(uid)
282
 
        gecos = w.pw_gecos.decode(bzrlib.user_encoding)
283
 
        username = w.pw_name.decode(bzrlib.user_encoding)
284
 
        comma = gecos.find(',')
285
 
        if comma == -1:
286
 
            realname = gecos
287
 
        else:
288
 
            realname = gecos[:comma]
289
 
        if not realname:
290
 
            realname = username
291
 
 
292
 
    except ImportError:
293
 
        import getpass
294
 
        realname = username = getpass.getuser().decode(bzrlib.user_encoding)
295
 
 
296
 
    return realname, (username + '@' + socket.gethostname())
297
 
 
298
 
 
299
 
def _get_user_id(branch):
300
 
    """Return the full user id from a file or environment variable.
301
 
 
302
 
    e.g. "John Hacker <jhacker@foo.org>"
303
 
 
304
 
    branch
305
 
        A branch to use for a per-branch configuration, or None.
306
 
 
307
 
    The following are searched in order:
308
 
 
309
 
    1. $BZREMAIL
310
 
    2. .bzr/email for this branch.
311
 
    3. ~/.bzr.conf/email
312
 
    4. $EMAIL
313
 
    """
314
 
    v = os.environ.get('BZREMAIL')
315
 
    if v:
316
 
        return v.decode(bzrlib.user_encoding)
317
 
 
318
 
    if branch:
319
 
        try:
320
 
            return (branch.controlfile("email", "r") 
321
 
                    .read()
322
 
                    .decode(bzrlib.user_encoding)
323
 
                    .rstrip("\r\n"))
324
 
        except IOError, e:
325
 
            if e.errno != errno.ENOENT:
326
 
                raise
327
 
        except BzrError, e:
328
 
            pass
329
 
    
330
 
    try:
331
 
        return (open(os.path.join(config_dir(), "email"))
332
 
                .read()
333
 
                .decode(bzrlib.user_encoding)
334
 
                .rstrip("\r\n"))
335
 
    except IOError, e:
336
 
        if e.errno != errno.ENOENT:
337
 
            raise e
338
 
 
339
 
    v = os.environ.get('EMAIL')
340
 
    if v:
341
 
        return v.decode(bzrlib.user_encoding)
342
 
    else:    
343
 
        return None
344
 
 
345
 
 
346
 
def username(branch):
347
 
    """Return email-style username.
348
 
 
349
 
    Something similar to 'Martin Pool <mbp@sourcefrog.net>'
350
 
 
351
 
    TODO: Check it's reasonably well-formed.
352
 
    """
353
 
    v = _get_user_id(branch)
354
 
    if v:
355
 
        return v
356
 
    
357
 
    name, email = _auto_user_id()
358
 
    if name:
359
 
        return '%s <%s>' % (name, email)
360
 
    else:
361
 
        return email
362
 
 
363
 
 
364
 
def user_email(branch):
365
 
    """Return just the email component of a username."""
366
 
    e = _get_user_id(branch)
367
 
    if e:
368
 
        m = re.search(r'[\w+.-]+@[\w+.-]+', e)
369
 
        if not m:
370
 
            raise BzrError("%r doesn't seem to contain "
371
 
                           "a reasonable email address" % e)
372
 
        return m.group(0)
373
 
 
374
 
    return _auto_user_id()[1]
375
 
 
376
 
 
377
263
def compare_files(a, b):
378
264
    """Returns true if equal in contents"""
379
265
    BUFSIZE = 4096