##// END OF EJS Templates
worker: Use buffered input from the pickle stream...
worker: Use buffered input from the pickle stream On Python 3, "pickle.load" will raise an exception ("_pickle.UnpicklingError: pickle data was truncated") when it gets a short read, i.e. it receives fewer bytes than it requested. On our build machine, Mercurial seems to frequently hit this problem while updating a mozilla-central clone iff it gets scheduled in batch mode. It is easy to trigger with: #wipe the workdir rm -rf * hg update null chrt -b 0 hg update default I've also written the following program, which demonstrates the core problem: from __future__ import print_function import io import os import pickle import time obj = {"a": 1, "b": 2} obj_data = pickle.dumps(obj) assert len(obj_data) > 10 rfd, wfd = os.pipe() pid = os.fork() if pid == 0: os.close(rfd) for _ in range(4): time.sleep(0.5) print("First write") os.write(wfd, obj_data[:10]) time.sleep(0.5) print("Second write") os.write(wfd, obj_data[10:]) os._exit(0) try: os.close(wfd) rfile = os.fdopen(rfd, "rb", 0) print("Reading") while True: try: obj_copy = pickle.load(rfile) assert obj == obj_copy except EOFError: break print("Success") finally: os.kill(pid, 15) The program reliably fails with Python 3.8 and succeeds with Python 2.7. Providing the unpickler with a buffered reader fixes the issue, so let "os.fdopen" create one. https://bugzilla.mozilla.org/show_bug.cgi?id=1604486 Differential Revision: https://phab.mercurial-scm.org/D8051

File last commit:

r43375:649d3ac3 default
r44718:cb52e619 stable
Show More
win32text.py
224 lines | 6.5 KiB | text/x-python | PythonLexer
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 # win32text.py - LF <-> CRLF/CR translation utilities for Windows/Mac users
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 #
Martin Geisler
win32text: add copyright header
r8253 # Copyright 2005, 2007-2009 Matt Mackall <mpm@selenic.com> and others
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Matt Mackall
extensions: mark win32text deprecated...
r20624 '''perform automatic newline conversion (DEPRECATED)
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Martin Geisler
win32text: mark this extension as deprecated
r11269 Deprecation: The win32text extension requires each user to configure
the extension again and again for each clone since the configuration
is not copied when cloning.
We have therefore made the ``eol`` as an alternative. The ``eol``
uses a version controlled file for its configuration and each clone
will therefore use the right settings from the start.
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 To perform automatic newline conversion, use::
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 [extensions]
Martin Geisler
hgext: enable extensions without "hgext." prefix in help texts
r10112 win32text =
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 [encode]
** = cleverencode:
# or ** = macencode:
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 [decode]
** = cleverdecode:
# or ** = macdecode:
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 If not doing conversion, to make sure you do not commit CRLF/CR by accident::
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 [hooks]
pretxncommit.crlf = python:hgext.win32text.forbidcrlf
# or pretxncommit.cr = python:hgext.win32text.forbidcr
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
To do the same check on a server to prevent CRLF/CR from being
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 pushed or pulled::
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873
Martin Geisler
win32text: use reST syntax for literal blocks
r9217 [hooks]
pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf
# or pretxnchangegroup.cr = python:hgext.win32text.forbidcr
Dirkjan Ochtman
help: add/fix docstrings for a bunch of extensions
r8873 '''
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485 from __future__ import absolute_import
import re
Martin Geisler
i18n: import _ instead of gettext
r7225 from mercurial.i18n import _
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.node import short
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485 from mercurial import (
Gregory Szorc
global: use pycompat.xrange()...
r38806 pycompat,
Boris Feld
configitems: register the 'win32text.warn' config
r34186 registrar,
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 )
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.utils import stringutil
Lee Cantey
Correct inadvertent line ending change.
r4859
Augie Fackler
extensions: change magic "shipped with hg" string...
r29841 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
Augie Fackler
extensions: document that `testedwith = 'internal'` is special...
r25186 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
# be specifying the version(s) of Mercurial they are tested with, or
# leave the attribute unspecified.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 testedwith = b'ships-with-hg-core'
Augie Fackler
hgext: mark all first-party extensions as such
r16743
Boris Feld
configitems: register the 'win32text.warn' config
r34186 configtable = {}
configitem = registrar.configitem(configtable)
Augie Fackler
formatting: blacken the codebase...
r43346 configitem(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'win32text', b'warn', default=True,
Boris Feld
configitems: register the 'win32text.warn' config
r34186 )
Lee Cantey
Correct inadvertent line ending change.
r4859 # regexp for single LF without CR preceding.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 re_single_lf = re.compile(b'(^|[^\r])\n', re.MULTILINE)
Lee Cantey
Correct inadvertent line ending change.
r4859
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 newlinestr = {b'\r\n': b'CRLF', b'\r': b'CR'}
filterstr = {b'\r\n': b'clever', b'\r': b'mac'}
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def checknewline(s, newline, ui=None, repo=None, filename=None):
# warn if already has 'newline' in repository.
Lee Cantey
Correct inadvertent line ending change.
r4859 # it might cause unexpected eol conversion.
# see issue 302:
Matt Mackall
urls: bulk-change BTS urls to new location
r26420 # https://bz.mercurial-scm.org/302
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 if newline in s and ui and filename and repo:
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'WARNING: %s already has %s line endings\n'
b'and does not need EOL conversion by the win32text plugin.\n'
b'Before your next commit, please reconsider your '
b'encode/decode settings in \nMercurial.ini or %s.\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 % (filename, newlinestr[newline], repo.vfs.join(b'hgrc'))
Augie Fackler
formatting: blacken the codebase...
r43346 )
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
def dumbdecode(s, cmd, **kwargs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 checknewline(s, b'\r\n', **kwargs)
Lee Cantey
Correct inadvertent line ending change.
r4859 # replace single LF to CRLF
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return re_single_lf.sub(b'\\1\r\n', s)
Lee Cantey
Correct inadvertent line ending change.
r4859
Augie Fackler
formatting: blacken the codebase...
r43346
Lee Cantey
Correct inadvertent line ending change.
r4859 def dumbencode(s, cmd):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return s.replace(b'\r\n', b'\n')
Lee Cantey
Correct inadvertent line ending change.
r4859
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def macdumbdecode(s, cmd, **kwargs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 checknewline(s, b'\r', **kwargs)
return s.replace(b'\n', b'\r')
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def macdumbencode(s, cmd):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return s.replace(b'\r', b'\n')
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
Jesse Glick
Provide better context for custom Python encode/decode filters....
r5967 def cleverdecode(s, cmd, **kwargs):
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 if not stringutil.binary(s):
Patrick Mezard
Backed out changeset 7f4257b5cbfc...
r6473 return dumbdecode(s, cmd, **kwargs)
return s
Lee Cantey
Correct inadvertent line ending change.
r4859
Augie Fackler
formatting: blacken the codebase...
r43346
Lee Cantey
Correct inadvertent line ending change.
r4859 def cleverencode(s, cmd):
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 if not stringutil.binary(s):
Patrick Mezard
Backed out changeset 7f4257b5cbfc...
r6473 return dumbencode(s, cmd)
return s
Lee Cantey
Correct inadvertent line ending change.
r4859
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def macdecode(s, cmd, **kwargs):
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 if not stringutil.binary(s):
Patrick Mezard
Merge with macencode branch
r6484 return macdumbdecode(s, cmd, **kwargs)
return s
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def macencode(s, cmd):
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 if not stringutil.binary(s):
Patrick Mezard
Merge with macencode branch
r6484 return macdumbencode(s, cmd)
return s
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
Patrick Mezard
Register data filters in a localrepo instead of util...
r5966 _filters = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'dumbdecode:': dumbdecode,
b'dumbencode:': dumbencode,
b'cleverdecode:': cleverdecode,
b'cleverencode:': cleverencode,
b'macdumbdecode:': macdumbdecode,
b'macdumbencode:': macdumbencode,
b'macdecode:': macdecode,
b'macencode:': macencode,
Augie Fackler
formatting: blacken the codebase...
r43346 }
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675
Patrick Mezard
win32text: rename forbidcrlforcr() function
r6483 def forbidnewline(ui, repo, hooktype, node, newline, **kwargs):
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 halt = False
Martin Geisler
util: use built-in set and frozenset...
r8150 seen = set()
Bryan O'Sullivan
win32text: be more careful about rejecting violating changesets...
r8147 # we try to walk changesets in reverse order from newest to
# oldest, so that if we see a file multiple times, we take the
# newest version as canonical. this prevents us from blocking a
# changegroup that contains an unacceptable commit followed later
# by a commit that fixes the problem.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tip = repo[b'tip']
Augie Fackler
formatting: blacken the codebase...
r43346 for rev in pycompat.xrange(
repo.changelog.tiprev(), repo[node].rev() - 1, -1
):
Matt Mackall
use repo[changeid] to get a changectx
r6747 c = repo[rev]
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 for f in c.files():
Bryan O'Sullivan
win32text: be more careful about rejecting violating changesets...
r8147 if f in seen or f not in tip or f not in c:
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 continue
Bryan O'Sullivan
win32text: be more careful about rejecting violating changesets...
r8147 seen.add(f)
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 data = c[f].data()
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 if not stringutil.binary(data) and newline in data:
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 if not halt:
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'attempt to commit or push text file(s) '
b'using %s line endings\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% newlinestr[newline]
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.warn(_(b'in %s: %s\n') % (short(c.node()), f))
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 halt = True
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if halt and hooktype == b'pretxnchangegroup':
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 crlf = newlinestr[newline].lower()
filter = filterstr[newline]
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'\nTo prevent this mistake in your local repository,\n'
b'add to Mercurial.ini or .hg/hgrc:\n'
b'\n'
b'[hooks]\n'
b'pretxncommit.%s = python:hgext.win32text.forbid%s\n'
b'\n'
b'and also consider adding:\n'
b'\n'
b'[extensions]\n'
b'win32text =\n'
b'[encode]\n'
b'** = %sencode:\n'
b'[decode]\n'
b'** = %sdecode:\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (crlf, crlf, filter, filter)
)
Jesse Glick
Issue 882: add standard hook to reject text files with CRLF....
r5675 return halt
Patrick Mezard
Register data filters in a localrepo instead of util...
r5966
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def forbidcrlf(ui, repo, hooktype, node, **kwargs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return forbidnewline(ui, repo, hooktype, node, b'\r\n', **kwargs)
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
OHASHI Hideya
win32text: Add macencode/macdecode
r6481 def forbidcr(ui, repo, hooktype, node, **kwargs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return forbidnewline(ui, repo, hooktype, node, b'\r', **kwargs)
OHASHI Hideya
win32text: Add macencode/macdecode
r6481
Augie Fackler
formatting: blacken the codebase...
r43346
Patrick Mezard
Register data filters in a localrepo instead of util...
r5966 def reposetup(ui, repo):
if not repo.local():
return
Gregory Szorc
py3: define and use pycompat.iteritems() for hgext/...
r43375 for name, fn in pycompat.iteritems(_filters):
Patrick Mezard
Register data filters in a localrepo instead of util...
r5966 repo.adddatafilter(name, fn)
Augie Fackler
formatting: blacken the codebase...
r43346
Steve Borho
win32text: give deprecation warning...
r12837 def extsetup(ui):
Matt Mackall
win32text: mark deprecated extension option deprecated
r25829 # deprecated config: win32text.warn
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if ui.configbool(b'win32text', b'warn'):
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"win32text is deprecated: "
b"https://mercurial-scm.org/wiki/Win32TextExtension\n"
Augie Fackler
formatting: blacken the codebase...
r43346 )
)