71 like the deprecated win32text extension does. This means that you can |
71 like the deprecated win32text extension does. This means that you can |
72 disable win32text and enable eol and your filters will still work. You |
72 disable win32text and enable eol and your filters will still work. You |
73 only need to these filters until you have prepared a ``.hgeol`` file. |
73 only need to these filters until you have prepared a ``.hgeol`` file. |
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.checkheadshook``. The |
77 lookup the expected line endings from the ``.hgeol`` file, which means |
77 hook will lookup the expected line endings from the ``.hgeol`` file, |
78 you must migrate to a ``.hgeol`` file first before using the hook. |
78 which means you must migrate to a ``.hgeol`` file first before using |
|
79 the hook. ``eol.checkheadshook`` only checks heads, intermediate |
|
80 invalid revisions will be pushed. To forbid them completely, use the |
|
81 ``eol.checkallhook`` hook. These hooks are best used as |
|
82 ``pretxnchangegroup`` hooks. |
79 |
83 |
80 See :hg:`help patterns` for more information about the glob patterns |
84 See :hg:`help patterns` for more information about the glob patterns |
81 used. |
85 used. |
82 """ |
86 """ |
83 |
87 |
198 except error.ParseError, inst: |
202 except error.ParseError, inst: |
199 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
203 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
200 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
204 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
201 return None |
205 return None |
202 |
206 |
203 def hook(ui, repo, node, hooktype, **kwargs): |
207 def _checkhook(ui, repo, node, headsonly): |
204 """verify that files have expected EOLs""" |
208 # Get revisions to check and touched files at the same time |
205 # Extract heads and get touched files set at the same time |
|
206 files = set() |
209 files = set() |
207 heads = set() |
210 revs = set() |
208 for rev in xrange(repo[node].rev(), len(repo)): |
211 for rev in xrange(repo[node].rev(), len(repo)): |
209 ctx = repo[rev] |
212 ctx = repo[rev] |
210 files.update(ctx.files()) |
213 files.update(ctx.files()) |
211 heads.add(rev) |
214 revs.add(rev) |
212 for pctx in ctx.parents(): |
215 if headsonly: |
213 heads.discard(pctx.rev()) |
216 for pctx in ctx.parents(): |
214 for rev in heads: |
217 revs.discard(pctx.rev()) |
|
218 for rev in revs: |
215 ctx = repo[rev] |
219 ctx = repo[rev] |
216 eol = parseeol(ui, repo, [ctx.node()]) |
220 eol = parseeol(ui, repo, [ctx.node()]) |
217 if eol: |
221 if eol: |
218 eol.checkrev(repo, ctx, files) |
222 eol.checkrev(repo, ctx, files) |
|
223 |
|
224 def checkallhook(ui, repo, node, hooktype, **kwargs): |
|
225 """verify that files have expected EOLs""" |
|
226 _checkhook(ui, repo, node, False) |
|
227 |
|
228 def checkheadshook(ui, repo, node, hooktype, **kwargs): |
|
229 """verify that files have expected EOLs""" |
|
230 _checkhook(ui, repo, node, True) |
|
231 |
|
232 # "checkheadshook" used to be called "hook" |
|
233 hook = checkheadshook |
219 |
234 |
220 def preupdate(ui, repo, hooktype, parent1, parent2): |
235 def preupdate(ui, repo, hooktype, parent1, parent2): |
221 #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) |
236 #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) |
222 repo.loadeol([parent1]) |
237 repo.loadeol([parent1]) |
223 return False |
238 return False |