Show More
@@ -0,0 +1,23 b'' | |||
|
1 | $ hg debugtemplate '{""|splitlines|commonprefix}\n' | |
|
2 | ||
|
3 | $ hg debugtemplate '{"foo/bar\nfoo/baz\nfoo/foobar\n"|splitlines|commonprefix}\n' | |
|
4 | foo | |
|
5 | $ hg debugtemplate '{"foo/bar\nfoo/bar\n"|splitlines|commonprefix}\n' | |
|
6 | foo | |
|
7 | $ hg debugtemplate '{"/foo/bar\n/foo/bar\n"|splitlines|commonprefix}\n' | |
|
8 | foo | |
|
9 | $ hg debugtemplate '{"/foo\n/foo\n"|splitlines|commonprefix}\n' | |
|
10 | ||
|
11 | $ hg debugtemplate '{"foo/bar\nbar/baz"|splitlines|commonprefix}\n' | |
|
12 | ||
|
13 | $ hg debugtemplate '{"foo/bar\nbar/baz\nbar/foo\n"|splitlines|commonprefix}\n' | |
|
14 | ||
|
15 | $ hg debugtemplate '{"foo/../bar\nfoo/bar"|splitlines|commonprefix}\n' | |
|
16 | foo | |
|
17 | $ hg debugtemplate '{"foo\n/foo"|splitlines|commonprefix}\n' | |
|
18 | ||
|
19 | $ hg init | |
|
20 | $ hg log -r null -T '{rev|commonprefix}' | |
|
21 | hg: parse error: argument is not a list of text | |
|
22 | (template filter 'commonprefix' is not compatible with keyword 'rev') | |
|
23 | [255] |
@@ -99,6 +99,45 b' def basename(path):' | |||
|
99 | 99 | """ |
|
100 | 100 | return os.path.basename(path) |
|
101 | 101 | |
|
102 | @templatefilter('commonprefix') | |
|
103 | def commonprefix(filelist): | |
|
104 | """List of text. Treats each list item as file name with / | |
|
105 | as path separator and returns the longest common directory | |
|
106 | prefix shared by all list items. | |
|
107 | Returns the empty string if no common prefix exists. | |
|
108 | ||
|
109 | The list items are not normalized, i.e. "foo/../bar" is handled as | |
|
110 | file "bar" in the directory "foo/..". Leading slashes are ignored. | |
|
111 | ||
|
112 | For example, ["foo/bar/baz", "foo/baz/bar"] becomes "foo" and | |
|
113 | ["foo/bar", "baz"] becomes "". | |
|
114 | """ | |
|
115 | def common(a, b): | |
|
116 | if len(a) > len(b): | |
|
117 | a = b[:len(a)] | |
|
118 | elif len(b) > len(a): | |
|
119 | b = b[:len(a)] | |
|
120 | if a == b: | |
|
121 | return a | |
|
122 | for i in xrange(len(a)): | |
|
123 | if a[i] != b[i]: | |
|
124 | return a[:i] | |
|
125 | return a | |
|
126 | try: | |
|
127 | if not filelist: | |
|
128 | return "" | |
|
129 | dirlist = [f.lstrip('/').split('/')[:-1] for f in filelist] | |
|
130 | if len(dirlist) == 1: | |
|
131 | return '/'.join(dirlist[0]) | |
|
132 | a = min(dirlist) | |
|
133 | b = max(dirlist) | |
|
134 | # The common prefix of a and b is shared with all | |
|
135 | # elements of the list since Python sorts lexicographical | |
|
136 | # and [1, x] after [1]. | |
|
137 | return '/'.join(common(a, b)) | |
|
138 | except TypeError: | |
|
139 | raise error.ParseError(_('argument is not a list of text')) | |
|
140 | ||
|
102 | 141 | @templatefilter('count') |
|
103 | 142 | def count(i): |
|
104 | 143 | """List or text. Returns the length as an integer.""" |
General Comments 0
You need to be logged in to leave comments.
Login now