D3439: templatefilters: add commonprefix
joerg.sonnenberger (Joerg Sonnenberger)
phabricator at mercurial-scm.org
Tue May 8 15:18:53 UTC 2018
joerg.sonnenberger updated this revision to Diff 8549.
joerg.sonnenberger retitled this revision from "template filters: add commonprefix" to "templatefilters: add commonprefix".
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D3439?vs=8454&id=8549
REVISION DETAIL
https://phab.mercurial-scm.org/D3439
AFFECTED FILES
mercurial/templatefilters.py
tests/test-template-filters.t
CHANGE DETAILS
diff --git a/tests/test-template-filters.t b/tests/test-template-filters.t
new file mode 100644
--- /dev/null
+++ b/tests/test-template-filters.t
@@ -0,0 +1,11 @@
+ $ hg debugtemplate '{"foo/bar\nfoo/baz\n"|splitlines|commonprefix}\n'
+ foo
+ $ hg debugtemplate '{"foo/bar\nbar/baz"|splitlines|commonprefix}\n'
+
+ $ hg debugtemplate '{"foo/../bar\nfoo/bar"|splitlines|commonprefix}\n'
+ foo
+ $ hg init
+ $ hg log -r null -T '{rev|commonprefix}'
+ hg: parse error: argument is not a list of text
+ (template filter 'commonprefix' is not compatible with keyword 'rev')
+ [255]
diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
--- a/mercurial/templatefilters.py
+++ b/mercurial/templatefilters.py
@@ -99,6 +99,33 @@
"""
return os.path.basename(path)
+ at templatefilter('commonprefix')
+def commonprefix(filelist):
+ """List of text. Treats each list item as file name, and returns
+ the longest common directory prefix shared by all list items.
+ Returns the empty string if no common prefix exists.
+
+ The list items are not normalized, i.e. "foo/../bar" is handled as
+ file "bar" in the directory "foo/..".
+
+ For example, ["foo/bar/baz", "foo/baz/bar"] becomes "foo" and
+ ["foo/bar", "baz"] becomes "".
+ """
+ def common(a, b):
+ while a != b:
+ if len(a) > len(b):
+ a = os.path.dirname(a)
+ else:
+ b = os.path.dirname(b)
+ return a
+ try:
+ if not filelist:
+ return ""
+ dirlist = [os.path.dirname(f) for f in filelist]
+ return reduce(common, dirlist)
+ except TypeError:
+ raise error.ParseError(_('argument is not a list of text'))
+
@templatefilter('count')
def count(i):
"""List or text. Returns the length as an integer."""
To: joerg.sonnenberger, #hg-reviewers
Cc: yuja, mercurial-devel
More information about the Mercurial-devel
mailing list