Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 14:05:26 -0800] rev 41563
tests: use raw strings in test-cbor.py
To avoid SyntaxWarning on Python 3.8 due to invalid \ escape.
Differential Revision: https://phab.mercurial-scm.org/D5839
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 14:03:15 -0800] rev 41562
showstack: use raw docstring
Avoids a SyntaxWarning on Python 3.8 due to invalid \ escape.
Differential Revision: https://phab.mercurial-scm.org/D5838
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 14:00:57 -0800] rev 41561
tests: use raw string in test-check-code.t
To avoid a SyntaxWarning on Python 3.8 due to invalid \ escape.
Differential Revision: https://phab.mercurial-scm.org/D5837
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:47:13 -0800] rev 41560
run-tests: set attributes in sorted order
Python 3.8 preserves insertion order in serialized output
(https://bugs.python.org/issue34160). Older Pythons serialized
in sorted order.
Let's make insertion order sorted so behavior is consistent across
Python versions.
Differential Revision: https://phab.mercurial-scm.org/D5831
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:41:10 -0800] rev 41559
revetbenchmarks: use raw string for regular expression with escapes
This avoids a SyntaxWarning on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5830
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:38:33 -0800] rev 41558
check-code: use raw string
This avoids a SyntaxWarning in Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5829
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:37:09 -0800] rev 41557
tests: use raw strings for regular expressions with escapes
Avoids SyntaxWarning on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5828
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:35:55 -0800] rev 41556
drawdag: use raw strings for docstrings
Avoids SyntaxWarning for invalid \ escape on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5827
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:34:11 -0800] rev 41555
check-config: use raw strings for regular expressions
This avoids SyntaxWarning on Python 3.8 for invalid \ escapes.
Differential Revision: https://phab.mercurial-scm.org/D5826
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:32:30 -0800] rev 41554
run-tests: use raw strings for regular expressions
Avoids SyntaxWarning due to invalid \ escape on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5825
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:31:19 -0800] rev 41553
check-commit: use raw string for regular expression
Avoids SyntaxWarning on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5824
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:13:05 -0800] rev 41552
configitems: use raw strings for hidden-{command,topic} items
These strings are regular expressions. The "\." needs to be
string escaped. We use raw strings to avoid doing that and the
SyntaxWarning we'd receive otherwise on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5822
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:03:10 -0800] rev 41551
convert: use raw string for regular expressions
This avoids a SyntaxWarning on Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5821
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:01:49 -0800] rev 41550
graphmod: use raw string
Needed to avoid a SyntaxWarning due to unescaped \ in Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5820
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:00:52 -0800] rev 41549
crecord: use raw string for regular expression
\s emits a SyntaxWarning in Python 3.8. Use a raw string to
avoid escaping the \.
Differential Revision: https://phab.mercurial-scm.org/D5819
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 08:59:11 -0800] rev 41548
patch: properly escape \ in string literals
Python 3.8 will emit a SyntaxWarning for str/bytes with invalid
escapes. This commit addresses 4 occurrences where we had a bare
\ in a str/bytes.
Differential Revision: https://phab.mercurial-scm.org/D5818
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:07:00 -0800] rev 41547
global: make some docstrings raw strings
Python 3.8 emits a SyntaxWarning when a str/bytes contains invalid
\ escapes. Various docstrings in our code base contain invalid
\ escapes.
This commit turns those docstrings into raw strings.
Differential Revision: https://phab.mercurial-scm.org/D5816
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 08:54:30 -0800] rev 41546
global: use raw strings for regular expressions with escapes
Escape sequences like \w, \s, and \d are technically invalid
in str/bytes. This became a deprecation warning in Python 3.6
(https://bugs.python.org/issue27364). Python 3.8 bumps it to
a SyntaxWarning (https://bugs.python.org/issue32912), which is
non-silent by default.
This commit changes a number of regular expressions to use
br'' so regular expression special sequences don't need \\
literals. This fixes roughly half of the SyntaxWarning we
see in the code base with Python 3.8.
Differential Revision: https://phab.mercurial-scm.org/D5815
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Feb 2019 09:29:25 -0800] rev 41545
tests: add optional Python 2.7 deprecation output
pip 19 will emit a Python 2.7 deprecation warning when used with
Python 2.7. Let's add that as optional output to our pip test.
Differential Revision: https://phab.mercurial-scm.org/D5823
Augie Fackler <augie@google.com> [Mon, 04 Feb 2019 17:06:22 -0500] rev 41544
tests: fix test-match.py on Python3
# skip-blame just b prefixes
Differential Revision: https://phab.mercurial-scm.org/D5835
Pulkit Goyal <pulkit@yandex-team.ru> [Mon, 04 Feb 2019 20:35:21 +0300] rev 41543
merge with stable
Pulkit Goyal <pulkit@yandex-team.ru> [Mon, 04 Feb 2019 18:14:03 +0300] rev 41542
match: teach diffmatcher.visitdir() to return 'all' if possible
This patch teaches differencematcher.visitdir() to return 'all' when
m1.visitdir() returns 'all' and m2 does not matches.
Before this patch, from a differencematcher.visitdir(), we always returned
either True or False. We never returned 'all' even when we can. This causes
problem when m1 and m2 of a differencematcher are themselves differencematcher.
In that case, we try to check:
`if self._m2_.visitdir(dir) == 'all'`
which will never be 'all' even though it can be.
This leads to iterating over a lot of sub-directory manifest, even though we
don't want to while extending a narrow clone. I am yet to measure the impact of
this but calculating manifest was taking ~50-60 seconds, so this should
definitely save some of time there.
Differential Revision: https://phab.mercurial-scm.org/D5814
Boris Feld <boris.feld@octobus.net> [Sun, 03 Feb 2019 10:01:43 +0100] rev 41541
py3: use integer division instead of `int(...)` call
Changeset 38a82e0333c9 and 7f853549823b introduced explicit conversion to
integer to work around the division behavior change from python2 to python3.
Using the integer division operator is a simpler and clearer way to achieve
this.
Pulkit Goyal <pulkit@yandex-team.ru> [Sun, 03 Feb 2019 17:15:11 +0530] rev 41540
py3: add some b'' prefixes in test-notify.t
# skip-blame as just b'' prefixes
Differential Revision: https://phab.mercurial-scm.org/D5811
Pulkit Goyal <pulkit@yandex-team.ru> [Sun, 03 Feb 2019 17:05:47 +0530] rev 41539
py3: use pycompat.long in hgext/convert/monotone.py
Differential Revision: https://phab.mercurial-scm.org/D5810
Pulkit Goyal <pulkit@yandex-team.ru> [Sun, 03 Feb 2019 16:59:46 +0530] rev 41538
py3: add three new passing tests found by buildbot
Differential Revision: https://phab.mercurial-scm.org/D5809
Pulkit Goyal <pulkit@yandex-team.ru> [Sun, 03 Feb 2019 16:38:47 +0530] rev 41537
py3: do a fsdecode(), fsencode() dance in posix.py
We have to use `fsdecode()` instead of sysstr() because they are abusing
`PyUnicode_EncodeFSDefault()` to get back bytes.
Differential Revision: https://phab.mercurial-scm.org/D5808
Taapas Agrawal <taapas2897@gmail.com> [Sun, 03 Feb 2019 01:02:24 +0530] rev 41536
revert: add prompt before undeleting a file in -i (issue6008)
This adds a prompt that asks whether or not a removed file is to be undeleted
in `hg revert -i`.
Differential Revision: https://phab.mercurial-scm.org/D5803
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 02 Feb 2019 13:16:46 -0800] rev 41535
py3: add alternate output on Python 3
This is basically the same deal as D5806. Python 3's exception
printing output is different.
We had to tweak the regular expression to match appropriately,
hence the added line of output.
Differential Revision: https://phab.mercurial-scm.org/D5807
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 02 Feb 2019 13:13:22 -0800] rev 41534
py3: add Python 3 output for test-flagprocessor.t
The exception is being generated from ui.traceback(), which
simply calls traceback.format_*() to format exceptions. Since
the output from the standard library has changed, there is
seemingly not much we can do about it. So this commit adds
conditional output depending on the Python version.
I'm not thrilled about b'' appearing in user-facing output.
Can we do something better here?
Differential Revision: https://phab.mercurial-scm.org/D5806
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 02 Feb 2019 11:49:26 -0800] rev 41533
zeroconf: Python 3 porting of vendored library
A quick glance through this module reveals that most of it "just works"
on Python 3 with the source transformer active. There are a few
places where we need to ensure we're using str.
Differential Revision: https://phab.mercurial-scm.org/D5804
Anton Shestakov <av6@dwimlabs.net> [Tue, 22 Jan 2019 14:22:25 +0800] rev 41532
relnotes: more improvements
Yuya Nishihara <yuya@tcha.org> [Sat, 02 Feb 2019 15:26:51 +0900] rev 41531
py3: don't use universal_newlines in svnsubrepo
On Python 3, it means text=True without any specific encoding, which is
pretty bad. Instead, use util.fromnativeeol() to translate CR+LF to LF
without encoding conversion.
Yuya Nishihara <yuya@tcha.org> [Sat, 02 Feb 2019 15:21:35 +0900] rev 41530
py3: remove unneeded fsencode() from gitsubrepo
Here p.stdout isn't a TextIO. read() must return bytes.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 25 Jan 2019 14:41:53 -0800] rev 41529
debugcommands: add a debugpathcopies command
I've been working on storing copy metadata in the changelog instead of
the filelog and this has been useful for debugging.
Do we usually add tests for these?
Differential Revision: https://phab.mercurial-scm.org/D5791
Augie Fackler <augie@google.com> [Fri, 01 Feb 2019 20:21:04 -0500] rev 41528
py3: record several more passes from the buildbot ratchet
Differential Revision: https://phab.mercurial-scm.org/D5799
Martin von Zweigbergk <martinvonz@google.com> [Wed, 30 Jan 2019 17:05:09 -0800] rev 41527
grep: respect ui.relative-paths
Differential Revision: https://phab.mercurial-scm.org/D5777
Martin von Zweigbergk <martinvonz@google.com> [Wed, 30 Jan 2019 16:59:31 -0800] rev 41526
grep: move writing of path outside of column loop
This will make the next patch simpler.
Differential Revision: https://phab.mercurial-scm.org/D5776
Martin von Zweigbergk <martinvonz@google.com> [Tue, 29 Jan 2019 12:01:13 -0800] rev 41525
resolve: respect ui.relative-paths
Differential Revision: https://phab.mercurial-scm.org/D5748
Martin von Zweigbergk <martinvonz@google.com> [Wed, 30 Jan 2019 12:05:43 -0800] rev 41524
merge: respect ui.relative-paths
We print file paths in a lot of places in this code and I've probably
missed a few places. We can fix them as we discover them (I'm also
happy to fix anything reviewers notice, of course).
Differential Revision: https://phab.mercurial-scm.org/D5747
Augie Fackler <augie@google.com> [Tue, 29 Jan 2019 18:46:11 -0500] rev 41523
histedit: add templating support to histedit's rule file generation
This will allow users to customize the display of the rule list for the
free-form segment that we don't interpret. We've had users want to add things
like bookmark names or similar to the rule list as a convenience, which seems
reasonable.
Differential Revision: https://phab.mercurial-scm.org/D5742
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Feb 2019 17:03:51 -0800] rev 41522
py3: account for demand import difference between Python versions
Our lazy importer for Python 3 will validate that modules are
loadable before returning a stub module object. This is different
from Python 2, which will always return a stub module object.
While we could change behavior of the Python 3 demand importer,
that seems like a problem for another day.
This commit teaches test-extension.t about that difference in
behavior.
Differential Revision: https://phab.mercurial-scm.org/D5798
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Feb 2019 13:20:13 -0800] rev 41521
tests: use unimported modules in test-demandimport.py
contextlib isn't a good module to test because it is likely already
imported by code above. Let's use modules that shouldn't have been
imported. And let's verify that with asserts.
Differential Revision: https://phab.mercurial-scm.org/D5797
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Feb 2019 16:47:29 -0800] rev 41520
py3: conditionalize test-demandimport.py for Python 3
The Python 3 lazy importer uses the LazyLoader that is part of
importlib.
On Python 3 and later, LazyLoader is implemented using a custom module
type that defines a __getattribute__ which triggers module loading.
Furthermore, there are additional differences as well. For example,
it appears that Python 3 will return an existing sys.modules
entry instead of constructing a new module object.
This commit adds additional test coverage for lazy importing
behavior to cover the differences between Python 2 and 3. This
reveals that the test and some lazy import functionality is kinda
busted. For example, the test assumes "contextlib" will be lazy.
But in reality an import before it has already imported contextlib!
There's definitely room to improve the behavior of the demand
importer code, both for Python 2 and 3. But at least the test
passes on Python 3 now.
Differential Revision: https://phab.mercurial-scm.org/D5796
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Feb 2019 12:09:05 -0800] rev 41519
py3: replace print() with assert in test-demandimport.py
Behavior of demand imports behaves differently between Python 2 and 3.
.out files do not support conditional output the way that .t files do.
In order to make this test work on Python 3, we'll need to make the
test itself conditional.
The first step of this is to port the test to not use a .out file
to compare output.
Unfortunately, we can't easily use the unittest framework for
defining this test because putting import statements in functions
changes the behavior of the demand importer (at least on Python 2).
So, we effectively replace a bunch of print() with assert statements.
This makes the test a bit annoying to debug, as the test will
stop at first assertion failure. But we don't exactly have
a good alternative.
Differential Revision: https://phab.mercurial-scm.org/D5795
Pulkit Goyal <pulkit@yandex-team.ru> [Sat, 02 Feb 2019 04:49:42 +0530] rev 41518
py3: pass str into grp.getgrnam
grp.getgrnam expects str on Python 3.
This fixes test-acl.t on Python 3.
Differential Revision: https://phab.mercurial-scm.org/D5794
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 30 Jan 2019 03:50:31 +0530] rev 41517
montone: fix addition to list by using .append() instead of '+'
Differential Revision: https://phab.mercurial-scm.org/D5739
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 17:04:26 -0500] rev 41516
tests: give up and make setsockopt() calls optional in the output
I can't figure out what causes these calls to happen or not, and I
weary of dealing with them. End the madness for now by marking them
all as optional lines of output.
Differential Revision: https://phab.mercurial-scm.org/D5762
Augie Fackler <augie@google.com> [Thu, 31 Jan 2019 11:12:59 -0500] rev 41515
py3: fix test-remotefilelog-repack.t
This is uglier, but more obviously correct in my opinion. I guess
Python 3 doesn't hang on to the exception as long, which seems
reasonable.
Differential Revision: https://phab.mercurial-scm.org/D5781
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 19:43:43 -0500] rev 41514
tests: alter email `From` line to a value that's consistently parsed
Python2:
>>> email.header.decode_header('=?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hertzog@debian.org>')
[('Rapha\xc3\xabl Hertzog', 'utf-8'), ('<hertzog@debian.org>', None)]
Python3:
>>> email.header.decode_header('=?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hertzog@debian.org>')
[(b'Rapha\xc3\xabl Hertzog', 'utf-8'), (b' <hertzog@debian.org>', None)]
So alter the input to an input that parses to the same result
consistently. After skimming the relevant RFC (1342), I'm not sure if
what we had was valid, or how I could modify it to be more consistent.
Differential Revision: https://phab.mercurial-scm.org/D5769
Martin von Zweigbergk <martinvonz@google.com> [Thu, 31 Jan 2019 16:51:52 -0800] rev 41513
diff: drop duplicate filter of copies by destination
I'm pretty sure we don't need to filter copies by destination, at
least since the previous patch.
Differential Revision: https://phab.mercurial-scm.org/D5790
Martin von Zweigbergk <martinvonz@google.com> [Thu, 31 Jan 2019 16:32:54 -0800] rev 41512
diff: use match.intersectmatchers()
Differential Revision: https://phab.mercurial-scm.org/D5789
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Feb 2019 09:13:39 -0800] rev 41511
tests: convert ParseError arguments to str on Python 3
Arguments internally are bytes. Printing the exception on Python 3
will include b'' prefixes. This test file uses a .out file, which
doesn't support conditional output. The easiest way to get this to
pass on Python 3 is to normalize the exception before printing so
there are no b'' prefixes.
Differential Revision: https://phab.mercurial-scm.org/D5793
Matt Harbison <matt_harbison@yahoo.com> [Thu, 31 Jan 2019 22:01:09 -0500] rev 41510
tests: quote $PYTHON for py3 support on Windows
Matt Harbison <matt_harbison@yahoo.com> [Thu, 31 Jan 2019 21:54:38 -0500] rev 41509
py3: byteify the --retest path of run-tests.py
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 19:18:20 -0500] rev 41508
subrepo: clean up lingering bytes/str issues in svn support
Path encoding is a little suspect in here, but it's not worse than it
was when we were on Python 2 only.
Subversion subrepo tests now pass in Python 3.
Differential Revision: https://phab.mercurial-scm.org/D5774
Martin von Zweigbergk <martinvonz@google.com> [Wed, 30 Jan 2019 16:14:39 -0800] rev 41507
tweakdefaults: set ui.relative-paths instead of command.status.relative
Differential Revision: https://phab.mercurial-scm.org/D5775
Martin von Zweigbergk <martinvonz@google.com> [Tue, 29 Jan 2019 15:37:35 -0800] rev 41506
status: introduce higher-level ui.relative-paths
The existing commands.status.relative trumps the new config. We need
to keep the existing config around for compatibility. However, I don't
think we need to introduce similar command-specific options for other
commands when they learn to respec ui.relative-paths.
Differential Revision: https://phab.mercurial-scm.org/D5746
Martin von Zweigbergk <martinvonz@google.com> [Tue, 29 Jan 2019 15:37:14 -0800] rev 41505
status: extract helper for producing relative or absolute path for UI
I put the helper in scmutil so it can be used by most modules. I would
have put it in utils.pathutil, but I think that's supposed to be
unaware of repos.
Differential Revision: https://phab.mercurial-scm.org/D5745
Navaneeth Suresh <navaneeths1998@gmail.com> [Thu, 31 Jan 2019 18:17:02 +0530] rev 41504
tags: avoid generating commit for an already deleted tag (issue5752)
`$ hg tag --remove <tagname>` will keep on generating commits
regardless of checking whether the tag is deleted or not. I added a
a fix for `global` tags by aborting if `nullid` is already mapped
to the tag that is to be deleted.
Differential Revision: https://phab.mercurial-scm.org/D5780
Boris Feld <boris.feld@octobus.net> [Fri, 21 Dec 2018 17:10:07 +0100] rev 41503
watchman: detect nested mercurial repositories and abort
Disable fsmonitor on nested mercurial repositories. Only depth one
repositories are detected at the moment.
Differential Revision: https://phab.mercurial-scm.org/D5587
Boris Feld <boris.feld@octobus.net> [Fri, 21 Dec 2018 17:12:31 +0100] rev 41502
watchman: add verbose config knob
This new config knob allows to silent watchman log and warning messages when
watchman is unavailable.
Differential Revision: https://phab.mercurial-scm.org/D5586
Ludovic Chabant <ludovic@chabant.com> [Tue, 29 Jan 2019 22:59:15 -0800] rev 41501
extdiff: add --per-file and --confirm options
The new options lets the user control how the external program is run.
By default, Mercurial passes the 2 snapshot directories as usual, but
it can also run the program repeatedly on each file's snapshot pair,
and optionally prompt the user each time.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 30 Jan 2019 19:20:31 -0500] rev 41500
run-tests: sort the skip, failure and error lists in the final output
This will help keep the lists consistent, for comparison across runs.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 17:07:58 -0800] rev 41499
tests: add Python 3 output for test-remotefilelog-gc.t
Python 3 raises a slightly different error on invalid paths.
Differential Revision: https://phab.mercurial-scm.org/D5773
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 17:22:07 -0800] rev 41498
hg: raise Abort on invalid path
Currently, some os.path functions when opening repositories may
raise an uncaught TypeError or ValueError if the path is invalid.
Let's catch these exceptions and turn them into an Abort for
convenience.
Differential Revision: https://phab.mercurial-scm.org/D5772
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 19:29:32 -0500] rev 41497
subrepo: bytes/str cleanups on Git support
Git subrepo tests now pass on Python 3.
Differential Revision: https://phab.mercurial-scm.org/D5768
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 16:54:34 -0800] rev 41496
tests: compare against a bytes in test-lock.py
skip-blame: just b'' prefixes
Differential Revision: https://phab.mercurial-scm.org/D5771
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 16:53:12 -0800] rev 41495
tests: perform a shallow copy instead of a deep copy
Python 3 can't perform a deep copy because it looks like symbols
in the locals() namespace are not deep-copyable. For the curious,
somehow the deepcopy() is attempting to copy objects attached to
the unittest.* functions for the running test!
We don't use deepcopy() anywhere in the code base and a shallow
object copy should be sufficient to test lock copying.
Actually, I'm not sure why we even test this, as I couldn't find
copy.copy() being used for lock copying either. Who knows.
Differential Revision: https://phab.mercurial-scm.org/D5770
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 18:49:17 -0500] rev 41494
tests: make and use a new `svnurlof.py` helper for constructing svn urls
The previous trick of a Python oneliner and some subshells is too hard
to make portable, and this lets us consolidate some Windows-specific
logic down to a single place.
Differential Revision: https://phab.mercurial-scm.org/D5766
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 17:24:57 -0500] rev 41493
server: skip logging of ECONNRESET
I believe this was exposed by 5492dc20, because the sending of the 500
would have already failed and prevented this logging. On Python 3,
this will be a ConnectionResetError, which is a subtype of OSError,
which is why we check for both OSError and socket.error.
Bonus: this fixes a race in test-hgweb.t where sometimes the
ECONNRESET wouldn't happen, because now we just don't log those
errors.
Differential Revision: https://phab.mercurial-scm.org/D5764
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 18:32:11 -0500] rev 41492
git: a little pycompat.bytestring() love to make this code work in py3
Differential Revision: https://phab.mercurial-scm.org/D5765
Augie Fackler <augie@google.com> [Thu, 24 Jan 2019 16:07:32 -0500] rev 41491
py3: have test-revset2.t write test scripts in a more portable way
Fixes the test on Python 3.
Differential Revision: https://phab.mercurial-scm.org/D5763
Augie Fackler <augie@google.com> [Wed, 30 Jan 2019 16:43:52 -0500] rev 41490
py3: fix up test-remotefilelog-cacheprocess.t to not depend on a repr
It looks like the repr() of Exceptions is different from Python 2 to
Python 3.7 (but not 3.5?), but the str() is still stable. Sigh.
Differential Revision: https://phab.mercurial-scm.org/D5761
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:36:51 -0800] rev 41489
remotefilelog: cast division result to an int
Otherwise mid is a float and this confuses __slice__ on Python 3.
Differential Revision: https://phab.mercurial-scm.org/D5760
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:34:47 -0800] rev 41488
tests: cast division result to int
Otherwise it is a float on Python 3 and code later compares about
casting a float to an int.
Differential Revision: https://phab.mercurial-scm.org/D5759
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:30:01 -0800] rev 41487
tests: various Python 3 ports for test-remotefilelog-datapack.py
Use bytes I/O. Use byteschr(). Convert temporary path to bytes.
Differential Revision: https://phab.mercurial-scm.org/D5758
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:22:42 -0800] rev 41486
tests: use items() in test-remotefilelog-datapack.py
Performance doesn't matter in tests. iteritems() doesn't exist
in Python 3.
Differential Revision: https://phab.mercurial-scm.org/D5757
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:21:43 -0800] rev 41485
tests: use bytes and %d formatting in test-remotefilelog-datapack.py
There were numerous failures on Python 3 due to str/bytes mismatch
and '%s' not working for ints.
Differential Revision: https://phab.mercurial-scm.org/D5756
Boris Feld <boris.feld@octobus.net> [Mon, 28 Jan 2019 03:41:33 -0500] rev 41484
perf: add a --[no-]clear-caches option to `perfnodemap`
The option is useful to look at pure lookup performance on a warm data
structure.
Boris Feld <boris.feld@octobus.net> [Fri, 25 Jan 2019 18:55:45 -0500] rev 41483
perf: add a perfnodemap command
The command focus on timing of the nodemap object itself.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:07:20 -0800] rev 41482
wireprotov1server: use binascii.unhexlify
The "hex" codec doesn't exist in Python 3. We could use
`codecs.decode(h, 'hex_codec')`. But `binascii.unhexlify()`
exists and should work the same on Python 2 and 3.
Differential Revision: https://phab.mercurial-scm.org/D5755
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 12:55:44 -0800] rev 41481
tests: conditionalize test-http-bad-server.t for Python 3.5
It appears that Python 3 introduced output buffering in the HTTP
response stack. And Python 3.6 switched from sock.makefile().write()
to sock.sendall().
So, we need to conditionalize test-http-bad-server.t to account
for the difference in behavior between Python 3.5 and 3.6.
Differential Revision: https://phab.mercurial-scm.org/D5754
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 12:12:25 -0800] rev 41480
tests: log sendall() operations and port test-http-bad-server.t
Python 3's HTTP server layer buffers output and uses sendall()
instead of write(). In order to make test-http-bad-server.t pass
on Python 3, we needed to teach our socket proxy to log sendall()
events and to abort future sends if we reached our send limit.
The tests using `tail` were difficult to port with inline output
conditionals since the number of lines varied. So we now use
`#if py3` for these tests.
test-http-bad-server.t now passes on Python 3.6 and 3.7 on at
least Linux. However, it does not yet pass on Python 3.5 because
of low-level differences to how the HTTP server is implemented.
Differential Revision: https://phab.mercurial-scm.org/D5753
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 29 Jan 2019 14:06:46 -0800] rev 41479
tests: glob away readline(-1)
Most of these are readline(65537) on Python 3. I don't think it is
worth the readability hit to use (re), as it would require escaping
parenthesis.
Differential Revision: https://phab.mercurial-scm.org/D5752
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 13:08:59 -0800] rev 41478
tests: change how sockets are closed
Python 3 uses a different type to represent a socket file object
than Python 2. We need to conditionalize how the socket is closed
accordingly.
While we're here, we switch to use socket.shutdown() to close the
socket. This is because socket.close() may not actually close
the socket until it is GCd. socket.shutdown() forces an immediate
shutdown.
I suspect Python 3 changed semantic behavior here, as I can't get
test-http-bad-server.t to work with socket.close(). socket.shutdown()
does appear to work, however.
Differential Revision: https://phab.mercurial-scm.org/D5751
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 09:52:16 -0800] rev 41477
tests: add b'' prefixes to badserverext.py
This avoids a handful of failures due to missing str and bytes.
# skip-blame: just a bunch of b'' prefixes
Differential Revision: https://phab.mercurial-scm.org/D5750
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 30 Jan 2019 11:44:34 -0800] rev 41476
hgweb: log error before attempting I/O
Previously, an uncaught exception during HTTP request serving would
attempt to send an error response then log the exception.
If an exception occurred during I/O, this exception would be
raised and the original exception wouldn't be logged.
This commit changes behavior so the original exception is logged
first, before we attempt to do anything else. This ensures the
exception is logged.
This change resulted in new tracebacks appearing in various tests.
Because tracebacks can vary between Python versions, we added a
simple script to filter the stack part of traceback lines. This
makes testing much simpler, as we don't need to glob over lines
and make lines conditional.
Differential Revision: https://phab.mercurial-scm.org/D5749
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 29 Jan 2019 11:51:19 -0800] rev 41475
tests: write commit message using file I/O
Python 2.7 will print() \x94\x5c\x0a whereas Python 3 will
print() \xc2\x94\x5c\x0a. Why, I'm not sure. It probably has to
do with print() being Unicode aware on Python 3 and Python
attempting some kind of encoding before emitting the output.
This difference results in a different bytes making it to the
commit message and the JSON output varying. We work around
this by writing bytes to a commit message file.
Differential Revision: https://phab.mercurial-scm.org/D5741
Kyle Lippincott <spectral@google.com> [Mon, 28 Jan 2019 18:00:14 -0800] rev 41474
patch: handle 0 context lines (diff.unified=0) when parsing patches
Previously, if there were no context lines, we would just keep updating the
ranges and the hunk, but not actually storing the hunk (just overwriting it each
time). Thus a diff like this:
$ hg diff --config diff.unified=0
diff --git a/bar b/bar
--- a/bar
+++ b/bar
@@ -1,0 +2,1 @@ 1
+change1
@@ -3,0 +5,1 @@ 3
+change2
would come out of the parser like this (change1 is lost):
bar:
@@ -3,0 +5,1 @@ 3
+change2
This had some really weird side effects for things like commit --interactive,
split, etc.
Differential Revision: https://phab.mercurial-scm.org/D5743
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 30 Jan 2019 03:56:35 +0530] rev 41473
py3: pass str into RuntimeError() to prevent b'' in output
# skip-blame as just r'' prefixes
Differential Revision: https://phab.mercurial-scm.org/D5740
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 30 Jan 2019 03:49:56 +0530] rev 41472
py3: use '%d' instead of '%s' for integers
Differential Revision: https://phab.mercurial-scm.org/D5738
Augie Fackler <augie@google.com> [Tue, 29 Jan 2019 13:26:18 -0500] rev 41471
tests: port test-hgweb-auth.py to Python 3
Differential Revision: https://phab.mercurial-scm.org/D5736
Augie Fackler <augie@google.com> [Tue, 29 Jan 2019 13:25:21 -0500] rev 41470
url: convert some variables back to bytes
Differential Revision: https://phab.mercurial-scm.org/D5735
Augie Fackler <augie@google.com> [Tue, 29 Jan 2019 13:24:20 -0500] rev 41469
url: add some defensive asserts on expected incoming types
Our type handling is a nightmare here, and we're loading passwords to
do network IO, so we can afford to be potentially-slow but pedantic
here.
Differential Revision: https://phab.mercurial-scm.org/D5734
Pulkit Goyal <pulkit@yandex-team.ru> [Tue, 29 Jan 2019 16:03:52 +0300] rev 41468
changegroup: don't try to build changelog chunks if not required
When we extend a narrow clone without ellipsis, we don't download changelog
information because that's already present with the client. However we still try
to build that chunk stream. Building that chunk stream involves calling a lookup
function and store.emitrevisions() API. The lookup function is called len(cl)
number of times.
On large repositories, where len(cl) is in millions, calling that lookup
function is not a good idea. Also it's not required to use the
store.emitrevisons() API because we already have nodes present which we can use.
This patch short-circuits state building logic if we are processing a
non-ellipsis case and changelog is not required.
This saves up ~20 seconds on our internal repo for a single extend call.
Differential Revision: https://phab.mercurial-scm.org/D5733
Pulkit Goyal <pulkit@yandex-team.ru> [Tue, 29 Jan 2019 15:43:02 +0300] rev 41467
changegroup: initialize the state variable a bit earlier
This will make the next patch much easier.
Differential Revision: https://phab.mercurial-scm.org/D5732
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 26 Jan 2019 11:23:31 -0800] rev 41466
tests: conditionalize test output on Python 3.7
Python 3.7 changed behavior of urllib.parse.quote() from RFC 2396
to RFC 3986 and ~ is now in the set of reserved characters and
isn't escaped.
We conditioanlize test output accordingly.
Differential Revision: https://phab.mercurial-scm.org/D5717
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 13 Oct 2018 16:53:43 +0200] rev 41465
hghave: add pyXY features for Python version numbers
This will allow us to sniff for Python >= versions in tests.
Differential Revision: https://phab.mercurial-scm.org/D5088
Pulkit Goyal <pulkit@yandex-team.ru> [Tue, 29 Jan 2019 14:30:10 +0300] rev 41464
py3: whitelist couple more passing tests found by buildbot
Differential Revision: https://phab.mercurial-scm.org/D5731
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 26 Jan 2019 13:52:39 -0800] rev 41463
keepalive: implement _close_conn() so closes are known
Keepalives were not working on Python 3 because
http.client.HTTPResponse was refactored to call _close_conn()
instead of close(). Our custom close() is what returns inactive
connections to the available state.
We better support Python 3 by implementing a _close_conn().
Differential Revision: https://phab.mercurial-scm.org/D5720
Matt Harbison <matt_harbison@yahoo.com> [Mon, 28 Jan 2019 21:35:06 -0500] rev 41462
lfs: explicitly add the Content-Length header when uploading blobs, for py3
This was the reason for test-lfs-test-server.t#git-server complaining about an
"invalid byte in chunk length". For some reason if this isn't explicitly added,
py3.7.1 is adding `transfer-encoding: chunked` as well as `Content-length: x`.
Wireshark flagged this as malformed. However, if this is set, it doesn't bother
with `transfer-encoding`.
Before this patch with py3:
PUT /objects/31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b HTTP/1.1
Accept-Encoding: identity
Content-length: 12
accept: application/vnd.git-lfs
content-type: application/octet-stream
host: localhost:20062
transfer-encoding: chunked
user-agent: git-lfs/2.3.4 (Mercurial 4.9rc0+149-7eb7637e34bf)
Before this patch with py27:
PUT /objects/31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b HTTP/1.1
Accept-Encoding: identity
accept: application/vnd.git-lfs
content-type: application/octet-stream
content-length: 12
host: localhost:20062
user-agent: git-lfs/2.3.4 (Mercurial 4.9rc0+149-7eb7637e34bf+20190128)
With this patch and py3, the content is the same as the py27 example. RFC2616
says to ignore `Content-Length` if `Transfer-Encoding` is present, so maybe
there's nothing to do in the hg-server side (though I'm not sure which it is
using if presented both).
Maybe chunked encoding is better to do? If someone knows how to suppress the
`Content-Length`, we can try that instead.
Boris Feld <boris.feld@octobus.net> [Mon, 28 Jan 2019 03:20:31 -0500] rev 41461
perf: support looking up multiple revisions
The nodemap code has optimisations around the number of lookup we actually made.
As a result, being able to specify multiple revisions to look up is important
when measuring performances. One can now specify full revspecs with the --rev
arguments.
Boris Feld <boris.feld@octobus.net> [Fri, 25 Jan 2019 18:43:48 -0500] rev 41460
perf: add a no-lookup variant to perfindex
It is useful to check how long it takes to create a index object without doing
anything with it. We add a new flag dedicated to that.
Boris Feld <boris.feld@octobus.net> [Mon, 28 Jan 2019 04:47:40 -0500] rev 41459
perf: add some documentation to perfindex
It seems useful to document how the arguments can affect the benchmark.
Boris Feld <boris.feld@octobus.net> [Fri, 25 Jan 2019 14:53:19 -0500] rev 41458
perf: move cache clearing in the `setup` step of `perfheads`
The cache clearing is pretty fast, but this seems more "correct".
Boris Feld <boris.feld@octobus.net> [Fri, 25 Jan 2019 18:22:02 -0500] rev 41457
revlog: document cext oddities in terms of object/caches
This clarify why we just call clearcaches on a single object.
Boris Feld <boris.feld@octobus.net> [Fri, 25 Jan 2019 14:52:31 -0500] rev 41456
perf: document perfheads
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 22:32:09 -0500] rev 41455
py3: stabilize the output of lfs commandserver tests
The print() statements were being output at the very end, so write to the same
stdout sink as runcommand, and explicitly flush.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 20:58:18 -0500] rev 41454
py3: conditionalize some LFS test output
I'm not sure why the one stackframe is py2 only, but that seems harmless. The
remaining failure is LfsCorruptionError printing the fully qualified name, as
well as b'' around its message.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 20:50:52 -0500] rev 41453
lfs: strip the response headers from the Batch API before printing
For reasons unknown, py3 is adding an extra '\n' before the headers print out.
This makes the output the same as py2.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 18:34:17 -0500] rev 41452
py3: force hgweb.server error log to internally write unicode
Otherwise, there's a lot of py2/py3 divergence in the LFS tests because of the
"HG error" lines picking up a b'' prefix. wsgicgi.py uses procutil.stderr, so I
assume the input was meant to be bytes.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 17:48:15 -0500] rev 41451
py3: byteify the decoded JSON responses upon receipt in the LFS blobstore
It got too confusing juggling r'' vs b'' across several functions.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 18:05:17 -0500] rev 41450
hgweb: ensure Content-Length and Content-Type are not promoted to HTTP_ on py3
In stabilizing test-lfs-serve-access.t for py3, the server started asserting on
blob upload:
Environment should not have the key: HTTP_CONTENT_LENGTH (use CONTENT_LENGTH instead)
It could be avoided by explicitly setting the Content-Length header on the
client side. I didn't go back to py2, but printing the original header here in
py37 revealed 'Content-length' when sent to the error log.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 15:42:55 -0500] rev 41449
py3: raw stringify various JSON and HTTP headers in the LFS blobstore module
This is (almost?) entirely from Augie's work. I'm a bit surprised that the JSON
data is being encoded with ASCII via `pycompat.bytesurl()`- I would have thought
UTF-8.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 15:19:28 -0500] rev 41448
py3: byteify the LFS blobstore module
This is almost entirely b'' prefixing, with a couple of exceptions forced to
bytes. Much of this is also borrowed from Augie's code. There's an
HTTPError.read() that I flagged that I assume needs to be converted to bytes,
but I can't find confirmation.
Handling the deserialized JSON object over several functions made r'' vs b''
accesses confusing, so this assumes that the JSON object will be converted to
bytes immediately. That will be done in the following commits, so it's not
buried in these trivial changes.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 00:50:39 -0500] rev 41447
py3: raw stringify various things in the LFS server module
Some of this is based on code written by Augie. I'm slightly unsure if these
are the correct pycompat bytes <-> str conversion methods.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 00:36:56 -0500] rev 41446
py3: add b'' prefixes to the LFS server module
There are a ton of these changes in the blobstore, as well as r'' prefixing. So
separating these out hopefully makes review easier.
# skip-blame for b'' prefixing
Matt Harbison <matt_harbison@yahoo.com> [Sun, 27 Jan 2019 00:26:17 -0500] rev 41445
py3: add b'' and r'' prefixes to LFS tests
Augie Fackler <augie@google.com> [Sun, 27 Jan 2019 20:22:07 -0500] rev 41444
py3: more tests from the ratchet
Differential Revision: https://phab.mercurial-scm.org/D5730