Mercurial > hg
view hgext/win32text.py @ 6858:8f256bf98219
Add support for multiple possible bisect results (issue1228, issue1182)
The real reason for both issue is that bisect can not handle cases where there
are multiple possibilities for the result.
Example (from issue1228):
rev 0 -> good
rev 1 -> skipped
rev 2 -> skipped
rev 3 -> skipped
rev 4 -> bad
Note that this patch does not only fix the reported Assertion Error but also
the problem of a non converging bisect:
hg init
for i in `seq 3`; do echo $i > $i; hg add $i; hg ci -m$i; done
hg bisect -b 2
hg bisect -g 0
hg bisect -s
From this state on, you can:
a) mark as bad forever (non converging!)
b) mark as good to get an inconsistent state
c) skip for the Assertion Error
Minor description and code edits by pmezard.
author | Bernhard Leiner <bleiner@gmail.com> |
---|---|
date | Sat, 02 Aug 2008 22:10:10 +0200 |
parents | 9c897ffd3637 |
children | ab8038bf5127 |
line wrap: on
line source
# win32text.py - LF <-> CRLF translation utilities for Windows users # # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. # # To perform automatic newline conversion, use: # # [extensions] # hgext.win32text = # [encode] # ** = cleverencode: # [decode] # ** = cleverdecode: # # If not doing conversion, to make sure you do not commit CRLF by accident: # # [hooks] # pretxncommit.crlf = python:hgext.win32text.forbidcrlf # # To do the same check on a server to prevent CRLF from being pushed or pulled: # # [hooks] # pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf from mercurial.i18n import gettext as _ from mercurial.node import bin, short import re # regexp for single LF without CR preceding. re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE) def dumbdecode(s, cmd, ui=None, repo=None, filename=None, **kwargs): # warn if already has CRLF in repository. # it might cause unexpected eol conversion. # see issue 302: # http://www.selenic.com/mercurial/bts/issue302 if '\r\n' in s and ui and filename and repo: ui.warn(_('WARNING: %s already has CRLF line endings\n' 'and does not need EOL conversion by the win32text plugin.\n' 'Before your next commit, please reconsider your ' 'encode/decode settings in \nMercurial.ini or %s.\n') % (filename, repo.join('hgrc'))) # replace single LF to CRLF return re_single_lf.sub('\\1\r\n', s) def dumbencode(s, cmd): return s.replace('\r\n', '\n') def clevertest(s, cmd): if '\0' in s: return False return True def cleverdecode(s, cmd, **kwargs): if clevertest(s, cmd): return dumbdecode(s, cmd, **kwargs) return s def cleverencode(s, cmd): if clevertest(s, cmd): return dumbencode(s, cmd) return s _filters = { 'dumbdecode:': dumbdecode, 'dumbencode:': dumbencode, 'cleverdecode:': cleverdecode, 'cleverencode:': cleverencode, } def forbidcrlf(ui, repo, hooktype, node, **kwargs): halt = False for rev in xrange(repo.changelog.rev(bin(node)), repo.changelog.count()): c = repo.changectx(rev) for f in c.files(): if f not in c: continue data = c[f].data() if '\0' not in data and '\r\n' in data: if not halt: ui.warn(_('Attempt to commit or push text file(s) ' 'using CRLF line endings\n')) ui.warn(_('in %s: %s\n') % (short(c.node()), f)) halt = True if halt and hooktype == 'pretxnchangegroup': ui.warn(_('\nTo prevent this mistake in your local repository,\n' 'add to Mercurial.ini or .hg/hgrc:\n' '\n' '[hooks]\n' 'pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n' '\n' 'and also consider adding:\n' '\n' '[extensions]\n' 'hgext.win32text =\n' '[encode]\n' '** = cleverencode:\n' '[decode]\n' '** = cleverdecode:\n')) return halt def reposetup(ui, repo): if not repo.local(): return for name, fn in _filters.iteritems(): repo.adddatafilter(name, fn)