Files
palemoon27/python/mach_commands.py
T
roytam1 9ea51ff217 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1196734 - Support packaged WebExtensions in WebIDE r=ochameau (1b505870be)
- Bug 1142090 - Check existence of mainRoot. r=jryans (f761a86027)
- Bug 1194827 - [promise-dbg] Implement panel startup and destroy r=fitzgen (1da2bf4dd2)
- var-let (46909d8af0)
- Bug 1171919 - Fix intermittent browser_styleeditor_bug_740541_iframes.js by keeping track of windows instead of documents. r=bgrins (62cda75dba)
- Bug 949355 - Wait for iframes to be loaded before looking at their style sheets. r=bgrins (7c7f47d581)
- Bug 1013814 - add inIDOMUtils.getRelativeRuleLine; r=heycam,pbrosset (60153c71f7)
- Bug 1197930 - Add comments for getRuleLine and getRuleColumn. r=heycam (6c65131f95)
- Bug 1157292 - include XBL stylesheets in the inspector's list of stylesheets, r=dholbert,heycam (f3ecad41c2)
- Bug 1187409 - make CssPropertyIsShorthand handle CSS variables r=heycam (6dcba2f01b)
- Bug 1142206 - Let GetSubpropertiesForCSSProperty handle custom property. r=heycam, r=pbrosset (f86eba559a)
- Bug 1201136 - treat "currentColor" as a valid color. r=heycam (f868825389)
- Bug 180118 - Part 5: Add a RestyleHintData outparam to HasAttributeDependentStyle for use with eRestyle_SomeDescendants. r=bzbarsky (fab0ecdf39)
- Bug 979574 - don't let inherited properties override with !important. r=bgrins (cb97a944e7)
- Bug 1195357 - make stringifyProperty escape text for CSS comment; r=pbrosset (a740fe5551)
- Bug 1203520 - We need a DevTools ESLint plugin containing our ruleset r=gps (9cbaf33c74)
- Bug 1206356: Add mfbt/Random.h, implementing the xorshift128+ random number generator. r=waldo (1928e47e21)
- align to TFF (3ef45392b8)
- Bug 1130045 - Hyphenated properties are no more listed in the webconsole suggestions. r=past (8cddd0a3c3)
- Bug 1176653 - Remove wrappedJSObject and WebConsoleUtils.unwrap from values jsterm helper;r=bholley (2ee1fb5a8a)
- Bug 1195869 - Refresh tabs in sidebar mode. r=jryans (4bdefa878a)
- Bug 1188071 - Remove placeholder content when adding a new app to WebIDE project panel. r=jryans (8eb5109e5b)
- Bug 1200682 - Fix CSS for sidebar view. r=jryans (c1ba95aca1)
- Bug 1197946 - Remove dropdown buttons/icons in sidebar mode. r=jryans (a3a66fc42e)
- Bug 1146460 - Fixed ToolboxFullscreenState style. r=jryans (81de395bae)
- Bug 1132670 - Warn when connecting to a server newer than client. r=jryans (3adc2b604f)
- Bug 1198830 - Disable toolboxfullscreen if sidebars are enabled. r=jryans (8206c3aec6)
- Bug 1176908 - Unforget to disable runtime commands in WebIDE. r=jryans (eb682ca339)
- Bug 1203806 - Hide "Open App" menu item. r=jryans (792fbd9118)
- Bug 1142184 - Fix DevTools access check in runtime info. r=ochameau (fd6b8e6d8a)
- Bug 1157893 - Create a toggle for developer mode r=ochameau (a60cf477f6)
- Bug 1114676 - Enable web components for all apps when toggling developer mode r=ochameau (7243a0cbdd)
- Bug 1121896 - Show when animations are running on the compositor in the animation panel. r=pbro (d5cc21b76e)
- Bug 1205046 - Replace devtools panel icons with new ones;r=bgrins (78b37567a7)
- Bug 1188413 - Introduce key shortcut to reload tools r=past (97c749cac1)
- Bug 1211017 - Show URL as the title in worker toolboxes;r=ejpbruel (2cdd35b0cc)
- Bug 1089240 - Add a measurement tool. r=pbrosset (96963ab52d)
- Bug 1122142 - Reword the label for enabling chrome debugging; r=past (715aaf3e8f)
- Bug 1150946 - Relabel Service Workers toolbox option. r=nsm, r=jryans (c5b42a767d)
- Bug 1164284 - Remove profiler options in toolbox settings, and move gecko platform data option to general settings. r=jryans (3f594c803c)
- Bug 1160361 - Move commands-index to the server. r=bgrins (2fedb4b2ba)
- align commandline client (a997a8d0ac)
- Bug 1184192 - Prevent unnecessary hideBoxModel request r=bgrins (2cf0be6029)
- Bug 1134876 - Clicking an in-progress recording snapshot will no longer throw an error. r=vp (58ae692945)
- update paths (636c4bb39d)
- align tests (9cef39cef6)
- align tests (3e07a48a95)
- Bug 1192458, Part 1 - Consolidate push and desktop notification permissions. r=nsm,wchen,MattN (eb17f26c49)
- Bug 1192458, Part 2 - New icon for consolidated notification permission. r=MattN (966b821e6f)
- Bug 1197421 - Fix promise worker proxy cleanup and update callers. r=catalinb (2128787815)
- Bug 1184626 - Add a per-process push message listener. r=smaug (0d65907e78)
- Bug 1188686 - Clear push subscriptions when forgetting about site. r=kitcambridge (ff8d40a053)
- Bug 1188450 - Add an empty EXPORTED_SYMBOLS array to PushServiceChildPreload.jsm; r=nsm (7d2274ddef)
- Bug 1190661 - Send push only to child processes when in e10s mode. r=smaug (bcdc3b4207)
- Bug 1192441: Disable Push service debug logging by default. r=doug (d66aebc97d)
- Bug 1196512 - Use principals to test for push permissions. r=nsm (c41ba7be28)
- Bug 1197998 - Use counters for Push subscribe, unsubscribe and permission query. r=froydnj,kitcambridge,jst (e3bbaddfef)
- Bug 1172502 - Add message encription for WebPush. r=mt r=kitcambridge r=keeler r=smaug (ae571ed395)
- Bug 914481 - Patch 1 - Push usage and permissions telemetry. r=kitcambridge (d3a69bf4f0)
- Bug 914481 - Patch 2 - Track subscribe and unsubscribe success/failure. r=kitcambridge (aa049e0804)
- Bug 914481 - Patch 3 - Subscription and quota expiration times. r=kitcambridge, p=ally (d9dd4a3dcc)
- Bug 914481 - Patch 4 - Track why we fail to deliver notifications to Service Workers. r=kitcambridge (9d8e7f0d38)
- Back out bug 1100863 and bug 1152264 for causing bug 1189729 (5bd65ff786)
- Bug 1185544 - Add data delivery to the WebSocket backend. r=dragana,nsm (2c3242e712)
- Bug 1197421 - Fetch resolver uses PromiseWorkerProxy. r=catalinb (d8611f0bcc)
- leftover of 1192458 (3c97058773)
- Bug 1178533 - Add nsIInstallPackagedWebapp for registering permissions when navigating to signed packages r=bholley,fabrice,valentin (8174625aab)
- Bug 1180118 - Part 7: Split out FindClosestRestyleRoot and allow passing in a pre-computed restyle root to AddPendingRestyle. r=bzbarsky (b783859d8a)
- Bug 1180118 - Part 8: Keep track of the closest restyle root in AddPendingRestylesForDescendantsMatchingSelectors. r=bzbarsky (cf9d1b35b6)
- Bug 1180118 - Part 9: Clear nsCSSSelector pointers in the pending restyle tracker if they might be stale. r=bzbarsky (13faac05f3)
- Bug 1180118 - Part 10: Logging. r=bzbarsky (79f71825ca)
- Bug 1180118 - Part 11: Use ReparentStyleContext even if eRestyle_SomeDescendants is used. r=bzbarsky (9f8e218aac)
- Bug 1187851 patch 1 - Tests for making dynamic changes to filter and perspective change fixed position containing block for descendants. r=roc (82bbd8b750)
- Bug 1187851 patch 2 - Cleanup to prepare for making dynamic changes to filter and perspective change fixed position containing block for descendants. r=roc (9fc38132ac)
- Bug 1187851 patch 3 - Rename nsChangeHint_AddOrRemoveTransform to nsChangeHint_UpdateContainingBlock. r=roc (25e50c5ac5)
- Bug 1187851 patch 5 - Make dynamic changes to perspective change fixed position containing block for descendants. r=roc (df51439c10)
- Bug 1203766 - Part 1: Generate nsPresArena::ObjectIDs with a preprocessor-included file. r=bzbarsky (18e36acbd9)
- Bug 1203766 - Part 2: Add an ArenaRefPtr class that can have its pointer cleared out when an object's owning nsPresArena goes away. r=bzbarsky (ff06cd91e0)
- Bug 1203766 - Part 3: Add ArenaRefPtr support to nsStyleContext. r=bzbarsky (f1b52960f2)
- Bug 1203766 - Part 4: Add a "restyle generation" counter, which increments whenever we process pending restyles. r=bzbarsky (b54d7e5ec9)
- Bug 1203766 - Part 5: Rename nsComputedDOMStyle::mStyleContextHolder to mStyleContext. r=bzbarsky (5fa2d18667)
- Bug 1203766 - Part 6: Cache resolved style contexts on nsComputedDOMStyle to avoid re-resolving if styles haven't changed. r=bzbarsky (de84fc67e7)
- Bug 1203766 - Part 6.1: Clear cached style context on nsComputedDOMStyle when its element is moved. r=bzbarsky (d43394515a)
- Bug 1203766 - Part 7: Test. r=bzbarsky (59c7ea8c81)
- Bug 1203766 - Unified compilation fixes. (61137c44a5)
- Bug 1151829 - Unbreak build on non-SPS platforms after bug 1093934. (e9188d7c56)
- Bug 1202512 - Part 1: Add Element flags to record whether an eRestyle_SomeDescendants restyle is pending for it. r=bzbarsky (7f6dbef338)
- Bug 1197620 - Part 1 - Stop all animations in destroyed frames. r=bbirtles (829b1635db)
- Bug 1197620 - Part 2 tests that animation stop playing when its element is not displayed. r=bbirtles (87597b5125)
- Bug 1190254 - Use same conditions to call ReparentStyleContext in RestyleUndisplayedNodes as in RestyleSelf. r=mats (7e778822b3)
- Bug 1181011 - Don't use cached rule node structs for animations within pseudo-elements. r=dbaron a=abillings (966b351dcd)
- Bug 1180120 - Part 1: Record on style contexts that reset style is explicitly inherited. r=dbaron (50b4f4e76a)
- Bug 1180120 - Part 2: Move style-if-visited as well in nsStyleContext::Move (and assert that its parent is the same as the non-visited-style parent). r=dbaron (fd34448459)
- Bug 1180120 - Part 3: Record on ElementRestyler whether we are at the root of a restyle. r=dbaron (edeb469544)
- Bug 1180120 - Part 4: Add an outparam to CalcStyleDifference to indicate which struct pointers were identical. r=dbaron (1410e5ce05)
- Bug 1180120 - Part 5: Factor out section of ElementRestyler::Restyle that calls AddPendingRestylesForDescendantsMatchingSelectors. r=dbaron (ab5b899c7f)
- Bug 1180120 - Part 6: Replace HasSameCachedStyleData call with samePointerStructs bit tests. r=dbaron (3654cb6db8)
- Bug 1180120 - Part 6.1: Factor out some of RestyleUndisplayedDescendants. r=dbaron (882a535699)
- Bug 1180120 - Part 6.2: Refactor MaybeReframeFor{Before,After}Pseudo. r=dbaron (99ccd305ca)
- Bug 1180120 - Part 7: Add eRestyleResult_StopWithStyleChange. r=dbaron (6626dd8133)
- Bug 1192302 - Part 1: Make MustCheckUndisplayedContent take its frame as an argument. r=bzbarsky (7ae5bcc569)
- Bug 1192302 - Part 2: Traverse the frame tree when processing eRestyle_SomeDescendants. r=bzbarsky (71b325d22e)
- Bug 1206996: Use range-based 'for' syntax to iterate across nsFrameLists in RestyleManager. r=tn (a2c8e0fa73)
- Bug 1163875 - ensure opacity animation in patterns results in redraws r=jwatt (7fd1f5c55a)
- Bug 1180036 - Replace the warning that anonymous nodes should not be in child lists with an assert plus whitelisting of known-OK cases. r=bz (0c9dd01766)
- Bug 1169440 patch 4 - Add comment to nsStylePadding::DifferenceAlwaysHandledForDescendants. r=heycam (2483adc4a0)
- Bug 1169440 patch 5 - Adjust hints in CalcDifference methods to emit new nsChangeHint_ReflowChangesSizeOrPosition hint. r=heycam (b1ad73ab5f)
- Bug 1169440 patch 6 - Add parameter to nsIFrame::FrameNeedsReflow to control handling of target being a reflow root. r=dholbert (c75a63eb67)
- Bug 1169440 patch 7 - Pass parameter determined from style hint to FrameNeedsReflow. r=dholbert (ee02625c5a)
- Bug 1198894: Use nsChangeHint_RepaintFrame instead of NS_STYLE_HINT_VISUAL to trigger simple repaints in nsStyleStruct.cpp CalcDifference methods. r=heycam (770bb3c11c)
- Bug 417178 - "Google reader does not show subscribed topics in ff3b3 at certain zoom levels" [p=roc@ocallahan.org (Robert O'Callahan [roc]) r+sr=dbaron a1.9b5=mconnor] (a9b8541d23)
- Bug 1203472 - [css-grid] Add missing |mIsSubgrid| check. r=simon.sapin@exyr.org (d68050a108)
- Bug 1141919 - Fix incomplete line break suppression in ruby. r=dbaron (087a824358)
- Bug 1157011 - Check line break suppression of BR frame from its parent frame. r=dholbert (5572f7bc56)
- Bug 1134849 - For display:inline elements whose writing mode is orthogonal to their parent's, the computed value should become inline-block. r=dbaron (0df244841c)
- Bug 1196887 - Compare the writing-mode property, not only whether it is horizontal or vertical, when deciding whether to compute display:inline as inline-block. r=dholbert (a0c4500a83)
- Bug 1140198 - display:contents on the root element (but not else-where) should compute to 'block'. r=roc (606663d0c9)
- Bug 1188061 - Pass the style context to nsStylePosition::CalcDifference so that it can take account of writing-mode where necessary. r=dbaron (6728d9d865)
- Bug 1181907 (Part 1) - Make it possible to use nsGenericHashKey with free functions. r=heycam (c304448825)
- Bug 1181907 (Part 2) - Make nsCSSProperty hashable. r=heycam (4fff3bb968)
- Bug 1181907 (Part 3) - Add CSSVariableImageTable and use it to store ImageValues generated by CSS variables. r=heycam (8431589452)
- Bug 1139723 - Turn on expensive style struct assertions for 1136010-1.html, and fix pref name typo. r=dbaron (f20387295b)
- Bug 1151214 part 1 - Remove the optimization to ignore 'align-content' changes for single-line flex containers. It's invalid now that we'll support 'align-content' for other box types (grid). r=dbaron (aa21e1a3a4)
- No bug. Add comment to nsStyleClipPath::ReleaseRef explaining why only one member is nulled out. r=me (NPOTB) (19d5eb5fb1)
- Bug 1202993 - Remove the logical-direction-based keywords for caption-side, and instead interpret the old physical keywords as logical sides. r=dholbert (0f33c4a767)
- Bug 1177149 - Don't force an invalidation for transform origin changes. r=dbaron (8a134525e0)
- Bug 1191855 - Make the intrinsic size of <iframe> remain physical 300x150, regardless of writing mode. r=dholbert (64d897f218)
- Bug 1099557 - Make -moz-control-character-visibility default to 'visible' rather than 'hidden', so that spurious control characters are rendered as hexboxes. r=dbaron (ef6eed92c2)
- align to FF (1d931574ae)
- Bug 1141926 - Check nsCaret visibility when NotifySelectionChanged. r=roc (d23f1422e2)
- Bug 1163135 - Make it safer to start the profiler via signal; r=snorp (a345c59230)
- Bug 1205074 - Enable EHABI stack walking on Android r=BenWa (cdd2d3eff2)
- comment (77b939be05)
- Bug 1157299 - Use HTTPS for mach pastebin. r=gps (8929700c5f)
- Bug 1157299 - Post to pastebin as "Anonymous" instead of "None" by default. r=gps (bffce9944d)
- Bug 1176642 - Defer import of urllib2; r=chmanchester (2055ff43cd)
- Bug 1200293 - mach target for mozregression. r=ahal (dcec1485b4)
- Bug 1186896 - Fix import statements for mach update-uuids. r=gps (4704560598)
- Bug 1165162 - Introduce a helper for converting from origin strings to a principal. rpending=Yoshi (353eea1ef9)
- Bug 1154773 - Change undefined property a.prototype. r=Yoric (8a4dc37d6c)
- Bug 1164290 - Adding symbolic link into test zip file. r=janx (3963f57e75)
- missing bit of Bug 1181646 - Add React as a shared library for devtools. (2ec5360b4f)
- missing comments and bit of Bug 1157293 - Part 3 (f298c7691c)
- Bug 1171256 - Add an API similar to Chrome's webNavigation (r=Mossop) (734dc2f5b3)
- missing bits of Bug 992947 (35a11a820f)
- Bug 1147765 - Fix asynchronous initialization of Style Editor. r=ejpbruel (47ea2936ae)
- Bug 1156767 - Report error message and continue loading other stylesheets even when a stylesheet fails; r=bgrins (7bf6916670)
- Bug 1148893 - Replace .then handlers with yields to catch 'Unknown sheet source' rejections in Style Editor onShow task. r=ejpbruel (83fc10af05)
- Bug 1148893 - Return the style sheet selection promise to the caller. r=ejpbruel (fa19557d61)
- fix path (475d4d8aea)
- Bug 1187914 - Part 2: Fix the display of the "Add New Rule" and "Copy" menu item in the rule and computed view r=bgrins (b12bcf3127)
- align tests (4401c436bc)
- strangely missing bit (d4ead9b89c)
- comments (6e0a2c1c32)
- Bug 1164564 - Implement a WorkerDebuggerTransport;=jlong (3783d1e61f)
2022-07-22 08:52:41 +08:00

319 lines
12 KiB
Python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import absolute_import, print_function, unicode_literals
import argparse
import logging
import mozpack.path as mozpath
import os
import platform
import subprocess
import sys
import which
from mozbuild.base import (
MachCommandBase,
)
from mach.decorators import (
CommandArgument,
CommandProvider,
Command,
)
ESLINT_NOT_FOUND_MESSAGE = '''
Could not find eslint! We looked at the --binary option, at the ESLINT
environment variable, and then at your path. Install eslint and needed plugins
with
mach eslint --setup
and try again.
'''.strip()
NODE_NOT_FOUND_MESSAGE = '''
nodejs is either not installed or is installed to a non-standard path.
Please install nodejs from https://nodejs.org and try again.
Valid installation paths:
'''.strip()
NPM_NOT_FOUND_MESSAGE = '''
Node Package Manager (npm) is either not installed or installed to a
non-standard path. Please install npm from https://nodejs.org (it comes as an
option in the node installation) and try again.
Valid installation paths:
'''.strip()
ESLINT_PROMPT = '''
Would you like to use eslint
'''.strip()
ESLINT_PLUGIN_MOZILLA_PROMPT = '''
eslint-plugin-mozilla is an eslint plugin containing rules that help enforce
JavaScript coding standards in the Mozilla project. Would you like to use this
plugin
'''.strip()
ESLINT_PLUGIN_REACT_PROMPT = '''
eslint-plugin-react is an eslint plugin containing rules that help React
developers follow strict guidelines. Would you like to install it
'''.strip()
@CommandProvider
class MachCommands(MachCommandBase):
@Command('python', category='devenv',
description='Run Python.')
@CommandArgument('args', nargs=argparse.REMAINDER)
def python(self, args):
# Avoid logging the command
self.log_manager.terminal_handler.setLevel(logging.CRITICAL)
self._activate_virtualenv()
return self.run_process([self.virtualenv_manager.python_path] + args,
pass_thru=True, # Allow user to run Python interactively.
ensure_exit_code=False, # Don't throw on non-zero exit code.
# Note: subprocess requires native strings in os.environ on Windows
append_env={b'PYTHONDONTWRITEBYTECODE': str('1')})
@Command('python-test', category='testing',
description='Run Python unit tests.')
@CommandArgument('--verbose',
default=False,
action='store_true',
help='Verbose output.')
@CommandArgument('--stop',
default=False,
action='store_true',
help='Stop running tests after the first error or failure.')
@CommandArgument('tests', nargs='+',
metavar='TEST',
help='Tests to run. Each test can be a single file or a directory.')
def python_test(self, tests, verbose=False, stop=False):
self._activate_virtualenv()
import glob
# Python's unittest, and in particular discover, has problems with
# clashing namespaces when importing multiple test modules. What follows
# is a simple way to keep environments separate, at the price of
# launching Python multiple times. This also runs tests via mozunit,
# which produces output in the format Mozilla infrastructure expects.
return_code = 0
files = []
# We search for files in both the current directory (for people running
# from topsrcdir or cd'd into their test directory) and topsrcdir (to
# support people running mach from the objdir). The |break|s in the
# loop below ensure that we don't run tests twice if we're running mach
# from topsrcdir
search_dirs = ['.', self.topsrcdir]
last_search_dir = search_dirs[-1]
for t in tests:
for d in search_dirs:
test = mozpath.join(d, t)
if test.endswith('.py') and os.path.isfile(test):
files.append(test)
break
elif os.path.isfile(test + '.py'):
files.append(test + '.py')
break
elif os.path.isdir(test):
files += glob.glob(mozpath.join(test, 'test*.py'))
files += glob.glob(mozpath.join(test, 'unit*.py'))
break
elif d == last_search_dir:
self.log(logging.WARN, 'python-test',
{'test': t},
'TEST-UNEXPECTED-FAIL | Invalid test: {test}')
if stop:
return 1
for f in files:
file_displayed_test = [] # Used as a boolean.
def _line_handler(line):
if not file_displayed_test and line.startswith('TEST-'):
file_displayed_test.append(True)
inner_return_code = self.run_process(
[self.virtualenv_manager.python_path, f],
ensure_exit_code=False, # Don't throw on non-zero exit code.
log_name='python-test',
# subprocess requires native strings in os.environ on Windows
append_env={b'PYTHONDONTWRITEBYTECODE': str('1')},
line_handler=_line_handler)
return_code += inner_return_code
if not file_displayed_test:
self.log(logging.WARN, 'python-test', {'file': f},
'TEST-UNEXPECTED-FAIL | No test output (missing mozunit.main() call?): {file}')
if verbose:
if inner_return_code != 0:
self.log(logging.INFO, 'python-test', {'file': f},
'Test failed: {file}')
else:
self.log(logging.INFO, 'python-test', {'file': f},
'Test passed: {file}')
if stop and return_code > 0:
return 1
return 0 if return_code == 0 else 1
@Command('eslint', category='devenv',
description='Run eslint or help configure eslint for optimal development.')
@CommandArgument('-s', '--setup', default=False, action='store_true',
help='configure eslint for optimal development.')
@CommandArgument('path', nargs='?', default='.',
help='Path to files to lint, like "browser/components/loop" '
'or "mobile/android". '
'Defaults to the current directory if not given.')
@CommandArgument('-e', '--ext', default='[.js,.jsm,.jsx]',
help='Filename extensions to lint, default: "[.js,.jsm,.jsx]".')
@CommandArgument('-b', '--binary', default=None,
help='Path to eslint binary.')
@CommandArgument('args', nargs=argparse.REMAINDER) # Passed through to eslint.
def eslint(self, setup, path, ext=None, binary=None, args=[]):
'''Run eslint.'''
if setup:
return self.eslint_setup()
if not binary:
binary = os.environ.get('ESLINT', None)
if not binary:
try:
binary = which.which('eslint')
except which.WhichError:
pass
if not binary:
print(ESLINT_NOT_FOUND_MESSAGE)
return 1
# The cwd below is unfortunate. eslint --config=PATH/TO/.eslintrc works,
# but --ignore-path=PATH/TO/.eslintignore treats paths as relative to
# the current directory, rather than as relative to the location of
# .eslintignore (see https://github.com/eslint/eslint/issues/1382).
# mach commands always execute in the topsrcdir, so we could make all
# paths in .eslint relative to the topsrcdir, but it's not clear if
# that's a good choice for future eslint and IDE integrations.
# Unfortunately, running after chdir does not print the full path to
# files (convenient for opening with copy-and-paste). In the meantime,
# we just print the active path.
self.log(logging.INFO, 'eslint', {'binary': binary, 'path': path},
'Running {binary} in {path}')
cmd_args = [binary,
'--ext', ext, # This keeps ext as a single argument.
] + args
# Path must come after arguments. Path is '.' due to cwd below.
cmd_args += ['.']
return self.run_process(cmd_args,
cwd=path,
pass_thru=True, # Allow user to run eslint interactively.
ensure_exit_code=False, # Don't throw on non-zero exit code.
)
def eslint_setup(self, update_only=False):
"""Ensure eslint is optimally configured.
This command will inspect your eslint configuration and
guide you through an interactive wizard helping you configure
eslint for optimal use on Mozilla projects.
"""
sys.path.append(os.path.dirname(__file__))
# At the very least we need node installed.
nodePath = self.getNodeOrNpmPath("node")
if not nodePath:
return 1
npmPath = self.getNodeOrNpmPath("npm")
if not npmPath:
return 1
# Install eslint.
print("Installing eslint...")
with open(os.devnull, "w") as fnull:
subprocess.call([npmPath, "install", "eslint", "-g"],
stdout=fnull, stderr=fnull)
# Install eslint-plugin-mozilla.
print("")
print("Installing eslint-plugin-mozilla...")
with open(os.devnull, "w") as fnull:
subprocess.call([npmPath, "link"],
cwd="testing/eslint-plugin-mozilla",
stdout=fnull, stderr=fnull)
# Install eslint-plugin-react.
print("")
print("Installing eslint-plugin-react...")
with open(os.devnull, "w") as fnull:
subprocess.call([npmPath, "install", "-g", "eslint-plugin-react"],
stdout=fnull, stderr=fnull)
def getPossibleNodePathsWin(self):
"""
Return possible nodejs paths on Windows.
"""
if platform.system() != "Windows":
return []
return {
"%s\\nodejs" % os.environ.get("SystemDrive"),
os.path.join(os.environ.get("ProgramFiles"), "nodejs"),
os.path.join(os.environ.get("PROGRAMW6432"), "nodejs"),
os.path.join(os.environ.get("PROGRAMFILES"), "nodejs")
}
def getNodeOrNpmPath(self, filename):
"""
Return the nodejs or npm path.
"""
try:
appPath = which.which(filename)
return appPath
except which.WhichError:
pass
if platform.system() == "Windows":
try:
for ext in ["", ".cmd", ".exe"]:
nodeOrNpmPath = which.which(filename + ext,
path=self.getPossibleNodePathsWin())
if self.is_valid(nodeOrNpmPath):
return nodeOrNpmPath
except which.WhichError:
pass
if filename == "node":
print(NODE_NOT_FOUND_MESSAGE)
elif filename == "npm":
print(NPM_NOT_FOUND_MESSAGE)
if platform.system() == "Windows":
appPaths = self.getPossibleNodePathsWin()
for p in appPaths:
print(" - " + p)
elif platform.system() == "Darwin":
print(" - /usr/local/bin/node")
elif platform.system() == "Linux":
print(" - /usr/bin/nodejs")
return None
def is_valid(self, path):
try:
with open(os.devnull, "w") as fnull:
subprocess.check_call([path, "--version"], stdout=fnull)
return True
except subprocess.CalledProcessError:
return False