Show More
@@ -30,18 +30,17 b' import re' | |||||
30 | # regexp for single LF without CR preceding. |
|
30 | # regexp for single LF without CR preceding. | |
31 | re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE) |
|
31 | re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE) | |
32 |
|
32 | |||
33 | def dumbdecode(s, cmd): |
|
33 | def dumbdecode(s, cmd, ui=None, repo=None, filename=None, **kwargs): | |
34 | # warn if already has CRLF in repository. |
|
34 | # warn if already has CRLF in repository. | |
35 | # it might cause unexpected eol conversion. |
|
35 | # it might cause unexpected eol conversion. | |
36 | # see issue 302: |
|
36 | # see issue 302: | |
37 | # http://www.selenic.com/mercurial/bts/issue302 |
|
37 | # http://www.selenic.com/mercurial/bts/issue302 | |
38 | if '\r\n' in s: |
|
38 | if '\r\n' in s and ui and filename and repo: | |
39 | u = ui.ui() |
|
39 | ui.warn(_('WARNING: %s already has CRLF line endings\n' | |
40 | u.warn(_('WARNING: file in repository already has CRLF line ending \n' |
|
40 | 'and does not need EOL conversion by the win32text plugin.\n' | |
41 | ' which does not need eol conversion by win32text plugin.\n' |
|
41 | 'Before your next commit, please reconsider your ' | |
42 |
' |
|
42 | 'encode/decode settings in \nMercurial.ini or %s.\n') % | |
43 | ' mercurial.ini or .hg/hgrc\n' |
|
43 | (filename, repo.join('hgrc'))) | |
44 | ' before next commit.\n')) |
|
|||
45 | # replace single LF to CRLF |
|
44 | # replace single LF to CRLF | |
46 | return re_single_lf.sub('\\1\r\n', s) |
|
45 | return re_single_lf.sub('\\1\r\n', s) | |
47 |
|
46 | |||
@@ -52,9 +51,9 b' def clevertest(s, cmd):' | |||||
52 | if '\0' in s: return False |
|
51 | if '\0' in s: return False | |
53 | return True |
|
52 | return True | |
54 |
|
53 | |||
55 | def cleverdecode(s, cmd): |
|
54 | def cleverdecode(s, cmd, **kwargs): | |
56 | if clevertest(s, cmd): |
|
55 | if clevertest(s, cmd): | |
57 | return dumbdecode(s, cmd) |
|
56 | return dumbdecode(s, cmd, **kwargs) | |
58 | return s |
|
57 | return s | |
59 |
|
58 | |||
60 | def cleverencode(s, cmd): |
|
59 | def cleverencode(s, cmd): |
@@ -10,7 +10,7 b' from i18n import _' | |||||
10 | import repo, changegroup |
|
10 | import repo, changegroup | |
11 | import changelog, dirstate, filelog, manifest, context, weakref |
|
11 | import changelog, dirstate, filelog, manifest, context, weakref | |
12 | import re, lock, transaction, tempfile, stat, errno, ui |
|
12 | import re, lock, transaction, tempfile, stat, errno, ui | |
13 | import os, revlog, time, util, extensions, hook |
|
13 | import os, revlog, time, util, extensions, hook, inspect | |
14 |
|
14 | |||
15 | class localrepository(repo.repository): |
|
15 | class localrepository(repo.repository): | |
16 | capabilities = util.set(('lookup', 'changegroupsubset')) |
|
16 | capabilities = util.set(('lookup', 'changegroupsubset')) | |
@@ -492,14 +492,18 b' class localrepository(repo.repository):' | |||||
492 | fn = filterfn |
|
492 | fn = filterfn | |
493 | break |
|
493 | break | |
494 | if not fn: |
|
494 | if not fn: | |
495 | fn = lambda s, c: util.filter(s, c) |
|
495 | fn = lambda s, c, **kwargs: util.filter(s, c) | |
|
496 | # Wrap old filters not supporting keyword arguments | |||
|
497 | if not inspect.getargspec(fn)[2]: | |||
|
498 | oldfn = fn | |||
|
499 | fn = lambda s, c, **kwargs: oldfn(s, c) | |||
496 | l.append((mf, fn, cmd)) |
|
500 | l.append((mf, fn, cmd)) | |
497 | self.filterpats[filter] = l |
|
501 | self.filterpats[filter] = l | |
498 |
|
502 | |||
499 | for mf, fn, cmd in self.filterpats[filter]: |
|
503 | for mf, fn, cmd in self.filterpats[filter]: | |
500 | if mf(filename): |
|
504 | if mf(filename): | |
501 | self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) |
|
505 | self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) | |
502 | data = fn(data, cmd) |
|
506 | data = fn(data, cmd, ui=self.ui, repo=self, filename=filename) | |
503 | break |
|
507 | break | |
504 |
|
508 | |||
505 | return data |
|
509 | return data |
@@ -9,6 +9,11 b' for path in sys.argv[1:]:' | |||||
9 | file(path, 'wb').write(data) |
|
9 | file(path, 'wb').write(data) | |
10 | EOF |
|
10 | EOF | |
11 |
|
11 | |||
|
12 | cat > print.py <<EOF | |||
|
13 | import sys | |||
|
14 | print(sys.stdin.read().replace('\n', '<LF>').replace('\r', '<CR>').replace('\0', '<NUL>')) | |||
|
15 | EOF | |||
|
16 | ||||
12 | hg init |
|
17 | hg init | |
13 | echo '[hooks]' >> .hg/hgrc |
|
18 | echo '[hooks]' >> .hg/hgrc | |
14 | echo 'pretxncommit.crlf = python:hgext.win32text.forbidcrlf' >> .hg/hgrc |
|
19 | echo 'pretxncommit.crlf = python:hgext.win32text.forbidcrlf' >> .hg/hgrc | |
@@ -62,4 +67,35 b' echo' | |||||
62 | hg log -v |
|
67 | hg log -v | |
63 | echo |
|
68 | echo | |
64 |
|
69 | |||
65 | # XXX missing tests for encode/decode hooks |
|
70 | rm .hg/hgrc | |
|
71 | (echo some; echo text) > f3 | |||
|
72 | python -c 'file("f4.bat", "wb").write("rem empty\x0D\x0A")' | |||
|
73 | hg add f3 f4.bat | |||
|
74 | hg ci -m 6 -d'0 0' | |||
|
75 | ||||
|
76 | python print.py < bin | |||
|
77 | python print.py < f3 | |||
|
78 | python print.py < f4.bat | |||
|
79 | echo | |||
|
80 | ||||
|
81 | echo '[extensions]' >> .hg/hgrc | |||
|
82 | echo 'win32text = ' >> .hg/hgrc | |||
|
83 | echo '[decode]' >> .hg/hgrc | |||
|
84 | echo '** = cleverdecode:' >> .hg/hgrc | |||
|
85 | echo '[encode]' >> .hg/hgrc | |||
|
86 | echo '** = cleverencode:' >> .hg/hgrc | |||
|
87 | cat .hg/hgrc | |||
|
88 | echo | |||
|
89 | ||||
|
90 | rm f3 f4.bat bin | |||
|
91 | hg co 2>&1 | python -c 'import sys, os; sys.stdout.write(sys.stdin.read().replace(os.getcwd(), "...."))' | |||
|
92 | python print.py < bin | |||
|
93 | python print.py < f3 | |||
|
94 | python print.py < f4.bat | |||
|
95 | echo | |||
|
96 | ||||
|
97 | python -c 'file("f5.sh", "wb").write("# empty\x0D\x0A")' | |||
|
98 | hg add f5.sh | |||
|
99 | hg ci -m 7 -d'0 0' | |||
|
100 | python print.py < f5.sh | |||
|
101 | hg cat f5.sh | python print.py |
@@ -155,3 +155,25 b' 1' | |||||
155 |
|
155 | |||
156 |
|
156 | |||
157 |
|
157 | |||
|
158 | hello<NUL><CR><LF> | |||
|
159 | some<LF>text<LF> | |||
|
160 | rem empty<CR><LF> | |||
|
161 | ||||
|
162 | [extensions] | |||
|
163 | win32text = | |||
|
164 | [decode] | |||
|
165 | ** = cleverdecode: | |||
|
166 | [encode] | |||
|
167 | ** = cleverencode: | |||
|
168 | ||||
|
169 | WARNING: f4.bat already has CRLF line endings | |||
|
170 | and does not need EOL conversion by the win32text plugin. | |||
|
171 | Before your next commit, please reconsider your encode/decode settings in | |||
|
172 | Mercurial.ini or ..../.hg/hgrc. | |||
|
173 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
174 | hello<NUL><CR><LF> | |||
|
175 | some<CR><LF>text<CR><LF> | |||
|
176 | rem empty<CR><LF> | |||
|
177 | ||||
|
178 | # empty<CR><LF> | |||
|
179 | # empty<LF> |
General Comments 0
You need to be logged in to leave comments.
Login now