[PATCH] Strip filter name from command before passing to filter function

Jesse Glick Jesse.Glick at Sun.COM
Sat Feb 9 11:37:41 CST 2008


# HG changeset patch
# User Jesse Glick <jesse.glick at sun.com>
# Date 1202578078 18000
# Node ID 290048536da3aa15cb7ed17bc3823de52e957981
# Parent  e2cbdd93134105f9c11f05c6e2a4c32e5a0e6945
Strip filter name from command before passing to filter function.

The new registration of in-process data filters (introduced in
f8ad3b76e923 & 11af38a592ae) failed to correctly strip the filter name
from its arguments before passing the "command" to the filter
function. Thus a registration such as

[decode]
*.gz = compress: -9

would result in the associated filter function being called with the
argument 'compress: -9' rather than just '-9' as expected.

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -488,9 +488,11 @@ class localrepository(repo.repository):
             for pat, cmd in self.ui.configitems(filter):
                 mf = util.matcher(self.root, "", [pat], [], [])[1]
                 fn = None
+                params = cmd
                 for name, filterfn in self._datafilters.iteritems():
                     if cmd.startswith(name): 
                         fn = filterfn
+                        params = cmd[len(name):].lstrip()
                         break
                 if not fn:
                     fn = lambda s, c, **kwargs: util.filter(s, c)
@@ -498,7 +500,7 @@ class localrepository(repo.repository):
                 if not inspect.getargspec(fn)[2]:
                     oldfn = fn
                     fn = lambda s, c, **kwargs: oldfn(s, c)
-                l.append((mf, fn, cmd))
+                l.append((mf, fn, params))
             self.filterpats[filter] = l
 
         for mf, fn, cmd in self.filterpats[filter]:
diff --git a/tests/test-custom-filters b/tests/test-custom-filters
new file mode 100755
--- /dev/null
+++ b/tests/test-custom-filters
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+hg init
+
+cat > .hg/hgrc <<EOF
+[extensions]
+prefixfilter = prefix.py
+[encode]
+*.txt = stripprefix: Copyright 2046, The Masters
+[decode]
+*.txt = insertprefix: Copyright 2046, The Masters
+EOF
+
+cat > prefix.py <<EOF
+from mercurial import util
+def stripprefix(s, cmd, filename, **kwargs):
+    header = '%s\n' % cmd
+    if s[:len(header)] != header:
+        raise util.Abort('missing header "%s" in %s' % (cmd, filename))
+    return s[len(header):]
+def insertprefix(s, cmd):
+    return '%s\n%s' % (cmd, s)
+def reposetup(ui, repo):
+    repo.adddatafilter('stripprefix:', stripprefix)
+    repo.adddatafilter('insertprefix:', insertprefix)
+EOF
+
+cat > .hgignore <<EOF
+.hgignore
+prefix.py
+prefix.pyc
+EOF
+
+cat > stuff.txt <<EOF
+Copyright 2046, The Masters
+Some stuff to ponder very carefully.
+EOF
+hg add stuff.txt
+hg ci -m stuff
+
+echo '% Repository data:'
+hg cat stuff.txt
+
+echo '% Fresh checkout:'
+rm stuff.txt
+hg up
+cat stuff.txt
+echo >> stuff.txt <<EOF
+Very very carefully.
+EOF
+hg stat
+
+cat > morestuff.txt <<EOF
+Unauthorized material subject to destruction.
+EOF
+
+echo '% Problem encoding:'
+hg add morestuff.txt
+hg ci -m morestuff
+hg stat
diff --git a/tests/test-custom-filters.out b/tests/test-custom-filters.out
new file mode 100644
--- /dev/null
+++ b/tests/test-custom-filters.out
@@ -0,0 +1,11 @@
+% Repository data:
+Some stuff to ponder very carefully.
+% Fresh checkout:
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+Copyright 2046, The Masters
+Some stuff to ponder very carefully.
+M stuff.txt
+% Problem encoding:
+abort: missing header "Copyright 2046, The Masters" in morestuff.txt
+M stuff.txt
+A morestuff.txt


More information about the Mercurial-devel mailing list