mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-07-20 22:19:49 +00:00
9ea51ff217
- 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)
319 lines
12 KiB
Python
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
|