Граф коммитов

188 Коммитов

Автор SHA1 Сообщение Дата
Andrew Halberstadt d3ccaac56c Bug 1473498 - Fix Python 3 environment variables with subprocess r=glandium
On Windows in Python 2, the subprocess module requires the use of bytes with
the 'env' argument. For that reason, we would sometimes use byte strings with
'os.environ' like so:

    os.environ[b"FOO"] = b"bar"

However, this is a failure with Python 3 as 'os.environ' must only be used with
the text type. This patch creates a new 'setenv' helper that ensures we create
new environment with 'bytes' on Python 2, and 'text' on Python 3.

Differential Revision: https://phabricator.services.mozilla.com/D38237

--HG--
extra : moz-landing-system : lando
2019-07-30 21:35:53 +00:00
Edwin Gao a1cc4534a7 Bug 1519369 - support 'debugger' parser argument for mach test command r=ahal,gbrown
Differential Revision: https://phabricator.services.mozilla.com/D39229

--HG--
extra : moz-landing-system : lando
2019-07-26 15:18:18 +00:00
Andrew Halberstadt 4e06e1101d Bug 1473498 - [mach] Fix Python 3 decorator compatibility r=firefox-build-system-reviewers,chmanchester
Differential Revision: https://phabricator.services.mozilla.com/D36104

--HG--
extra : moz-landing-system : lando
2019-07-16 20:42:34 +00:00
Justin Wood 4b233fe605 Bug 1559975 - Make python/mach lint with 'py2' and 'py3' r=catlee
Depends on D36096

Differential Revision: https://phabricator.services.mozilla.com/D36099

--HG--
extra : moz-landing-system : lando
2019-07-05 14:24:58 +00:00
Andrew Halberstadt 1a58163ed7 Bug 1473498 - [mach] Enable test_logger with Python 3 r=firefox-build-system-reviewers,chmanchester
Depends on D36101

Differential Revision: https://phabricator.services.mozilla.com/D36102

--HG--
extra : moz-landing-system : lando
2019-07-02 20:59:46 +00:00
Andrew Halberstadt 3f6339271d Bug 1473498 - [mach] Enable test_config with Python 3 r=firefox-build-system-reviewers,chmanchester
Depends on D36100

Differential Revision: https://phabricator.services.mozilla.com/D36101

--HG--
extra : moz-landing-system : lando
2019-07-02 20:59:03 +00:00
Andrew Halberstadt 975f664521 Bug 1473498 - [mach] Enable test_entry_points with Python 3 r=firefox-build-system-reviewers,chmanchester
Differential Revision: https://phabricator.services.mozilla.com/D36100

--HG--
extra : moz-landing-system : lando
2019-07-02 20:58:14 +00:00
Andrew Halberstadt 3824b084b6 Bug 1473498 - [mach] Enable test_dispatcher with python 3 r=firefox-build-system-reviewers,chmanchester
This test is working with minimal effort. Let's get it running to prevent
future regressions.

Differential Revision: https://phabricator.services.mozilla.com/D36098

--HG--
extra : moz-landing-system : lando
2019-07-02 21:27:35 +00:00
Andrew Halberstadt 6f363de429 Bug 1473498 - [mach] Pull tests out of make check r=firefox-build-system-reviewers,mshal
Differential Revision: https://phabricator.services.mozilla.com/D36097

--HG--
extra : moz-landing-system : lando
2019-07-02 20:40:39 +00:00
Nick Alexander aaeaaec3dc Bug 1521996 - Part 1: Add `conditional_name` to mach @Command definition. r=ahal
We want `mach run` for Android to be wildly different than `mach run`
for Desktop.  But right now, mach really doesn't support two different
implementations of the same underlying named command.  The avenues
that might support different implementations, mostly run through
`conditions`.

`conditions` were added to mach commands in Bug 901972, and never
really anticipated this use case: commands are keyed by name condition
evaluation is delayed until dispatch-time.  In order to have different
commands with the same name, and have full support for `--help`,
command matching, suggestions, etc, we really need conditions to
evaluate at parse-time.  Indeed, since Bug 901972 landed, we've moved
context creation earlier in the dispatch flow and hacked in things
that look like parse-time conditions (see Bug 1291335 and Bug
1305695).

This approach is not the prettiest, but it handles this narrow
use-case -- making `mach run` and `mach install` different on Android
-- without much code churn.

Differential Revision: https://phabricator.services.mozilla.com/D18290

--HG--
extra : moz-landing-system : lando
2019-05-17 21:39:31 +00:00
Manish Goregaokar 409a85d649 Bug 1549636: use uuid4() in mach; r=glandium
Differential Revision: https://phabricator.services.mozilla.com/D30147

--HG--
extra : moz-landing-system : lando
2019-05-07 02:34:53 +00:00
Bobby Holley cb0e71a251 Bug 1543246 - Suggest |./mach busted| when something breaks. r=froydnj
Depends on D26818

Differential Revision: https://phabricator.services.mozilla.com/D26930

--HG--
extra : moz-landing-system : lando
2019-04-10 16:40:14 +00:00
Chris Manchester 5c005e476e Bug 1526072 - Record cpu utilization and clobber/full builds in build telemetry. r=nalexander
Differential Revision: https://phabricator.services.mozilla.com/D22630

--HG--
extra : moz-landing-system : lando
2019-03-27 22:42:48 +00:00
Noemi Erli 6269026d4e Backed out 4 changesets (bug 1526072) for causing build bustages in test_clobber.py CLOSED TREE
Backed out changeset d3d56eca307f (bug 1526072)
Backed out changeset 37942b0f911b (bug 1526072)
Backed out changeset a0eb0f43c928 (bug 1526072)
Backed out changeset c1d1576431d7 (bug 1526072)
2019-03-27 22:51:22 +02:00
Chris Manchester 68be120a7f Bug 1526072 - Record cpu utilization and clobber/full builds in build telemetry. r=nalexander
Differential Revision: https://phabricator.services.mozilla.com/D22630

--HG--
extra : moz-landing-system : lando
2019-03-18 20:36:54 +00:00
Andrew Halberstadt 68820fd64b Bug 1513951 - [mach] Fix error handling bug in config.py r=gbrown
Differential Revision: https://phabricator.services.mozilla.com/D21430

--HG--
extra : moz-landing-system : lando
2019-02-28 18:03:47 +00:00
Andrew Halberstadt 80bdd47243 Bug 1518572 - [mach] Stuff the 'handler' instance into the context when applicable r=firefox-build-system-reviewers,mshal
For mach commands that have 'pass_context=True', we should implicitly add the
handler instance to the context. This will give mach command implementations an
easy way to access things like the command/subcommand names, the parser, argv
list, etc.

Differential Revision: https://phabricator.services.mozilla.com/D20521

--HG--
extra : moz-landing-system : lando
2019-02-25 16:19:05 +00:00
Andrew Halberstadt 24b0aff27c Bug 1520006 - [mach] Fix bug in 'mach completion', r=nalexander
This fixes an issue from bug 1518586.

It stemmed from the fact that I misunderstood how the 'parser' attribute
was being used in mach commands and didn't do enough testing. This patch
fixes things such that we check that 'parser' is not None, as well as
add the completion targets from 'handler.arguments'.

Differential Revision: https://phabricator.services.mozilla.com/D16501

--HG--
extra : moz-landing-system : lando
2019-01-14 21:20:55 +00:00
Andrew Halberstadt 292cda01c7 Bug 1519968 - [mach] Minor improvements to autocomplete docs, r=jmaher
Differential Revision: https://phabricator.services.mozilla.com/D16495

--HG--
extra : moz-landing-system : lando
2019-01-14 19:43:53 +00:00
Andrew Halberstadt 8905ad4bab Bug 1518586 - [mach] Implement bash completion for subcommands and arguments r=nalexander
Since we're calling into a mach command for the current completion
implementation anyway (and incurring python startup penalties), we
might as well move all the bash logic into the mach command.

The new 'mach-completion' command was created in case there are
scripts relying on the current behaviour of 'mach-commands'.

Depends on D16254

Differential Revision: https://phabricator.services.mozilla.com/D16255

--HG--
extra : moz-landing-system : lando
2019-01-11 15:28:49 +00:00
Andrew Halberstadt 1d78259cdb Bug 1518586 - [mach] Add some basic usage docs r=nalexander
I was looking for a good place to put documentation for enabling the
bash completion script when I realized that the 'mach' documentation
is targeted at tool developers rather than users.

Seeing as this is the main 'mach' documentation and we want to make
'firefox-source-docs' the place to go for contribution information,
we should endeavour to target end users with this documentation.

This adds a very basic usage page which should be expanded upon, but
is better than nothing.

I changed the headers in 'index.rst' to use raw:: html so that they
don't show up in the nav bar to the left (and subsequently block the
*actually important* things from appearing).

Differential Revision: https://phabricator.services.mozilla.com/D16254

--HG--
extra : moz-landing-system : lando
2019-01-11 03:34:30 +00:00
Ted Mielczarek 70af650a9f bug 1517909 - format build telemetry time correctly when seconds has no fractional component. r=nalexander
It turns out that Python's `datetime.isoformat` method will leave off the
fractional component of seconds if it would be all zeroes, but the voluptuous
`Datetime` validator wants it to be present, so it's possible to hit an error
if you run mach at exactly an integer second.

This patch switches from `isoformat` to `strftime` with an explicit format
string instead.

Differential Revision: https://phabricator.services.mozilla.com/D15981

--HG--
extra : moz-landing-system : lando
2019-01-08 21:29:26 +00:00
Ted Mielczarek fc2a640d8f bug 1517712 - log mach output when test_telemetry.py fails. r=sheehan
Differential Revision: https://phabricator.services.mozilla.com/D15716

--HG--
extra : moz-landing-system : lando
2019-01-08 15:14:51 +00:00
Ted Mielczarek 7f6bbcf435 bug 1517811 - use mozdebug in mach to validate debugger arguments. r=froydnj
Differential Revision: https://phabricator.services.mozilla.com/D15847

--HG--
extra : moz-landing-system : lando
2019-01-08 16:10:36 +00:00
Ted Mielczarek 5def08dbfb bug 1517244 - Try to log more info during intermittent test_telemetry failure. r=sheehan
Differential Revision: https://phabricator.services.mozilla.com/D15578

--HG--
extra : moz-landing-system : lando
2019-01-02 16:56:12 +00:00
Connor Sheehan 1e603661c4 Bug 1506759: remove `try-except` block which swallows `OSError` r=ted
We have a few bugs filed as intermittent failures all relating
to an `AssertionError` on the return value of this block, which
seems to have a relevant value when `OSError` is thrown. Removing
this will not fix the problem but will at least let us see the
true cause of the failure for debugging and stabilization.

Differential Revision: https://phabricator.services.mozilla.com/D11884

--HG--
extra : moz-landing-system : lando
2018-11-14 16:33:22 +00:00
Ted Mielczarek 54b3bbd1ce bug 1505205 - don't write telemetry for recursive mach command invocations. r=firefox-build-system-reviewers,chmanchester
This change tries to ensure that we don't write telemetry data for mach
commands invoked recursively as part of other mach commands. The intent of
build system telemetry is to only collect data about commands that users are
invoking directly.

There are two ways that we found mach commands can be recursively invoked:
* By running a python subprocess to recursively invoke mach (used in
  `mach bootstrap` to call `mach artifact toolchain`)
* By using `Registrar.dispatch` to delegate to a sub-command (used by many
  build system commands to invoke `mach build`).

The subprocess case is handled here by having mach set a `MACH_MAIN_PID`
environment variable whose value is the current process' pid on startup if it
does not already exist in the environment. Telemetry code then checks that the
value of that variable matches the current pid and skips writing telemetry data
if not.

The dispatch case is handled by making `MachRegistrar` store the current depth
of the command stack and pass it to the `post_dispatch_handler` which will skip
writing telemetry data if depth != 1.

Additionally the `should_skip_dispatch` function in mach_bootstrap is renamed
to `should_skip_telemetry_submission`, which was its original intent. The
combination of checks added in this change should be sufficient for deciding
when to write telemetry data, and we were not collecting telemetry for the set
of mach commands in that function (which included `mach bootstrap`).

In order to facilitate writing a test for the dispatch case this change adds a
`mach python --exec-file` option to execute Python code directly in the context
of the `mach python` command.

Differential Revision: https://phabricator.services.mozilla.com/D11207

--HG--
extra : moz-landing-system : lando
2018-11-10 19:04:30 +00:00
Ted Mielczarek e85df1cdc8 bug 1505325 - fix build telemetry path filtering when cwd is outside of topsrcdir/objdir. r=firefox-build-system-reviewers,chmanchester
The build telemetry code attempts to filter paths to avoid PII from usernames
and other things. It does this by converting every commandline argument to
an absolute path and then making them relative to topsrcdir or topobjdir and
omitting any that fail. This meant that running a mach command with a cwd
outside of the topsrcdir or objdir would omit all arguments since they were
converted to absolute paths from the cwd.

This change fixes this by adding the cwd to the list of paths used to create
relative paths. Additionally we add the user's home directory to that list
to try to avoid usernames sneaking through. Finally, instead of simply
removing these path prefixes, we replace them with sigils: $topsrcdir,
$objdir, $HOME.

Differential Revision: https://phabricator.services.mozilla.com/D11174

--HG--
extra : moz-landing-system : lando
2018-11-10 19:14:44 +00:00
Ted Mielczarek 8e018fdef0 bug 1505325 - add a basic test for build telemetry. r=firefox-build-system-reviewers,chmanchester
This change adds python/mach/mach/test/test_telemetry.py which contains
a simple test that running mach with the build telemetry setting enabled
causes us to write a telemetry file. The test fixture in the file should
make it easy to write additional tests.

A necessary precursor to make the tests work was to change mach_bootstrap's
`should_skip_dispatch` function, which would refuse to write telemetry data
if stdout was not a terminal (which it isn't in the tests) and also in
automation. The latter test is moved to ensure that we don't *submit*
telemetry data from automation, but we can still write it to disk. Machines
in automation should never have the telemetry setting enabled outside of
these tests anyway, so this should not change anything in practice.

Differential Revision: https://phabricator.services.mozilla.com/D11172

--HG--
extra : moz-landing-system : lando
2018-11-10 19:04:05 +00:00
Edwin Gao 9ffeff17f0 Bug 1504550 - error running ./mach wpt --debugger rr --headless --no-manifest-update r=gbrown
Changes:
- under a specific code path such as:
`./mach <test_type> --debugger`
there exists now additional checks for IndexError when attempting to parse the debugger program name.
- print a nicer error message if user failed to properly specify the debugger program name.
- raise exit code of 1 if IndexError is raised.

Others:
- code comments updated to better reflect/describe what the section does.

Differential Revision: https://phabricator.services.mozilla.com/D10987

--HG--
extra : moz-landing-system : lando
2018-11-07 12:47:34 +00:00
Chris Manchester 9b3b733a84 Bug 1497638 - Gather telemetry for mach commands other than build. r=ted,firefox-build-system-reviewers,nalexander
Differential Revision: https://phabricator.services.mozilla.com/D10177

--HG--
extra : moz-landing-system : lando
2018-10-31 20:03:56 +00:00
Edwin Gao 4c107f8236 Bug 1291335 - Check mozconfig for --disable-tests when running mach test commands r=gbrown
Behavior changes:

- instead of reading the mozconfig file, it now instantiates an instance of the build object.
- safe checking methods are used to access attributes to prevent errors on automation environment.
- better mach command parsing is performed with handler category instead of error-prone argv parsing.


Other changes:

- docstring for testing/xpcshell/runxpcshelltests.py::buildTestList() added and modernized.
- added clause that if length of tests gathered is 0, mach exits with an error code of 1.

Differential Revision: https://phabricator.services.mozilla.com/D7133

--HG--
extra : moz-landing-system : lando
2018-10-03 15:40:48 +00:00
Jay Kamat 245ac54f65 Bug 1493345 Fix improper usage of blessings.tigetstr r=ted,firefox-build-system-reviewers
blessings.tigetstr is not part of its API. It happens to work because
blessings imports curses using 'from curses import tigetstr'.

Instead, we can just use terminal.normal, which contains the string we were
going to get anyway.

See https://github.com/erikrose/blessings/pull/138 for more information.

Let me know if there's a better way of resolving this. Hopefully with this +
the patch I submitted to blessings (https://github.com/erikrose/blessings/pull/137)
firefox will build fine with TERM improperly set.

Differential Revision: https://phabricator.services.mozilla.com/D5377

--HG--
extra : moz-landing-system : lando
2018-10-02 18:36:30 +00:00
Edwin Gao d7986ad99a Bug 1305695 - ./mach test --debugger=<debugger> doesn't fail if <debugger> isn't available r=gbrown
- added checkers in python/mach/mach/main.py prior to calling registrar.py.
- added internal function to check if specified debugger is installed.
- support both ./mach test <test_name> and ./mach <test_category> styles.

Differential Revision: https://phabricator.services.mozilla.com/D7234

--HG--
extra : moz-landing-system : lando
2018-10-01 22:06:54 +00:00
shindli 6ba91671cb Backed out changeset 05df95ba3a98 (bug 1305695) for ES lint failures CLOSED TREE 2018-10-02 00:00:23 +03:00
Edwin Gao 63180f5b60 Bug 1305695 - ./mach test --debugger=<debugger> doesn't fail if <debugger> isn't available r=gbrown
- added checkers in python/mach/mach/main.py prior to calling registrar.py.
- added internal function to check if specified debugger is installed.
- support both ./mach test <test_name> and ./mach <test_category> styles.

Differential Revision: https://phabricator.services.mozilla.com/D7234

--HG--
extra : moz-landing-system : lando
2018-10-01 18:03:06 +00:00
Ted Mielczarek 3028fb8bdb bug 1237610 - don't call post_dispatch_handler when using debug-command. r=gps
MozReview-Commit-ID: 4UG6RH4b6tZ

Differential Revision: https://phabricator.services.mozilla.com/D4596

--HG--
extra : rebase_source : a06ef350840b059b2ef9eaea8010085e41d5dd50
2018-05-16 12:56:39 -04:00
Chris Manchester 7edeeaa646 Bug 1475058 - Send SIGINT when interrupting interactive in mach before sending SIGKILL. r=mshal
MozReview-Commit-ID: 2XxLyNi1ZuS

--HG--
extra : rebase_source : d91eed728446219da6be78e310b1a12b597a0d99
2018-07-12 11:50:48 -07:00
Andrew Halberstadt 9435736ade Bug 1471620 - Skip python-tests locally that don't run with python 3 in CI r=davehunt
This will make sure that when running |mach python-test --python 3| locally,
we only run the tests that also run in CI with python 3 (and therefore pass
presumably).

MozReview-Commit-ID: 3OBr9yLSlSq

--HG--
extra : rebase_source : 456340d0ecdddf1078f2b5b4ebb1eddf3813b26a
2018-06-27 11:10:02 -04:00
Dave Hunt c65268bd7a Bug 1388013 - Support running |mach python-test| against Python 3 using pipenv; r=ahal
This patch allows executing |mach python-test| against Python 3 by specifying the optional |--three| command line option. When this option is present, pipenv will be used to manage a virtual environment using Python 3 and attempt to run the tests. When it is not present, pipenv will not be used, and everything will work as it did before this patch.

My original plan was to use pipenv regardless of the target version of Python, however I encountered several issues running some of the tests against our Python packages. Once all tests have been patched to run against Python 3, then we should be able to use pipenv when running them against Python 2.

Note that this patch allows tests to run against Python 3, but there are plenty of issues preventing them from passing. With this patch in place we can start to add Python 3 support to our packages and have the tests running in CI to ensure we don't regress back to just supporting Python 2.

MozReview-Commit-ID: BuU5gZK83hL


IHG: changed taskcluster/ci/source-test/python.yml

--HG--
extra : rebase_source : ca2b15d905f7a5c895a2fd8916144841f5d205de
2018-05-03 10:34:22 +01:00
Andreea Pavel dd5cd1d832 Backed out 3 changesets (bug 1388013) for build bustages e.g. ../python/mozbuild/mozpack/test/test_files.py on a CLOSED TREE
Backed out changeset eea857170a41 (bug 1388013)
Backed out changeset c55bfefbd4e1 (bug 1388013)
Backed out changeset 3a163da2b21b (bug 1388013)
2018-05-31 11:48:19 +03:00
Dave Hunt 18568a8c94 Bug 1388013 - Support running |mach python-test| against Python 3 using pipenv; r=ahal
This patch allows executing |mach python-test| against Python 3 by specifying the optional |--three| command line option. When this option is present, pipenv will be used to manage a virtual environment using Python 3 and attempt to run the tests. When it is not present, pipenv will not be used, and everything will work as it did before this patch.

My original plan was to use pipenv regardless of the target version of Python, however I encountered several issues running some of the tests against our Python packages. Once all tests have been patched to run against Python 3, then we should be able to use pipenv when running them against Python 2.

Note that this patch allows tests to run against Python 3, but there are plenty of issues preventing them from passing. With this patch in place we can start to add Python 3 support to our packages and have the tests running in CI to ensure we don't regress back to just supporting Python 2.

MozReview-Commit-ID: BuU5gZK83hL


IHG: changed taskcluster/ci/source-test/python.yml

--HG--
extra : rebase_source : e1a64c0ffa8fe5cce71a041579601d4a72e37779
2018-05-03 10:34:22 +01:00
Chris Manchester 3722bcaf82 Bug 1453426 - Kill invoked process on keyboard interrupt in mach build. r=mshal
MozReview-Commit-ID: IdnVrK6Gqtk

--HG--
extra : rebase_source : 2599a6c236b2c624d74f399ff3b5af3e7a574dc8
2018-04-17 15:30:27 -07:00
David Major 9b78fd3f22 Bug 1447750 - Point MACH_ERROR's URL at the new Bugzilla component r=nalexander 2018-03-21 11:09:00 +02:00
Tarek Ziadé 0081c14e07 Bug 1401879 - sort mach-commands output - r=gps
MozReview-Commit-ID: KgocEmTy4wR

--HG--
extra : rebase_source : 211c03cd533abd1325f6e671523fdd7b5ee8b824
2018-03-21 20:27:42 +01:00
Andrew Halberstadt f354075c7a Bug 1434430 - [flake8] Fix blank 'except' statements r=rwood
This is a new issue that gets linted with flake8 3.5.0. Basically you should
never use a blank except: statement.

This will catch all exceptions, including KeyboardInterrupt and SystemExit
(which is likely not intended). If a catch all is needed, use
`except: Exception`.  If you *really* mean to also catch KeyboardInterrupt et
al, use `except: BaseException`.

Of course, being specific is often better than a catch all.

MozReview-Commit-ID: FKx80MLO4RN

--HG--
extra : rebase_source : 7c74a7d0d81f2c984b47aff3a0ee3448b791177b
2018-01-31 14:32:08 -05:00
Gregory Szorc b3b7dfcfef Bug 1415614 - Add an API to log all structured messages; r=mshal
Currently, marking a logger as a structured logger will require a
subsequent function call in order for the logger to be hooked up
to active handlers. This behavior is not intuitive and makes it
easy to not have handlers for newly-registered loggers. This means
messages may not be logged anywhere.

In addition, we have to manually specify which named loggers to
enable structured logging for. This can be annoying.

We change the behavior of register_structured_logger() to
automatically add existing terminal and json handlers to the
logger being marked as structured.

We also introduce an API to enable structured logging for all
loggers. Existing consumers of registered_structured_logger()
in mozbuild have been updated to use this API. A new consumer
has been added for the `mach configure` command because it should
have been there before.

We stop short of making enable_all_structured_loggers() the default.
This is because various commands interact with the log manager in
ways that will result in duplicate logging of messages and
dropping of structured messages. There is a bit of a rabbit hole
here and addressing it can be done as a follow-up.

MozReview-Commit-ID: 1aU6eJvTSMP

--HG--
extra : rebase_source : 2a0a569b378cc3083b55fc7076b291abdfb7453f
2017-11-09 15:09:52 -08:00
Gregory Szorc 6c9c35a19d Bug 1415614 - Don't assign mach logger to instance variable; r=nalexander
We don't use this attribute outside of this function. Besides, you can
easily obtain a handle on the logger by calling
``logging.getLogger('mach')``.

MozReview-Commit-ID: 41vdn6McowW

--HG--
extra : rebase_source : dca383e5f5b770fa3adb09d753897633258302a1
2017-11-08 14:28:19 -08:00
Steve Armand d11ffd18db Bug 1399989 - Add python/mach to flake8 linter. r=gps
MozReview-Commit-ID: KKnBgYFwpfT

--HG--
extra : rebase_source : 4e4b3453a91970366dba0073853ad3ab62738c81
2017-09-17 22:41:17 -04:00
Andrew Halberstadt d3806e8077 Bug 1289444 - Forward extra arguments in |mach test| to the underlying test commands, r=chmanchester
MozReview-Commit-ID: 631K2n0wB1a

--HG--
extra : rebase_source : d5aa8c59e16e811915ff24100fd1fe7a49604304
2017-08-29 16:20:47 -04:00