hgext/eol.py
changeset 13617 9cb1a42cd4b3
parent 13616 e6f93ca9ce86
child 13625 8aec2516602b
equal deleted inserted replaced
13616:e6f93ca9ce86 13617:9cb1a42cd4b3
    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