[Updated] D8928: worker: don't expose readinto() on _blockingreader since pickle is picky
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Wed Aug 26 16:33:10 UTC 2020
martinvonz edited the summary of this revision.
martinvonz updated this revision to Diff 22463.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D8928?vs=22407&id=22463
BRANCH
default
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D8928/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D8928
AFFECTED FILES
mercurial/worker.py
tests/test-fix-pickle.t
CHANGE DETAILS
diff --git a/tests/test-fix-pickle.t b/tests/test-fix-pickle.t
new file mode 100644
--- /dev/null
+++ b/tests/test-fix-pickle.t
@@ -0,0 +1,45 @@
+A script that implements uppercasing all letters in a file.
+
+ $ UPPERCASEPY="$TESTTMP/uppercase.py"
+ $ cat > $UPPERCASEPY <<EOF
+ > import sys
+ > from mercurial.utils.procutil import setbinary
+ > setbinary(sys.stdin)
+ > setbinary(sys.stdout)
+ > sys.stdout.write(sys.stdin.read().upper())
+ > EOF
+ $ TESTLINES="foo\nbar\nbaz\n"
+ $ printf $TESTLINES | "$PYTHON" $UPPERCASEPY
+ FOO
+ BAR
+ BAZ
+
+This file attempts to test our workarounds for pickle's lack of
+support for short reads.
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > fix =
+ > [fix]
+ > uppercase-whole-file:command="$PYTHON" $UPPERCASEPY
+ > uppercase-whole-file:pattern=set:**
+ > EOF
+
+ $ hg init repo
+ $ cd repo
+
+# Create a file that's large enough that it seems to not fit in
+# pickle's buffer, making it use the code path that expects our
+# _blockingreader's read() method to return bytes.
+ $ echo "some stuff" > file
+ $ for i in $($TESTDIR/seq.py 13); do
+ > cat file file > tmp
+ > mv -f tmp file
+ > done
+ $ hg commit -Am "add large file"
+ adding file
+
+Check that we don't get a crash
+
+ $ hg fix -r .
+ saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-fix.hg (glob)
diff --git a/mercurial/worker.py b/mercurial/worker.py
--- a/mercurial/worker.py
+++ b/mercurial/worker.py
@@ -71,8 +71,12 @@
def __init__(self, wrapped):
self._wrapped = wrapped
- def __getattr__(self, attr):
- return getattr(self._wrapped, attr)
+ # Do NOT implement readinto() by making it delegate to
+ # _wrapped.readline(), since that is unbuffered. The unpickler is fine
+ # with just read() and readline(), so we don't need to implement it.
+
+ def readline(self):
+ return self._wrapped.readline()
# issue multiple reads until size is fulfilled
def read(self, size=-1):
@@ -91,7 +95,7 @@
del view
del buf[pos:]
- return buf
+ return bytes(buf)
else:
To: martinvonz, #hg-reviewers, marmoute
Cc: marmoute, mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20200826/5dde4fdc/attachment-0002.html>
More information about the Mercurial-patches
mailing list