changeset 3677:1a0fa3914c46

Avoid looking up usernames if the current user owns the .hgrc file Converting uids into usernames may be somewhat expensive when NIS or LDAP is involved.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sat, 18 Nov 2006 23:51:14 -0200
parents d94664748bc1
children 7e622c9a9707
files mercurial/ui.py mercurial/util.py tests/test-trusted.py
diffstat 3 files changed, 22 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/ui.py	Sat Nov 18 23:51:13 2006 -0200
+++ b/mercurial/ui.py	Sat Nov 18 23:51:14 2006 -0200
@@ -96,10 +96,12 @@
     def _is_trusted(self, fp, f, warn=True):
         if not self.check_trusted:
             return True
+        st = util.fstat(fp)
+        if util.isowner(fp, st):
+            return True
         tusers = self.trusted_users
         tgroups = self.trusted_groups
         if (tusers or tgroups) and '*' not in tusers and '*' not in tgroups:
-            st = util.fstat(fp)
             user = util.username(st.st_uid)
             group = util.groupname(st.st_gid)
             if user not in tusers and group not in tgroups:
--- a/mercurial/util.py	Sat Nov 18 23:51:13 2006 -0200
+++ b/mercurial/util.py	Sat Nov 18 23:51:14 2006 -0200
@@ -654,6 +654,11 @@
     def explain_exit(code):
         return _("exited with status %d") % code, code
 
+    # if you change this stub into a real check, please try to implement the
+    # username and groupname functions above, too.
+    def isowner(fp, st=None):
+        return True
+
     try:
         # override functions with win32 versions if possible
         from util_win32 import *
@@ -765,6 +770,16 @@
             return _("stopped by signal %d") % val, val
         raise ValueError(_("invalid exit code"))
 
+    def isowner(fp, st=None):
+        """Return True if the file object f belongs to the current user.
+
+        The return value of a util.fstat(f) may be passed as the st argument.
+        """
+        if st is None:
+            st = fstat(f)
+        return st.st_uid == os.getuid()
+
+
 def opener(base, audit=True):
     """
     return a function that opens files relative to base
--- a/tests/test-trusted.py	Sat Nov 18 23:51:13 2006 -0200
+++ b/tests/test-trusted.py	Sat Nov 18 23:51:14 2006 -0200
@@ -41,6 +41,10 @@
         return group
     util.groupname = groupname
 
+    def isowner(fp, st=None):
+        return user == cuser
+    util.isowner = isowner
+
     # try to read everything
     #print '# File belongs to user %s, group %s' % (user, group)
     #print '# trusted users = %s; trusted groups = %s' % (tusers, tgroups)