8 from demandload import demandload |
8 from demandload import demandload |
9 from node import * |
9 from node import * |
10 from i18n import gettext as _ |
10 from i18n import gettext as _ |
11 demandload(globals(), "os re sys signal shutil imp urllib pdb") |
11 demandload(globals(), "os re sys signal shutil imp urllib pdb") |
12 demandload(globals(), "fancyopts ui hg util lock revlog templater bundlerepo") |
12 demandload(globals(), "fancyopts ui hg util lock revlog templater bundlerepo") |
13 demandload(globals(), "fnmatch mdiff random signal tempfile time") |
13 demandload(globals(), "fnmatch mdiff difflib random signal tempfile time") |
14 demandload(globals(), "traceback errno socket version struct atexit sets bz2") |
14 demandload(globals(), "traceback errno socket version struct atexit sets bz2") |
15 demandload(globals(), "archival cStringIO changegroup email.Parser") |
15 demandload(globals(), "archival cStringIO changegroup email.Parser") |
16 demandload(globals(), "hgweb.server sshserver") |
16 demandload(globals(), "hgweb.server sshserver") |
17 |
17 |
18 class UnknownCommand(Exception): |
18 class UnknownCommand(Exception): |
1642 def __init__(self, line, linenum, colstart, colend): |
1642 def __init__(self, line, linenum, colstart, colend): |
1643 self.line = line |
1643 self.line = line |
1644 self.linenum = linenum |
1644 self.linenum = linenum |
1645 self.colstart = colstart |
1645 self.colstart = colstart |
1646 self.colend = colend |
1646 self.colend = colend |
|
1647 |
1647 def __eq__(self, other): |
1648 def __eq__(self, other): |
1648 return self.line == other.line |
1649 return self.line == other.line |
1649 def __hash__(self): |
|
1650 return hash(self.line) |
|
1651 |
1650 |
1652 matches = {} |
1651 matches = {} |
1653 def grepbody(fn, rev, body): |
1652 def grepbody(fn, rev, body): |
1654 matches[rev].setdefault(fn, {}) |
1653 matches[rev].setdefault(fn, []) |
1655 m = matches[rev][fn] |
1654 m = matches[rev][fn] |
1656 for lnum, cstart, cend, line in matchlines(body): |
1655 for lnum, cstart, cend, line in matchlines(body): |
1657 s = linestate(line, lnum, cstart, cend) |
1656 s = linestate(line, lnum, cstart, cend) |
1658 m[s] = s |
1657 m.append(s) |
1659 |
1658 |
1660 # FIXME: prev isn't used, why ? |
1659 def difflinestates(a, b): |
|
1660 sm = difflib.SequenceMatcher(None, a, b) |
|
1661 for tag, alo, ahi, blo, bhi in sm.get_opcodes(): |
|
1662 if tag == 'insert': |
|
1663 for i in range(blo, bhi): |
|
1664 yield ('+', b[i]) |
|
1665 elif tag == 'delete': |
|
1666 for i in range(alo, ahi): |
|
1667 yield ('-', a[i]) |
|
1668 elif tag == 'replace': |
|
1669 for i in range(alo, ahi): |
|
1670 yield ('-', a[i]) |
|
1671 for i in range(blo, bhi): |
|
1672 yield ('+', b[i]) |
|
1673 |
1661 prev = {} |
1674 prev = {} |
1662 ucache = {} |
1675 ucache = {} |
1663 def display(fn, rev, states, prevstates): |
1676 def display(fn, rev, states, prevstates): |
1664 diff = list(sets.Set(states).symmetric_difference(sets.Set(prevstates))) |
|
1665 diff.sort(lambda x, y: cmp(x.linenum, y.linenum)) |
|
1666 counts = {'-': 0, '+': 0} |
1677 counts = {'-': 0, '+': 0} |
1667 filerevmatches = {} |
1678 filerevmatches = {} |
1668 for l in diff: |
1679 if incrementing or not opts['all']: |
|
1680 a, b = prevstates, states |
|
1681 else: |
|
1682 a, b = states, prevstates |
|
1683 for change, l in difflinestates(a, b): |
1669 if incrementing or not opts['all']: |
1684 if incrementing or not opts['all']: |
1670 change = ((l in prevstates) and '-') or '+' |
|
1671 r = rev |
1685 r = rev |
1672 else: |
1686 else: |
1673 change = ((l in states) and '-') or '+' |
|
1674 r = prev[fn] |
1687 r = prev[fn] |
1675 cols = [fn, str(rev)] |
1688 cols = [fn, str(r)] |
1676 if opts['line_number']: |
1689 if opts['line_number']: |
1677 cols.append(str(l.linenum)) |
1690 cols.append(str(l.linenum)) |
1678 if opts['all']: |
1691 if opts['all']: |
1679 cols.append(change) |
1692 cols.append(change) |
1680 if opts['user']: |
1693 if opts['user']: |
1681 cols.append(trimuser(ui, getchange(rev)[1], rev, |
1694 cols.append(trimuser(ui, getchange(r)[1], rev, |
1682 ucache)) |
1695 ucache)) |
1683 if opts['files_with_matches']: |
1696 if opts['files_with_matches']: |
1684 c = (fn, rev) |
1697 c = (fn, rev) |
1685 if c in filerevmatches: |
1698 if c in filerevmatches: |
1686 continue |
1699 continue |
1687 filerevmatches[c] = 1 |
1700 filerevmatches[c] = 1 |