[PATCH 0 of 5] simplify new portability code

Adrian Buehlmann adrian at cadifra.com
Sun May 1 02:04:02 CDT 2011


On 2011-05-01 08:49, Adrian Buehlmann wrote:
> On 2011-05-01 08:22, Augie Fackler wrote:
>> On May 1, 2011, at 1:20 AM, Adrian Buehlmann wrote:
>>>
>>> see patches. No functional change.
>>> _______________________________________________
>>> Mercurial-devel mailing list
>>> Mercurial-devel at selenic.com
>>> http://selenic.com/mailman/listinfo/mercurial-devel
>>
>> Is there some particular reason to inline these functions? I feel like it doesn't add clarity to inline them in most cases, and can make it harder for extensions to reuse them in meaningful ways.
>>
> 
> I feel quite the opposite.

And instead of the current maze of pointless inefficient misleading little
functions, we could do a much cleaner abstraction like this one (applies
*on top* of my series, untested):

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1315,23 +1315,16 @@
     names = []
     wctx = repo[None]
     wctx.status(clean=True)
-    existing = None
+    cca = None
     abort, warn = scmutil.checkportabilityalert(ui)
     if abort or warn:
-        existing = dict([(fn.lower(), fn) for fn in
-                         wctx.added() + wctx.clean() + wctx.modified()])
+        cca = scmutil.casecollisionauditor(
+                  ui, wctx.added() + wctx.clean() + wctx.modified())
     for f in repo.walk(match):
         exact = match.exact(f)
         if exact or f not in repo.dirstate:
-            if existing:
-                fl = f.lower()
-                if fl in existing and existing[fl] != f:
-                    msg = _('possible case-folding collision for %s') % f
-                    if abort:
-                        raise util.Abort("%s" % msg)
-                    elif warn:
-                        ui.warn(_("warning: %s\n") % msg)
-                existing[fl] = f
+            if cca:
+                cca(f)
             names.append(f)
             if ui.verbose or not exact:
                 ui.status(_('adding %s\n') % match.rel(join(f)))
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -40,6 +40,22 @@
             _("ui.portablefilenames value is invalid ('%s')") % val)
     return abort, warn

+class casecollisionauditor(object):
+    def __init__(self, ui, existing):
+        self._ui = ui
+        self._map = dict([(f.lower(), f) for f in existing])
+
+    def __call__(self, f):
+        fl = f.lower()
+        map = self._map
+        if fl in map and map[fl] != f:
+            msg = _('possible case-folding collision for %s') % f
+            if abort:
+                raise util.Abort("%s" % msg)
+            elif warn:
+                ui.warn(_("warning: %s\n") % msg)
+        map[fl] = f
+
 class path_auditor(object):
     '''ensure that a filesystem path contains no banned components.
     the following properties of a path are checked:


More information about the Mercurial-devel mailing list