comparison hgext/eol.py @ 13649:328ce8a405ac

eol: improve hook failure output Before, only the first failure was reported: abort: b.txt should not have CRLF line endings while now all of them are listed: abort: end-of-line check failed: d.txt in a7040e68714f should not have CRLF line endings b.txt in fbcf9b1025f5 should not have CRLF line endings As first suggested by Antoine Pitrou <solipsis@pitrou.net>
author Patrick Mezard <pmezard@gmail.com>
date Mon, 14 Mar 2011 21:08:18 +0100
parents 8aec2516602b
children 56e71e7d2ba2
comparison
equal deleted inserted replaced
13639:595dba23d337 13649:328ce8a405ac
167 except KeyError: 167 except KeyError:
168 ui.warn(_("ignoring unknown EOL style '%s' from %s\n") 168 ui.warn(_("ignoring unknown EOL style '%s' from %s\n")
169 % (style, self.cfg.source('patterns', pattern))) 169 % (style, self.cfg.source('patterns', pattern)))
170 170
171 def checkrev(self, repo, ctx, files): 171 def checkrev(self, repo, ctx, files):
172 failed = []
172 for f in files: 173 for f in files:
173 if f not in ctx: 174 if f not in ctx:
174 continue 175 continue
175 for pattern, style in self.cfg.items('patterns'): 176 for pattern, style in self.cfg.items('patterns'):
176 if not match.match(repo.root, '', [pattern])(f): 177 if not match.match(repo.root, '', [pattern])(f):
177 continue 178 continue
178 target = self._encode[style.upper()] 179 target = self._encode[style.upper()]
179 data = ctx[f].data() 180 data = ctx[f].data()
180 if target == "to-lf" and "\r\n" in data: 181 if (target == "to-lf" and "\r\n" in data
181 raise util.Abort(_("%s should not have CRLF line endings") 182 or target == "to-crlf" and singlelf.search(data)):
182 % f) 183 failed.append((str(ctx), target, f))
183 elif target == "to-crlf" and singlelf.search(data):
184 raise util.Abort(_("%s should not have LF line endings")
185 % f)
186 # Ignore other rules for this file
187 break 184 break
185 return failed
188 186
189 def parseeol(ui, repo, nodes): 187 def parseeol(ui, repo, nodes):
190 try: 188 try:
191 for node in nodes: 189 for node in nodes:
192 try: 190 try:
213 files.update(ctx.files()) 211 files.update(ctx.files())
214 revs.add(rev) 212 revs.add(rev)
215 if headsonly: 213 if headsonly:
216 for pctx in ctx.parents(): 214 for pctx in ctx.parents():
217 revs.discard(pctx.rev()) 215 revs.discard(pctx.rev())
216 failed = []
218 for rev in revs: 217 for rev in revs:
219 ctx = repo[rev] 218 ctx = repo[rev]
220 eol = parseeol(ui, repo, [ctx.node()]) 219 eol = parseeol(ui, repo, [ctx.node()])
221 if eol: 220 if eol:
222 eol.checkrev(repo, ctx, files) 221 failed.extend(eol.checkrev(repo, ctx, files))
222
223 if failed:
224 eols = {'to-lf': 'CRLF', 'to-crlf': 'LF'}
225 msgs = []
226 for node, target, f in failed:
227 msgs.append(_(" %s in %s should not have %s line endings") %
228 (f, node, eols[target]))
229 raise util.Abort(_("end-of-line check failed:\n") + "\n".join(msgs))
223 230
224 def checkallhook(ui, repo, node, hooktype, **kwargs): 231 def checkallhook(ui, repo, node, hooktype, **kwargs):
225 """verify that files have expected EOLs""" 232 """verify that files have expected EOLs"""
226 _checkhook(ui, repo, node, False) 233 _checkhook(ui, repo, node, False)
227 234