# HG changeset patch # User Patrick Mezard # Date 1300025264 -3600 # Node ID e6f93ca9ce8663dbed053fe6d36b02ed234aea0a # Parent 686dec753b52e4a8a64912a408a458c303e98615 eol: make the hook check all new heads, not only tip (issue2666) Report and test by Antoine Pitrou diff -r 686dec753b52 -r e6f93ca9ce86 hgext/eol.py --- a/hgext/eol.py Sun Mar 13 15:07:44 2011 +0100 +++ b/hgext/eol.py Sun Mar 13 15:07:44 2011 +0100 @@ -202,13 +202,20 @@ def hook(ui, repo, node, hooktype, **kwargs): """verify that files have expected EOLs""" + # Extract heads and get touched files set at the same time files = set() + heads = set() for rev in xrange(repo[node].rev(), len(repo)): - files.update(repo[rev].files()) - tip = repo['tip'] - eol = parseeol(ui, repo, [tip.node()]) - if eol: - eol.checkrev(repo, tip, files) + ctx = repo[rev] + files.update(ctx.files()) + heads.add(rev) + for pctx in ctx.parents(): + heads.discard(pctx.rev()) + for rev in heads: + ctx = repo[rev] + eol = parseeol(ui, repo, [ctx.node()]) + if eol: + eol.checkrev(repo, ctx, files) def preupdate(ui, repo, hooktype, parent1, parent2): #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) diff -r 686dec753b52 -r e6f93ca9ce86 tests/test-eol-hook.t --- a/tests/test-eol-hook.t Sun Mar 13 15:07:44 2011 +0100 +++ b/tests/test-eol-hook.t Sun Mar 13 15:07:44 2011 +0100 @@ -81,3 +81,38 @@ adding manifests adding file changes added 2 changesets with 2 changes to 1 files + + $ printf "first\r\nsecond" > b.txt + $ hg add b.txt + $ hg commit -m 'CRLF b.txt' + $ hg push ../main + pushing to ../main + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + error: pretxnchangegroup hook failed: b.txt should not have CRLF line endings + transaction abort! + rollback completed + abort: b.txt should not have CRLF line endings + [255] + + $ hg up -r -2 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ printf "some\nother\nfile" > c.txt + $ hg add c.txt + $ hg commit -m "LF c.txt, b.txt doesn't exist here" + created new head + $ hg push -f ../main + pushing to ../main + searching for changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 2 changes to 2 files (+1 heads) + error: pretxnchangegroup hook failed: b.txt should not have CRLF line endings + transaction abort! + rollback completed + abort: b.txt should not have CRLF line endings + [255]