view mercurial/strutil.py @ 17626:3a524b647897

context: add "descendant()" to changectx for efficient descendant examination This patch adds "descendant()", which uses "revlog.descendant()" for descendant examination, to changectx. This implementation is more efficient than "new in old.descendants()" expression, because: - "changectx.descendants()" creates temporary "changectx" objects, but "revlog.descendant()" doesn't "revlog.descendant()" checks only revision numbers of descendants. - "revlog.descendant()" stops scanning, when scanning of all revisions less than one of examination target is finished this can avoid useless scanning in "not descendant" case.
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Tue, 18 Sep 2012 21:39:12 +0900
parents 25e572394f5c
children b723f05ec49b
line wrap: on
line source

# strutil.py - string utilities for Mercurial
#
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

def findall(haystack, needle, start=0, end=None):
    if end is None:
        end = len(haystack)
    if end < 0:
        end += len(haystack)
    if start < 0:
        start += len(haystack)
    while start < end:
        c = haystack.find(needle, start, end)
        if c == -1:
            break
        yield c
        start = c + 1

def rfindall(haystack, needle, start=0, end=None):
    if end is None:
        end = len(haystack)
    if end < 0:
        end += len(haystack)
    if start < 0:
        start += len(haystack)
    while end >= 0:
        c = haystack.rfind(needle, start, end)
        if c == -1:
            break
        yield c
        end = c - 1