74 |
74 |
75 The ``win32text.forbid*`` hooks provided by the win32text extension |
75 The ``win32text.forbid*`` hooks provided by the win32text extension |
76 have been unified into a single hook named ``eol.hook``. The hook will |
76 have been unified into a single hook named ``eol.hook``. The hook will |
77 lookup the expected line endings from the ``.hgeol`` file, which means |
77 lookup the expected line endings from the ``.hgeol`` file, which means |
78 you must migrate to a ``.hgeol`` file first before using the hook. |
78 you must migrate to a ``.hgeol`` file first before using the hook. |
79 Remember to enable the eol extension in the repository where you |
|
80 install the hook. |
|
81 |
79 |
82 See :hg:`help patterns` for more information about the glob patterns |
80 See :hg:`help patterns` for more information about the glob patterns |
83 used. |
81 used. |
84 """ |
82 """ |
85 |
83 |
163 ui.setconfig('decode', pattern, self._decode[key]) |
161 ui.setconfig('decode', pattern, self._decode[key]) |
164 ui.setconfig('encode', pattern, self._encode[key]) |
162 ui.setconfig('encode', pattern, self._encode[key]) |
165 except KeyError: |
163 except KeyError: |
166 ui.warn(_("ignoring unknown EOL style '%s' from %s\n") |
164 ui.warn(_("ignoring unknown EOL style '%s' from %s\n") |
167 % (style, self.cfg.source('patterns', pattern))) |
165 % (style, self.cfg.source('patterns', pattern))) |
|
166 |
|
167 def checkrev(self, repo, ctx, files): |
|
168 for f in files: |
|
169 if f not in ctx: |
|
170 continue |
|
171 for pattern, style in self.cfg.items('patterns'): |
|
172 if not match.match(repo.root, '', [pattern])(f): |
|
173 continue |
|
174 target = self._encode[style.upper()] |
|
175 data = ctx[f].data() |
|
176 if target == "to-lf" and "\r\n" in data: |
|
177 raise util.Abort(_("%s should not have CRLF line endings") |
|
178 % f) |
|
179 elif target == "to-crlf" and singlelf.search(data): |
|
180 raise util.Abort(_("%s should not have LF line endings") |
|
181 % f) |
|
182 # Ignore other rules for this file |
|
183 break |
168 |
184 |
169 def parseeol(ui, repo, nodes): |
185 def parseeol(ui, repo, nodes): |
170 try: |
186 try: |
171 for node in nodes: |
187 for node in nodes: |
172 try: |
188 try: |
188 """verify that files have expected EOLs""" |
204 """verify that files have expected EOLs""" |
189 files = set() |
205 files = set() |
190 for rev in xrange(repo[node].rev(), len(repo)): |
206 for rev in xrange(repo[node].rev(), len(repo)): |
191 files.update(repo[rev].files()) |
207 files.update(repo[rev].files()) |
192 tip = repo['tip'] |
208 tip = repo['tip'] |
193 for f in files: |
209 eol = parseeol(ui, repo, [tip.node()]) |
194 if f not in tip: |
210 if eol: |
195 continue |
211 eol.checkrev(repo, tip, files) |
196 for pattern, target in ui.configitems('encode'): |
|
197 if match.match(repo.root, '', [pattern])(f): |
|
198 data = tip[f].data() |
|
199 if target == "to-lf" and "\r\n" in data: |
|
200 raise util.Abort(_("%s should not have CRLF line endings") |
|
201 % f) |
|
202 elif target == "to-crlf" and singlelf.search(data): |
|
203 raise util.Abort(_("%s should not have LF line endings") |
|
204 % f) |
|
205 # Ignore other rules for this file |
|
206 break |
|
207 |
|
208 |
212 |
209 def preupdate(ui, repo, hooktype, parent1, parent2): |
213 def preupdate(ui, repo, hooktype, parent1, parent2): |
210 #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) |
214 #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) |
211 repo.loadeol([parent1]) |
215 repo.loadeol([parent1]) |
212 return False |
216 return False |