mercurial/strutil.py
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
Tue, 17 Aug 2010 17:46:10 +0200
changeset 11942 50a4e55aa278
parent 10263 25e572394f5c
child 25979 b723f05ec49b
permissions -rw-r--r--
demandimport: store level argument on _demandmod instances The 'level' argument to __import__ was added in Python 2.6, and is specified for either relative or absolute imports. The fix introduced in e160f2312815 allowed such imports to proceed without failure, but effectively disabled demandimport for them. This is particularly unfortunate in Python 3.x, where *all* imports are either relative or absolute. The solution introduced here is to store the level argument on the demandimport instance, and propagate it to _origimport() when its value isn't None. Please note that this patch hasn't been tested in Python 3.x, and thus may not be complete. I'm worried about how sub-imports are handled; I don't know what they are, or whether the level argument should be modified for them. I've added 'TODO' notes to these cases; hopefully, someone more knowledgable of these issues will deal with them.

# 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