|
1 # win32text.py - LF <-> CRLF translation utilities for Windows users |
|
2 # |
|
3 # This software may be used and distributed according to the terms |
|
4 # of the GNU General Public License, incorporated herein by reference. |
|
5 # |
|
6 # To perform automatic newline conversion, use: |
|
7 # |
|
8 # [extensions] |
|
9 # hgext.win32text = |
|
10 # [encode] |
|
11 # ** = cleverencode: |
|
12 # [decode] |
|
13 # ** = cleverdecode: |
|
14 # |
|
15 # If not doing conversion, to make sure you do not commit CRLF by accident: |
|
16 # |
|
17 # [hooks] |
|
18 # pretxncommit.crlf = python:hgext.win32text.forbidcrlf |
|
19 # |
|
20 # To do the same check on a server to prevent CRLF from being pushed or pulled: |
|
21 # |
|
22 # [hooks] |
|
23 # pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf |
|
24 |
1 from mercurial import util, ui |
25 from mercurial import util, ui |
2 from mercurial.i18n import gettext as _ |
26 from mercurial.i18n import gettext as _ |
|
27 from mercurial.node import * |
3 import re |
28 import re |
4 |
29 |
5 # regexp for single LF without CR preceding. |
30 # regexp for single LF without CR preceding. |
6 re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE) |
31 re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE) |
7 |
32 |
41 'dumbdecode:': dumbdecode, |
66 'dumbdecode:': dumbdecode, |
42 'dumbencode:': dumbencode, |
67 'dumbencode:': dumbencode, |
43 'cleverdecode:': cleverdecode, |
68 'cleverdecode:': cleverdecode, |
44 'cleverencode:': cleverencode, |
69 'cleverencode:': cleverencode, |
45 }) |
70 }) |
|
71 |
|
72 def forbidcrlf(ui, repo, hooktype, node, **kwargs): |
|
73 halt = False |
|
74 for rev in xrange(repo.changelog.rev(bin(node)), repo.changelog.count()): |
|
75 c = repo.changectx(rev) |
|
76 for f in c.files(): |
|
77 if f not in c: |
|
78 continue |
|
79 data = c[f].data() |
|
80 if '\0' not in data and '\r\n' in data: |
|
81 if not halt: |
|
82 ui.warn(_('Attempt to commit or push text file(s) ' |
|
83 'using CRLF line endings\n')) |
|
84 ui.warn(_('in %s: %s\n') % (short(c.node()), f)) |
|
85 halt = True |
|
86 if halt and hooktype == 'pretxnchangegroup': |
|
87 ui.warn(_('\nTo prevent this mistake in your local repository,\n' |
|
88 'add to Mercurial.ini or .hg/hgrc:\n' |
|
89 '\n' |
|
90 '[hooks]\n' |
|
91 'pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n' |
|
92 '\n' |
|
93 'and also consider adding:\n' |
|
94 '\n' |
|
95 '[extensions]\n' |
|
96 'hgext.win32text =\n' |
|
97 '[encode]\n' |
|
98 '** = cleverencode:\n' |
|
99 '[decode]\n' |
|
100 '** = cleverdecode:\n')) |
|
101 return halt |