Matt Mackall <mpm@selenic.com> [Mon, 11 Jul 2016 08:54:13 -0500] rev 29501
merge with stable
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 06 Jul 2016 21:16:00 -0700] rev 29500
sslutil: try to find CA certficates in well-known locations
Many Linux distros and other Nixen have CA certificates in well-defined
locations. Rather than potentially fail to load any CA certificates at
all (which will always result in a certificate verification failure),
we scan for paths to known CA certificate files and load one if seen.
Because a proper Mercurial install will have the path to the CA
certificate file defined at install time, we print a warning that
the install isn't proper and provide a URL with instructions to
correct things.
We only perform path-based fallback on Pythons that don't know
how to call into OpenSSL to load the default verify locations. This
is because we trust that Python/OpenSSL is properly configured
and knows better than Mercurial. So this new code effectively only
runs on Python <2.7.9 (technically Pythons without the modern ssl
module).
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 06 Jul 2016 20:46:05 -0700] rev 29499
sslutil: issue warning when unable to load certificates on OS X
Previously, failure to load system certificates on OS X would lead
to a certificate verify failure and that's it. We now print a warning
message with a URL that will contain information on how to configure
certificates on OS X.
As the inline comment states, there is room to improve here. I think
we could try harder to detect Homebrew and MacPorts installed
certificate files, for example. It's worth noting that Homebrew's
openssl package uses `security find-certificate -a -p` during package
installation to export the system keychain root CAs to
etc/openssl/cert.pem. This is something we could consider adding
to setup.py. We could also encourage packagers to do this. For now,
I'd just like to get this warning (which matches Windows behavior)
landed. We should have time to improve things before release.
skarlage <skarlage@fb.com> [Thu, 30 Jun 2016 08:38:19 -0700] rev 29498
revert: don't backup if no files reverted in interactive mode (issue4793)
When reverting interactively, we always backup files before prompting the user
to find out if they actually want to revert them. This can create spurious
*.orig files if a user enters an interactive revert session and then doesn't
revert any files. Instead, we should only backup files that are actually being
touched.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 05 Jul 2016 07:25:51 +0900] rev 29497
perf: define command annotation locally for Mercurial earlier than 3.1
Before this patch, using cmdutil.command() for "@command" annotation
prevents perf.py from being loaded by Mercurial earlier than 1.9 (or
2daa5179e73f), because cmdutil.command() isn't available in such
Mercurial, even though there are some code paths for Mercurial earlier
than 1.9.
For example, setting "_prereadsize" attribute in perfindex() and
perfnodelookup() is effective only with hg earlier than 1.8 (or
61c9bc3da402).
In addition to it, "norepo" option of command annotation has been
available since 3.1 (or 75a96326cecb), and this is another blocker for
loading perf.py with earlier Mercurial.
============ ============ ======
command of
hg version cmdutil norepo
============ ============ ======
3.1 or later o o
1.9 or later o x
earlier x x
============ ============ ======
This patch defines "command()" for annotation locally as below:
- define wrapper of existing cmdutil.command(), if cmdutil.command()
doesn't support "norepo"
(for Mercurial earlier than 3.1)
- define full command() locally with minimum function, if
cmdutil.command() isn't available at runtime
(for Mercurial earlier than 1.9)
This patch also defines parsealiases() locally without examining
whether it is available or not, because it is small enough to define
locally.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 05 Jul 2016 07:25:51 +0900] rev 29496
perf: avoid using formatteropts for Mercurial earlier than 3.2
Before this patch, referring commands.formatteropts prevents perf.py
from being loaded by Mercurial earlier than 3.2 (or 7a7eed5176a4),
because it isn't available in such Mercurial, even though formatting
itself has been available since 2.2 (or ae5f92e154d3).
In addition to it, there are some code paths for Mercurial earlier
than 3.2. For example, setting "_prereadsize" attribute in perfindex()
and perfnodelookup() is effective only with hg earlier than 1.8 (or
61c9bc3da402).
This patch uses empty option list as formatteropts, if it isn't
available in commands module at runtime.
Disabling -T/--template option for earlier Mercurial should be
reasonable, because:
- since 427e80a18ef8, -T/--template for formatter has been available
- since 7a7eed5176a4, commands.formatteropts has been available
- the latter revision is direct child of the former
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 05 Jul 2016 07:25:51 +0900] rev 29495
perf: use locally defined revlog option list for Mercurial earlier than 3.7
Before this patch, referring commands.debugrevlogopts prevents perf.py
from being loaded by Mercurial earlier than 3.7 (or 5606f7d0d063),
because it isn't available in such Mercurial, even though
cmdutil.openrevlog(), a user of these options, has been available
since 1.9 (or a79fea6b3e77).
In addition to it, there are some code paths for Mercurial earlier
than 3.7. For example, setting "_prereadsize" attribute in perfindex()
and perfnodelookup() is effective only with hg earlier than 1.8 (or
61c9bc3da402).
But just "using locally defined revlog option list" might cause
unexpected behavior at runtime. If --dir option is specified to
cmdutil.openrevlog() of Mercurial earlier than 3.5 (or 49c583ca48c4),
it is silently ignored without any warning or so.
============ ============ ===== ===============
debugrevlogopts
hg version openrevlog() --dir of commands
============ ============ ===== ===============
3.7 or later o o o
3.5 or later o o x
1.9 or later o x x
earlier x x x
============ ============ ===== ===============
Therefore, this patch does:
- use locally defined option list, if commands.debugrevlogopts isn't
available (for Mercurial earlier than 3.7)
- wrap cmdutil.openrevlog(), if it is ambiguous whether
cmdutil.openrevlog() can recognize --dir option correctly
(for Mercurial earlier than 3.5)
This wrapper function aborts execution, if:
- --dir option is specified, and
- localrepository doesn't have "dirlog" attribute, which indicates
that localrepository has a function for '--dir'
BTW, extensions.wrapfunction() has been available since 1.1 (or
0ab5f21c390b), and this seems old enough for "historical
portability" of perf.py, which has been available since 1.1 (or
eb240755386d).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 05 Jul 2016 07:25:51 +0900] rev 29494
perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
Before this patch, using util.safehasattr() prevents perf.py from
being loaded by Mercurial earlier than 1.9.3 (or 94b200a11cf7),
because util.safehasattr() isn't available in such Mercurial, even
though there are some code paths for Mercurial earlier than 1.9.3.
For example, setting "_prereadsize" attribute in perfindex() and
perfnodelookup() is effective only with Mercurial earlier than 1.8 (or
61c9bc3da402).
This patch is a preparation for using util.safehasattr() safely in
subsequent patches.
This patch defines util.safehasattr() forcibly without examining
whether it is available or not, because:
- examining existence of "safehasattr" safely itself needs similar logic
- safehasattr() is small enough to define locally
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 05 Jul 2016 07:25:51 +0900] rev 29493
perf: add historical portability policy for future reference
Anton Shestakov <av6@dwimlabs.net> [Sat, 09 Jul 2016 14:01:55 +0800] rev 29492
tests: check ETag format in test-hgweb-commands
Anton Shestakov <av6@dwimlabs.net> [Sat, 09 Jul 2016 03:26:24 +0800] rev 29491
hgweb: emit a valid, weak ETag
Previously, ETag headers from hgweb weren't correctly formed, because rfc2616
(section 14, header definitions) requires double quotes around the content of
the header. str(web.mtime) didn't do that.
Additionally, strong ETags signify that the resource representations are
byte-for-byte identical. That is, they can be reconstructed from byte ranges if
client so wishes. Considering ETags for all hgweb pages is just mtime of
00changelog.i and doesn't consider of e.g. .hg/hgrc with description, contact
and other fields, it's clearly shouldn't be strong. The W/ prefix marks it as
weak, which still allows caching the whole served file/page, but doesn't allow
byte-range requests.
Maciej Fijalkowski <fijall@gmail.com> [Tue, 07 Jun 2016 15:35:58 +0200] rev 29490
policy: add cffi policy for PyPy
This adds cffi policy in the case where we don't want to use C modules,
but instead we're happy to rely on cffi (bundled with pypy)
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Jul 2016 10:04:11 -0700] rev 29489
sslutil: handle default CA certificate loading on Windows
See the inline comment for what's going on here.
There is magic built into the "ssl" module that ships with modern
CPython that knows how to load the system CA certificates on
Windows. Since we're not shipping a CA bundle with Mercurial,
if we're running on legacy CPython there's nothing we can do
to load CAs on Windows, so it makes sense to print a warning.
I don't anticipate many people will see this warning because
the official (presumed popular) Mercurial distributions on
Windows bundle Python and should be distributing a modern Python
capable of loading system CA certs.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 30 Jun 2016 19:54:12 -0700] rev 29488
sslutil: expand _defaultcacerts docstring to note calling assumptions
We should document this so future message additions don't seem out
of place.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Jul 2016 10:00:56 -0700] rev 29487
sslutil: document the Apple OpenSSL cert trick
This is sort of documented in _plainapplypython()'s docstring. But
it helps to be explicit in security code.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 04 Jul 2016 09:58:45 -0700] rev 29486
sslutil: use certificates provided by certifi if available
The "certifi" Python package provides a distribution of the
Mozilla trusted CA certificates as a Python package. If it is
present, we assume the user intends it to be used and we use
it to provide the default CA certificates when certificates
are otherwise not configured.
It's worth noting that this behavior roughly matches the popular
"requests" package, which also attempts to use "certifi" if
present.
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 03 Jul 2016 22:28:24 +0530] rev 29485
py3: make files use absolute_import and print_function
This patch includes addition of absolute_import and print_function to the
files where they are missing. The modern importing conventions are also followed.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Jul 2016 19:17:45 -0700] rev 29484
sslutil: don't attempt to find default CA certs file when told not to
Before, devel.disableloaddefaultcerts only impacted the loading of
default certs via SSLContext. After this patch, the config option also
prevents sslutil._defaultcacerts() from being called.
This config option is meant to be used by tests to force no CA certs
to be loaded. Future patches will enable _defaultcacerts() to have
success more often. Without this change we can't reliably test the
failure to load CA certs. (This patch also likely fixes test failures
on some OS X configurations.)
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Jul 2016 19:04:39 -0700] rev 29483
sslutil: pass ui to _defaultcacerts
We'll use this shortly.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Jul 2016 18:03:51 -0700] rev 29482
sslutil: change comment and logged message for found ca cert file
Future patches will change _defaultcacerts() to do something
on platforms that aren't OS X. Change the comment and logged
message to reflect the future.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 01 Jul 2016 19:27:34 -0700] rev 29481
tests: better testing of loaded certificates
Tests were failing on systems like RHEL 7 where loading the system
certificates results in CA certs being reported to Python. We add
a feature that detects when we're able to load *and detect* the
loading of system certificates. We update the tests to cover the
3 scenarios:
1) system CAs are loadable and detected
2) system CAs are loadable but not detected
3) system CAs aren't loadable
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 17:42:55 +0200] rev 29480
update: teach hg to override untracked dir with a tracked file on update
This is a fix to an old problem when Mercurial got confused by an
untracked folder with the same name as one of the files in a commit
hg was trying to update to. It is pretty safe to remove this folder if
it is empty. Backing up an empty folder seems to go against Mercurial's
"don't track dirs" philosophy.
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29479
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29478
rebase: move rebase finish logic to be a method of the RR class
Rebase finish logic includes collapsing working directorystate into
a single commit, moving bookmarks, clearing status and collapsemsg files,
reporting skipped commits to the user and obsoleting precursors of the
newly created commits.
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29477
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29476
rebase: move local variable 'extrafn' to the RR class
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29475
rebase: move local variable 'currentbookmarks' to the RR class
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29474
rebase: make collapsing use explicit logic to decide on the rev to reuse
This code:
for rev in sortedstate:
...
...
newnode = concludenode(repo, rev, p1, rbsrt.external,
commitmsg=commitmsg,
extrafn=extrafn, editor=editor,
keepbranches=rbsrt.keepbranchesf,
date=rbsrt.date)
uses 'rev' variable in 'concludenode' function invocation. It is not
explicitly assigned before, but its value comes as last value or 'rev' in
a for loop, e.g. last element in a 'sortedstate'. IMO this a bad style and it
also makes it hard to refactor the function, so it is better to explicitly
define the value passed to 'concludenode'.
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29473
rebase: move new rebase preparation to be a method of the RR class
This commit moves logic that prepares the execution of a new rebase
operation to be a method of the rebaseruntime class.
Kostia Balytskyi <ikostia@fb.com> [Fri, 01 Jul 2016 14:09:53 +0200] rev 29472
rebase: move abort/continue prep to be a method of the RR class
This commit moves logic that prepares the execution of abort and
continue phases or rebase operation to be a method of the rebaseruntime
class.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 30 Jun 2016 18:59:53 -0700] rev 29471
hgweb: expose list of per-repo labels to templates
hgweb currently offers limited functionality for "classifying"
repositories. This patch aims to change that.
The web.labels config option list is introduced. Its values
are exposed to the "index" and "summary" templates. Custom
templates can use template features like ifcontains() to e.g.
look for the presence of a specific label and engage specific
behavior. For example, a site operator may wish to assign a
"defunct" label to a repository so the repository is prominently
marked as dead in repository indexes.
Sean Farley <sean@farley.io> [Tue, 21 Jun 2016 14:58:49 -0700] rev 29470
histedit: move autoverb rule to the commit it matches
Inspired by how 'git rebase -i' works, we move the autoverb to the
commit line summary that it matches. We do this by iterating over all
rules and inserting each non-autoverb line into a key in an ordered
dictionary. If we find an autoverb line later, we then search for the
matching key and append it to the list (which is the value of each key
in the dictionary). If we can't find a previous line to move to, then we
leave the rule in the same spot.
Tests have been updated but the diff looks a little messy because we
need to change one of the summary lines so that it will actually move to
a new spot. On top of that, we added -q flags to future some of the
output and needed to change the file it modified so that it wouldn't
cause a conflict.
Sean Farley <sean@farley.io> [Fri, 27 May 2016 14:03:00 -0700] rev 29469
histedit: use _getsummary in ruleeditor
This patch uses our common method instead of duplicating logic.
Sean Farley <sean@farley.io> [Fri, 27 May 2016 14:02:36 -0700] rev 29468
histedit: use _getsummary in torule
This patch uses our common method instead of duplicating logic.
Sean Farley <sean@farley.io> [Fri, 27 May 2016 14:00:12 -0700] rev 29467
histedit: extract common summary code into method
We're going to need to use this code in our autoverb logic so let's
extract it now and save ourselves from code duplication.
Sean Farley <sean@farley.io> [Thu, 26 May 2016 15:43:00 -0700] rev 29466
histedit: remove unneeded initial parameter
Now that the autoverb logic no longer acts on an individual rule line,
we don't need this parameter since we apply our logic just once at the
time of initialization.
Sean Farley <sean@farley.io> [Thu, 26 May 2016 16:46:10 -0700] rev 29465
histedit: move autoverb logic from torule to ruleeditor
This is needed for an upcoming change that will automatically rearrange the
rules based on the commit message. Before this patch, the autoverb logic only
applied to one rule at a time. This moves that logic one step up so that it can
iterate over all the rules and rearrange as needed.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 30 Jun 2016 13:06:19 -0700] rev 29464
treemanifests: actually strip directory manifests
Stripping has only partly worked since 7cbb3a01fa38 (repair: use cg3
for treemanifests, 2016-01-19): the bundle seems to have been created
correctly, but revlog entries in subdirectory revlogs were not
stripped. This meant that e.g. "hg verify" would fail after stripping
in a tree manifest repo.
To find the revisions to strip, we simply iterate over all directories
in the repo (included in store.datafiles()). This is inefficient for
stripping few commits, but efficient for stripping many commits. To
optimize for stripping few commits, we could instead walk the tree
from the root and find modified subdirectories, just like we do in the
changegroup code. I'm leaving that for another day.
Jun Wu <quark@fb.com> [Thu, 30 Jun 2016 15:26:11 +0100] rev 29463
logtoprocess: do not leak the ui object in uisetup
logtoprocess.log should use "self" passed in function arguments instead
of the "ui" object from outside the function.
Jun Wu <quark@fb.com> [Wed, 29 Jun 2016 23:53:20 +0100] rev 29462
chgserver: document why we don't merge mtimehash and confighash
People may get confused about chg's mtimehash and confighash design: why two
hashes instead of just one. This patch adds text addressing the concern.
Jun Wu <quark@fb.com> [Thu, 30 Jun 2016 10:31:50 +0100] rev 29461
extensions: move uisetup and extsetup to standalone functions
This is to make them wrap-able. chgserver wants to know if an extension
accesses config or environment variables during uisetup and extsetup and
include them in confighash accordingly.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 02 Jul 2016 09:41:40 -0700] rev 29460
sslutil: don't access message attribute in exception (issue5285)
I should have ran the entire test suite on Python 2.6. Since the
hostname matching tests are implemented in Python (not .t tests),
it didn't uncover this warning. I'm not sure why - warnings should
be printed regardless. This is possibly a bug in the test runner.
But that's for another day...
Matt Mackall <mpm@selenic.com> [Fri, 01 Jul 2016 16:02:56 -0500] rev 29459
merge with stable
Anton Shestakov <av6@dwimlabs.net> [Fri, 01 Jul 2016 13:54:35 +0800] rev 29458
hgweb: add absolute urls for archives in json-summary
Anton Shestakov <av6@dwimlabs.net> [Fri, 01 Jul 2016 13:36:59 +0800] rev 29457
tests: allow bz2 archives in test-hgweb-json.t
Only testing a specific type because list items seem to be in arbitrary order.
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 01 Jul 2016 19:17:16 +0530] rev 29456
keepalive: switch from thread to threading module
The thread module in py3 is renamed to _thread, but we can use
the high level threading module instead.
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 28 Jun 2016 16:01:53 +0530] rev 29455
py3: conditionalize httplib import
The httplib library is renamed to http.client in python 3. So the
import is conditionalized and a test is added in check-code to warn
to use util.httplib
Matt Mackall <mpm@selenic.com> [Fri, 01 Jul 2016 15:12:33 -0500] rev 29454
Added signature for changeset 26a5d605b868
Matt Mackall <mpm@selenic.com> [Fri, 01 Jul 2016 15:12:32 -0500] rev 29453
Added tag 3.8.4 for changeset 26a5d605b868
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 26 Jun 2016 19:34:48 -0700] rev 29452
sslutil: synchronize hostname matching logic with CPython
sslutil contains its own hostname matching logic. CPython has code
for the same intent. However, it is only available to Python 2.7.9+
(or distributions that have backported 2.7.9's ssl module
improvements).
This patch effectively imports CPython's hostname matching code
from its ssl.py into sslutil.py. The hostname matching code itself
is pretty similar. However, the DNS name matching code is much more
robust and spec conformant.
As the test changes show, this changes some behavior around
wildcard handling and IDNA matching. The new behavior allows
wildcards in the middle of words (e.g. 'f*.com' matches 'foo.com')
This is spec compliant according to RFC 6125 Section 6.5.3 item 3.
There is one test where the matcher is more strict. Before,
'*.a.com' matched '.a.com'. Now it doesn't match. Strictly speaking
this is a security vulnerability.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 26 Jun 2016 19:16:54 -0700] rev 29451
tests: import CPython's hostname matching tests
CPython has a more comprehensive test suite for it's built-in hostname
matching functionality. This patch adds its tests so we can improve
our hostname matching functionality.
Many of the tests have different results from CPython. These will be
addressed in a subsequent commit.
Wagner Bruna <wbruna@yahoo.com> [Fri, 01 Jul 2016 07:41:37 -0300] rev 29450
i18n-pt_BR: synchronized with dd9175ca81dc
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 29 Jun 2016 19:43:27 -0700] rev 29449
sslutil: emit warning when no CA certificates loaded
If no CA certificates are loaded, that is almost certainly a/the
reason certificate verification fails when connecting to a server.
The modern ssl module in Python 2.7.9+ provides an API to access
the list of loaded CA certificates. This patch emits a warning
on modern Python when certificate verification fails and there are
no loaded CA certificates.
There is no way to detect the number of loaded CA certificates
unless the modern ssl module is present. Hence the differences
in test output depending on whether modern ssl is available.
It's worth noting that a test which specifies a CA file still
renders this warning. That is because the certificate it is loading
is a x509 client certificate and not a CA certificate. This
test could be updated if anyone is so inclined.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 29 Jun 2016 19:49:39 -0700] rev 29448
tests: test case where default ca certs not available
I'm not a fan of TLS tests not testing both branches of a possible
configuration. While we have test coverage of the inability to validate
a cert later in this file, I insist that we add this branch so
our testing of security code is extra comprehensive.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 29 Jun 2016 19:38:24 -0700] rev 29447
sslutil: don't load default certificates when they aren't relevant
Before, we would call SSLContext.load_default_certs() when
certificate verification wasn't being used. Since
SSLContext.verify_mode == ssl.CERT_NONE, this would ideally
no-op. However, there is a slim chance the loading of system
certs could cause a failure. Furthermore, this behavior
interfered with a future patch that aims to provide a more
helpful error message when we're unable to load CAs.
The lack of test fallout is hopefully a sign that our
security code and tests are in a relatively good state.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 29 Jun 2016 19:37:38 -0700] rev 29446
sslutil: display a better error message when CA file loading fails
Before, sslcontext.load_verify_locations() would raise a
ssl.SSLError which would be caught further up the stack and converted
to a urlerror. By that time, we lost track of what actually errored.
Trapping the error here gives users a slightly more actionable error
message.
The behavior between Python <2.7.9 and Python 2.7.9+ differs. This
is because our fake SSLContext class installed on <2.7.9 doesn't
actually do anything during load_verify_locations: it defers actions
until wrap_socket() time. Unfortunately, a number of errors can occur
at wrap_socket() time and we're unable to ascertain what the root
cause is. But that shouldn't stop us from providing better error
messages to people running a modern and secure Python version.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 29 Jun 2016 18:15:28 -0700] rev 29445
tests: add test for empty CA certs file
smf reported that an environment with no loaded CA certs resulted
in a weird error. I'd like to detect this a bit better so we can
display an actionable error message.
The actual error being globbed over in this patch is "unknown error"
with a ssl.c line number. That isn't useful at all.
Maciej Fijalkowski <fijall@gmail.com> [Mon, 06 Jun 2016 13:08:13 +0200] rev 29444
internals: move the bitmanipulation routines into its own file
This is to allow more flexibility with the C sources -- now the
bitmanipulation routines can be safely imported without importing Python.h
Martijn Pieters <mjpieters@fb.com> [Fri, 24 Jun 2016 16:12:05 +0100] rev 29443
journal: new experimental extension
Records bookmark locations and shows you where bookmarks were located in the
past.
This is the first in a planned series of locations to be recorded; a future
patch will add working copy (dirstate) tracking, and remote bookmarks will be
supported as well, so the journal storage format should be fairly generic to
support those use-cases.
Augie Fackler <raf@durin42.com> [Mon, 27 Jun 2016 11:53:50 -0400] rev 29442
httpclient: update to 54868ef054d2 of httpplus
As of that revision, httpplus fully supports Python 3, including
mimicing all the subtle behavior changes around headers in Python 3's
http.client.
Yuya Nishihara <yuya@tcha.org> [Mon, 27 Jun 2016 20:44:14 +0900] rev 29441
revset: check invalid function syntax "func-name"() explicitly
Before the error was caught at func() as an unknown identifier, and the
optimizer failed to detect the syntax error. This patch introduces getsymbol()
helper to ensure that a string is not allowed as a function name.
Yuya Nishihara <yuya@tcha.org> [Tue, 28 Jun 2016 22:39:06 +0900] rev 29440
chg: silence warning of unused parameter 'sig'
Anton Shestakov <av6@dwimlabs.net> [Wed, 29 Jun 2016 22:48:32 +0800] rev 29439
hgweb: reindent atom/changelogentry.tmpl
It was mixing tabs and spaces, and not in a good way.
Indent style of other atom entries seems to be 1 space per level, so let's
apply it here as well.
Anton Shestakov <av6@dwimlabs.net> [Wed, 29 Jun 2016 21:07:59 +0800] rev 29438
hgweb: remove unused/nonexistent filelogentry from atom/map
filelog in atom style uses changelogentry to show commits, and
atom/filelogentry.tmpl doesn't even exist.
Anton Shestakov <av6@dwimlabs.net> [Wed, 29 Jun 2016 20:58:09 +0800] rev 29437
hgweb: remove unnecessary CDATA markup in atom/branchentry.tmpl
Since content is of type "text" (and is already escaped), using a CDATA section
is not required.
Looks like this was just an artifact of copying things from rss style in
add2f9ddcfb5, because other entries in atom style don't use CDATA in such
places.
Anton Shestakov <av6@dwimlabs.net> [Wed, 29 Jun 2016 20:19:04 +0800] rev 29436
hgweb: reindent rss/changelogentry.tmpl
It was mixing tabs and spaces, and not in a good way.
Indent style of other rss entries seems to be 4 spaces per level, so let's
apply it here as well.
Anton Shestakov <av6@dwimlabs.net> [Wed, 29 Jun 2016 19:40:04 +0800] rev 29435
hgweb: remove a couple of superfluous spaces in rss style
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 27 Jun 2016 19:10:30 +0530] rev 29434
py3: add tests in check-code to load modules from util.py
The conditionalize imports are added in util.py and now we import modules from
there. So adding tests so that someone in future can use that.
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 27 Jun 2016 16:48:54 +0530] rev 29433
py3: conditionalize SocketServer import
The SocketServer is renamed to socketserver in python 3
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 27 Jun 2016 16:37:37 +0530] rev 29432
py3: conditionalize xmlrpclib import
The xmlrpclib library is renamed to xmlrpc.client in python 3
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 27 Jun 2016 16:16:10 +0530] rev 29431
py3: conditionalize the urlparse import
The urlparse library is renamed to urllib.parse in python 3
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 27 Jun 2016 15:53:38 +0530] rev 29430
py3: update tests/test-check-py3-compat.t
The lower part of the test runs with python 3 and hence remain unchanged.
Jun Wu <quark@fb.com> [Fri, 24 Jun 2016 15:21:10 +0100] rev 29429
chg: send SIGPIPE to server immediately when pager exits (issue5278)
If the user press 'q' to leave the 'less' pager, it is expected to end the
hg process immediately. We currently rely on SIGPIPE for this behavior. But
SIGPIPE won't arrive if we don't write anything (like doing heavy
computation, reading from network etc). If that happens, the user will feel
that the hg process just hangs.
The patch address the issue by adding a SIGCHLD signal handler and sends
SIGPIPE to the server as soon as the pager exits.
This is also an issue with hg's pager implementation.
Jun Wu <quark@fb.com> [Fri, 24 Jun 2016 17:06:41 +0100] rev 29428
chgserver: do not ignore SIGPIPE if pager is used
We rely on SIGPIPE to exit when the pager exits. And Python ignores SIGPIPE
by default. Explicitly set SIGPIPE handler to SIG_DFL (terminate) just like
pager.py.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 24 Jun 2016 11:12:41 -0700] rev 29427
debug: make debug{revlog,index,data} --dir not just a flag
The directory argument (for tree manifests) should belong to to the
--dir argument. I had mistakenly made --dir a flag. One effect of this
was that I had meant for "-m" to be optional, but instead it changed
the behavior of --dir, so with "hg debugdata -m --dir dir1 0", the -m
took over and the "dir1" got treated as a revision in the root
manifest log.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 24 Jun 2016 11:25:55 -0700] rev 29426
debugdata: disallow trailing option with -c/-m
Before this change, "hg debugdata -c 0 foo" was allowed.
Yuya Nishihara <yuya@tcha.org> [Sun, 26 Jun 2016 17:16:57 +0900] rev 29425
revset: get rid of redundant error checking from match()
Actually there was no additional error checking. It should be caught by
"not all(specs)".
Martijn Pieters <mjpieters@fb.com> [Fri, 24 Jun 2016 10:32:38 +0100] rev 29424
share: move magic string to a constant
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 12 Mar 2016 16:08:19 -0800] rev 29423
branchmap: remove unused exception variable
Henrik Stuart <henriks@unity3d.com> [Mon, 27 Jun 2016 12:11:18 +0200] rev 29422
patch: allow copy information to be passed in
When displaying patches from graphical tools where you can browse through
individual files, with diff being called separately on each, recomputing the
limits of file copy history can become rather expensive on large repositories.
Instead, we can compute it once and pass it in for subsequent calls.
liscju <piotr.listkiewicz@gmail.com> [Thu, 23 Jun 2016 22:37:17 +0200] rev 29421
largefiles: check file in the repo store before checking remotely (issue5257)
Problem was files to check were gathered in the repository where
the verify was launched but verification was done on the remote
store. It was observed when user committed in cloned repository
and ran verify before pushing - committed files were marked
as non existing.
This commit fixes this by checking in the remote store only files
that are not existing in the repository store where verify was launched.
Solution is similiar to fd288d118074
liscju <piotr.listkiewicz@gmail.com> [Mon, 27 Jun 2016 10:33:33 +0200] rev 29420
largefiles: remove additional blank lines
It does not conform to the coding style.
liscju <piotr.listkiewicz@gmail.com> [Fri, 24 Jun 2016 09:08:16 +0200] rev 29419
largefiles: fix misleading comments in lfutil instore and storepath
Problem in both cases is cache in largefiles has assigned
meaning - user cache which is additional place to get/put
files. Those two function works on store - the main place
to store largefiles in the repository - .hg/largefiles and
using "cache" to describe it is misleading.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 19:10:46 -0700] rev 29418
revset: implement match() in terms of matchany()
match() is the special case of a single element list being passed
to matchany() with the additional error checking that the revset
spec is defined. Change the implementation to remove the redundant
code and have match() call matchany().
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 19:12:20 -0700] rev 29417
scmutil: improve documentation of revset APIs
I can never remember the differences between the various revset
APIs. I can never remember that scmutil.revrange() is the one I
want to use from user-facing commands.
Add some documentation to clarify this.
While we're here, the argument name for revrange() is changed to
"specs" because that's what it actually is.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 13:52:46 -0700] rev 29416
mdiff: remove use of __slots__
The use of __slots__ was added way back in 2006 in 4ec58b157265.
__slots__ isn't necessary for this class.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 17:40:53 -0700] rev 29415
i18n: use unicode literal
Other parts of this expression are already using unicode literals.
We need this to make Python 3 happy and to avoid an implicit
conversion in Python 2.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 17:22:06 -0700] rev 29414
pycompat: add HTTPPasswordMgrWithDefaultRealm to Python 3 block
Looks like we missed this in 800ec7c048b0.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 26 Jun 2016 07:59:02 -0700] rev 29413
ui: path option to declare which revisions to push by default
Now that we have a mechanism for declaring path sub-options, we can
start to pile on features!
Many power users have expressed frustration that bare `hg push`
attempts to push all local revisions to the remote. This patch
introduces the "pushrev" path sub-option to control which revisions
are pushed when no "-r" argument is specified.
The value of this sub-option is a revset, naturally.
A future feature addition could potentially introduce a "pushnames"
sub-options that declares the list of names (branches, bookmarks,
topics, etc) to push by default. The entire "what to push by default"
feature should probably be considered before this patch lands.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 18:35:14 -0700] rev 29412
ui: don't fixup [paths] sub-options
As part of developing a subsequent patch I discovered that sub-option
values like "." were getting converted to paths. This is because the
[paths] section is treated specially during config loading.
This patch prevents post-processing sub-options from the [paths]
section.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 07:26:43 -0700] rev 29411
sslutil: abort when unable to verify peer connection (BC)
Previously, when we connected to a server and were unable to verify
its certificate against a trusted certificate authority we would
issue a warning and continue to connect. This is obviously not
great behavior because the x509 certificate model is based upon
trust of specific CAs. Failure to enforce that trust erodes security.
This behavior was defined several years ago when Python did not
support loading the system trusted CA store (Python 2.7.9's
backports of Python 3's improvements to the "ssl" module enabled
this).
This commit changes behavior when connecting to abort if the peer
certificate can't be validated. With an empty/default Mercurial
configuration, the peer certificate can be validated if Python is
able to load the system trusted CA store. Environments able to load
the system trusted CA store include:
* Python 2.7.9+ on most platforms and installations
* Python 2.7 distributions with a modern ssl module (e.g. RHEL7's
patched 2.7.5 package)
* Python shipped on OS X
Environments unable to load the system trusted CA store include:
* Python 2.6
* Python 2.7 on many existing Linux installs (because they don't
ship 2.7.9+ or haven't backported modern ssl module)
* Python 2.7.9+ on some installs where Python is unable to locate
the system CA store (this is hopefully rare)
Users of these Pythongs will need to configure Mercurial to load the
system CA store using web.cacerts. This should ideally be performed
by packagers (by setting web.cacerts in the global/system hgrc file).
Where Mercurial packagers aren't setting this, the linked URL in the
new abort message can contain instructions for users.
In the future, we may want to add more code for finding the system
CA store. For example, many Linux distributions have the CA store
at well-known locations (such as /etc/ssl/certs/ca-certificates.crt
in the case of Ubuntu). This will enable CA loading to "just work"
on more Python configurations and will be best for our users since
they won't have to change anything after upgrading to a Mercurial
with this patch.
We may also want to consider distributing a trusted CA store with
Mercurial. Although we should think long and hard about that because
most systems have a global CA store and Mercurial should almost
certainly use the same store used by everything else on the system.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 25 Jun 2016 07:32:02 -0700] rev 29410
sslutil: remove out of place comment
This comment likely got orphaned as a result of refactoring in this
file. It isn't providing any useful value. So delete it.
liscju <piotr.listkiewicz@gmail.com> [Fri, 24 Jun 2016 11:51:00 +0200] rev 29409
largefiles: remove additional blank line between methods in localstore
According to the coding style it should be a single blank line
between functions.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jun 2016 12:37:09 -0700] rev 29408
revset: make head() honor order of subset
The ordering of 'x & head()' was broken in 6a1a4c212d50 (revset:
improve head revset performance, 2014-03-13). Presumably due to other
optimizations since then, undoing that change to fix the order does
not slow down the simple case of "hg log -r 'head()'" mentioned in
that commit. I see a small slowdown from ~0.16s to about ~0.19s with
'not 0 & head()', but I'd say it's worth it for the correct output.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jun 2016 13:08:10 -0700] rev 29407
revsets: use itervalues() where only values are needed
I don't think there will be a noticeable speedup, but it removes an
unused variable.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jun 2016 12:39:05 -0700] rev 29406
revsets: passing a set to baseset() is not wrong
Since 69c6e9623bdc (revset: force ascending order for baseset
initialized from a set, 2016-04-04), it is safe to pass a revset to a
baseset.