# Copyright (C) 2009-2010 W. Trevor King # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ Tools for getting, setting, creating, and parsing the user's id. For example, 'John Doe ' Note that the Arch VCS backend *enforces* ids with this format. """ import os import re from socket import gethostname import libbe import libbe.storage.util.config def get_fallback_username(): name = None for env in ["LOGNAME", "USERNAME"]: if os.environ.has_key(env): name = os.environ[env] break assert name != None return name def get_fallback_email(): hostname = gethostname() name = get_fallback_username() return "%s@%s" % (name, hostname) def create_user_id(name, email=None): """ >>> create_user_id("John Doe", "jdoe@example.com") 'John Doe ' >>> create_user_id("John Doe") 'John Doe' """ assert len(name) > 0 if email == None or len(email) == 0: return name else: return "%s <%s>" % (name, email) def parse_user_id(value): """ >>> parse_user_id("John Doe ") ('John Doe', 'jdoe@example.com') >>> parse_user_id("John Doe") ('John Doe', None) >>> try: ... parse_user_id("John Doe ") ... except AssertionError: ... print "Invalid match" Invalid match """ emailexp = re.compile("(.*) <([^>]*)>(.*)") match = emailexp.search(value) if match == None: email = None name = value else: assert len(match.groups()) == 3 assert match.groups()[2] == "", match.groups() email = match.groups()[1] name = match.groups()[0] assert name != None assert len(name) > 0 return (name, email) def get_user_id(storage=None): """ Sometimes the storage will also keep track of the user id (e.g. most VCSs). """ user = libbe.storage.util.config.get_val('user') if user != None: return user if storage != None and hasattr(storage, 'get_user_id'): user = storage.get_user_id() if user != None: return user name = get_fallback_username() email = get_fallback_email() user = create_user_id(name, email) return user def set_user_id(user_id): """ """ user = libbe.storage.util.config.set_val('user', user_id)