view hgext/win32text.py @ 4928:e8f4e40f285a

convert/subversion: work around memory leak in svn's python bindings The svn.ra.get_log wrapper attaches the hash of changed paths for every log entry to a global memory pool, so memory consumption increases rapidly, with no way to free it. Our workaround is to call this function in a child process, and feed its results back over a pipe. The memory consumption of the child still grows huge (hundreds of megabytes), but at least it goes away once the reading-the-log phase is done.
author Bryan O'Sullivan <bos@serpentine.com>
date Thu, 19 Jul 2007 12:41:07 -0700
parents 8c5aca855b5d
children
line wrap: on
line source

from mercurial import util, ui
from mercurial.i18n import gettext as _
import re

# regexp for single LF without CR preceding.
re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE)

def dumbdecode(s, cmd):
    # 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:
        u = ui.ui()
        u.warn(_('WARNING: file in repository already has CRLF line ending \n'
                 ' which does not need eol conversion by win32text plugin.\n'
                 ' Please reconsider encode/decode setting in'
                 ' mercurial.ini or .hg/hgrc\n'
                 ' before next commit.\n'))
    # 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):
    if clevertest(s, cmd):
        return dumbdecode(s, cmd)
    return s

def cleverencode(s, cmd):
    if clevertest(s, cmd):
        return dumbencode(s, cmd)
    return s

util.filtertable.update({
    'dumbdecode:': dumbdecode,
    'dumbencode:': dumbencode,
    'cleverdecode:': cleverdecode,
    'cleverencode:': cleverencode,
    })