Mercurial > public > mercurial-scm > hg
comparison mercurial/context.py @ 15528:a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
splitblock() was added to handle blocks returned by bdiff.blocks() which differ
only by blank lines but are not made only of blank lines. I do not know exactly
how it could happen but mdiff.blocks() threshold behaviour makes me think it
can if those blocks are made of very popular lines mixed with popular blank
lines. If it is proven to be wrong, the function can be dropped.
The first implementation made annotate share diff configuration entries. But it
looks like users will user -w/b for annotate but not for diff, on both the
command line and hgweb. Since the latter cannot use command line entries, we
introduce a new [annotate] section duplicating the diff whitespace options.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Fri, 18 Nov 2011 12:04:31 +0100 |
parents | cff509500a24 |
children | 2a48422e27f6 |
comparison
equal
deleted
inserted
replaced
15527:9926aab3d0b5 | 15528:a84698badf0b |
---|---|
5 # This software may be used and distributed according to the terms of the | 5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. | 6 # GNU General Public License version 2 or any later version. |
7 | 7 |
8 from node import nullid, nullrev, short, hex | 8 from node import nullid, nullrev, short, hex |
9 from i18n import _ | 9 from i18n import _ |
10 import ancestor, bdiff, error, util, scmutil, subrepo, patch, encoding | 10 import ancestor, mdiff, error, util, scmutil, subrepo, patch, encoding |
11 import match as matchmod | 11 import match as matchmod |
12 import os, errno, stat | 12 import os, errno, stat |
13 | 13 |
14 propertycache = util.propertycache | 14 propertycache = util.propertycache |
15 | 15 |
431 # hard for renames | 431 # hard for renames |
432 c = self._filelog.children(self._filenode) | 432 c = self._filelog.children(self._filenode) |
433 return [filectx(self._repo, self._path, fileid=x, | 433 return [filectx(self._repo, self._path, fileid=x, |
434 filelog=self._filelog) for x in c] | 434 filelog=self._filelog) for x in c] |
435 | 435 |
436 def annotate(self, follow=False, linenumber=None): | 436 def annotate(self, follow=False, linenumber=None, diffopts=None): |
437 '''returns a list of tuples of (ctx, line) for each line | 437 '''returns a list of tuples of (ctx, line) for each line |
438 in the file, where ctx is the filectx of the node where | 438 in the file, where ctx is the filectx of the node where |
439 that line was last changed. | 439 that line was last changed. |
440 This returns tuples of ((ctx, linenumber), line) for each line, | 440 This returns tuples of ((ctx, linenumber), line) for each line, |
441 if "linenumber" parameter is NOT "None". | 441 if "linenumber" parameter is NOT "None". |
458 decorate = (((linenumber is None) and decorate_compat) or | 458 decorate = (((linenumber is None) and decorate_compat) or |
459 (linenumber and with_linenumber) or | 459 (linenumber and with_linenumber) or |
460 without_linenumber) | 460 without_linenumber) |
461 | 461 |
462 def pair(parent, child): | 462 def pair(parent, child): |
463 for a1, a2, b1, b2 in bdiff.blocks(parent[1], child[1]): | 463 blocks = mdiff.allblocks(parent[1], child[1], opts=diffopts, |
464 child[0][b1:b2] = parent[0][a1:a2] | 464 refine=True) |
465 for (a1, a2, b1, b2), t in blocks: | |
466 # Changed blocks ('!') or blocks made only of blank lines ('~') | |
467 # belong to the child. | |
468 if t == '=': | |
469 child[0][b1:b2] = parent[0][a1:a2] | |
465 return child | 470 return child |
466 | 471 |
467 getlog = util.lrucachefunc(lambda x: self._repo.file(x)) | 472 getlog = util.lrucachefunc(lambda x: self._repo.file(x)) |
468 def getctx(path, fileid): | 473 def getctx(path, fileid): |
469 log = path == self._path and self._filelog or getlog(path) | 474 log = path == self._path and self._filelog or getlog(path) |